重温微软一代经典操作系统的诞生:200 位程序员的苦难与欢愉造就了 Windows NT
重温经典。本文回顾了微软首个服务器操作系统 — Windows NT 诞生背后的故事。
当时,200 多位开发者在大师的带领下对抗疲劳和恐惧,努力打造伟大的创举—并祈祷避开不可修复的错误。
华盛顿州雷德蒙德市,1993 年 5 月 26 日。
David Cutler 穿着白色锐步鞋、白裤子和印有“Over the Line”字样的 T 恤,冲进微软公司构建实验室(Build Lab)的大门。
Cutler 先生是一个矮胖、秃顶的男人,性格与传奇的亚哈和布莱船长有一些相似之处。**他正在检查为桌面计算机设计的,有史以来最大、最复杂也可能是最重要的程序的进度。**但他的脸上没有一丝喜悦。
现在是 5 月 3 日星期一早上 10 点 20 分,这个名为 Windows NT 的程序的每日“构建”还没有完成。作为 NT 团队的负责人,Cutler 先生坚持要求每天早上在机器上拼出一个新的 NT 构建,或者说测试版本,这样他的程序员就可以“享用自己做出来的东西”了。
Cutler 先生的怒火来自于进度的拖延,来自于前一天那个糟糕的测试,来自于整个世界。他对着一个屏幕盯了一会儿就冲出了实验室,身后是一片萧杀的气氛。Kyle Shannon 和 Arden White 两位构建员拿出一大瓶抗胃酸药,一人吞了一片。刚过早晨,这一天已经毁掉了。
几分钟后,Cutler 先生回到构建实验室,脸色看起来更加沮丧。“你们搞不定这该死的东西,整个上午就白费,”他厉声呵斥。
这位 NT 项目负责人不喜欢压制情绪。“要解除压力,你就得把它释放出来,”他说。他也的确是这么做的。Shannon 先生指向门旁墙上画的一个圆圈——就在那里,Cutler 先生曾猛一脚踢穿墙壁并弄伤了自己的脚趾。
几个月前他 50 岁生日的时候,Cutler 先生的团队送给他一块裱装起来的办公室墙壁,结果有一次他因为新版本无法在他的计算机上运行而怒火中烧,毁掉了那件礼物。
红色代码
Cutler 先生的急躁算不上绅士风度,但也可以理解。
对于他和大约 200 名将 NT 带入自己生活的开发和测试人员来说,唯一重要的事情就是时间。这款产品的进度晚了六个月,而周一它已经正式发布了,微软计划在 60 天内开始向客户发放数十万份副本。
未能在截止日期前完成—或者发布一个漏洞百出的 NT—会让一款被许多人认为是有史以来最雄心勃勃的计算机程序声名扫地。
NT 由惊人的 430 万行代码组成,开发成本超过 1.5 亿美元,目标是为微软及其盟友征服全新的世界。
NT 的支持者不仅希望这款程序可以用在速度更快的个人计算机上,还希望它能够助力新型 PC 网络从此崛起,从而取代成本高昂的大型机和小型机。
Digital Equipment Corp.(DEC)的目标是借助 NT 成为领先的 PC 制造商,Compaq Computer Corp.(惠普)则剑指工作站制造商,而美国电话电报公司的 NCR 希望成为大型机的廉价替代品制造商。
微软的首席执行官威廉·盖茨三世对 NT 寄予厚望,期盼它能一举击败另一家非常成功的软件先驱 Novell Inc.的网络程序,打破后者的垄断地位。 NT 还能为英特尔公司巩固 PC 微处理器市场近乎垄断的优势地位。
众多企业在 NT 上压下了巨大的赌注。
但 NT 的开发过程也证明,在技术高度复杂的时代,创新通常需要顽强的系统构建和团结大型团队的能力,同时允许甚至是培养冲突。
冲突是创新的核心,“因为解决问题的方法并不总是唯一的,”IBM 公司前首席科学家 Emanuel R. Piore 说。”没有冲突的实验室不是好的实验室。”
代码之王
NT 的故事开始于 1980 年代后期,当时微软开发出的基础操作系统(名为 DOS)已经开始主导个人计算市场。
操作系统(OS)控制计算机的基本功能,并提供独特的个性和能力。DOS 的成功让盖茨先生走上了成为美国首富的道路。
但他和他的助手们梦想做出一种更先进的操作系统,从某种意义上说,这种系统可能在未来多年成为个人计算的通行标准。
它的运行速度会大幅提升,一次处理 32 位信息,远超 DOS 的 16 位,从而为大幅增强的图形界面提供基础。它将包含非凡的安全特性,这对企业客户尤其重要。它仍然能够运行为 DOS 编写的成千上万个应用程序(例如 Lotus 1-2-3)。它可以同时执行多项任务,并且可以将许多不同类型的计算机和数百种不同类型的打印机和其他设备连接到一个单一、无缝的指挥系统中。
他们设想的系统也将是“可移植的”,也就是说能够运行在各种类别的微处理器上,让 NT能够兼容诸如工作站、连接网络和其他中型计算机的“服务器”等各种环境。尽管它的复杂性是无可避免的,但系统依旧要非常可靠。
实际上,这样的东西当时已经存在于世了:那是一种称为 Unix 的高端、复杂、昂贵的系统,主要由科学家和工程师使用。在一位核心助手 Nathan Myhrvold 的敦促下,盖茨先生打算将 Unix 拥有的大部分特性带给 PC 大众。1988 年,他找到了可以完成这一任务的“天选之人”,Cutler 先生。
Cutler 先生是 DEC 的一位杰出人物,曾领导编写 VMS 的程序员团队。那款操作系统能将多种计算机连接在一起,并推动了 DEC 在 1970 年代后期的发展。这是 DEC 的主要竞争对手 IBM 从未实现过的壮举,让 DEC 在 IBM 的商用计算机市场蛋糕上切下了一大块份额。
但在 DEC 取得了更大的成功之后,这家公司终止了 Cutler 先生的下一个重大项目,于是他在 1988 年辞职了。盖茨先生打电话给他时,他正在准备创办自己的公司。
盖茨先生认为 Cutler 先生可能拥有创建“超级”操作系统的理想技能。这位微软负责人会见了 Cutler 先生,结果对他的专业知识留下了深刻印象,并被他狂野的个性打动了。
“比起魅力,他更出名的是他的代码,”盖茨先生说。这正是注重实际的盖茨先生想要的。碰巧的是,Cutler 先生的风格与微软以对抗为生的企业文化一拍即合。
对于 Cutler 先生来说,愤怒和激情是相伴而生的。他很容易生气,喜欢用“我要剥掉你的皮”之类的表情来威胁同事。但他努力完成工作的热情感染了同事,而他频繁的发难则起到了在大项目中经常缺失的重要作用:清晰无误的即时反馈。
没有人怀疑他是一个天才的程序员,这是一件很奇怪的事情。程序员说,编写代码完全不是什么按部就班的练习,而更像是在打棒球。同样聪明的两个人可以坐下来试一试编程;也许一个会成功,另一个却以失败告终,而原因就像艺术一样神秘莫测。一些最优秀的程序员甚至从未上过大学。
Cutler 先生抵达后不久,于 1988 年 11 月在盖茨先生的专属年度静修会(retreat)上展示了他对 NT 的愿景。Cutler 先生畅谈至深夜,“我们敬畏地坐着,倾听他的一言一辞”,系统营销副总裁 Jonathan Lazarus 回忆道。
与此同时,Cutler 先生是那种能带着他的团队在泥泞中艰难跋涉的领导者。“大家知道 Cutler 先生的情绪爆发并不是冲着个人来的,”他的首席构建员 Mitchell Duncan 说。“他攻击的不是你这个人。Dave 早上 6 点就来了。他每个周末都在公司。他一直呆在战壕里。”
创新张力
与他肩并肩守在战壕里的是各个部门的工程师,他们经常在寻找编程问题的答案时大声吵嚷,互相竞争。
程序代码每增加一行,这些问题就变得更复杂一些(NT 程序代码最后写满了 100,000 页单行距 A4 纸)。
环顾四周,首先映入眼帘的是开发人员,也叫“代码骑手”—这批人主要是男性,通常信心十足—他们负责编写基本指令。
接下来是测试人员,他们负责设法让这些指令失败。
然后是产品经理,他们负责思考 NT 应该实现哪些功能。最后还有构建员,他们负责将程序整合在一起。
开始 NT 的开发工作时,Cutler 先生将团队分为三大单元:一个单元创建监控和运行程序的基本语言;一个单元打造系统的联网能力;还有一个负责用户实际看到的所有特性。
每个单元又被分成 5 到 10 个小组,每个小组只有三四个人。“越小越好,”Cutler 先生说,他希望下放责任、取消主管并避免经常与大型项目伴生滋长的官僚主义。
组织结构到位后,他开始组装一个可以在不同微处理器上运行的操作系统原型。Cutler 先生在 1990 年 1 月做出的一项重要早期决定,是让 NT 兼容由新兴的 Mips 计算机系统公司制造的功能强大的新芯片,与英特尔的 386 及后继芯片。
此举可能会威胁到微软强大的长期合作伙伴英特尔的利润,因为这一规模庞大的 PC 软件将来能够在英特尔竞争对手的芯片上运行了。
终于自由了
NT 项目很快就向盖茨先生提出了一个巨大的政治问题。
他之前与 IBM 达成了一项协议,根据该协议,两家公司将共同开发另一种操作系统,该系统将提供一些高级特性,同时仍运行 DOS—它被称为 OS/2。
为了安抚 IBM,Cutler 先生需要让 NT 运行为 OS/2 编写的应用程序。盖茨先生坚持保留这种兼容性,因为它对 IBM 很重要—但这只是没什么吸引力的妥协。
NT 团队将 OS/2 视为“一袋垃圾”,Steven Wood(第一位加入 NT 项目的微软程序员)说。然而事实证明,NT 加速了微软和 IBM 之间迟早到来的决裂。
到 1990 年 8 月,盖茨先生的新产品,一款名为 Windows,让 DOS 程序更易用的图形命令系统已经席卷了 PC 世界,每月销售 500,000 份。
巨大的成功让盖茨先生大胆下注 — 将 Windows 与 NT 结合,此举让微软与 IBM 之间出现了无法弥合的裂痕。
实际上,这意味着 Cutler 先生接到了新任务,让 NT 运行为 Windows 和 DOS,而不是 OS/2 和 DOS 编写的应用程序。
IBM 得到了消息。这家公司实际上已经和微软分道扬镳,OS/2 是他们的最后合作遗产。(自那以后,Windows 以 10 倍的市场份额击败了 OS/2。)
盖茨先生希望他对 Windows 的喜爱不会威胁到他与 IBM 的长期合作关系,但是当决裂不可避免时,他兴高采烈地写信给同事们说,微软再也用不着接受 IBM“糟糕的代码、糟糕的设计和其他开销”了。
这次分裂提升了 NT 的地位,并为团队注入了新的活力。一夜之间,他们的工作从微软外围转移到了盖茨先生对微软愿景的核心领域,在那里“我们所做的一切都应该致力于让 Windows 更加成功”。
随着项目步伐开始加快,Cutler 先生的每日简报从富有想象力的软件方案研讨会转变为对最后期限的讨论。来自这个庞大组织各个部门的负责人汇聚一堂,他们开始与 Cutler 先生一起争论他最担忧的问题:可靠性、可移植性和兼容性。
测试人员和编程人员在可靠性领域爆发了很多最激烈的战斗。 每天晚上,测试人员都会让新的 NT 代码在 200 台计算机上经受考验,这种压力在现实世界中很少出现。测试人员可能会要求 NT 连夜同时在不同的文件中读写。
同时,他们可能会指示程序在屏幕上创建一个图形,然后一遍又一遍地擦除它。早上会生成一份测试报告,任何无法完成测试的计算机—可能是因为崩溃或死机—都将受到调查。在一个美好的夜晚,只有 2%的计算机会出现故障。
当测试暴露出错误时,程序员很高兴,但当测试人员看起来太残忍并暴露出太多缺陷时,他们会大声抱怨。
Cutler 先生虽然坚信改进系统的一个好办法就是破坏它,但他有时也会拒绝测试人员的建议,认为他们过于严格了。一位参加每日会议的测试人员用别出心裁的手段报复了他,反复坐在会议桌上 Cutler 先生喜欢的那把椅子上。
追求可移植性的目标也考验了团队的耐心和纪律。
当开发人员未能对英特尔和 Mips 版本给予同等关注时,Cutler 先生会大声疾呼。他的信条是:像对待英特尔一样对待 Mips,并让两个版本都有够快的速度。
有一次,NT 的首席构建员 Duncan 先生违反了 Cutler 禁止将构建分为 Mips 和英特尔版本的政策,因为渴望获得最新英特尔代码的程序员要求他这样做。
Duncan 先生说,当 Cutler 先生得知自己的主要指示遭到违反时,“他把怨气都撒在了我身上。”在第二天早上的一次会议上,NT 最高领导斥责他做出了“单方面的决定”,并立即予以否决。
“死亡行军”
微软的所有人都明白,NT 需要大批外部软件开发人员参与才能取得成功,因此团队的一个关键部门负责努力向成千上万愿意为新系统编写程序的大小公司推广 NT。
1991 年 10 月,这个团队发布了一套代码指南,帮助人们为英特尔版本的 NT 编写程序。12 月,他们发布了 Mips 版本指南。然而,这些早期工具包只是“开胃菜”。渴望开始为 NT 编写程序的软件开发人员期待的是主食—个完整的工具包。微软承诺于 1992 年 7 月 7 日在旧金山的一次会议上放出完整版。
业界的期望值来到了高点。在过去,揭开一个未完成的操作系统的帷幕时从未面临如此多的麻烦事。
但是 NT 非常复杂,它有几千个缺陷或错误,人们担心这个套件会成为一种耻辱。为了在 7 月 7 日之前清理好整个项目,NT 团队发起了“死亡行军”,一位成员这样说道。
工作量增加了,简报和构建时间延长到周六和周日,办公室有了晚餐供应,很多人开始在工作中打盹—在办公桌下、休息室和地板上酣睡。
NT 团队中有很多人实际上从未有过这样的冲刺经历。对于 18%的员工来说,这是他们大学毕业后的第一份工作。
Johanne Caron,一位 28 岁的法裔加拿大人,正在编写“DOS shell”的一部分代码,这是支持现有 DOS 程序在 NT 上运行的指令层;她发现自己已经无路可退了。她的基本代码影响了 NT 的一个关键部分,于是引来了审查。
如果有人批评她,她说,“我会给他们个二比零。”与此同时,她的婚姻正在破裂。“我把我所有的精力都投入到了工作中,”她说。“我甚至没有试图挽救婚姻。”
对这种疯狂节奏感到不满的不仅仅是员工的配偶。六月一个星期六的早上,Jonathan Manheim 在去 Cutler 先生晨会的路上送他七岁的儿子去参加一场足球比赛。下车时男孩说:“如果你赛后还在这里,我会把我所有的玩具都扔掉。”
这句话让正在努力制作与 NT 兼容的 Windows 图形程序的 Manheim 先生大受刺激,“那就像一把刀插进了我心中。我不记得我对儿子说了什么,但那天我没有去上班。”
Cutler 先生一直保持着高压政策。在大多数软件开发项目中,正在开发的各个部分偶尔才会拼接在一起。相比之下,Cutler 先生几乎每天都坚持重新构建,这意味着 NT 的每个部分(其中一些包含数百个更改)都必须重新组装成一个整体,然后进行新一轮的测试。
这种不断更新构建的战斗导致了更多程序员与构建员之间的对抗。“我们这些开发牛仔疯狂地抛出代码,大声喊道:我们需要下一个构建,下一个,”首席构建员 Duncan 先生抱怨道。
激动的同事甚至会在 Duncan 先生加班的晚上睡在办公桌下面时骚扰他。他开始在门上挂一个牌子:“请勿打扰,在桌子底下睡觉中。”白天,他开始加强戒备,为自己和手下购买了施工安全帽。当他戴上帽子时,程序员经常会给帽子来一巴掌。
一些人筋疲力尽,博得了同事的同情。36 岁的 Walter Moore 负责编写在最流行的计算机屏幕上显示图像的代码。代码越聪明,图像在屏幕上闪烁的速度就越快。这是一项基础的、乏味的工作,但如果做得不好,可能会引起很多客户的不满。
在“死亡行军”中,Moore 先生发现自己“越来越落后”。面对艰巨的任务时,他有一种强烈的玩电子游戏的冲动。一位富有同情心的经理给他背书,但他的表现变得如此糟糕,以至于同事们开始调侃他的状况。
“迟早要完,”当人们问他出什么事的时候,Moore 先生这样回答。最后,他所在部门的负责人告诉他:“我认为你搞不定了。”10 月,Moore 先生辞职了。
尽管 NT 团队“伤亡“惨重,但软件开发人员的工具包还是按时交付了。那场为期三天的会议“是一个转折点,”在场的开发人员 Peter Winston 说。“它让 NT 从愿景变成了一款可行的产品。”套件卖出了五万套,每套 69 美元,这对于未完成的产品来说是闻所未闻的数字。
“杀虫行动”
盖茨先生对 NT 项目还是不放心。
一些体验过早期系统的潜在客户告诉他,NT 远远没能打动他们。他们说它太慢了,需要太多内存,而且还没有证明自己可以运行 Windows 应用程序。
最后一年的 9 月下旬,盖茨先生被迫宣布 NT 跳票,赶不上年底的预定时间。不久,发布日期正式确定为“1993 年上半年”。
10 月 12 日,NT 的第一个测试版向真实客户发布。盖茨先生对其中的一部分内容并不满意。12 月,他闭门会见了 NT 团队的领导,并严厉提醒他们,虽然软件程序中的全新特性令人钦佩,但看到熟悉的程序运行得比以前更慢是最让客户受不了的事情。
重点很明确。“比尔基本上指出了我们的工作重心应该放在哪里,”负责测试的 Moshe Dunie 说。“那是他的天赋,他能看出弱点所在。”
这种缺陷基本都源于 NT 的庞大规模。 NT 就像一个巨大的交互式拼图游戏,每添加一块拼图都可能以不可预测的方式影响之前的图形。
NT 需要与 600 多种打印机配合使用。它必须能够识别调制解调器、指点设备,当然还有其他计算机并与之通信。它必须能够完美地运行流行的 Windows 程序—这些程序本来完全是用另一种语言编写的。
团队在编写代码、构建程序并用测试来惩罚自己时可以学到很多东西,但即使是 Cutler 先生也承认没有人“能够掌握 NT 的复杂性”。
随着 3 月第二个测试版本的发布日期临近,焦虑情绪开始蔓延。系统性能正在提升,功能已经就绪,数量惊人的现有应用程序和外围硬件已经接入。但是与 Windows 程序的兼容性 — 一个至关重要的目标—直是一个令人头疼的问题。
事实证明,一些人理想中的,一个处理 Windows 程序的通用翻译器是不可能实现的。因此,由 Mark Felton 领导的一个由九名程序员组成的团队制作了“变通代码”,在 NT 中嵌入了多个独立的翻译器,当 NT 被要求运行特定的 Windows 程序时,这些翻译器就会开始工作。
Felton 团队的目标是让 NT 支持 200 个 Windows 程序,但事实证明,很大一部分程序很难兼容。高层管理人员担心,如果 NT 不能很好地运行 Windows 程序,一些客户可能会完全拒绝它。
压力越来越大了。
Felton 先生是一位自信的程序员;二战后,他的父母都在他的家乡英格兰开始了软件开发人员的生涯。然而,Felton 先生的道路并非一帆风顺。
“有时事情会倒退,”他说,因为某些 Windows 程序实际上在最新的和据称有所改进的版本上运行得更糟。运行 Windows 程序所需的“变通办法”越来越多,已经很大的 NT 只能继续增长。“如果我们更小一点就好了,”Felton 先生说,因为更胖的代码需要更多的内存,而更多的内存意味着更昂贵的计算机。
与此同时,数以千计的编程错误威胁着 NT。 错误按优先级排序,“priority”和“showstopper”—可能导致系统崩溃或数据丢失的错误—受到最多关注。对错误的修复经常会产生更多的错误。
即使是像 Cutler 先生这样经验丰富的程序员也不排除 NT 可能以某种方式陷入一个奇怪的无限循环的可能性 — 也就是说错误修复又会带来崩溃性的错误。这种场面并不罕见。软件业历史上充斥着臭名昭著的失败项目。这类失败经历曾让很多人的职业生涯在嘲笑声中迎来终点。
每当发现一个新错误时,“事情……看起来很糟糕,”Cutler 先生说。“然后有人修复了一个错误,局势就扭转过来了。”他的一名高级助手 David Thomson 补充说:“每天早上我们都会查看错误数量。如果数量持续增加,我们就完蛋了。”
耐心逐渐耗尽。
一个星期六晚上,Cutler 先生指责 Caron 女士没有在当天早些时候提交一个修复程序,错过了压力测试。他要她解释原因。“我在上空手道课,踢别人的屁股,”她回击道,Cutler 先生震惊满面,只说了一句“OK”。
妥协,而不是完美
在 NT 团队全力以赴的时候,情况已经很明显了。这个项目会成为一团混乱而成功的妥协代码,而不是什么完美代码的典范之作。
例如,在 4 月的最后一周,团队修复了足足 1,132 个错误,但发现了 713 个严重到需要修复的新错误。刚刚发布的 NT 程序包含一些错误,而当最终版本在 60 天内发布时,几乎肯定会有错误被保留下来。
第一批 NT 代码编写者之一 Mark Lucovsky 说,现在的选项很明显:“这个问题我们解决了吗?这个问题我们推迟了吗?这个问题是我们正在处理的吗?”
最严重的那些问题都是和 NT 与知名 Windows 程序之间的不兼容相关的。例如,流行的桌面出版程序 Aldus Pagemaker 在某些情况下无法打印成功。因为像这样的小故障很可能会被用户发现,最近几周更多的测试人员和错误修复人员被分配到 Windows 兼容性问题上。
截至 5 月初,Felton 先生的清理团队统计到,200 个选定的 Windows 应用程序中有 80%在 NT 上的表现“良好”或“优秀”,但其他 20%被归类为“差”“一般”或“炸弹”。尽管如此,负责 NT 项目的微软高级副总裁 Paul Maritz 表示,“我们已经解决了这个问题。”
对盖茨来说,他认为 NT“完全达到了我们为其设定的目标”,尽管他希望代码不至于变得如此庞大。他希望 NT 能运行在具有 8 兆字节随机存取存储器的 PC 上,但承认在大多数情况下它需要 12 到 16 兆字节。
不管妥协与否,NT 都被行业观察家视为重磅炸弹,因为它实现了微软在网络能力、可靠性、兼容性和可移植性方面的一系列主要目标,使其竞争对手难以为继,并打造了一个可以持续到 20 世纪末的操作系统。
盖茨先生预测,来年微软将售出 100 万份 NT,Windows 用户的初始定价为 295 美元。
“你不得不说 NT 是肯定会成功的,”贸易周刊 Info world 的编辑 Stewart Alsop 说。“唯一的问题是有多肯定?它是个人和组织计算的全部未来,还是说只是一部分?”
Cutler 先生拒绝对结果作出判断。他说他“非常坚决”不去做预测。“当你没有发货时,你不会做预测。直到 NT 上架,我们才完成目标。”
其他人说 Cutler 先生已经可以赢得掌声了。著名计算机设计师、Cutler 先生的导师之一 Gordon Bell 认为,虽然这位 NT 负责人的方法很苛刻,但“这可能是唯一能够在这样的项目中取得成功的风格。我认为世界上没有其他人能做出来 NT。没有其他人拥有项目所需的令人难以置信的专注力和耐力。”
至于 Cutler 先生的团队,他们对未来的看法存在分歧。许多人热切期待着为 NT 的下一个版本工作,而另一些人则觉得他们生命中的一章已经结束。他们有些累了,几乎到了崩溃的边缘。
经过近两年的“发布模式”,一个又一个期限迫在眉睫,“人们真的筋疲力尽,”图形程序员 Charles Whitmer 说。“很多人都感到愤怒、疲倦,感觉身体被掏空。”
原文链接:
https://tech-insider.org/windows/research/1993/0526.html
本文文字及图片出自 InfoQ
共有 1 条讨论