[轉]你真的應該再學習一種語言麼

當博客作者Gustavo Duarte宣稱“學習新語言通常都是在浪費時間”時,他的觀點受到了很大的爭議。最初,他以標題“New Languages Considered Harmful”發表了文章,這是在刻意模仿Dijksta那篇關於Goto的經典論文,但是由於來自他人的反響過於強烈,因此它改了一個更爲柔和的標題“Language Dabbling Considered Wasteful”。

對於專業程序員來說,學習新語言通常都是在浪費時間。儘管這種浪費可能很有趣(比如,成爲一種嗜好),但是它仍然是浪費。如果你只是爲了取樂,那麼好吧,但是利潤將受到威脅。在一羣卓越的程序員面前宣傳這種論調無異於異端邪說:甚至《The Pragmatic Programmer》這本書還建議我們應該每年都學習一種新語言(不過它的其他建議總體上說還是不錯的)。這簡直是廢話。

他還解釋了他認爲學習新語言無用的原因:

潛在的理論是,通過學習新語言,你可以“擴展思路”,併成爲一名“更優秀的程序員”。沒錯。只不過按照這種論斷,吸毒也可以拓展我們的經驗(可千萬別試!)。事實上,學習一種新的語言是樁得不償失的買賣,把大量的精力花費在低價值的任務上,這種時間投資只能獲得很少的回報。

Gustavo批評了Scott關於“學習新語言就是在不斷地磨利自己的砍柴刀”的類比。Scott說:

今年,我在學習Ruby。這意味着我的團隊轉移到Ruby上了麼?大概不是。它不過是意味着我今年正在學習Ruby,我要堅持不懈地磨利工具。你可能忙於砍柴沒功夫磨刀,但是我想提醒你——不管你用的是哪個牌子、哪種類型的刀——記住,別的人用其他牌子、其他類型的刀也照樣順順當當地砍柴。別人也有你不知道的招式。

Gustavo不相信事情會如Scott所述。

Scott Hanselman爭論說學習新語言是在磨利砍柴刀,但是我覺得他是被新買來明晃晃的鈍刀子迷住了,反而忽略了自己那把磨了一半的舊刀子。與其有一打不好不壞的刀,不如只留下三把非常鋒利的。你在工具箱中加入的每一種新語言,都將使你更難以利用已有的語言達到更大的生產力的提升。

網上還有大量後續的討論。

最有趣的評論來自於Hacker’s news,它是Lisp技術傳播者Paul Graham的站點的一部分。Scott Schneider在評論中說到:

我認爲他堅持這種觀點是因爲持有這樣的假設,即所有語言都有相同的概念,它們彼此只是“字面表達和句法風格”不同而已。但是我認爲,建議學習更多編程的出發點在於讓你自己可以接觸到不同的程序設計範型。以此爲目的,我並認爲你不一定要把每一種語言都研究到鑽牛角尖的程度,但應該能輕鬆自在地以一種新的方式去思考。

Steven Hazel繼續說道:

我認爲“剛好夠用(enough)”是一個關鍵點。文章的作者似乎在探討是否應該每年都轉移到一種新的語言上,這一點我承認是很荒謬的。真正的含義在於學習一些新概念,而不是每一年都把關鍵的程序用新的語言實現。事實上,只有一種語言是務實的選擇時,我纔會在日常工作中採用它。

Alain Perils在其經典的“Epigrams on Programming”中宣稱,“如果一種語言不會影響你思考程序設計的方式,那麼它不值得學習。”,這一點和Eric Raymond’的發現非常吻合:

Lisp是值得學習的。一旦你真正掌握了它,就能獲得非常有深度的、具有啓發意義的經驗;這些經驗將讓你在以後的日子裏成爲一個更優秀的程序員,即使你再也不會用到Lisp。

下面的引用來自於Paul Graham的著名的文章“Beating the averages”,文中他提出了“The Blub Paradox”。文章中稱:

達到了一定的年齡後,程序員很少再主動去轉換語言了。無論他們曾經用過哪些語言,他們開始考慮“剛好夠用”就行了。

The Blub Paradox理論是指,每個人都知道他們爲什麼喜歡自己所選擇的語言,這個原因通常都是該語言很強大。他們放棄機器語言而選擇了C語言,是爲了提高程序員的生產力;放棄了C語言而選擇Java,是爲了進一步抽象,最終還是提高程序員的生產力。當然,他們也聽說過其他的語言,但是他們認爲“我用現在的語言可以解決眼前的問題,因此沒有必要去學習另一種語言。”

程序設計語言,或者其他類型的語言,當你理解了它後(未必掌握得非常熟練),它開始左右你的思考。根據自然語言研究者的研究,如果一個詞彙(或者一類詞彙)沒有在某種語言中出現過,那麼人們在思考這個詞彙所表現的概念時相當困難。Paul Graham指出在程序設計語言的領域裏也有相似的情況發生:

讓程序來寫程序?你什麼時候會想去做這種事?如果你用Cobol,並不經常。如果你用Lisp,這種事每天都在發生。

那麼,你應該花時間去學習一種新的語言麼?如果你決定去學,如何選擇下一種語言才能獲得最大的收穫呢?

Google的研究主管Peter Norvig撰寫了一篇名爲“Teach Yourself Programming in Ten Years”的文章,文中他給出了關於如何選擇語言的精闢的建議:

至少要學習半打語言。其中包括支持類抽象的語言(比如Java或者C++),支持函數抽象的語言(比如Lisp或者ML),支持句法抽象的語言(比如Lisp),支持聲明式規範的語言(比如Prolog或者C++模板),支持協同程序(coroutine)的語言(比如Icon或者Scheme),以及支持並行機制的語言(比如Sisal)。

那麼,你的看法呢?你會學習新語言麼,還是認爲那是在浪費時間?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章