这里有一份我觉得值得推荐给大家的幻灯片(下载链接)。这个幻灯片是不久前举办的WordCamp China 2009上微软王超群的演讲,演讲主题是《熟悉的陌生人:微软对PHP的新支持使WordPress在IIS7上雄起》。WordCamp是业界著名的PHP大会,不过我这里推荐这个幻灯片不是为了为了推广PHP,而是为了说明一些其他问题——当然也有关于技术的有价值的内容,这些您看了幻灯片和我的文章之后就会明白了。
对了,之前我已经在InfoQ上写了一篇新闻报道了这次事件。不过新闻归新闻,目的是客观说明情况而不是发表个人观点。不过博客是个人地盘,我就打算在此畅所欲言了。
说到PHP,可能最容易让人想起的就是著名的LAMP架构(Linux + Apache + MySQL + PHP),而这全开放的平台似乎和“封闭”的微软技术距离比较远。不过微软其实一直没有放弃对PHP的“追求”,这次演讲谈的就是微软在这方面的努力,以及取得的成果。我推荐这个幻灯片的主要原因之一,便是它写的非常有水平,尤其是开头一部分。在幻灯片一开始阐述了微软对待开源的态度,希望和PHP的同志们拉近一些距离:
嗯,就是这个观点:“微软已经不是当年的微软了”,它变了,变得怎么样了呢?变得拥抱开源了:“开源的朋友们,不要看到“微软”两个字就心生厌恶,来,抱一个”。此外还引用了微软首席软件架构师Ray Ozzie(如果我没有认错的话)的言论:
I think any company these days, any technology provider, even Microsoft, has to find the right balance of being a contributor and user of open source.
我认为如今任何的公司及技术提供商,即使是微软,也必须在开源的用户和贡献者中寻找一个合适的平衡点。
如果说Ray Ozzie可能还是在“王婆卖瓜”的话,那么Linux创建者、开源领袖Linus Torvald最近发表的话语应该更有“参考价值”:
Oh, I’m a big believer in “technology over politics” ... There are “extremists” in the free software world, but that’s one major reason why I don’t call what I do “free software” any more. I don’t want to be associated with the people for whom it‟s about exclusion and hatred.
哦,我强烈认为“技术高于政治”……自由软件世界中有一些“极端主义者”,这也是我不再把我做的事情称作“自由软件”的主要原因。我不想和那些有排斥和憎恶心态的人产生关系。
这句话在有人反对“微软为Linux提交GPL代码以提高Hyper-V的兼容性”时说的。Linus的意思再明确不过了:“技术就是就是技术,不要有门户之见”。顺便一提,开源软件(Open Source)和自由软件(Free Software)是有很大区别的,不应该混为一谈。就我个人而言,我喜欢“开源”而不喜欢“自由”。我也不喜欢FSF觉得微软永远是错的,不喜欢它搞某些东西的方式。不过肯定也有人喜欢,每个人都可以有自己的观点。
好像有点说歪了。其实我也不知道微软是不是只是“口头”上讨好开源界,但是我至少看出,微软在想办法证明自己——不管这个证明是不是有什么陷阱,有什么“不可告人的秘密”。在这方面,微软至少在摆事实,讲道理,而不是随口说“我就是拥抱开源”。我觉得,在中学里学写议论文的时候,大家都应该已经知道就被告知论述的基本方式是“摆事实”,“讲道理”。可是从平时讨论的时候,我却又觉得根本不是那么一回事情。说句得罪人的话,我觉得许多朋友缺乏必要的逻辑思维能力,会产生非常多的逻辑谬误出来,但是却都还坚持自己是正确的。搞到最后,吵起架来彼彼皆是。而且往往在这个时候,无数匿名兄弟就跳出来发挥自己的聪明才智,各种讽刺挖苦谩骂的奇思妙语一个接一个,令人宛如置身于天上“猫扑”,人间“天涯”。
其实坚持自己是正确的不要紧,我也喜欢坚持自己的意见,谁不希望自己是正确的呢?但是要拿出理论根据来。其实作为技术从业人员,在许多问题上拿出根据来非常简单,例如写一个程序便知泛型会不会降低性能。如果有些问题很难用数据说明问题(如数据获取太难),那么至少也要找出一些别人的看法来支持自己的观点。如果一味地“我认为”,“我觉得”效果自然就大打折扣了。因此,我现在也经常会有意地在文章中引用自己或其它的人的说法,至少可以让自己有“底气”一些,而不会感觉像是在扯淡。
我个人比较反感“光说不练”的人,我希望看到的不是“个人说法”,而是多个人的观点,或者是实际效果。例如前几天有个匿名朋友在我博客上留言,偏要坚持“静态方法的调用会阻塞其它线程访问”,我说“你试试看就知道了”,他也原样复制一遍发回给我,针锋相对,不屈不饶。不知道他最后是否认为他达到了论证“我在误导初学者,为自己的书作广告”的目的(我写过书吗?),至少我当时,既无奈,又窝火。
既然谈到了技术,那就再谈远一些。这位认为“静态方法的调用会阻塞其它线程访问”的朋友证明了他自己在某个方面学的有问题,而我前几天发表的Double Check文章中,有许多朋友提出“怎么能lock在一个实例字段上”,“应该lock在一个静态字段才能产生效果”。换句话说,在这些朋友看来,一个实例方法是不会产生线程安全问题的——虽然ASP.NET MVC框架的DefaultControllerFactory就出现了这样的毛病。这说明了在多线程开发方面,社区的整体意识还处于一个非常薄弱的程度——希望我这么说不会引起各位的不满。
此外,昨天我意识到原来很多朋友用了很久的for却无法写出其等价的while写法,又想起之前发现公司里的大部分同事不知道C#中使用@开头的字符串表示法中如何包含一个双引号。这应该都是基础中的基础,应该人人知道,不是吗?但事实就是让我感到惊讶,许多朋友认为自己不停地在学东西,ASP.NET MVC、Sliverlight,WPF一个一个地学,但是最后最普通的东西却不知道。结果工作找不好,薪水拿不高,最后一崩溃又开始叫嚷着这个行业没前途。那么,有没有想过换一种思路来学习,例如,不要随意轻视一些东西?
说到这里,我又想起其它一些事情,那就是我觉得如今社区里的“风气”出现了比较严重的问题。例如最近不止一次发生围攻面试者的“群体性事件”,每次有人发表面试对方的题目之后,就有大量朋友上前表示不满,对于简单的题目认为太基础了,考不出能力。对于困难的题目,就认为它太难,钻牛角尖,“又不是在招算法研究人员”。总之我发现,似乎只要是遇到了回答不出的问题,都会遭到许多人的反对。似乎社区中许多朋友都认为自己怀才不遇,“我来面试你,你也过不了”,都认为“千里马常有,而伯乐不常有”。有朋友问我,你面试别人时问些什么?我难以启齿啊,因为我问的往往也是那些问题,可是一下子就被鄙视了。其实没有什么东西是简单的,有时候问问题并不是要得到结果,而是想从中看出一些细节来,例如一个人的思考方式和深度——我问某某和某某在写法上的区别,不是在搞“茴香豆”,是由其他目的。不知您是否相信,我在面试时会让对方谈一下最喜欢的体育运动的规则?
最近似乎认为我“无聊”的朋友也多了起来,认为我写的东西没有什么实际意义,认为我写这些东西都是在“炫耀”。其实,我的文章都是源于实际工作中的想法,我认为对于实际工作是非常有帮助的。我不喜欢《XX编程三百例》式的文章,我认为那是“鱼”而不是“渔”。我不知道那些朋友希望我写什么样的文章才算有实际意义,但是我想最有意义的应该是提高您的能力,而正是如此,我认为您更应该关注我在成长过程中想到的这些问题。轻易鄙视这个鄙视那个,就好像鄙视面试者那样,这可不好。鄙视一个东西不要紧,但关键是,你思考了没有?不要鄙视了半天,但是到最后也不知道发生了什么事,盲目地忙碌。
思考很重要,例如换一种思考方式就会得到不同凡响的结果。至少,这也是锻炼逻辑的一种有效方式。想要验证自己想清楚了没,我认为最好的方式就是写一篇文章。如果您想明白了,一定能把它说清楚。反过来说也一样,如果您说不清楚,基本上就是因为您没有想明白。
说了好多,越扯越远,喝口水,回来继续吧。
PPT的正题自然是讲述微软在PHP平台上做出的努力和取得的成果,其中列举了之前与康盛创想合作进行的性能评估结果,证明在Windows Server 2008 + IIS上运行PHP,从平均相应时间,每秒处理的请求数,以及数据吞吐量等多方便均显著优于Linux + Apache的托管方式。当然,这个结果也受到了一些质疑,例如为什么在Apache中使用了mod_php而不是在大多数情况下性能更好的FastCGI。关于这点我没有测试过,我不清楚。不过这并不要紧,我想说的是:Windows的性能真的不差。
这也是幻灯片的截图之一。从中可以看出IIS 7的吞吐量完全可以达到静态文件请求20K,ASP.NET请求5K RPS(每秒请求数)的吞吐量。这是100%的事实,我可以担保,因为在我07年在微软的时候,曾经在自己工作用的普通 32位workstation上试验过,请求静态文件轻松超过了10K。算上IIS 7的性能增强,以及测试机的性能因素,得到上图的结果完全没有问题。至于ASP.NET动态请求的性能,5000多完全就是一个没有意义的数字了——我不是说它假,我只是说它没有意义。因为对于动态请求来说,纯粹比这种“空请求”的吞吐量,几乎没有任何实际参考价值。因为,我们有其它的性能瓶颈,根本达不到IIS本身的性能限制。
对于普通Web应用程序来说,如果在实现上没有大的问题,几乎不会让Web服务器(指IIS这种,不是指“机器”)成为性能瓶颈。性能瓶颈往往是在外部服务器调用,或者外部数据访问上。例如耗时的SQL查询一多,应用程序整体性能自然就下来了。因此,业界最为热烈的讨论往往是基于“缓存”和各种数据存储方式的,因为到目前为止它们都是最有可能成为性能瓶颈的。对于Web服务器本身性能的讨论也不是没有,只是相对就少很多了,要有,大部分也是基于静态请求的性能比较。
对于Web 2.0的网站来说,由于变化太多太快,几乎无法生成静态页。因此,这样的Web应用程序在一台机器上的吞吐量根本达不到5K,即时是1K也几乎做不到。在一台目前普通配置的服务器上,如果可以达到每秒100多的动态请求,基本上已经做的相当不错了,甚至50、60多也已经“够意思”了——像当年豆瓣鬼神般的5、600(如果我没有记错的话)几乎难以再现。不过100 RPS也已经是一个很了不起的数字了,如果按6小时的密集请求来算,您想一下这样一个动态站点的日访问量是多少呢?
当然,Windows不是没有性能问题,我只是说在IIS,Web开发等方面不会出现性能问题。有人说Windows的文件系统,也就是NTFS的性能很差,尤其是在处理零碎地文件时候。这我也有所耳闻,平时也有类似的感觉,但是没有经过这方面的实践,所以并无法说出准确的结论。不过真的性能差,也要去好好了解它,这样我们就可以设法避免一些薄弱的环节。随意举个例子,我们可以优化自己程序的存储方式,尽量读取连续的数据,让文件系统的性能问题可以缓解一下。SQL Server不也是在NTFS上构建出高效数据应用的吗?
使用Windows系统的另外的问题,也是被人提及很多次的问题,便是授权协议。Linux使用是不要钱的,而Windows是要花钱买的,这个自然应该算入成本。不过在我看来,其实Windows并不贵。为什么呢?您可以去Dell的网站上看一下一台预装了Windows Server的服务器的价格,一个Web Edition的Windows Server操作系统的价格大约是3000多元,这也就相当于一个普通程序员1个月的薪水而已,更何况操作系统可以算作是一次性投资。对于一个公司来说,每天开一次门就相当于几千几万的钱花出去了,购买一个Web Edition的Windows Server价钱根本算不了什么。至于开发成本,这是一个太“虚”的东西,暂时就不讨论了吧——我想,应该也没有什么理由可以有力证明使用ASP.NET会加大开发成本。
事实上,Web Edition已经足够部署ASP.NET应用程序了,Enterprise Edition自然要贵上十几倍甚至更多,但是您根本用不着。用盗版操作系统时带来的坏习惯“要用就用最好的”,在产品环境中一定要改一下。哦,对了,微软对于年收入低于100万的公司,或是非盈利机构都有非常大的折扣,甚至免费的策略(如BizSpark计划)。您不应该错过。
因此我认为,在Windows平台上使用ASP.NET,是一个非常合适的Web应用程序开发/运行平台。即时是对于创业型小公司来说,我也会选择使用Windows + ASP.NET。
但是……微软平台上的授权价格并非总是个可以忽视的问题。因为SQL Server实在是太贵了,而免费的Express版本是不可以用于商业应用的(存疑,求证)。如果我们想要使用SQL Server,那么成本的确会哗哗地上升,尤其对于创业公司来说这是比不可忽视的支出(当然如果加入了BizSpark计划……)。因此可以这么说,运行ASP.NET的Windows很便宜,但是SQL Server,以及运行SQL Server的Windows会非常昂贵。因此,对于数据存储来说,我会选择Linux下的免费及开源的产品。而且我可以有更多的选择,无论是关系型数据库,键/值存储方式,还是现在慢慢再兴起的如MongoDB那样的无架构,文档型数据库,都可以合理组装使用。
所以我现在越来越推荐Windows + *nix的合作关系,至于在Windows和*nix项目的通讯问题上,其实丝毫不用担心。如今各个项目都是基于标准的通讯协议(如TCP/IP,甚至HTTP),使用通用的或自定义的格式进行数据交换。对于一个Linux下的数据库来说,它根本不会关心与它连接的是Windows还是Linux,也不会关心发起调用的是.NET还是Java,Python或Ruby平台。大家根据协议办事即可。
那么为什么业界总是认为Windows性能差呢?原因可能是因为微软的“声誉”不太好,而业界声音最响,最为活跃的大都是开源工作者或自由人士,他们自然会不遗余力地支持自己的环境——这很正常,优秀的程序员一定是有信仰的,我一直这么认为——当然也会产生一些不客观的FUD行为。还有便是,Windows进入服务器领域时间比较晚,而且在IIS 5那些年代,Windows在服务器领域的表现的确不怎么好。因此,那时候留下的负面印象自然也会产生不好的影响。但是微软是在发展的,微软牛人非常多,微软研究院的论文年年占据各大会议相当比例,而微软的产品的质量也已经足够了得了。如果继续用10年前的印象来判断如今的微软是不正确的——当年微软系统在服务器这块没有丝毫占用率(几乎都是Unix,Oracle的天下),现在已经占据中小公司80-90%,世界五百强50%的份额,这还不够说明问题吗?
关于这点,作为Windows平台下的程序员,我们应该有足够的自信,管别人怎么“怀疑”我们呢。
对了,还有一个可能的原因是由于微软的技术太容易入门,导致给人不够“牛逼”的感觉。这也是没有必要的,就好比说,一个国家的初等教育水平高,能证明它的高等教育水准不行吗?这只是定位的问题,当然这可能也是微软的策略——但不是微软的错,也不是微软技术没有价值的证据。当然,作为Windows平台上的程序员,提高自己的能力是没有错的。不光没有错,是一定必须要这么做的!
不过必须承认的是,Windows有个硬伤,就是您无法在上面捣鼓某些东西,例如换一个文件系统,改一改内核。如果你是热衷于这方面的Geek,那么自然不适合使用Windows。
最后,还是用幻灯片里的内容收尾吧。在这份幻灯片的末尾附有30多页的IIS Web应用程序配置最佳实践,是一个非常不错的参考,您一定要看一下。
就写到这里吧,虽然结尾有些仓促,但我真的已经很困了。