Don’t Just Learn the Language, Understand its Culture
在上大学的时候,我不得不去学习一门外语。当时我觉得自己的英语水平已经很牛逼了,就选择休学3年法语班。最近几年我去突尼斯度假。在那边阿拉伯语是官方语言,由于曾被法国殖民,法语也是比较通用的。语言则仅在旅游地区才讲。由于我对语言的无知,我发现自己只能在泳池边阅读Finnegans Wake(芬尼根的守灵夜),James Joyce的形式和语言之旅。尽管让人精疲力尽,但Joyce十分诙谐地融合了40多种语言真的十分惊人。认识到不同外语和语法的交织能够给作者带来新的自我表达方式后,这也成了我编程职业生涯中一直保持的事。
在他们开创性的书《程序员修炼之道》中,Andy Hunt和Dave Thomas鼓励我们每年都学一门新语言。我已经尝试过他们的建议,并在多年来有多种语言的编程经验。(以下是)我从各种语言冒险学到的,相比于只学习语言语法而言要重要得多:你要理解它背后的文化。你可以在任何语言中用Fortran,但只有真的学会一门语言你才会拥抱它。如果你的C#代码是一个很长的由众多静态Helper方法组成的Main方法,不要找借口,去了解类的本质。别总是羞于在函数式语言中花很长时间去了解正则表达式,强迫自己使用它们。
当你上手一次新语言,你会惊讶地发现你居然会以全新的方式使用你已经掌握的语言。我从Ruby编程中学会了如何高效地在C#中使用委托,完全释放.Net泛型的潜力给了我如何让Java泛型跟有用的灵感,LINQ让我自学Scala时更轻松。
你也可以从不同语言中更好地理解设计模式。C程序员会发现C#和Java已经将迭代器模式封装好了。在Ruby以及其他动态语言中你可能仍然采用访问者(模式),但你的实现却不会像GoF书中的例子那样。
有些争论认为《芬尼根的守灵夜》根本不可读,但也有人赞叹它的文风优美。为了减少对本书的阅读恐惧,单一语言的翻译版本也许可行。讽刺的是(度假的地方)法语才是第一语言。代码在很多地方是相似的。如果你写的守灵夜代码采用一点点Python、一些些Java和一丝丝Erlang,你的工程将混乱不堪。但如果你通过新语言大开脑洞获得灵感,能用不同的方式来解决事情,你会发现在写代码时旧语言可以为你学到的任何新语言带来更多美好。