很多年前,我刚入行的时候,曾经听说过一个前辈说起过一个小故事(据说是亲身经历)。在90年代中晚期,国内的软件产业还比较薄弱的时候,那位前辈工作的单位是以代码行数来计量工作量的。为了达到更高、更快、更强的目的(呵呵,借用一下奥运会的口号)他们编写了大量稀奇古怪的无效代码,比如声明N多不用的局部临时变量——反正这么做也会被编译器给“优化”掉,不影响运行效果和性能。过了一段时间之后,BOSS发觉不对劲了——每个人每天的代码量都很高,但是开发进度却始终快不起来——于是这些小手段就被戳穿,而改为根据CPU占用率来考核。当时最先进的奔腾2(或许就连之后很久的奔腾4)也不够现在一部手机的CPU彪悍的,用五六行代码写一些无意义的死循环就能让可怜的CPU满载运行老久的了——于是,这位前辈及其同事们显然又得逞了一段时间,直到BOSS也懂了一点技术,开始改用功能点数量作为考核依据!
众所周知,今天的CPU已经成为电脑中性能过剩最为明显的一个部件了,一般家庭用户也开始知道升级内存、加大宽带、增加硬盘要比升级一颗CPU更能产生更加明显的效果——因为,现在即使是大型游戏也很难将一颗主流CPU占用到100%(显卡超烂或者没有显卡的情况除外)。那么,从某种意义上说,开发人员关注程序性能真的是一件十分无聊而且浪费精力的事情了。
实际上,我目前所处的这个外籍团队,确实并不关注软件的性能。不关注性能的理由实际上也确实挺有道理的:
在我们的项目立项之初,我曾经问过我们CTO(就是之前提过那个50多的瑞典老头)为什么选用c#、WCF、Asp.net、Sql server等技术?
瑞典老头呵呵一笑,开始摆谱了。他说他当年从七八十年代做起,干到现在,他见过的技术体系中,只有微软的最为系统、支持最好!我当然不满足于他倚老卖老的答案,开始针锋相对的问:我们用Linux平台、oracle数据库不是更好吗?毕竟我们现在的数据库都有300G以上,用Oracle提供高性能应该是合理的!于是白人CTO开始认真回答我的问题了:首先,使用一家的微软产品体系,出了问题易于得到服务、而不用担心不同厂商之间互相推诿(他指的显然都是正版);其次,各种语言、及各种数据库之间的性能差异,大到了不可容忍的地步吗?
这两个理由是相当过硬的!
一个作为商业运营的项目,最怕的事就是出现了问题互相推诿——这种情况我遇到过绝对不止一次,经常遇到互不承认自己有问题的麻烦情况。而Oracle和SqlServer、c#与Php/Java的性能差异,真的不是差不太多——而如果要比较开发效率,c#+sql则比那些“杂牌组合”(此处无贬义)高了不少,而且更容易招募到合适的人手——不信大家可以参考一下一个Oracle DBA和Linux Admin的工资。
因此,我感觉到老外的理念中,在服务保障、易维护性与性能做取舍的时候,性能是可以舍弃的一环。而国内IT公司(还有很多客户)对服务、维护的意识还很淡薄,而且也普遍没有正版意识——所以我们似乎根本没有过在这两者之间做取舍的疑问,这个可能也是我们的差距之一吧!
再者,不同语言之间的性能差距,其实真的不算很大。据测试,c#和c++比,性能差距大约也就在10%以内;而众所周知“高性能”的Objective-C,性能其实是很糟糕的,是纯靠编译器优化以及高速缓存的使用才会看起来拥有很高的性能。另一方面,就算你用了公认速度最快的汇编语言来写程序,一个劣质的算法就能把性能弄到很糟,甚至越是高效的汇编/C语言,越容易产生溢出漏洞,反而是有垃圾回收器的Java和c#显得更加稳定可靠,对不对?
另外一些不得不提的技术是大家都知道的面向对象编程(OOP)、面向对象设计(OOD)以及程序分层结构(传统意义上分三层比较经典),还有关系型数据库到对象的转换过程(O/R mapping)。以上术语我不做过多解释,因为我想尽量避免技术细节以便让更多“局外人”也能够阅读本文,比如市场、管理、行政人员——他们往往是软件的使用者、开发计划的制定者、开发人员的管理者。
上述这些技术术语都意味着同一件事情——性能下降!曾经有一位新加入我们团队的同事大叫着去问老外们:为什么做一个这么简单的查询,我需要写十几个类?这么写性能不是很差吗?
老外的回答超淡定!第一个问题的答案是:这样每个类都很小,很容易理解这个结构中的每一个组件。后一个问题的答案是:我们不是有超强的CPU吗?
不要笑,老外们依赖于超强的CPU并不是什么坏事,毕竟硬件厂商确实为我们提供了超强而且廉价的硬件设备。这年头随便一台智能手机的CPU都比阿波罗登月时代NASA的工作电脑要彪悍许多倍,在硬件的技术进步面前我们为什么要停步不前呢?
小结一下:软件的性能往往会被作为评价一个软件质量优劣的重要因素,但是很遗憾,性能不是唯一因素,也不是最主要的因素。
随着技术的发展,随之提升的是软件开发的管理和控制手段的进化。因此:
写到这里,我又想起我去年做过的一个项目来了。
那时候,我在一个武汉本土公司上班,典型的国内开发环境,我一个人独力实现一个简单的考试系统。大意上就是把考试题库什么的放在公网上;然后在各考点的考试服务器上同步题库进行考试。考点服务器和考生之间是简单的b/s架构。完成这个东西大约用了我3周时间,然后就是噩梦般的一个月使劲修改之!
为什么我要使劲修改它呢?它的功能运行大体正常,比较头痛的问题在于,各考点都不能提供一台像样的服务器用于考试。基本配置就是赛扬3.06G、普通台式机硬盘、4G内存——这可是2011年啊!任凭我如何使用服务器端缓存、把各种功能改为javascript放在客户端运行、修改考试计算的算法,最终都无法承载200人同时考试的压力!而我提出的,“至少用I3 CPU主机”的方案,迟迟得不到任何领导的批准!逼于无奈,把B/S架构改为了C/S架构,用WPF写了一个数百K的小程序,放在网页上做了一个链接。考生打开网页,下载考试端程序然后运行,终于把服务器性能不足的问题“妥善”解决——而此时的领导还不痛不痒的说“瞧瞧,不用花钱总归还是有办法的吧!别老想着花钱买新机器,那是不可能的!”
由这个故事里,国内同仁们是不是或多或少产生了某种共鸣呢?
洋人在性能方面的大手大脚,源自于软件管理手段的提升、硬件性价比的提升,以及正版售后维护观念的深入人心。而这几点国内的同仁可能就不那么乐观了:管理手段较之欧美而言,可算是比较低下的;硬件固然廉价,却因为折旧跌价太快而不被“穷怕了”的中国老板们接受;而盗版问题,就不做太多评价了——某种意义上说,我们不是盗版的受益者,而是受害者!
好吧,本节总结一下:单反面强调性能有可能意味着你还没有脱离编码(coding)的境界(热衷于竞技性编码比赛者除外),而软件早已产业化、工程化,所以在某些因素面前,我们是应该适当放弃性能的,比如在小结里提到的几种情况。但是另一方面,作为一个技术人员,依然需要掌握与性能相关的各种技能,以便在没有彪悍硬件设备的时候依然可以“绝境逢生”
性能是个很大的话题,本节写的很乱,大家谅解!
最后的最后,顺便说一个关于性能的小故事,当然,只是故事而已。这些年来,一直有人在提Wintel联盟阴谋论这样的说法:即微软故意让windows每一代新品都拥有更低的性能、更大的资源消耗,以促进同盟Intel的新款CPU产品上市销售——持这种观点的人士甚至能言之凿凿的指出:微软的Xbox游戏机只是一台基于奔三CPU的windows2000,却可以运行所有主流游戏,而同款游戏在现役windows平台上表现则惨不忍睹甚至无法运行云云。
呵呵,故事就是故事,这个小节里已经写了不少故事了,信不信由你吧!
2012-05-28 22:57:19