人月神话,外科手术队伍

以下摘自《人月神话》,讨论了开发团队的组建以及运作。

在计算机领域的会议中,常常听到年轻的软件经理声称,他们喜欢由一流人才组成的小型、精干的队伍,而不是那些几百人的大型团队,这里的“人”当然暗指平庸的程序员。其实我们也经常有相同的看法。

软件经理很早就认识到优秀程序员和较差程序员之间生产率的差异。

我常常重复这样一个观点,需要协作沟通的人员数量影响着开发成本,因为成本的主要组成部分是相互的沟通和交流,以及更正沟通不当引起的不良结果(系统调试)。这一点,也暗示系统应该由尽可能少的人员来开发。

如果在一个200人的项目中,有25个最能干和最有开发经验的项目经理,那么开除剩下的175名程序员,让项目经理来编程开发。

对于效率和概念的完整性来说,最好由少数干练的人员来设计和开发,而对于大型系统,则需要大量的人手,以使产品能在时间上满足要求。如何调和这两方面的矛盾呢?

Harlan Mills的提议提供了一个崭新的、创造性的解决方案。Mills建议大型项目的每一个部分由一个团队解决,但是该队伍以类似外科手术的方式组建,而并非一拥而上。也就是说,同每个成员截取问题某个部分的做法相反,由一个人来完成问题的分解,其他人给予他所需要的支持,以提高效率和生产力。

使用医生的比喻:如果考虑所有可能想到的工作,这样的队伍应该如何运作?

外科医生。Mills称之为首席程序员。他亲自定义功能和性能技术说明书,设计程序,编制源代码,测试以及书写技术文档。首席程序员需要极高的天分、十年的经验和应用数学、业务数据处理或其他方面的大量系统知识和应用知识。

副手。他是外科医生的后备,能完成任何一部分工作,但是相对具有的经验较少。他的主要作用是作为设计的思考着、讨论者和评估人员。外科医生试图和他沟通设计,但不受到他建议的限制。副手经常在与其他团队讨论有关功能和接口问题时代表自己的小组。他需要详细了解所有的代码,研究设计策略的备选方案。显然,他充当外科医生的保险机制。他甚至可能编制代码,但对代码的任何部分,不承担具体的开发职责。

管理员。外科医生是老板,他必须在人员、薪酬、办公空间等方面具有决定权,但他决不能在这些事务上浪费任何时间。因而,他需要一个控制财务、人员、工作地点和办公设备的专业管理人员,该管理员充当与组织中其他管理机构的接口。

编辑。外科医生负责文档的生成,出于最大透明度的考虑,他必须创建各种文档。无论是对内部描述还是外部描述。而编辑根据外科医生的草稿或者口述,进行分析和重新组织,提供各种参考信息和书目,对多个版本进行维护,并监督文档生成的机制。

两个文秘。管理员和编辑每个人需要一个文秘。管理员的文秘负责项目的协作一致和非产品文件。

程序职员。他负责维护编程产品库中所有团队的技术记录。该职员接受文秘性质的培训,承担机器码文件和可读文件的相关管理职责。

工具维护人员。他的工作是检查他的外科医生所需要的工具,而不是其他团队的需要。工具维护人员常常要开发一些实用程序、编制具有目录的函数库以及宏库。

测试人员。外科医生需要大量合适的测试用例,用来对他所编写的工作片段,以及对整个工作进行测试。他还负责计划测试的步骤和为单元测试搭建测试平台。

语言专家。在大多数计算机项目中,总有一两个乐于掌握复杂编程语言的人。这些专家非常有帮助,很快大家会向他咨询。这些天才不同于外科医生,外科医生主要是系统设计者以及考虑系统的整体实现。而语言专家则寻找一种简洁、有效的使用语言的方法来解决复杂、晦涩或者棘手的问题。他通常需要对技术进行一些研究(2~3天)。通常一个语言专家可以为两个到三个外科医生服务。

要特别注意传统的两人队伍与外科医生-副手团队架构之间的区别。首先,传统的队伍将工作进行划分,每人负责一部分工作的设计和实现。在外科手术团队中,外科医生和副手都了解所有的设计和全部的代码。这节省了空间分配、磁盘访问等的劳动量,同时也确保了工作概念上的完整性。

在传统的队伍中大家是平等的。出现观点的差异时,不可避免地需要讨论和进行相互的妥协和让步。由于工作和资源的分解,不同意见会造成策略和接口上的不一致,例如谁的空间会被用作缓冲区,而事实上最终它们必须整合在一起。而在外科手术团队中,不存在利益的差别,观点的不一致之处可以由外科医生单方面来统一。

如果整个工作能控制在范围之内,10个人的团队无论如何组织,总是比较高效的。但是当我们需要面对几百人参与的大型任务时,如何应用外科手术团队的概念呢?

扩建过程的成功依赖于这样一个事实,即每个部分的概念完整性得到了彻底的提高——决定设计的人员是原来的1/7或者更少。所以,可以让200人去解决问题,而仅仅需要协调20个人,即那些“外科医生”的思路。

整个系统必须具备概念上的完整性,要有一个系统架构师从上至下地进行所有设计。要使工作易于管理,必须清晰地划分体系结构设计和实现之间的界线,系统架构师必须一丝不苟地专注于体系结构。总的来说,上述的角色分工和技术是可行的,在实际工作中,具有非常高的效率。