上星期我在InfoQ发表了一篇新闻,对Joe Stagner在博客上发表的三篇关于ASP.NET与PHP性能对比的文章进行了总结。写新闻其实挺不爽的,因为不能夹杂个人的看法,只能平铺直叙陈述事实。当然,如果像某些新闻那样“换一种说法”是可以骗过一些“不明真相的群众”,但是这就有违道德了。因此,在客观陈述完新闻内容之后,我只能选择把自己的感想、评论等内容放在自己的博客上。
Joe Stagner的背景挺特殊,它是PHP的老用户,在ASP.NET出现之前就是PHP的重量级开发人员了。后来不知哪一天开始他加入了微软,我们就可以在一些如介绍ASP.NET AJAX的文章、视频中看到他。这次他又涉及了一个敏感话题:性能比较。要知道每次这种比较都会惹来一阵争论……我不想用“口水战”来形容,我认为它和“争论”的性质不同。Joe也承认,每次他说PHP好话就会被微软的同事职责,而说.NET好话就要被PHP阵营说是微软的托。
我深信优秀的技术人员都是有信仰的,都有技术倾向性。因此如Joe夹在中间的人的确比较尴尬。但是我认为,有信仰,和“客观”是不冲突的。信仰涉及到倾向性,而客观则意味着有倾向性之后的办事方式。
至于比较结果,您可以关注一下新闻内容,总体来说,ASP.NET从纯粹的执行效率上来说是大幅领先于PHP的。这并不令人惊讶,一个是编译为机器码的执行方式,一个是解析执行(即时缓存了op-code也并不是机器码),性能自然天差地远。
Joe也知道会引发争论,因此他在文章后面写道:
我知道某些人会被这个测试结果激怒,欢迎发表评论及反对意见,但是如果你无法保持礼貌的话,我会删除你的评论并阻止你的IP。
如果你不喜欢,并拒绝接受这个结果——那么你也来测试一下。用数据支持你的观点,使用我的代码或你自己的,然后围绕事实再来争论
自然,Joe也给出了测试代码及测试环境的描述。
文章的评论自然是很有看头的,说法很多,有许多人说VS的IDE好,有人说PHP永远只能写出半专业的程序。Joe一一进行了回应,我个人认为回应的还是很客观的,紧紧围绕在测试的中心。他表示,虽然VS非常优秀,但是PHP也有很好的IDE。而能否写出专业的程序是看人,而不是由PHP决定的,有丑陋的PHP程序,也能写出如C++一般工整美观的代码。
从表面上看,ASP.NET在性能上胜出PHP一大截,作为ASP.NET的忠实用户我应该非常乐意接受这个“结果”。但是,我并不关注这个,因为这种运行时上纯粹的速度对于一个Web应用程序来说实在微不足道。例如Joe的第三篇文章里列举出的PHP高手的应对方式:
以及InfoQ上的一条评论:
在WEB上便捷的开发,与各种系统之间灵活的搭配,像胶水一样将各种不同的物件拼装起来呈现给Web,(python在这方面也做得非常棒)。这才是PHP能有今天的本质原因。
之前我批评Java是一种不思进取的低生产力语言,回应很多。其中也有类似的说法,如说Java平台上开源多,项目多等等。没错,这我在对Java语言发起非难之前就已经反复强调了。我同意这个观点——但是,如果是这样的“结论”肯定是站不住脚的:“因为Java平台开源多,项目多,因此Java语言并不是不思进取的语言”。这就好比有人说“他熟悉PHP,PHP的项目多,因此PHP的性能比ASP.NET快”一样,把两种东西混淆起来了。
奇怪的是,Joe没有让人不要用PHP,我也没有让人不要用Java平台(不过我现在一直建议别人用Scala代替Java语言)。
许多国内技术人员总有这样的“毛病”,见不得自己使用东西有一点点“瑕疵”。既然我是Java平台开发人员,我使用Java语言,我就见不得别人说Java语言一丁点不好。其实做技术就是做权衡,“没有银弹”就意味着没有技术是完美无缺的,我们选择技术是在优势和劣势之间进行平衡后的结果。只有承认了缺点,认识到缺点,才能吸取其他技术的长处,来作出更好的权衡。
因此我一直认可的是,SQL Server的确贵,数据存储就用*nix平台上的吧。选择多,性能多。
当然,这不是国内技术人员的毛病,这是一个广泛的问题。很巧,李笑来老师昨天写了一篇博文,似乎刚好谈论了这方面的问题。文章很短,就全文摘录了:
无论是谁,一生中总是在不停地“选择”(姑且不论所谓选择之中有多少是真实的有多少是幻象而已)。每个人都在尽量在众多选项中选择“最好”的那个。一生有2n选择,可最终只有一条路属于自己。
走在自己正在走的那条路上,人们对其它可能性可以抱有两种态度:“好奇”——通常因对现状不满而表现为“后悔”;或者“自负”——更多人最终选择的是这个,因为另外一个选择所表现出来的“后悔”通常被认为是负面情绪,而与之相反的“无怨无悔”好像更加理直气壮更加毅然决然(尽管并不总是正确)。
时间长了,人们就不知不觉把“我一直在尽量选最好的”和“我选的就是好的”等同起来,进而外演为“与我选的不一样的选择就是不好的”,再进一步演化为“既然选的是‘不好’的,那他要么是笨,要么是‘坏’,反正跟我不一样!”
根源就在这里了。以自我为中心也好,过度自恋也好,沙文主义、大男子主义、狭隘民族主义也罢,都大抵上如此。
还有一个问题,之前也多次谈过,国内技术人员太容易轻视一个问题。例如在这篇新闻中不止一个用户觉得这个测试很无聊。为什么“无聊”?可能是觉得“这点性能不是关键”因此这个实验没有意义吧。我想说,其实最无聊的不是做实验的人,而是纠结与实验结果的人。或者说,无聊的不是实验,而是纠结于实验结果。与此相比,我反而强烈怀疑,轻易认为这个实验无聊的人,倒是真正只关注与“谁快谁慢”,而不关注过程和结果所表达出的内容。不去推测,不去思考。那么以后到了需要决策的时候,决策所需的依据从哪里来呢?应该都已经被“无聊”走了吧。
Joe的这几篇文章,以及我总结的时候,都刻意的详细列出了测试的过程和“运行性能”以外的结果。除了保持公正,客观之外,因为它们也是重要的数据。例如,我现在知道了在Windows上访问MySQL的驱动程序实现很差,而不同平台上访问PostgreSQL性能则相差无几。我知道,在Windows上进行大文件复制,受ACL影响性能较差。而如果关注Windows上运行PHP情况的朋友们则可以获得更多信息。
我不知道是不是国内技术人员的普遍水平较高,总是容易感觉国外的一些讨论无聊。例如有人讨论Java的原生类型时有人回复“是不是经济危机老美太闲了”。而上次有人和别人讨论ppt的缩写是怎么来的,就给软件最初的编写者写了一封英文信求证,老外非常详细解答了这个问题,还纠正了简称和缩写的差异。作者把信贴出来写了篇blog,原站上评论都是赞同。转帖评论齐刷刷都是骂该作者闲的蛋疼。
我不知道这算是学术态度的问题,还是只能说“对工作没有热情,对生活没有好奇”?在《原生类型》那片文章里,有朋友回复的好:
西方人这种看似无聊的争论才让他们达到了今天的高度,争论是不是一切量都可以用有理数表示,争论什么是运动,争论地球是宇宙的中心还是太阳是宇宙的中心,争论撒旦是如何诞生的,争论行星是如何运行。而我们很只注重实用,所以无法达到西方在理论上的高度,永远只能等别人争论完了,出结果了。我们拿来用用,仅此而已。
不过,嫌外国人无聊的人,往往也是嫌国内没有高技术含量的人。是不是很奇怪?
同样,Erlang之父Joe Armstrong写Why OO Sucks;Stephan Schmidt写Clojure vs Scala(上,下),Java平台语言Groovy创始人James Strachan认为Scala是Java未来的替代品,他和JRuby的核心维护者James Gosling、Charles Nutter对Scala vs. Java的话题讨论的不亦乐乎。这些都是在批评一个事物,或是在进行“语言比较”这一“无聊”的话题。那么他们是不是也都闲得慌了?
我在想,如果把他们的文章翻译过来,匿个名,或者让吉日嘎拉这样的“众矢之的”来发表,会不会被人指责不懂OO,不懂Java?您别说,我还真见过这样的事情,谁让国内翻译转载常常不留出处呢?
其实这又是个逻辑问题了,这近似于《常见逻辑谬误》一文提到“人身攻击及‘你也一样’”,也就是指并不关心问题本身,而是把论据转移到“对方”身上。其实,一个命题是否正确,和它是由哪个人提出的有联系吗?我们一直指责某些人“屁股决定脑袋”,可别人真的用脑袋说话了,我们每次还是盯着别人的屁股看。
如果用博客园里常见的现象就是,如果一个人在说比较微软技术和其他技术,而“恰好”那人又在说微软好话,又“恰好”那人是MVP。那么好,肯定会出现许多人说MVP是微软的托。我承认,有些MVP因为个人利益而会作微软的托。例如您现在在Google上搜索“MVP TFS”的第一条便是一则不光彩的事件。Ben Scheirman在一个TFS的MVP博客里回复说“即使有钱,也会用免费工具,因为更好用”,结果这条回复被删除了。对方私下写信说,这是因为他在用TFS咨询赚钱。
这不正说明MVP是托吗?不过这显然是MVP的个人行为,而不是MVP的群体做法。原因很简单,因为Ben自己也是个MVP,所以现在是“一个MVP说微软产品不好,其回复被另一个MVP删除了”。那么您说,MVP是否是微软的托?还有,您说我是不是微软的托?
同样道理,Oracle认证工程师说Oracle好,Rails爱好者说Rails好,是不是都是托呢?开源爱好者是不是开源的托?我还是认为,优秀的技术人员一定是有信仰的,也是有倾向性的。但是,他们的说得东西本身是否正确,并不以他们的倾向性而转移,那些东西的正确性是客观确定的。
我认为,如果社区要蓬勃发展,就要接受这种倾向性,并尽力保持客观的头脑,经常“换一种方式想问题”。我们要的不是和谐,而是争论,对客观事物的争论,而不是对个人的人身攻击。我认为,这方面我们做的还很不够,要继续努力。
文章来自:http://www.cnblogs.com/JeffreyZhao/
下一篇 浅谈 CSS 的定位和浮动