語言戰爭 Language Wars

作者:周思博 (Joel Spolsky)
SEPTEMBER 1, 2006
屬於 Joel on Software, https://www.joelonsoftware.com/2006/09/01/language-wars/

有位老朋友寫電郵問我:

「我有幾個基本的問題,希望你能回答。要在一台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# 寫的。

這些網頁的內容為表達個人意見。
All contents Copyright © 1999-2006 by Joel Spolsky. All Rights Reserved.