(转)語言戰爭

转载自:http://local.joelonsoftware.com/wiki/%E8%AA%9E%E8%A8%80%E6%88%B0%E7%88%AD

這篇文字於2006年9月1日張貼在約耳談軟體首頁。

有位老朋友寫電郵問我:

「我有幾個基本的問題,希望你能回答。要在一台Web伺服器、Web應用程式以及大規模分散模型及collection模型上建立一套企業級的應用程式,有哪些現有的技術可以達成。這個專案是由零開始的,沒有任何舊程式碼包袱,還有一些我不想拿出來煩你的細節…

「你會選.NET路線還是J2EE?」
「我們應該用哪一種Web伺服器呢(Apache, IIS或其他)?為什麼呢?」
「你推薦什麼Web開發語言(ASP.NET, Ruby, Ruby on Rails, Java, Python等)?原因為何?」
「你的公司是用什麼組合?為什麼會呢?」

呃,真是個好問題,既不可能回答卻又非常容易!

抱歉,我應該停止打啞謎。前陣子寫了一篇名為程式設計領域的帕麥爾斯頓勳爵的文章,我在文章裡面聲稱,有些程式設計的世界(如.NET及Java)非常廣闊而複雜,以致於絕不可能及早知道它們是否好到能滿足你的需求。更何況是C#/.NET/IIS組合和Java/J2EE/Apache/Solaris組合,還有PHP/Apache/Linux組合間的爭議多年來未曾平息,正確答案是永遠都找不到的。因為這些平台各別的優缺點實在太多,所以各陣營的擁護者就會吵個不停,永遠無法接近「真相」。不過說實在的,這些爭議挺有趣的。

你可能會認為,如果能找到在多個平台上都有豐富經驗的某人,問他準沒錯吧。這種人我看到過的並不多,不過有兩件事我倒是可以確定:

  1. .NET、Java以及PHP一直都被全世界的人用來建立Web應用程式。這些人並沒有因為選擇了其中某項技術而失敗。
  2. 所有這些環境既巨大又複雜,你絕對需要至少一位對所選平台有深厚開發經驗的架構設計師,否則你會做錯事,最後做出一堆必須重整結構的爛程式碼。

去年夏天我們找了一組實習生建立了Copilot,當時我們必須決定新程式碼所用的語言。我知道新專案通常會有一大段評估期去決定所要用的技術,評估期間還會伴隨許多爭論,會有某個瘋子真的浪費時間去評估SqueakLisp還有OCaml,以及其他種種真正出色值得崇拜,卻又缺少無數Web軟體開發必備系統的程式語言。這些爭議非常有趣卻只會浪費時間,因為到頭來只有三個半平台(C#, Java, PHP, 剩的半個是Python)有相同的機會讓你成功;至於其他無數掛保證的平台(Lisp, 用C寫的ISAPI DLL, Perl),都會在已經來不及補救時在眾目睽睽下失敗;還不算那些根本沒人理的平台呢。所以當你的工作處於危險時何必冒險(Ruby on Rails)呢?趁你罵我前先聲明,Ruby是套美麗的程式語言,我也敢說用它開發應用程式會得到很多樂趣,事實上如果你要做非關緊要的東西時,我保證一定很好玩。不過對認真的商業專案來說,你真的得認清事實,全世界用Ruby on Rails建立大型關鍵Web系統的經驗並不多,而且我真的不敢保證你不會遇到擴充性(scaling)問題,不會與某些舊程式碼有介面上的問題,不會找不到能懂那些程式碼的程式員,還有種種不知名的問題。所以即使Ruby on Rails是有趣的答案,我也的確聽過37 Signals,而他們也做出了可愛Ruby on Rails應用程式還賺了大錢,不過至少再過一年甚至六年都還不是個安全的選擇。舉些讓我害怕Ruby的例子,因為(1)它對Unicode表露了極強烈的厭惡,(2)它是眾所周知的慢,所以如果你會成為下一個MySpace,得比那些用.NET的傢伙多買五倍數量的機器。這些問題最後都會解決,不過就目前來說,你可以在你創業的兩人宿舍公司或是畢業專題上冒險使用Ruby,但是別在會讓某人因而被開除的企業專案上惡搞。Python算半個平台,因為它正跨在邊界上,快要由「有趣」的選擇跨界進入「安全」的選擇。

哦,我知道Paul告訴你,他是用Lisp寫出他的應用程式,然後因為程式是用Lisp寫的所以賺了幾百萬;不過說實在的,只有兩個人曾經相信他,而且這兩個人在完全重寫過之後是不會再犯那種錯誤的。

就不會對最新技術感興趣的大企業專案而言,安全的答案就是C#、Java、PHP或Python,因為證據實在太足夠了。已經有無數人用這些語言建立了各種巨型的關鍵性應用,這些技術即使有問題,也不會是什麼致命的問題。

那麼你要如何在C#、Java、PHP與Python之間做個選擇呢?唯一真正的差異在於比較熟悉哪一個。如果團隊裡有個曾用Java成功建立數個大型系統的正港Java大師,採用Java絕對會比用C#成功許多。原因並不是因為Java這種語言比較好(它沒有比較好,不過差距微不足道),純粹只因為大師比較熟悉。這對其他語言也是一樣的。

我們後來就直接告訴實習生必須用C#和ASP.NET來寫。尤其是其中某個實習生(寫出Copilot網站部份的那位)對ASP.NET有足夠的經驗,知道有什麼陷阱(如viewstate)要閃開,也知道要避開讓一頁裡無法放兩個<forms>等等的事情,所以他做得非常好,從一開始就用完全正確的方式,做出ASP.NET的程式碼架構,讓我們後來不會遇到問題。而好處就是沒有浪費任何一分鐘,對程式語言優劣作沒有結論(我從來沒看到過有結論)的爭議。

到最後Copilot就照我所說的,是用C#和ASP.Net完成的,只有Windows用戶端是用C++寫的。我們原本的內部程式碼是用VBScript,而新的內部程式碼則是用C#。FogBugz則是用Wasabi寫的,這是一套非常先進的函數編程(functional-programming)Basic變種,具備closure和lambda以及類似Rails的主動記錄(active records)功能,能夠編譯成VBScript、JavaScript、PHP4或是PHP5。Wasabi是套由我們最佳的開發者撰寫的內部私用語言,特別針對FogBugz的開發作了最佳化;而Wasabi的編譯器本身則是用C#寫的。

這些網頁的內容為表達個人意見。

1 评论

发表回复

您的电子邮箱地址不会被公开。