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