北京大学出版社96年底所出的《微软的秘密》一书是目前我所见到的对微软公司软件产品开发过程介绍的最专业、最深入的一本书。通过本书,我们可以看到微软公司是如何对科学地对软件产品开发进行有效地管理,我想这些经验对于中国的广大软件开发人员,尤其是关心中国软件产业发展的各位朋友是大有益处的。所以特将此书中涉及软件产品开发的部分内容摘录出来(第四章“产品定义与开发过程”),加上我在微软中国工作的实际经验总结出这篇文章,希望与大家共同分享。本文作为摘录,自然是挂一漏万,所以建议大家若有时间还是找来原书一读。
在微软的产品定义与开发过程中,微软软件开发遵循着一种可称之为“靠改进特性(Feature)与固定资源(Resource)来激发创造力”的战略。该战略可分为五个原则:
1. 将大项目分成若干里程碑式(Milestone)的重要阶段,各阶段之间有缓冲时间,但不进行单独的产品维护。
2. 运用想象描述和对特性的概要说明(Program Specification)指导项目。
3. 根据用户行为(User Behavior)和有关用户的资料确定产品特性及其优先顺序。
4. 建立模块化的和水平式的设计结构,并使项目结构反映产品结构的特点。
5. 靠个人负责和固定项目资源实施控制。
原则一:将大项目分成若干里程碑式的重要阶段,各阶段之间有缓冲时间,但不进行单独的产品维护。
1. 项目进度安排与里程碑
微软通常采用“同步-稳定产品开发法”。典型项目的生命周期包括三个阶段:
计划阶段:完成功能的说明和进度表的最后制定
开发阶段:写出完整的的源代码
稳定化阶段:完成产品,使之能够批量生产(Roll Out)
这三个大阶段以及阶段间内在的循环方法与传统的“瀑布”(Water Fall)式开发方式很不相同,后者是由需求、详尽设计、模块化的代码设计与测试、集成测试以及系统测试组成的。而微软的三个阶段更像是风险驱动的、渐进的“螺旋”式的生命周期模型。
计划阶段的产品是想象性描述与说明文件,用来解释项目将做什么和怎么做。在管理人员拟定进度表、开发员写出代码之前,这些东西都促进了人们对设计问题的思考与讨论。开发阶段围绕三次主要的内部产品发布来进行;稳定化阶段集中于广泛的内部与外部测试。在整个产品生产周期中,微软都使用了缓冲时间的概念。缓冲时间使开发组能够对付意外的困难和影响到时间进度的变故,它也提供了一种手段,可以缓和及时发货与试图精确估计发货时间之间的矛盾。
在开发和稳定化阶段的所有时间中,一个项目通常会将2/3的时间用于开发,1/3的时间用于稳定化。(Office部门副总裁曾这样概述通常的进度:“一般说来,在总的进度表中,用一半的时间写出产品,留下另一半的时间调试或应付意外事故。这样,如果我有一个两年的项目,我会用一年来完成事先想好的东西……如果事情有点麻烦,我便去掉我认为不太重要的特性。”)。这种里程碑式的工作过程使微软的经理们可以清楚地了解产品开发过程进行到了哪一步,也使他们在开发阶段的后期有能力灵活地删去一些产品特性以满足发货时期的要求。
计划阶段
计划阶段是在一个项目的生命周期中,所有于开发前进行的计划所占用的时间。计划阶段产生出想象性描述、市场营销计划、设计目标、一份最初的产品说明、为集成其他组开发的构件而规定的接口标准、最初的测试计划、一个文档策划(印刷品和联机帮助形式的)以及一份可用性问题清单(Usability List)。计划阶段从想象性描述开始。想象性描述来自产品经理以及各产品单位的程序经理;它是对规划产品的市场营销设想,包括了对竞争对手产品的分析以及对未来版本的规划。想象性描述也可能讨论在前一次版本中发现面必须解决的问题以及应添加的主要功能。所有这些都基于对顾客和市场的分析以及从产品支持服务组处得到的资料。
说明文件从一个大纲开始,然后定义出新的或增加的产品特性,并对其赋以不同的优先级。说明文件只是产品特性的一个预备性概览;从开始开发到项目完成它要增加或变化20% - 30%。虽然在生命周期的后期说明变化一般较小,但越到后期,开发员就越是必须具充分的理由来作改变。
通常程序经理使用VB创建项目原型。他们也开展设计可行性研究以了解设计中的取舍情况,尽快做出涉及产品说明的决定。对于重要产品的说明需由公司高层领导进行复审。对于不太重要的产品,则由部分经理去完成。
开发阶段
开发阶段的计划对三四个主要的里程碑版本都逐个分配一组特性,规定出特性的细节和技术上的相关性,记录下单个开发员的任务以及对进度的估计。在开发阶段中,开发员在功能性说明的指导下写源代码,测试员写出测试项目组以检查产品的特性与工作范围是否正常,用户教育人员(User Education)则编写出文档草案。
当测试员发现错误时,开发员并不是留待以后处理,而是马上改正,并在整个开发阶段内使测试不断地、自动地进行。这就改善了产品的稳定性并且使版本发布日期更易估计。当达到项目中的一定阶段点后(40%时),开发员就试图“锁定”产品的主要功能要求或特性,从此只允许小范围的改动。如果在此点之后开发员想作大的改动,他们必须与程序经理以及开发经理进行讨论协商,也许还要征求产品部门经理的意见。
一个项目是围绕着3或4个主要的内部版本,或“里程碑子项目”来组织开发阶段的。一般用2至4个月来开发每一个主要的里程碑版本。每个版本都包括其自身的编码、优化、测试以及调试活动。项目为意外事故保留总开发1/3的时间,即“缓冲时间”(Padding Time)。(苹果公司的小组是割裂的、独立的,各自开发各自的东西。在还有3个月就要发货时,才会将所有的东西集成起来;Borland公司以一种渐近的方式进行开发,即把工作分成许多小的部分,并且总是让开发的东西能够运转。看起来似乎这种渐进的方法费时,但实际上几乎没有用过很长时间,因为这使你总是能掌握住事情真实的情况。)
当对最后一个主要的里程碑版本做了测试与稳定化之后,产品就要进行“外观固定”(UI Freeze),即确定产品的主要用户界面,如菜单、对话框以及文件窗口等。此后有关用户界面将不再进行大的改动,以免引进同步修改相应文档的困难。
稳定化阶段
稳定化阶段着重于对产品的测试与调试。项目在此阶段尽量不再增加新的功能,除非是竞争产品或者市场发生了变化。稳定化阶段也包括了缓冲时间,以应付不可预见的问题或者延迟。
下面我将Micosoft开发软件的模式用以下这张简图加以描述:(这张图对微软的测试进行了比较详细的描述,我个人认为微软的测试是Microsoft软件产品开发中一个十分重要也是十分有特色的分工。这是通过在微软将近一年的观察和与国内同类企业的分析,我才得出这样的结论。大家都很明白,国内的软件开发商在这方面做得很不够,尤其不重视软件的内部测试,在他们的思想中,可能有一个误区:认为测试应该完全去由用户去负责,其实不然,在软件的开发流程中,软件的测试与开发是一种“矛与盾”的关系,互为补充,缺一不可。在微软,可能这种关系发挥到了极至:有时开发部门与测试部门互相较着劲,开发经理和测试经理的地位是相同的,有时甚至测试经理的地位甚至凌驾于开发经理之上,但他们之间没有根本的利益冲突,只有一个共同的目标:将产品的质量提高。)
补充一点:(对微软的测试流程加以简要的描述一下)微软内部,专门有一个小组负责为微软的工程师们提供日常工作和管理的工具软件,他们是非盈利机构,其主要任务是开发微软内部所需要的工具软件:例如:
SLM(Source Library Tree),源代码管理工具,负责管理软件开发过程中各个程序员的源码,各个程序员负责写自己的模块,每天将完成的代码Check-in到一个中央服务器的SLM树中,这个SLM树由预先定义好的脚本在固定的时间开始编译,通常这个过程需要好几个小时,所以微软内部根据各个项目组的情况有各自的规定:比如开发员必须在下班前(比如下午6:00)之前将当天修改的代码Check-in进去,这样SLM才开始编译。
第二天,QA组的各个测试员从服务器上下载前一天的一个Build开始测试,将测试的情况及时的反映到另外一个工具软件中:RAID(Raid is a tool for entering, tracking, analyzing, and reporting product defects during development and maintenan