语言战争

作者:周思博(Joel Spolsky)
属于Joel on Software, http://www.joelonsoftware.com

这篇文字于2006年9月1日张贴在约耳谈软体首页。

有位老朋友写电邮问我:

「我有几个基本的问题,希望你能回答。要在一台Web伺服器、Web应用程式以及大规模分散模型及collection模型上建立一套企业级的应用程式,有哪些现有的技术可以达成。这个专案是由零开始的,没有任何旧程式码包袱,还有一些我不想拿出来烦你的细节…

「你会选.NET路线还是J2EE?」
「我们应该用哪一种Web伺服器呢(Apache, IIS或其他)?为什么呢?」
「你推荐什么Web开发语言(ASP.NET, Ruby, Ruby on Rails, Java, Python等)?原因为何?」
「你的公司是用什么组合?为什么会呢?」

呃,真是个好问题,既不可能回答却又非常容易!

抱歉,我应该停止打哑谜。前阵子写了一篇名为[程式设计领域的帕麦尔斯顿勋爵](/wiki/The_Joel_on_Software_Translation_Project:%E5%B8%95%E9%BA%A5%E7%88%BE%E6%96%AF %E9%A0%93%E5%8B%B3%E7%88%B5 “The Joel on Software Translation Project:帕麦尔斯顿勋爵”)的文章,我在文章里面声称,有些程式设计的世界(如.NET及Java)非常广阔而复杂,以致于绝不可能及早知道它们是否好到能满足你的需求。更何况是C#/.NET/IIS组合和Java/J2EE/Apache/Solaris组合,还有PHP/Apache/Linux组合间的争议多年来未曾平息,正确答案是永远都找不到的。因为这些平台各别的优缺点实在太多,所以各阵营的拥护者就会吵个不停,永远无法接近「真相」。不过说实在的,这些争议挺有趣的。

你可能会认为,如果能找到在多个平台上都有丰富经验的某人,问他准没错吧。这种人我看到过的并不多,不过有两件事我倒是可以确定:

  1. .NET、Java以及PHP一直都被全世界的人用来建立Web应用程式。这些人并没有因为选择了其中某项技术而失败。
  2. 所有这些环境既巨大又复杂,你绝对需要至少一位对所选平台有深厚开发经验的架构设计师,否则你会做错事,最后做出一堆必须重整结构的烂程式码。

去年夏天我们找了一组实习生建立了Copilot,当时我们必须决定新程式码所用的语言。我知道新专案通常会有一大段评估期去决定所要用的技术,评估期间还会伴随许多争论,会有某个疯子真的浪费时间去评估[Squeak](http://www.squeak.org /)和[Lisp](http://www.findinglisp.com/blog/2005/12/reddit- and-lisp-psychosis.html)还有[OCaml](http://www.cabochon.com/~stevey/blog- rants/more- ocaml.html),以及其他种种真正出色值得崇拜,却又缺少无数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](/wiki/The_Joel_on_Software_Translation_Project:%E8%90%AC%E5%9C%8B%E7%A2%BC “The Joel on Software Translation Project:万国码”)表露了极强烈的厌恶,(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)要闪开,也知道要避开让一页里无法放两个等等的事情,所以他做得非常好,从一开始就用完全正确的方式,做出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.