《人月神话》-第3章-外科手术队伍

20000美元/年的程序员的生产率可能是10000美元/年程序员的10倍

需要沟通协作的人员数量影响着开发成本

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

现在我们来验证一下这个解决方案。一方面,这个开发队伍不是通常所说的不超过10个人的、理想的小型精干的队伍,该团队的规模如此之大,以至于至少需要两个层级的管理,或者大约5名管理人员。另外,它需要额外的财务、人员、空间、文秘和机器操作方面的支持。

另一方面,如果采用一拥而上的开发方法,那么原有的200人的队伍仍然不足以开发真正的大型系统。例如,在OS360项中,当项目进行到顶峰时,有超过1000人在为它工作——程序员、文档编制人员、操作人员、职员、秘书、管理人员、支持小组等。从1963年到1966年,设计、编码和文档工作花费了大约5000个人年。如果人月可以等量置换的话,我们所假设的200人队伍则需要25年的时间,才能使产品达到现有的水平。

这就是小型、精干队伍概念上的问题:对于真正意义上的大型系统,它太慢了。设想OS/360的工作由一个小型、精干的团队来解决,譬如一个10人团队。作为一个尺度,假设他们都非常能干,比一般的编程人员在编程和文档方面的生产率高7倍。同时假设OS/360原有开发人员是一些平庸的编程人员(这与实际情况相差很远)。同样作为一个尺度,假设另一个生产率的改进因子提高了7倍,因为较小的队伍所需的沟通和交流较少。同时假设同样的队伍完成的是同样的工作。那么,5000/(10×7×7)=10,他们需要10年来完成5000人年的工作。一个产品在最初设计的10年后才出现,还有人会对它感兴趣吗?或者它是否会随着软件开发技术的快速进步,而显得过时呢?

扫描二维码关注公众号,回复: 11238038 查看本文章

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


外科医生。Mils称之为首席程序员。他亲自定义功能和性能技术说明书,设计程序,编制源代码,测试以及书写技术文档。他使用例如PL的结构化编程语言,拥有对计算机系统的访问能力;该计算机系统不仅能够进行测试,还能够存储程序的各种版本,以允许简单的文件更新,并对其文档提供文本编辑能力。首席程序员需要极高的天分、丰富的经验和应用数学、业务数据处理或其他方面的大量系统知识和应用知识

副手。他是外科医生的后备,能完成任何一部分工作,但是相对具有的经验较少。他的主要作用是作为设计的思考者、讨论者和评估人员。

外科医生试图和他沟通设计,但不受到他建议的限制。副手经常在与其他团队讨论有关功能和接口问题时代表自己的小组。他需要详细了解所有的代码,研究设计策略的备选方案。显然,他充当外科医生的保险机制。他甚至可能编制代码,但对代码的任何部分,不承担具体的开发职责

管理员。他是外科医生的老板,必须在人员、薪酬、办公空间等方面具有决定权,但他绝对不能在这些事务上浪费任何时间。因而,他需要一个控制财务、人员、工作地点和办公设备的专业管理人员,该管理员充当与组织中其他管理机构的接口。 Baker建议,仅在项目具有法律合同、报表和财务方面的需求时,管理员才具有全职责任。否则,一个管理员可以为两个团队服务。

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

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

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

所有的计算机输入汇集到这个职员处。如果需要,他会对它们进行记录或者标识。输出列表会提交给程序职员,由他进行归档和编制索引。

另外,他负责将任何模型的最新运行情况记录在状态日志中,而所有以前的结果则按时间顺序进行归档保存

Mils概念的真正关键是“从个人艺术到公共实践”的编程观念转换。

它向所有的团队成员展现了所有计算机的运行和产物,并将所有的程序和数据看做是团队的所有物,而非私人财产。

程序职员的专业化分工,使程序员从文书等杂事中解放出来,同时还可以对那些经常被忽视的杂事进行系统整理,确保了它们的质量,并强化了团队最有价值的财富——工作产品。上述概念显然考虑的是批处理程序。当使用交互式终端,特别是在没有纸张输出的情况下,程序职员的职责并未消失,只是有所更改。他会记录小组程序和私有工作拷贝之间的更新,依然控制所有程序的运行,并使用自己的交互式工具来控制产品逐步增长的完整性和有效性。

工具维护人员。现在已经有很多文件编辑、文本编辑和交互式调试等工具,因此团队很少再需要自己的机器和机器操作人员。但是这些工具使用起来必须毫无疑问地具备令人满意的反应和可靠性。外科医生则是对这些工具的服务是否充分可用的唯一评判人员。他需要一个工具维护人员,保证所有基本服务的可靠性,以及承担团队成员所需要的特殊工具(特别是交互式计算机服务)的构建、维护和升级责任。即使已经拥有非常卓越的、可靠的集中式服务,每个团队仍然要有自己的工具维护人员。因为他的工作是检查他的外科医生所需要的工具,而不是其他团队的需要。工具维护人员常常要开发一些实用程序,编制具有目录的函数库以及宏库

测试人员。外科医生需要大量合适的测试用例,用来对他所编写的工作片段,以及对整个工作进行测试。因此,测试人员既是为他的各个功能设计系统测试用例的对手,也是为他的日常调试设计测试数据的助手。他还负责计划测试的步骤和为单元测试搭建测试平台。

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


如何运作

文中定义的开发团队在很多方面满足了迫切性的需要。10个人,其中7个专业人士在解决问题,而系统是一个人或者最多两个人思考的产物,因此其在客观上达到了概念的一致性。

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

第二,在传统的队伍中大家是平等的,出现观点的差异时,不可避免地需要讨论和进行相互的妥协和让步。由于工作和资源的分解,不同的意见会造成策略和接口上的不一致,例如谁的空间会被用做缓冲区,而事实上最终它们必须整合在一起。

而在外科手术团队中,不存在利益的差别,观点的不一致之处可以由外科医生单方面来统一。这两种团队组建上的差异——对问题不进行分解和上下级的关系——使外科手术队伍可以达到客观的一致性。


猜你喜欢

转载自blog.csdn.net/m0_37302219/article/details/106127158