一名優(yōu)秀的程序員需要精通幾種編程語(yǔ)言?
本文轉(zhuǎn)載自公眾號(hào)“讀芯術(shù)”(ID:AI_Discovery)
“編程小忍者”、“搖滾巨星開(kāi)發(fā)者”、“編程高手”、“開(kāi)源專(zhuān)家”、“多處理大亨”、“服務(wù)器大師”……一些奇怪術(shù)語(yǔ)的狂熱分子這樣稱(chēng)呼多語(yǔ)言程序員。
我對(duì)多語(yǔ)言程序員的定義有所不同。韋氏詞典將“多語(yǔ)種”定義為語(yǔ)言或術(shù)語(yǔ)的混合或混淆。 聽(tīng)起來(lái)好像帶有警告意味對(duì)嗎?
通常,多語(yǔ)種編程這一術(shù)語(yǔ)被認(rèn)為是尼爾·福特在2006年的一篇博客文章中提出的。2010年,迪安·萬(wàn)普勒在演講中進(jìn)一步詳細(xì)解釋了福特的論文,他在其中重申了不同語(yǔ)言在不同領(lǐng)域的優(yōu)勢(shì),并且程序員應(yīng)使用最適合的語(yǔ)言工具來(lái)完成工作。
多語(yǔ)言編程的思想起源于2000年代中期,是在身處Java生態(tài)系統(tǒng)的程序員群體中萌發(fā)的。
那時(shí)Java 語(yǔ)言已停滯不前,但Java虛擬機(jī)(JVM )是蓬勃發(fā)展的“非Java”語(yǔ)言社區(qū)的基礎(chǔ)。2003年的Groovy、2004年的Scala 、和2007年的Clojure都是很好的例子。
這些語(yǔ)言都提供了Java所沒(méi)有的功能,高階函數(shù)是其中最明顯的功能之一。有了這些新功能的幫助,程序員顯然可以輕松做到這些:使用Groovy處理可擴(kuò)展標(biāo)記語(yǔ)言(XML),或使用Scala處理嵌套結(jié)構(gòu),等等。
10多年過(guò)去了,多語(yǔ)言程序員的概念依舊方興未艾。
具體而言,多語(yǔ)言程序員至少要精通三種不同的編程語(yǔ)言。在理想情況下,混合使用語(yǔ)言可以提供強(qiáng)度、深度和多樣性,關(guān)鍵在于“截然不同”。
從技術(shù)角度來(lái)說(shuō),通曉Java、C++和ABAP的人可能會(huì)被視為多語(yǔ)言程序員。但是,由于上述三種語(yǔ)言都具有相似的、面向?qū)ο蟮母拍詈徒Y(jié)構(gòu),因此就算學(xué)了這三種語(yǔ)言也沒(méi)什么用。
正如加利福尼亞大學(xué)爾灣分校信息學(xué)的高級(jí)講師RichardPattis說(shuō)得那樣:“編程語(yǔ)言不僅是用于不同工作的工具,也是一項(xiàng)能夠塑造你對(duì)于編程觀念的技術(shù)。學(xué)習(xí)類(lèi)似的編程語(yǔ)言,可能不會(huì)對(duì)你思想的進(jìn)步帶來(lái)多大貢獻(xiàn)。”
為了拓寬思路,Pattis建議掌握多種編程語(yǔ)言的程序員要從不同的語(yǔ)言范式中學(xué)習(xí),無(wú)論是面向?qū)ο蟮恼Z(yǔ)言(如C++ /Java)、函數(shù)式語(yǔ)言(如ML和Haskell)、腳本語(yǔ)言(如Lisp和Python)、基于邏輯的語(yǔ)言(如Prolog)或底層語(yǔ)言(如C語(yǔ)言、Java虛擬機(jī)或機(jī)器語(yǔ)言)。關(guān)鍵不是要流利使用語(yǔ)言,而是掌握方法論,以全新方式處理問(wèn)題。
優(yōu)秀程序員不僅會(huì)編寫(xiě)代碼,而且還會(huì)不斷學(xué)習(xí)關(guān)鍵概念,進(jìn)而幫助他們以新方式解決問(wèn)題,并找到最有效的解決方案。
成為一名多語(yǔ)言程序員在筆者看來(lái)益處良多以下這些就足以吸引人。
讓你在職場(chǎng)中更搶手
精通多種編程語(yǔ)言,不僅為你的簡(jiǎn)歷增光添彩,也能表現(xiàn)出你很靈活、適應(yīng)能力強(qiáng),能夠使用優(yōu)秀工具來(lái)完成工作的能力。
它給了你更多機(jī)會(huì),也會(huì)讓你從容面對(duì)行業(yè)衰退。有能力探索多種編程范式,你會(huì)感到快樂(lè)和高產(chǎn),這將反映在你的編碼風(fēng)格中。
通過(guò)利用業(yè)內(nèi)所有的優(yōu)秀方案,你將開(kāi)發(fā)出更好的方法來(lái)編寫(xiě)代碼。多語(yǔ)言程序員能夠嘗試不同的句法,了解不同的社區(qū)——對(duì)于任何程序員而言,這種不斷的探索都會(huì)是他們能經(jīng)歷的比較好的體驗(yàn)之一。
掌握多語(yǔ)言還有助于你開(kāi)展自己的業(yè)務(wù)。當(dāng)客戶(hù)找到你,并需要你的專(zhuān)業(yè)知識(shí)來(lái)解決他們的問(wèn)題時(shí),你的“工具庫(kù)”中有更多工具可選,并且可以為他們帶來(lái)比較大的價(jià)值。
成為最會(huì)解決問(wèn)題的人,而不僅是程序員
如何最簡(jiǎn)潔地定義程序員的工作?那就是“解決問(wèn)題”。優(yōu)秀的程序員不能只編寫(xiě)出色的代碼,還需使用手頭的優(yōu)秀工具來(lái)解決業(yè)務(wù)問(wèn)題。
你也許不同意;“嘿,我是Java方面的佼佼者,我知道如何使用Java解決所有問(wèn)題”。如果這樣想,你可能患有“錘子和釘子”綜合癥。
該綜合癥表現(xiàn)為,如果你有把錘子,那么每個(gè)問(wèn)題對(duì)你來(lái)說(shuō)就像一顆釘子。在這種情況下,你只有一把錘子(即Java),最終,你的思想將被局限于,不管是什么問(wèn)題都要找出用Java解決的優(yōu)秀方法。換種說(shuō)法,如果Java無(wú)法解決你的問(wèn)題,你可能會(huì)陷入不知所措的困境。
現(xiàn)實(shí)中的確會(huì)遇到以前從未解決過(guò)的問(wèn)題,你可能的方案很可能并不夠高效,但這是你唯一了解的辦法了。
學(xué)習(xí)一門(mén)新語(yǔ)言開(kāi)闊了解決問(wèn)題的思路。你的思維將擺脫特定語(yǔ)言的束縛,并開(kāi)始從不同角度看待問(wèn)題。這將顯著提高你使用當(dāng)前語(yǔ)言的能力,你可能會(huì)發(fā)現(xiàn)自己冒出了更有效的解決問(wèn)題的新想法。
進(jìn)入學(xué)習(xí)模式
當(dāng)你開(kāi)始學(xué)習(xí)一門(mén)新的編程語(yǔ)言時(shí)會(huì)發(fā)生什么呢?
你會(huì)認(rèn)真鉆研書(shū)籍、消化示例代碼、并嘗試多樣的示例。你會(huì)發(fā)現(xiàn)一些可以幫助你正確學(xué)習(xí)語(yǔ)言的論壇、當(dāng)?shù)貓F(tuán)體、同事或其他任何在使用新語(yǔ)言方面經(jīng)驗(yàn)更為豐富的人。這些人可以在學(xué)習(xí)過(guò)程中幫助指導(dǎo)思考過(guò)程。你會(huì)開(kāi)始活躍在社區(qū)論壇中,并開(kāi)始定期提問(wèn)。
簡(jiǎn)而言之,你將立即進(jìn)入學(xué)習(xí)模式。這就像在健身房鍛煉。最初,肌肉酸痛不堪,但一段時(shí)間后,肌肉適應(yīng)了鍛煉周期,便不再像之前一樣酸痛。且肌肉生長(zhǎng)的同時(shí),耐力和力量也增加了。
學(xué)習(xí)對(duì)你的大腦也有同樣的作用。大腦一旦適應(yīng)了新概念學(xué)習(xí)曲線,如一門(mén)新編程語(yǔ)言,最終會(huì)使大腦更加敏捷,適應(yīng)能力更強(qiáng)。這將幫助你在日常工作中更有效地完成任務(wù),并更輕松地適應(yīng)日常使用的各種技術(shù)之間的細(xì)微差別。
例如,一位掌握如ABAP這樣的業(yè)務(wù)語(yǔ)言的Java開(kāi)發(fā)人員,可以很輕松地將共享對(duì)象概念與業(yè)務(wù)術(shù)語(yǔ)建立聯(lián)系,并發(fā)揮其用途。
最終,你的學(xué)習(xí)能力得到了增強(qiáng)。隨著時(shí)間的流逝,學(xué)習(xí)新事物對(duì)你而言,將變得越來(lái)越容易、也越來(lái)越快。
注意事項(xiàng)
盡管學(xué)習(xí)多種編程語(yǔ)言有許多益處,但其帶來(lái)的挑戰(zhàn)也不少。
在《JavaScript:語(yǔ)言精粹》一書(shū)中,道格拉斯·克羅克福德討論了JavaScript的優(yōu)缺點(diǎn)。每種語(yǔ)言都有其自身的一系列挑戰(zhàn),如果頻繁更換編程語(yǔ)言的學(xué)習(xí),卻不花足夠時(shí)間鉆研,你可能最終會(huì)“萬(wàn)事通,萬(wàn)事松”。
如果不能達(dá)到精通新語(yǔ)言的程度,那么多語(yǔ)言能力很可能會(huì)成為你的致命弱點(diǎn)。不斷地學(xué)習(xí)和適應(yīng)新語(yǔ)言與技術(shù)的過(guò)程也可能使開(kāi)發(fā)人員疲于奔命。同步保持所有技術(shù)的學(xué)習(xí)進(jìn)度是很難的,且你很可能會(huì)發(fā)現(xiàn)自己在學(xué)習(xí)道路上四處奔波,結(jié)果卻一無(wú)所獲。
關(guān)鍵是要學(xué)習(xí)難度適中、專(zhuān)注于自己能夠消化的知識(shí),并在達(dá)到學(xué)習(xí)極限后及時(shí)收手。一旦選擇好完成工作的優(yōu)秀工具,并獲得優(yōu)秀表現(xiàn)后,可停止學(xué)習(xí)并專(zhuān)心鞏固習(xí)得。凡事應(yīng)有度,切莫過(guò)頭。
恰如艾倫·佩利(Alan Perlis)所說(shuō):“如果一種語(yǔ)言不能影響你對(duì)編程的思考方式,你就用不著學(xué)它了。”
請(qǐng)記住,智慧在于理解學(xué)習(xí)新語(yǔ)言的成本,從中獲得的收益應(yīng)始終大于成本。