琢思磋文轩

学问之道贵能下人求告为善,赡才之径假人所长补已之短

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
                         Microsoft Product Cycle Model Training
 
(声明:本系列授课笔记是综合各相关资料整理而成,仅限于个人学习、研究或欣赏使用,引用转载请注明出处。如用于商业用途,必须经享有著作权人之许可。顺此对微软工程师的精彩授课深表感谢!)
 
一、微软产品开发周期模型
  微软产品开发周期通常分为五个阶段:
  1、计划:主要是做市场分析,看市场有无此软件产品的需求,以及竞争对手有哪些。
  2、设计:主要是软件要达到哪些功能,解决用户什么样的问题。细的方面包括选择什么语言来写代码,所支持的平台以及开发所用的模型。
  3、实现:就是依据设计写代码,并同时让测试人员找Bug。
  4、稳定:刚写的代码肯定存在诸多问题,稳定就是找出这些问题中的大部分,然后进行修正。
  5、发布。
  微软所有的开发团队在开发软件产品时都要遵循这一开发周期,但是每个团队又可能会略有差异,不同的团队在不同的阶段中所用的时间可能是不一样的。
  产品开发周期如下图1所示:
  还有另外一种直线表示的视图如图2所示:
  在微软上面的两副图是非常有名的,每个新员工来都要接受此开发周期流程的培训。每个开发经理都会给下面的开发人员讲这一流程。在直线图中,M1、M2代表实现阶段中不同的里程碑。
 
二、不同的小组及其职责
  微软公司软件产品部门内设置了三种主要职位,分别是程序经理、开发人员、测试人员。其中程序经理是微软中一个特殊的职位,并不一定是真正的经理,下面也不一定有下属。程序经理是对所做工程最了解的一个人,他的工作是项目组内部综合管理职能的延伸。在软件开发过程中,程序经理不亲自编写代码,但他对按时、保质地向客户提交正确的产品负有全部责任。一般说来,程序经理需要通过自己的努力工作赢得项目组成员的认可和尊重,赢得项目组内的组织权、协调权及与开发相关的决策权。
     一些人认为只要拥有了出色的程序员,就可以开发出优秀的软件产品。这种看法是片面的。一方面,一个完整的商业软件产品涉及文档、代码、用户界面、测试和发行等多个方面;另一方面,如果没有有效的组织、协调和管理,当项目组开发规模较大时,即使再出色的程序聚集在一起,也很难形成合力,不能开发出真正满足商业市场需求的合格的大型软件。这也正是在1984年之后,程序经理逐渐登上软件开发管理的舞台,并不断发展壮大的原因。目前微软公司已拥有了5000多名程序经理,这一数字几乎占了微软公司员工总数的十分之一。
  程序经理主要职责的具体内容包括:
  1、程序经理应拥有宏观的、整个产品范围的视角,负责编写产品的功能说明书。
  2、程序经理应跟踪并推动项目组的每一项工作,依据产品功能说明书的要求,保证项目组的工作成果和产品目标完全吻合。
  3、跟踪和管理项目进度。
  4、组织项目会议,评估和管理已发现的Bug。
  5、对项中需求进行调整变更的问题做出决策。
  6、与项目内外的相关人员保持交流和沟通。
  一句话概括就是:程序经理是项目的领导者,是项目资源的调度者,是项目的协调人。
     优秀的程序经理必须具备非常全面的技术知识,要有很强的软件架构设计能力。要熟悉某一行业,做某一项目就要对此项目的背景很熟,比如XBOX的程序经理就需要对整个游戏产业很熟,对PS2等竞争对手很熟。要了解竞争对手有哪些,竞争对手强项在哪里,不足之处又是什么。要有良好的人际关系和书面、口头、正式和非正式的交流沟通能力。要有客户需求意识,要时刻关注客户的需要。
  开发人员的主要职责是写出良好健壮的代码。但仅会写代码是不够的,开发人员也需要有设计能力,以及调试程序和修正错误的能力。
  一位优秀的开发人员首要要有非常扎实的计算机技术基础,特别是对于算法、数据结构的掌握是一位好的开发人员所必须拥有的。要有很强的写代码能力,要有很强的调试能力,能在很短的时间内查出程序的问题所在。要对新技术充满热情,对于新生事物要有强烈的求知欲。
     测试人员的主要职责是制定详细的测试策略和测试计划,书写翔实准确的测试报告,以及编写性能优异的测试工具。在设计阶段要起到监督的职能,实现阶段要看代码是否最理想最符合设计,同时还要检查程序的文档说明书。
  一位优秀的测试人员要有广泛的技术知识,对不同的平台、开发语言和开发技术都要有很深的了解。要善于用非常规的方式思考问题,不要局限于一个框框,要能跳出某种框框去想问题。比如微软在招聘测试人员时经常会问一个问题,就是如何去测试一支钢笔。首先肯定是应该能写字,写字的时候不漏水,笔盖能套紧等,但是你是否想过一支笔放在口袋里是否装得下,放在太阳底下会不会晒化,类似于这些我们应该想到更多的东西。曾经有一位很强的测试人员,在20分钟之内写出了50多条测试钢笔的方法。要不断分析和总结软件开发过程中可能出错的环节,应该尽可能多地参加软件测试项目,在实践中学习技能、积累经验。另外,任何一个产品完成以后,第一个使用的客户就是测试人员。因此测试人员必须把自己放在普通的、对计算机知识所知甚少的消费者角度来测试软件,而不是一位有多年计算机经验的人员。
     微软公司产品部门组织结构如图3所示。
 
  微软公司的产品部门通常负责某一类或某种产品的研发工作,产品部门内部除了总经理外,一般下辖三个职能部门:程序经理部门、开发部门和测试部门。当产品部门根据具体产品的开发需求建立实际的项目组时,将会根据项目对不同职能人员的要求,从三个职能部门中调配合适的人选共同组成项目组来完成项目开发工作。要补充的是,如图3中所示在测试人员中分为两种,一种是Tester,另一种是SDE/T。Tester通常做一些比较枯燥的测试工作,而SDE/T通常不做具体的测试,专职于写测试工具。当然Tester的工作是非常重要的,自动测试工具的能力还是有一定的限度的,往往最难、藏的最深的Bug都是Tester找出来的。
     微软除上述的职位之外,还有很多辅助性的职位,如市场策划人员、销售人员、专职的产品计划人员、硬件的设计人员、专职的用户帮助文档书写人员、本地化人员(如汉化人员)、美工设计人员、售后服务人员、公关部门人员以及法律顾问等。
 
三、产品生命周期的最佳实践
     [1] 计划阶段
     任何软件的开发工作都必须以市场为导向,即市场上所存在的明确或潜藏的商机是软件产品立项的先决条件。在先期所做的大量市场分析基础之上看准商机,由公司管理层主持制定宏观的商业计划。技术人员在此时可以为管理层提供技术层面的建议,供他们在决策时参考。
     [2] 设计阶段
     在设计阶段,项目组完成项目的所有规划工作,包括编写功能说明书、完成概要的设计、编写工作计划、制定费用预算和制定进度表等。
  在设计阶段的早期,项目组分析客户需求并将其书面化。随后,项目组开始设计整个解决方案,并编写产品的功能说明书,这一过程对于保证客户需求与产品特性之间的对应关系极为重要。项目组必须确保产品的特性能够准确、完整地体现客户需求,并能帮助客户实现业务目标。在功能说明书中应该详细阐释了软件每一个特性的功能和执行方式,以及所有特性的组合关系和整体架构。同时还应该依据市场需要的紧迫程度和该特性在产品架构中的地位等因素确定产品特性的优先级,并由此获得资源预算、进度预期和风险预期等信息。功能说明书是所有项目组成员同步工作的基石,它让开发人员、测试人员和其他项目组成员明确了每个产品特性的功能、操作方式和接口等信息。
  当功能说明书完成之后,项目组就可以开始详细的项目设计了,包括开发设计、测试设计、安全设计等等。在所有设计不存在明显矛盾或冲突之后,它们将被汇集成一份项目总体设计书,项目组的各成员则依此估计各自的工作时间并编制工作进度表。
     [3] 实现阶段
     实现阶段的主要工作是完成产品中所有组件的开发工作(包括代码和文档),此外还包括审核设计文档、安装并配置开发环境、代码检入工作、每日产品生成以及管理Bug数据库等。
     其中要说明的是,文档说明书在此阶段中是非常重要的,软件项目如果没有合格的文档,就会出现沟通上的困难和传承上的脱节。首先它是测试人员的重要参考资料;其次现在的公司人员流动量很大,如果某个核心程序员一旦离开项目组以后,留下的仅仅是一堆代码的话,下一个来接手的人要掌握此程序设计的思想、精要就非常的困难,这样的事情对项目的影响通常是致命的,微软WMI中的snmp provider就是这样一个典型的例子。
     在微软中使用一个统一的数据库管理源码、文档等资源,并保存和跟踪资源的不同版本。每天开发结束后,开发人员都要把自己计算机上最新的源码和文档更新到数据库中,这个过程被称为检入过程。此外,在微软公司的软件开发项目中最成功的经验之一就是每日产品生成,即每天都编译代码并生成完整的可执行版本,并对每一个生成的程序版本进行快速测试,以确保产品的每一次改动和每一次检入都不会破坏产品的整体结构,在最大程度上保证整个产品开发过程可管理、可预期,以及增强产品的稳定性。
     管理Bug数据库的工作主要包括为每个产品都建立一个集中的Bug数据库,产品中的Bug一般包括代码缺陷和不完美的产品特性,大多数的Bug记录都是由测试人员添加的。程序经理负责每天审查Bug数据库,并为开发人员分配Bug修改工作,开发人员修正Bug并将结果发回给测试人员。测试人员使用每日生成来检验Bug是否已经修正,若确定已更正,则修改Bug记录并关闭该项Bug。
     [4] 稳定阶段
  稳定阶段的主要任务是对产品进行测试,这一阶段测试的重点是在真实环境下的使用和操作测试,确认整个解决方案已经完成并可以发布。这一阶段的工作内容包括产品特性冻结、代码完成、用户界面冻结、Beta版本发布。
     产品特性冻结意味着除非有特殊原因,否则项目组不再为产品增加新的特性或修改已经确定的特性。代码完成意味着开发人员完成了所有的编码任务,测试人员开始做系统的集成测试。程序经理每天评审Bug、监控和分配Bug修改工作,而开发人员则需不断的修正Bug。用户界面冻结意味着用户界面的样式不再发生变更,界面上的提示信息不再发生变化。专职的用户帮助文档工程师开始编写联机帮助和用户手册。如果需要进行改动则必须经过程序经理的审核通过,并且对每一个变更都必须仔细跟踪和管理。
     在该阶段中,微软有一种工作叫Dogfood。大家知道在做狗食的时候,由于狗不会讲话,所以会有一个人去吃这个狗的食物,然后来判断此种食物的口味。微软借用了这种工作方式,在每一种产品完成之前,内部的员工必须先进行试用。虽然此时的软件还充满了Bug,并可能随时导致系统崩溃,但是员工们都还得继续Dogfood,这样就等于有几万名的测试人员在测试软件。Dogfood的目的不仅仅是为了找到Bug,还有一个作用就是帮助改进界面、操作的设计。
     [5] 发布阶段
     发布阶段是整个项目生命周期的冲刺阶段,主要的工作内容包括到达零Bug日期、发布候选版本、正式发布版本、签字认可等。
     零Bug并不意味着产品中没有Bug,它的意思是都对已发现的产品Bug进行了有效的管理和控制,改正了影响产品使用的Bug,对不影响产品使用,且因资源有限无法及时修改的Bug进行跟踪和记录,确保产品中所有已发现Bug都在项目组的控制范围之内,都可以在适当的时机得到修正。
     发布候选版本(RC0~RCx)意味着所有已知的优先级高的Bug都已被修正,不太重要的Bug可能被推迟到下一版本中再修正。开发人员应在24小时内修正新发现的重大Bug,在Bug修正后将发布一个新的候选版本,且新的候选版本必须通过完整的回归测试。
     正式发布产品版本的方式有两种,有基于盒装的产品发布(RTM)和基于Web的发布(RTW)。测试人员为最终正式发布版本签字,程序经理也需要签字确认。产品发布之后,通常都要开个庆祝会,看场电影,好好玩一玩!

posted on 2005-10-10 16:52  朱春雷  阅读(506)  评论(0编辑  收藏  举报