一、 团队模型概述
在软件开发活动中,团队的重要性无需再赘述了,就如同蜀汉帝国之所以能与曹魏、孙吴鼎足而立三分天下,其根本原因在于有一个优秀的团队,桃源结义、三顾茅庐都已成佳话。
怎样才能建设一个高效率的团队呢?我们认为有两个方面的要素:
1. 寻找适合企业发展策略的优秀人才。请注意我们强调的不是人,而是人才。至于如何寻找到优秀的人才,这是HR工作职责,Relax™无能为力。有句话是这样说的:A`s hire A`s; B`s hire C`s,一流的人雇佣一流的人,二流的人雇佣三流的人。企业应该寻找优秀的软件开发人员加盟,不要相信三个臭皮匠能顶诸葛亮的鬼话;
2. 用有效的方法组织人才。现代软件开发是需要若干人组成团队协同工作的,如果没有一种合适的团队组织方式,一群优秀的人才在一起也难以产生预期的结果。大家都知道田忌赛马的典故,同样的马匹,调整一下比赛次序即产生完全不同的成绩。
我们着重关注的是第二个方面。大抵每一种软件过程都有自己的团队模型,如同MSF其团队模型文档厚度达数十页;XP以Pair Programming为最佳实践,两个开发人员结对干活;FDD(Feature-Driven Development)则推崇“主程序员小组”,其结构类似于外科手术团队。Relax™以FDD为方法论基础,实现了这种已被证明为行之有效的团队理论,并以主程序员制度贯彻始终。本文将简要阐述Relax™中的团队模型。
二、 理论基础
如同Relax™所采用的其它最佳实践一样,“主程序员小组”的理论并不是FDD的发明者们或者Relax™的设计者拍脑袋想出的,而是来源于自上个世纪70年代以来Fred Brooks和温伯格等人的系统思考和精辟论述,“主程序员小组”理论的核心将软件开发活动从一种个人艺术上升到了公共实践。本文不再详细探讨,建议读者朋友们阅读Fred Brooks的名著《人月神话》以及温伯格先生的名著《程序开发心理学》。
一个已被证实的现象是:软件开发的效率随着开发团队规模扩大而下降。Fred Brooks将其原因归结于沟通成本的上升。为了使得团队沟通顺畅而又不影响工作效率,那么我们就需要将团队规模控制在某个阀值之下。主程序员小组模型即是用来将大规模的开发团队分割成高效率小团队的方法,我们建议主程序员小组的规模应控制在3到7人之间,这个规模的团队,成员既可独立开展工作又能有效沟通并合作解决棘手问题。
单纯将大规模团队切分成较小规模的开发小组并不能有效地解决问题,小组内部还需要一种合理的组织方式。这也是为什么Relax™的团队模型被称之为“主程序员小组”而不是“开发小组”的奥秘所在。Harlan Mills通过对外科手术小组的观察,提出了一种用以提高软件开发效率的、被称之为“虚拟手术小组”的方案,即按照外科手术小组的结构来组织软件开发团队。主程序员就是那位手执柳叶刀的外科医生,小组内的开发人员则在他的协调下工作。主程序员小组具有一致的工作目标,而不是小组内每个开发人员只管自己那一亩三分地各行其是。就如同外科手术小组的共同目标是手术成功,而不是麻醉师认为只要麻醉没问题就够了,手术能否成功与他无关。
我们可以将“主程序员小组”模型理解成一种个人主义加上团队精神的混合模式。这种模式为什么高效?大野耐一先生在其名著《丰田生产方式》中有阐述,个人技能结合团队协作会产生一种乘积效应。
不愿意读书的朋友,我们推荐看看两部好莱坞电影:《偷天换日》和《极速六十秒》,关注一下其中的两个“盗窃团伙”的特点和工作方式。
三、 Relax™中的实践
上文对“主程序员小组”的原理作了简略的说明。现在我们看看Relax™中一个典型的项目团队结构和各自的职责。遵循FDD的定义,一个团队包含如下表所示的关键角色:
角色 | 描述 |
项目经理 | 一种纯管理角色,负责资源的分配和协调 |
开发经理 | 一种技术管理角色,对项目的整体成败负责 |
主设计师 | 项目的架构和设计负责,召集并与主程序员们共同工作 |
主程序员 | 技术娴熟、有组织能力并愿意承担管理责任,领导小组开展工作 |
开发人员(类所有者) | 技术熟练,负责开发由主程序员所分配的Feature。 |
领域专家 | 精通项目所涉及的业务知识,为团队提供业务支持。通常此角色来自于客户方,与项目团队一起工作 |
其他支持角色 | 如配置管理人员、QA人员、文档人员、语言专家等等支持角色 |
有几个方面需要特别加以强调:
1. 同一个人可以担任多个角色,比如中小等规模项目,通常由项目经理兼任开发经理;
2. 主程序员也是开发人员,也领取具体的开发任务,而不是一个特设的管理职位。主程序员还具有更多的职责,请参考我们翻译的《主程序员的职责》一文。
3. 开发人员既需要独立工作又需要在主程序员协调下与其他成员合作。
4. FDD提倡领域建模。因此主设计师的主要职责是负责为项目建立一个合理的对象模型,并召集主程序员们一起合作将对象模型细化并设计出类图和序列图。
5. 为了简历或者名片上更好看些,主程序员也可被称呼为“首席程序员”,与英文的 “Chief Programmer”对应。
在这个团队模型中,主程序员是一个非常重要的角色,因此对担当此职位者的能力要求也颇为严格。Harlan Mills甚至认为“主程序员需要极高的天分、十年的经验和应用数学、业务数据处理或其他方面的大量系统知识和应用知识”。
当然这并不是说主程序员比开发人员的行政职位要更高级一些。在团队中主程序员和开发人员是平等的,但主程序员更乐意承担一部分管理职责。由于性格、喜好等因素,相当一部分软件开发者乐意做一名资深的软件开发人员而不愿意从事与人打交道的管理工作。
Relax™在设计上充分体现了主程序员的管理职责:
1. 在项目计划中,版本的交付项以“业务活动”为基本单位。而“业务活动”则被分配给特定的主程序员。
2. 主程序员们和项目经理一起定义和管理项目需求。
3. 主程序员对进度负责。主程序员负责管理“主程序员工作包”,从分配给自己的业务活动中挑选出Feature列为当前的开发任务中,并负责将Feature分配给开发人员。
4. 主程序员对质量负责。QA人员将缺陷分配给主程序员而不是某个开发人员。主程序员负责召集小组成员共同分析和解决问题。
人的活动既需要独立空间又需要融入公共空间。我们充分考虑到这种社会学和心理学上特征,提出了团队集体参与分析/设计、程序员独立开发并对单个开发任务负责、团队集体对项目成本/质量负责、项目信息完全共享和透明的理念。