前言
我第一次见到 Steve Maguire 是在 1986 年,当我们聘他来写麦金塔版的 Excel 时。作为一名特别谨慎而专注的程序写作者,他令我印象深刻。当时我是 Microsoft Multiplan , Word 与 Chart 的开发经理。这间公司正快速成长,而我们产品与开发过程中的问题也愈来愈多。 Steve 在解决这其中的一些问题上出过力,而且以这本书成为我们想出来解决这些问题的许多好作法的纪录者。接下来我要先提一下我自己的经历。
1981 年,我被比尔盖兹跟 Charles Simonyi 合聘加入微软公司商业应用程序团队工作。回顾当时,有七名程序员在进行一个商业应用程序的开发- Microsoft Multiplan. 其它三十名程序员则在进行程序语言与操作系统产品的发展。公司里剩下的一百人进行技术文件的撰写、销售、行销与管理工作。当时, Multiplan 的七名程序员都被塞到一栋位于华盛顿州 Bellevue 镇商业区的办公大楼里的一个大房间中。我们跟其它开发 MS-DOS 跟 Basic 的工作者没在同一栋建筑里,他们在两个十字路口之外。不过这并不是什么大问题,当时我们这间小公司只有一个人人想要达成的前景:让每个桌上的计算机都跑我们微软的程序。
我们用来开发 Multiplan 的系统对当时的 PC 软件开发而言是相当特殊的。我们将核心产品以 C 语言撰写-当时大部分的程序还是用汇编语言或 Pascal 写成的。我们在一台跑 Unix 的 PDP-11 计算机上完成自己的编辑与编译程序。 C 语言写的原始码被编译成 p-code ,下传到目的平台。当时我们得替每个微处理器建立出一套 p-code 解译器来执行我们开发的程序。
1983 年底,我们已经有了在 8080/Z80 , 6502 , Z8000 , 68000 , TI 99/a 与 8086 上执行的 p-code 解译器。那时候,我们的每套主要商用软件都有专门人员在进行开发-一个电子表格、一个文书处理器、一个简单的数据库记录管理程序,跟一份商用绘图程序包。我们有专门的环境开发人员使用汇编语言来撰写这些 p-code 解译器。我们也有一组人员在发展编译器与程序开发工具。除了少许操作系统服务相关的东西,这整个三十人的应用程序开发团队可以说是自给自足的,建立自己用的程序开发工具、编译器、解译器与产品的原始码。
在 1981 年,我们的主要目标在于销售随机搭售的产品。我们与硬件制造商合作,修改我们的产品以搭配制造商的硬件与销售管道。然后我们会交给硬件制造商一张磁盘与可以照相排版的使用手册。硬件厂商自己担负起整个产品的制造、发行与支持的工作。
1982 年时,我们开始转而强调零售管道。与硬件厂商的合作经验让这项转移过程迅速许多。我们只需要几个行销人员将产品卖给硬件制造商,几个产品开发人员来发展产品,几个技术写作者来撰写使用手册,至于测试、项目管理、产品制造、产品发行、产品支持与销售的部分,则都已经由硬件制造商支持了。要将目标转移到零售管道,我们得在微软内部找出一套完成全部特定产品发展与支持的办法。
更早,我们还在替 IBM 跟苹果计算机开发产品时,我们自行销售的第一套产品是 IBM-DOS 版的 Multiplan 跟苹果二号版的 Multiplan ,不过那时我们还在开发许多随机搭售产品。我们替 Unix , Xenix , TI 99/a , Tandy M100 , MSX (日本一种八位的家用计算机),非 IBM 的 MS-DOS 兼容机器, Commodore 64 , Atari ,苹果公司的苹果三号、 Lisa 跟麦金塔计算机, OS/2 , Windows 与其它特别的硬件环境开发电子表格、文书处理程序、商用绘图程序与数据库产品,有些环境本身还有好几种机型。在 IBM 兼容计算机成为主流机型前,我们已经为每一种跑 MS-DOS 的机器量身修改过我们的应用软件。在 Tandy ,王安, Paradyne , Consumer Devices , Eagle , Victor , Olivetti , DEC Rainbow 与其它 MS-DOS 机器上都有过我们的产品。(译:这里有许多在台湾还没普及过就从世界市场上消失了的厂牌,不另译。)除了面对这些不同系统平台,我们还发展了许多特定语言版本的商用软件。
早期产品只有英文版本的,今天我们则开发了超过三十种语言版本的产品,针对不同语言与文化改写或修改,包括阿拉伯文版、澳洲版、马来文版、中文版、捷克语版、丹麦文版、荷兰文版、英国版、芬兰版、法文版、法属加拿大版、德文版、希腊文版、希伯来文版、韩文版、意大利文版、日文版、挪威版、葡萄牙文版、俄文版、西班牙文版、土耳其文版、美国版等。
在 1985 年, IBM PC 在市场上的成功减轻了些产品开发的复杂度。我们必须支持的不同视讯标准只剩下主要的 IBM 兼容机型上的模式( CGA 跟单色文字模式)。不过在 1988 年左右,对不同视讯模式需要的支持开始多得超出预估的数量, IBM 先是发展了 EGA 视讯延伸标准,接着又发展了 VGA 标准,然后接着而来的是各种不同的 SVGA 模式与标准。
对其他硬件周边配备的支持也变得愈来愈复杂。我们得支持超过两百种不同的雷射与点数组表机。幸运的,输入装置的种类没有变化太多。原先就有 IBM 标准键盘与扩充键盘,而大部分指向装置依循着微软鼠标标准。
今天硬件上的许多复杂性与变异性都已经消失或被统合进一个复杂而完整的接口里。我们只需要替两种主要系统制作产品- Windows 跟麦金塔。但是新等级与新尺度的复杂性取代了硬件支持的复杂度。现在软件开发者得熟悉讯息传递式的图形使用者接口程序写作与对象导向设计跟程序写作方式。他们得透过 Windows 上的对象连结与嵌入( OLE )和麦金塔上的出版与订阅机制来支持产品延伸性,而且他们得支持同个产品系列里一致性的特性与可程序性的使用方法。
在 1984 年,我们产品中渐增的复杂性与制作零售产品所需的高标准让我们建立了一个品质确认小组。 1984 年,我们称这个小组为测试小组,到今天我们还是这样称呼这个小组,虽然我们测试小组的人数已经从 1984 年的五个人增加到超过五百人了。今天我们的测试小组确实是个先进的品质确认小组,从各种消费者的偏好习惯来进行产品品质的检测。
在建立测试小组以前,商用程序开发者们必须仰赖硬件制造商的消费者们测试产品,以找出错误所在,这种做法一直挺有效的。直到我们开始在对硬件制造商的消费者们推出产品前,直接对末端使用者推出零售版的产品,我们碰到问题了。有段时间,在我们的测试小组能力够强以前,程序开发员得自己测试零售产品。曾经历过那段时间的开发者们都学到了他们得在写作跟除错程序代码时非常小心的避免产生错误。他们了解推出一项会出错的产品要付出多大的代价。
不过,当测试小组愈来愈庞大时,开发小组愈来愈依赖测试小组来找寻程序里的错误。开发小组很快习惯了这种让测试小组负责找出所有问题的态度。这造成了底下这些严重的问题-产品时间表延期,错误百出的产品特性,未完成的产品功能,或甚至让产品取消推出-必须有些对策来避免这些事情发生。许多开发人员对于产品在推出后还在程序中被找到问题一点也不觉得羞耻。他们愤愤不平的问道, " 为何测试人员没在我们推出产品前找到问题? " 而测试人员一定会响应, " 那为何你们要在产品中制造问题? "
最后,开发人员开始明白测试人员永远也不可能找到一份软件中的所有错误。错误可能出现在设计上,规格上,或是顾客需求的分析上,而且测试人员在测试中没办法涵盖所有程序代码或使用方式。程序的错误可能隐藏在隐密而鲜少测试到的程序代码中,可能被程序其它部分功能的运作所暂时掩蔽着-甚至测试环境都可能掩护错误免于发现。测试人员很难找到这些问题,由于这些因素,测试小组经常只能在产品中找到百分之六十的程序错误。
程序开发人员拥有更多知识与工具来检测程序代码。当开发人员决心利用他们的工具去作这件事时,他们可以在程序中找到超过百分之九十的问题。如果开发人员负起他们原先丢给测试人员的除错责任,产品使用者只会发现百分之四十的错误。如果开发人员与测试人员合作找出错误,末端使用者只会找到少于百分之四的问题,而且这百分之四可能在产品对外公开测试时就被使用者找到。
早先,在 1989 年,许多开发经理与带领者开会讨论这个问题。会议之后,他们了解了一件事,并改变了态度:找寻问题、更正错误是开发部门的责任。开发人员过去让程序里的臭虫横行,现在,避免臭虫出现在测试人员面前而后溜到使用者面前的责任回到了他们身上。开发团队定下了 " 随时都有近乎可推出的产品 " 的目标。这表示说,当一项功能被标示为完成时,所以在这功能上找到的错误都将在新功能加上前获得修正。如果在以标示完成的功能上找出了严重的问题,工作进度将停滞不前。
我们将这种新的态度称作 " 零失误 " 。程序代码由开发部门建立并检测,然后在零失误的态度下交给测试部门。幸运的,几个开发小组已经体验过开发零失误程序所需的许多技术。 Steve Maguire 在这些日子里在各小组间解决了许多问题,并在本书中定下许多我们用来写作稳固而零错误的程序技巧。
微软改善,而且总是在改善产品开发工具与产品开发过程。在 1981 年,公司内只有程序开发人员、使用手册撰写者跟小型的销售、行销与管理小组。现在我们有产品行销、通路、销售、支持、测试、使用者教育(技术写作与出版)、计划管理与其它许多的专门人员。在今日微软特别小组的复杂架构下,我们要确定发展稳固程序代码的技巧不会失传、误解或被遗忘。 Steve Maguire 的这本书应该对我们跟读者们让这些技巧继续被活用有所帮助。
现在我是微软的开发与测试总监。我的部分工作是列出并宣传最好的作品。我非常感谢 Steve 花时间写了这样一本有益于管理者与程序写作者们发展世界级程序而且读起来如此令人快乐的书。 Steve 捉住而且描述了许多在微软宫公司用来发展稳固而可发行的程序代码的技巧。这本书将成为所有微软的程序写作者的建议读物。
David M. Moore
微软开发总监