观止-微软创建NT和未来的夺命狂奔
Showstopper!: The Breakneck Race to Create Windows NT and the Next Generation at Microsoft

"Showstopper"这个英文单词很有趣,在观看戏剧或其它演出时,人们使用这种词来形容节目格外精彩,让人拍手叫绝,以至于被观众的掌声和喝彩声打断,不得不等人们安静下来后才能继续。在日常用语方面它也是一个很好的词,人们用它来形容超乎寻常的美丽和迷人。但当这个词被引入到计算机特别是软件领域后,它的含义发生了根本性的变化,它代表的是最严重的问题。因为在软件领域人们经常使用臭虫(英文名为bug)这个词来称呼软件中的瑕疵或者问题,并根据严重程度,将臭虫分为若干等级,而"Showstopper"用来指最严重的那类臭虫,它如此严重以至于影响了产品的核心功能,不解决它产品就不能用。如果是在开发阶段,Showstopper的存在就会导致产品不能发布,其他很多工作也无法进行,整个项目不得不延期。

卡特勒体现了今天工作场所冷静的一面。他拒绝承认工作和休闲,职业和家庭,住宅和办公室间之间的差别,他非常严厉的道德规范奇怪地令其助手们兴奋。他展示了这样一个世界:伟大的成就在阴冷的背景下出现,把懒散困惑没有竞争力视为敌人,每个团队都渴望超越自己的弱点。“工作非常非常艰苦,”卡特勒说,“若干年以后,这个团队的人回过头来看的时候将充满自豪,他们会说这是我有生以来最大的成就,我的生活从来没有如此简单,我不用担心自己的职业生涯,不用担心自己的幸福,也不用担心能否处理好与老板和朋友的关系。我只有一件事情需要关心,那就是交付这个产品,并且尽自己所能做到最好。”

后来IBM很快TopView抛弃了,不过这次并购的最大益处,是把聪明人带到了微软。麦沃尔德和盖茨十分合拍,不久后这位物理学家完成了一系列关于软件业发展趋势的生动的备忘录,大大刺激了盖茨的好奇心,在其中一份备忘录中,麦沃尔德主张微软的现金奶牛DOS面临着两个近在咫尺的威胁。第一个威胁是新型芯片,很富潜力,速度比英特尔芯片快多了,但英特尔芯片又是DOS和它所有应用程序的“用武之片”,超速新型芯片是由名为RISC(精简指令集计算机)技术支持的,这种技术使芯片可以集中于执行普通操作。万一RISC芯片取代了英特尔在个人电脑里心脏的地位,微软帝国很可能会崩塌。第二个威胁是一个名为Unix的操作系统。自从10年前,AT&T的贝尔实验室发明了Unix后,它便逐渐受到科学家,工程师的欢迎,甚至受到了一些企业的宠爱。Unix主要有两大魅力:一是技术,这个系统可以同时处理很多计算任务,很容易与其他计算机连接,而且不需要修改大量代码,就可以工作在其他任何类型的硬件上;二是实惠,实际上它是免费的,AT&T拥有Unix的核心技术,但它允许其他人去改编和扩充Unix,而只是象征性的收取费用。这鼓励学者和工程师们去完善Unix,许多公司开始销售装着各种Unix操作系统的电脑。

卡特勒对它的操作系统有三个期望(可移植性,可靠性,个性化/运行多种子系统)。可移植性:这可是软件业的圣杯,创造一个可以适合每一种硬件的操作系统。当时每种商业操作系统都是为特定系列的芯片而量身定做的,所以只能在装载这些芯片的电脑里发挥作用。程序员用接近于目标硬件的汇编语言写了大量代码,将软件和硬件联系在一起。当硬件成本远大于软件成本时,没有人会介意这些。不过后来,当消费者发现在应用程序上的投资大过于购买硬件时,他们就不愿意抛弃他们已经安装的但已过时的应用软件,NT便是创造一个通用系统的机会,他将在电脑世界开创一个新纪元。

卡特勒对大团队的偏见是可以理解的,他预见到了把自己分散的太广的风险:他承担的越多,他觉得他能交出有质量的东西的可能性就越小。不过在软件日益复杂化的年代里,他对小型团队的痴心是一种不合时宜的错误。盖茨希望卡特勒会意识到“这个产品总的来看正在变糟”,除非某个和他水平相当的人填补上了管理缺口。

一些测试用不上一分钟,也有一些需要哼唧几个小时。所有测试结果都会被记录下来,然后进行分析,提供充分的素材来满足推理的需要。通过一个简单的搭档系统,测试员会始终跟踪同几个程序员的代码,以便可以更快的领会它们的代码。曼西姆告诉测试员要努力钻研每个缺陷,对某个部分代码正式提交“报告错误”之前要做深入的研究。程序员喜欢把错误报告当作测试员头脑发热时幻想出来的东西而枪毙掉,因此曼西姆激励大家要在提交报告前,做尽可能多的深思熟虑。“这样的谨慎对于增加程序员对我们的尊重是很有意义的。”

卡特勒自己也没有免受批评,其中之一来自于纳维简恩(Naveen Jain)。1990年春季,简恩被安排过来监督nt的两个部分-内核和图形-的融合情况。简恩是一位项目经理,他的工作是为NT提出让客户激动的新功能和让客户满意的修改建议。在微软,项目经理帮助定义产品,尽管他们不写代码,他们的影响力是相当可观的,甚至有时候超过了主要代码设计者。但是他们主要依赖的是劝说,他们没有权利命令程序员去实际完成他们的想法。不过,当员工们不肯配合时,项目经理可以雇佣合同工来编写他们想要的代码。理想情况下,项目经理是来自市场的使者,代码编写者集中精力去完成项目经理定义的产品时,项目经理会研究竞争对手的产品,从竞争者那里收集产品的亮点,并从潜在用户那里征求意见。如果一种微软的产品上市时缺少客户喜爱的功能,那么项目经理需要解释,为什么没有包含这样的功能。有时,他们缺少技术或其他方面的判断力,但是他们至少可以让程序员们对他们的目标作出裁定。

卡特勒有很多把柄在项目经理手里,导致他无法回避他们提出的不受欢迎的建议。根据去年10月份的日程表,NT的所有代码应该在1990年7月写完,现在看来这个计划已经超过期限没有希望了。图形方面的困境和MIPS处理器的发布延迟意味着NT团队只能努力在年底时完成代码的。让事情更糟的是,还有人怀疑NT的基本设计,称为客户服务器(client-server)模型。这个设计意味着OS/2环境位于内核的外面,实际上是被当作一个应用程序:有问题的应用程序几乎不可能破坏NT的其他部分。但是客户服务器模型减慢了性能,因为子系统必须与内核来来回回的通信告诉内核应用程序要做的事情。这会给NT增加一些耗费时间的操作过程,但是卡特坚信他的团队会战胜这些困难。而且,即使nt运行应用程序的速度比正常略微慢一些,那也是值得的,他这么认为。毕竟,可靠性是它的重要目标。因此,当在“必须在可靠性和速度之间选择平衡时”,他会说没有任何理由容忍不稳定。

尽管感谢米勒的热心,但卡特并不认同“他的团队是在完成一项历史性的任务或者nt是最后一个什么”的说法。固然NT的目标非同一般,但是这个操作系统也很难标志一个时代的结束。他宁可相信NT是未来众多的操作系统之一,可以提供多种个性化的应用。而且他非常了解计算机行业的前沿信息,知道有许多软件可能目前还没有开始筹划,但他们总有一天会超越NT。最重要的是,他知道人们操控信息的方式已经有了根本的变化,这种变化可能导致更加复杂的操作系统诞生,充其量NT可能成为这些新系统的基础,而这些系统大概会在下世纪早期成为标准配置。

米勒收集了一些笔和本子,两周的补给,准备用他的28英尺帆船来一次旅行。米勒觉得规格书的编写最好在一个人迹罕至的地方,而大海是最好的选择。但是他做过很多的规格书,知道“如果你完全与世隔绝的做什么事情,就无法做到最好,你至少需要有人可以给你点反馈意见”。木村显然是个好伙伴,但是他来不了了,他还要处理其他的文件系统。但米勒也没有独自去航行,他让皮亚佐利(他正式负责文件系统)安排了一个自己非常了解的程序员加入进来。

随着更多的程序员开始吃狗粮,他们对NT的粗糙感到惊讶。“要在NT上完成什么事情的难度,真是让人目瞪口呆。”有人说,“好像每次敲NT命令都不能正常工作的,你不得不先离开手头的工作,去找到出错的原因。”这意味着要去询问相关的同事,从而导致每天工作被打断的次数陡升,很难写出任何新的代码。NT核心代码的作者们经常发现自己被一些神秘的程序问题包围着,不管是不是他们的责任。几乎没有人喜欢这样的中断,但卡特勒认为这是不可避免的。现实的担忧使得他在心底成为一名渐进主义者,即使代码是建立在最好的规范和设计基础之上,通常也只能每次改进一点点,这是一个冗长乏味的工作,大家都尽量躲着。所以卡特喜欢骚扰那些被他怀疑是“总想写新代码,但却忘了昨天错误”的程序员。

每个构建都是NT在一个特定时间的快照。完成之后,一个构建会标上数字,然后同时分发给测试人员和程序员,他们很快就能知道最新的构建是否比上一个版本有所改进。人们常常会想起一些非常强的构建,有时候,程序员一直使用那些构建,直到确实有更好的出现才会更新。卡特勒不允许这么做,他希望人们在每个新的构建上工作。作为原则性的问题,他希望构建尽快更新。构建来得越快,测试人员就越能早的开始对其进行测试,程序员就能越早的开始精炼代码。因为真正评价代码的唯一方法就是运行那些代码。

在这份啰嗦的邮件中,卡特勒没有提到他的一个巨大失望之处,NT的Comder发布版本只能在英特尔的X86芯片上运行,它是标准PC的中央处理单元.团队的目标是创建也可以在英特尔竞争对手MIPS的RISC处理器上运行的NT。有两种风格的NT,团队就可以建立这个操作系统的可移植性,这样就可以证明NT经过适当的配置,完全能在其他芯片上运行。虽然英特尔和MIPS版本的程序代码只有微小差别-大约有5%的代码是针对每个芯片量身定做的-但它们在功能上是完全相同的。这意味着无论用户使用的是英特尔还是MIPS的PC,如果它们使用相同的应用软件,看到的会是同样的结果。此外。NT也可以很容易适应新的芯片。这对用户来说是件好事,因为这保证了他们现有的软件在未来的芯片中还能运行。

从项目开始起,卡特勒就强调了先后开发NT通用版本的重要性,这让程序员们很老实:强迫他们用可移植的语言编写代码,而不是用于芯片相关的汇编语言。卡特勒骄傲地自称为MIPS先生,他对专为MIPS芯片设计的NT版本十分热心,在某种程度上也是因为卡特勒在这方面是先行者。以前没有程序员把PC软件放置在快速的,新奇的RISC芯片中。另外的原因是战术上的。卡特勒怕面子版本会遭到轻视,除非有像他这样身份的人来重视这件事情。如果放弃对兼容性的要求,可以很容易的将NT适用于英特尔的X86芯片上,而且还能获得更好的性能。

过了一段时间,福吉林转换工作来编写用户手册。经常有人讽刺说,如果和一个随时准备着圣经的宗教疯狂者一起来钻研技术手册,那么从字上面的文字中,可以探寻出许多奥秘。一本有价值的手册可以让一个软件更有用,因为大多数手册都很糟糕,所以好的手册很很引人注目。一般的客户很少会在乎手册的艺术性,他们心急火燎的寻找让程序工作起来的指令。但是真正了解程序的专家写文档时总是囫囵吞枣,这对操作系统来说尤其贴切。在DOS的软件包装中附带了一本手册,但它还是孕育出了写作入门图书的手工产业。独立出版商们或许有天会详细解释NT是如何工作的,但是在那一天到来之前,无论是应用程序员还是普通用户都还必须依赖微软的文档。

尽管卡特勒深知NT确实太大太慢,但是他坚决反对把结束日期向后推。他向马瑞兹说了他的理由:对于像NT这样复杂而强大的程序来说,对其做润色和改进工作是没有止境的,它内部纵横交错四处蔓延,以至于“一个人的头脑中根本无法领会它的全部”。此外NT差不多达到了他期望的目标,如果微软不加进来那么多新手让他分神,他推测说,那么他可能已经发布了更好的版本。NT的问题没有哪一个是时间无法治愈的。性能不好是大多数新程序的通病,软件的历史充分证明了这一点,从IBM或者360到不同风格的Unix,再到微软的Windows,几乎所有划时代的系统都是在不成熟的状态下就发布出来,然后逐步演进并赢得广泛的认可。事实上人们会预料到一个新软件的第一个商业化版本可能包含各种缺陷。

对于目前的情况,卡特勒胸有成竹。他以前有过接生一个大操作系统的经验,他知道在这个阶段不需要什么特殊的本领,就可以找到NT的不足。更重要的是,NT目前的情况与卡特乐构建代码的哲学是相符的。他的观点是:“总是要先把事情做对,让其可靠,然后再顾及性能。一边往前走一边逐渐加入修饰和润色,这是我喜欢的做法。”

斯托维尔和布特兹之间的这场对峙反映出了相互争论战科技领域中的意义。在观念和风格方面的冲突,会慢慢激发成为创新的源泉。因为程序员做设计时主要依赖逻辑和数学,所以他们在做技术决策时常常小看了人性的作用。使用一成不变的方法能做出创造性的发明只是幻想。总是有很多方法来达到大体相同的技术目标,技术方向的选择经常是与人相关的。尽管商业方面的考虑会影响技术决策,但是技术决策仍反映了人的价值观念和心理状态。卡特勒看到了允许每个人有不同技术观点的好处,他很少会抑制冲突。通常他遵守皮里奥(E.R.Piore)的格言:“冲突会给实验室带来生命,没有任何冲突的实验室不再是一个好的实验室。”

卡特勒与臭虫作战方面的领导力,可以算是他对这个项目的重大贡献之一。他的技术方面的想法大多是借用过来的,要么来自于他以前的经历,要么来自他人。他对创新似乎存有敌意,很多次拒绝新的想法就是因为不熟悉而产生的误解。不过他认识到了其他人没有深刻认识到的关于大型软件的真理:软件可能导致灾难,这意味着代码编写者在做工作时必须坚信,任何差错都不可避免地会危害他们,如果不是现在那么就是将来的某一天。这个这种思想上的严格要求是恰如其分的,与臭虫斗争中是很可怕的活动。相对而言,改善性能好像是做外科手术,而修正臭虫则是直接交手的血腥格斗。