2006年09月14日

Joel是很多人很尊敬的软件大师,他的个人网站Joel on software在Bloglines的订户数已经达到32235个。可能你对他没印象,但你很可能看过他的文章,比如行进中开火看起来简单,实际上复杂。

Joel最近遇到了大麻烦,他撰文批判了Ruby的性能,遭到了来自四面八方的猛烈而一致的批驳。

Joel认为,Rails并没有性能问题,他只是质疑Rails的实现语言Ruby。由于绑定和duck typing的原因,Ruby不可能向下编译成CPU能够用一个Call指令直接支持的程度,这就在语言底层造成了性能上的短板,从而导致了Ruby在理论上的“慢”。导致的结果就是,本来你的应用要用10个服务器,现在可能要用100个。这样的话,你很难说“程序员的时间”真的比“CPU时间”更宝贵。

平心而论,Joel的观点在我看来还算是正常的质疑,只要是动态语言,就会面临这些矛盾。Joel也很小心的一再暗示,“我是尊重程序员时间的,请不要误解我。”

但Joel明显低估了RoR粉丝们的狂热。他发贴后的数个小时,几篇声讨文章就出炉了:

Avi Bryant从技术角度向Joel的观点发难,他认为,Ruby是慢,而且的确是受mathod dispatch方式的拖累。但他不同意“Ruby不可能向下编译,以便代码能够用一个CPU Call指令直接调用”的论断:在95%的情况下,一个很好的实现可以做到向下编译成一个跳转加一个比较指令,不需要“虚函数表”,这实际上从理论上比C++还要快。Avi解释了他的实现方法,并推介了应用了类似技术的Sun公司的新产品Strongtalk,他认为Ruby迟早会实现这个技术,并从Sun雇用了JRuby的人推测,Ruby很可能已经在做这个事儿了。

Chris Hanson提出不同观点,他认为,Ruby慢的原因不是message-based dynamic dispatch(dock typing),而仅仅是因为Ruby是一个单历的解释语言,Ruby需要在运行时扫描、解释然后执行代码。Chris提到Ruby2.0会会加入预编译环节,从而在性能方面获得重大提升。“这没什么难的,”他说,“这些技术难题60年代的Lisp语言和70年代的Smalltalk语言早就攻克了。”

Obie Fernandez用时态表达了他的遗憾,“他曾经是我心目中的英雄。。。”,Obie的这种感觉,我有一些,Jeff Atwood也有,他认为:

尽管Joel的Blog几乎是个金矿,他也会犯错误,比如他讨厌异常(Exceptions)(2)Java不适合做教学语言。但是,和最近Joel的新帖子相比,这都是小巫见大巫了。

Jeff更是翻出了旧账,有点不厚道的猜测Joel对Ruby的批判或多或少和他想推介自己的语言Wasabi有关,Joel当初推介基于VBScript的wasabi的时候,大家都以为他在开玩笑,以至于Joel要专门写个帖子辟谣:wasabi是真的!,挺好玩的。Jeff看不出wasabi比ruby高明在哪里,他认为,如果按照Joel的逻辑,我们就应该拒绝所有的动态语言,即便这个世界上已经充斥着双头的3G主频的只值两百美金的CPU。

最强烈的RoR粉丝Matt M甚至使用了不礼貌的字眼,他称Joel是一个“滑稽的老家伙”,曾经干下不少打压Ruby和Java的勾当,最近的那个帖子更是白痴论调,他讥讽到:“Joel说Ruby做计算不够快,请问他的Bug管理软件需要做什么样的大计算?是自动修复你的bug吗?” Matt进而讥讽了Joel的wasabi:“Joel实际上是用基于VBScript的定制语言来开发他的小程序。”--老美骂人都是这么杀人不见血的,害怕。

Matt M最后叹了口气,说出了我想说的:“近年来我比以往更仔细的在Joel的东西里淘金子,但我想再也淘不到了。”

从技术角度看,这件事情挺正常的。Joel敢去触动编程语言优劣这个话题禁区,遭到批判就不奇怪。他不像Robert C. Martin那样在语言的优劣问题上显得老奸巨滑。我感慨的是发布观点的风险竟然可以这么大,一着不慎,多年经营的口碑就会大打折扣。但是对于需要和喜爱发布观点的人来说,几乎不可能提前判断出一个话题会带来什么后果。这个事件令我联想起keso曾遭遇过的baidu专利事件。keso和Joel化解这件事的方式如出一辙:

keso说Update: 在有关朋友的提示之下,重新以“Li Yanhong”这个名字搜索,找到了相关专利,美国专利号:5,920,859。专利提交日期为1997年2月5日,批准日期为1999年7月6日。这项专利是关于超文本文档检索系统和方法(Hypertext document retrieval system and method)。相关专家可以来分析两个专利的相似性。

Joel说: Avi Bryant describes a method for making method calls really fast, even if they do happen to be duck-typed. Cool! (Ruby’s still slow. Film at 11.)

其实对有影响力的团体和个人来说,危机攻关的需求随时都会到来。提前准备好一个危机处理原则,恐怕是一件非常有价值的事情。

2005年06月23日

大家好。测试一下。

这应该是一个新段落, 这应该是一个链接

这应该是另一段。