在項(xiàng)目實(shí)踐中如何選擇編程語(yǔ)言
選擇使用什么樣編程語(yǔ)言對(duì)于一個(gè)項(xiàng)目來(lái)說(shuō)是一個(gè)最關(guān)鍵的技術(shù)決策。因?yàn)檫@項(xiàng)決策會(huì)影響到項(xiàng)目框架結(jié)構(gòu)和你所能夠利用上的資源,以及雇傭員工。既然如此,你是如何去選擇編程語(yǔ)言的呢?
事實(shí)上,你很有可能采取一些大眾化的做法,去引用在上個(gè)項(xiàng)目里所使用過(guò)的一些語(yǔ)言。或許你是一位對(duì)新鮮事物比較敏感的潮人,你會(huì)選擇一些最新最酷的語(yǔ)言。幾年前,很多很棒的年輕人已經(jīng)蓄意待發(fā)。而現(xiàn)在他們讓我意識(shí)到他們創(chuàng)造的節(jié)點(diǎn)是多么的棒,以及clojures已經(jīng)達(dá)到了一定的程度。上次我還注意到,他們圖靈完備的語(yǔ)言跟我的已經(jīng)具有相同的解決問(wèn)題的能力。實(shí)際上,他們還堅(jiān)持認(rèn)為他們的語(yǔ)言給了圖靈語(yǔ)言更強(qiáng)的表現(xiàn)力,更快的編寫(xiě)以及更低成本的維護(hù)。
合適的工具,合適的工作
古人云:工欲善其事,必先利其器。如果你需要自動(dòng)運(yùn)行一些命令執(zhí)行的維護(hù)任務(wù),可使用一些擅長(zhǎng)腳本編程的語(yǔ)言:如bash,perl,,hell even ruby;不要用Java. 如果你要解決的問(wèn)題需要一個(gè)在微軟操作系統(tǒng)的環(huán)境里能夠無(wú)縫整合的桌面客戶端,可以使用C#,不要用Java (Java桌面的粉絲,先冷靜一下)。如果解決的問(wèn)題需要處理大量的XML,以及你喜歡處理層積追蹤,那當(dāng)然要使用Java.
通常來(lái)說(shuō)最大的區(qū)別歸結(jié)為規(guī)則系統(tǒng)的復(fù)雜性。如果你從事的工作具有很多規(guī)則系統(tǒng)算法上的復(fù)雜性,使用一些能夠擅長(zhǎng)于表達(dá)的東西:一種函數(shù)式語(yǔ)言,像haskell 或者F#。或者就像90%的網(wǎng)頁(yè)應(yīng)用那樣,做的就是數(shù)據(jù)的輸入和輸出,你需要一種具有較好的面向?qū)ο竽芰Φ恼Z(yǔ)言去嘗試塑造你的領(lǐng)域:Java 和 C# 都是很好的選擇,以及還有幾乎所有的其它的現(xiàn)代語(yǔ)言。
Scala
或許你非常痛恨自己想要妥協(xié):為什么當(dāng)你能選擇兩個(gè)的時(shí)候,而只選擇函數(shù)的或程序的其中一個(gè)?為什么會(huì)遺漏這些語(yǔ)言的特色,要知道在過(guò)去的50年里你能擁有它們?nèi)浚F(xiàn)在是煎熬在一團(tuán)糟的語(yǔ)言上?是的,如果這聽(tīng)起來(lái)像你,你可能認(rèn)為你是一位對(duì)新鮮事物敏感的潮人,但是,事實(shí)上你錯(cuò)失了數(shù)年的良機(jī):是時(shí)候去了解一些Scalas 了。
我猜測(cè)Scala 能夠如此流行的大部分原因是它最終為所有沮喪的Java開(kāi)發(fā)者帶來(lái)了它們想要的語(yǔ)言工具。現(xiàn)在Java實(shí)在是一種超級(jí)反應(yīng)遲鈍的語(yǔ)言,使用它工作時(shí)感覺(jué)非常的失望。有些人轉(zhuǎn)換去使用C#,我也開(kāi)始喜歡使用新的華而不實(shí)的語(yǔ)言工具。它們有讓代碼變得更好嗎?很多的新語(yǔ)言的引進(jìn),提升了復(fù)雜性和增加了豐富性,但也使得代碼很難被理解和不容易后期的維護(hù)。
重點(diǎn)是,Java是一種玩具語(yǔ)言:白癡都可以寫(xiě)出像樣的合乎規(guī)范的Java. 不過(guò)麻煩是,Java這類(lèi)玩具語(yǔ)言,編程的人無(wú)論他們有多牛,每個(gè)人還是被迫去編寫(xiě)冗長(zhǎng)的愚蠢的Java 代碼。這也使得很多技術(shù)牛人不能通過(guò)編寫(xiě)難以破解的廢物來(lái)證明他們的水平。我也擔(dān)心Lambdas將對(duì)Java代碼庫(kù)的可維護(hù)性帶來(lái)沖擊,以致每個(gè)人開(kāi)始尋找新的令人困惑的方式來(lái)表達(dá)一切。
雇傭
另一個(gè)原因影響開(kāi)發(fā)人員去選擇合適的編程語(yǔ)言,就是你可以選擇被雇傭。不過(guò)這是真的嗎?我現(xiàn)在在C#辦公點(diǎn)工作,我藐視了Java開(kāi)發(fā)者嗎?當(dāng)然沒(méi)有。一個(gè)好的開(kāi)發(fā)者就是一個(gè)好的開(kāi)發(fā)者,跟語(yǔ)言沒(méi)什么關(guān)系。拒絕潛在的新人是因?yàn)樗麄兯赖牡恼Z(yǔ)言是反應(yīng)遲鈍的弱智語(yǔ)言。
麻煩的是:如果你認(rèn)為僅僅雇傭python 或者 node 開(kāi)發(fā)者可以讓你提升到一個(gè)更高的開(kāi)發(fā)人員的標(biāo)準(zhǔn):你錯(cuò)了。你選擇的空間會(huì)變得更加狹窄。或許那個(gè)空間的平均質(zhì)量會(huì)高一些,但誰(shuí)知道?誰(shuí)在意呢?我只需要一個(gè)開(kāi)發(fā)者,我希望她是在我能雇傭的人中最好的,跟平均值沒(méi)什么關(guān)系。
語(yǔ)言和能力之間沒(méi)有必然的聯(lián)系:我遇到了一些非常聰明的Java開(kāi)發(fā)人員和一些十足可怕的自認(rèn)為消息靈通的開(kāi)發(fā)者。我寧愿盡可能多的雇傭樂(lè)于使用我們所使用的技術(shù)的優(yōu)秀的開(kāi)發(fā)人員,而不是去限制我能召集到人才的機(jī)會(huì),坦誠(chéng)的說(shuō),目前已經(jīng)很受限制了。
我聽(tīng)說(shuō)到的另一個(gè)爭(zhēng)論是,你所使用的技術(shù)會(huì)限制應(yīng)聘者為你工作的意愿 --- 一些開(kāi)發(fā)者就想在指定的平臺(tái)工作,比如clojure. 其實(shí),他們阻礙了自己成長(zhǎng)。我寧愿要那些主動(dòng)想去解決有趣問(wèn)題的人員,不用去考慮語(yǔ)言,而不是那些只解決垃圾問(wèn)題的自以為是的潮人。如果你是在銀行工作,碰到的都是很胡扯的問(wèn)題嗎?當(dāng)然,可以直接用一種自以為是潮人的語(yǔ)言如果它能夠幫助你雇傭到足夠的傻子。它會(huì)使很多人才遠(yuǎn)離我。
通用語(yǔ)言
將所有使用潮人語(yǔ)言的程序員集中在一起,讓他們組成一個(gè)團(tuán)隊(duì)。會(huì)發(fā)生什么呢?意外的是,你看到了一堆C#和Java的開(kāi)發(fā)人員。因?yàn)閹缀趺恳粋€(gè)開(kāi)發(fā)人員都知道這兩種語(yǔ)言中的一種----它們是通用語(yǔ)言。反之如果沒(méi)有組成一個(gè)團(tuán)隊(duì),他們只不過(guò)是一群水平參差不齊潮人語(yǔ)言開(kāi)發(fā)人員。
事實(shí)上最重要的事情是當(dāng)你選擇一種語(yǔ)言時(shí),取決于你的團(tuán)隊(duì)中會(huì)有多少開(kāi)發(fā)人員熟悉這種語(yǔ)言,以及你打算雇傭的人有多少人了解這種語(yǔ)言。如果團(tuán)隊(duì)中的每個(gè)人需要重新培訓(xùn),像smalltalk;以及你雇傭的每個(gè)人需要手把手指導(dǎo)學(xué)習(xí)新語(yǔ)言---這是你必須考慮的成本因素,什么樣的利益和你會(huì)從中獲得什么好處?
其次,你是否可以在遇到問(wèn)題時(shí)比較容易的獲得支持幫助?Java的開(kāi)源社區(qū)非常棒---當(dāng)你遇到一個(gè)問(wèn)題,他們已經(jīng)至少有15個(gè)不同的解決方案,其中有一些甚至可行。如果你使用C#,那么你的選擇會(huì)非常有限---但是將會(huì)有選擇,有些不是來(lái)自微軟的支持。如果你使用最新的潮人語(yǔ)言,猜猜會(huì)發(fā)生什么? 你就只能靠自己。不過(guò)對(duì)于有些人來(lái)說(shuō),這正是潮人語(yǔ)言所吸引他們的地方。但對(duì)于我們這些想要把工作做好的人來(lái)說(shuō),這是一種痛苦。
最后,最好的建議還是傾向使用上一個(gè)項(xiàng)目相同的語(yǔ)言:因?yàn)槊總€(gè)人都已經(jīng)熟悉它,以及所需的工具也已經(jīng)安裝部署完成。這就是為什么Java迅速成為新一代cobol(譯者注:第一個(gè)廣泛使用的高級(jí)編程語(yǔ)言)的原因。