这是一个很普遍的谚语,那就是在后期的项目中增加更多的程序员会使情况变得更糟。为什么是这样?
这是一个很普遍的谚语,那就是在后期的项目中增加更多的程序员会使情况变得更糟。为什么是这样?
Answers:
必须向每个新开发人员介绍代码库和开发过程,这不仅需要新人花费时间,而且还需要[一名]高级开发人员的帮助(指导他们完成构建过程,解释测试过程,帮助他们)以及代码库中的陷阱,更详细的代码审查等)。
因此,您添加到项目中的新开发人员越多,花费的时间就越多,这样他们才能真正为项目做出贡献。
除了其他答案:另一个要考虑的因素是沟通。
完整的图表对于团队中的交流渠道数量(最常见的情况)是最坏的情况。可以想象,仅增加一名开发人员就可以大大增加沟通渠道。有了更简化的沟通方式,影响就更少了……但是它仍然会加总。
最初颁布该法的书中引用的问题,《神话人月》是交流。他首先说:
只有当任务可以在许多工人之间分配且彼此之间没有通信时,人和月份才是可互换的商品。收割小麦或采摘棉花是正确的。甚至对于系统编程也不是正确的。
他确实提到培训是问题的一部分:
交流的额外负担由两部分组成:培训和交流。必须对每个工人进行技术,工作目标,总体策略和工作计划方面的培训。该培训不能划分,因此这部分工作随工人人数线性变化。
...但是请注意,互通是更大的因素:
由于软件构建本质上是系统工作-在复杂的相互关系中进行的练习-通信工作量很大,并且它很快支配了由分区带来的单个任务时间的减少。增加更多的人会延长而不是缩短时间表。
还值得注意的是,Fred Brooks(作者)确实有背景知道他在说什么。这本书的大部分内容基于他管理IBM OS / 360项目的经验。尽管数十年来坚持不懈地倡导各种方式的“改进”管理方法,并且有些人甚至在起步时甚至提出了很酷的名字(eXtreme,Agile,Scrum等),但从那时起本质1似乎并没有改变。
1对于“本质”的定义,见同一作者的“没有银弹:根本和次要软件工程”,包括在20 日的周年纪念版人月神话。
因为编程不是基本的生产线工作。加快软件项目的进度需要时间。新人需要问很多问题,这会导致生产力下降(例如,新人学习,老人教他们->没有完成任何实际工作)。
为了简化它,请设想一个相对简单的单人项目,该项目计划进行1周:在星期四,您意识到它不会按时完成,相反,一个程序员需要6-7天才能完成之5。如果此时添加另一个程序员,则他们将需要与Programmer1一起工作至少几个小时或一天左右,询问许多问题以加快速度,等等。您可能不会一周剩余时间内的任何净正生产率。新的程序员可能还会引入一些额外的错误(因为他们将不像程序员1那样了解现有代码),因此将使实现和测试周期再推迟一两天。该项目将轻松完成整整两个工作周,而不是原来的一周!
弗雷德·布鲁克斯(Fred Brooks)回答了这个问题,写了一整本书《神话人月》。
这是快速n脏的版本:
1)您可以将一个项目分解为不同的部分以分配给更多的程序员是有限制的。
2)将项目划分给更多的人,可以增加协调应用程序所有部分所需的通信量。更多的交流=更多的工作。
3)对于您添加到项目中的每个人,您都添加了多个必须导航到团队的沟通渠道。此数字呈几何增长,并增加了必须进行的通信量。更多的交流=更多的工作。
4)添加每个团队成员时,会有一个“ J曲线”。就是说,现有的生产资源必须花时间让新人们加快他们原本可以花在项目上的速度。最终,您可能会增加容量,但是这会暂时降低项目速度。在项目中越晚,必须学习的内容越多,因此效果越明显。
我没有提到的另一个因素是某些任务需要按特定的顺序完成。在完成任务3之前,您不能执行任务4,因为它依赖于3。雇用某人同时执行任务3来同时执行任务4并没有好处。通常是在项目结束时,那些需要先完成其他任务的任务就是剩下的任务。
它们通常也是一些需要完成的最复杂的任务,正是这些任务需要对整个设计有最好的了解,以避免破坏已经完成的工作。他们通常还需要最广泛的业务领域知识。经过几个月的工作,我也许可以在一周或更短的时间内完成任务。一个新来的人会花一个多星期的时间来加快速度(并把我从我的任务中拉出来,以便有足够的时间来回答问题),即使非常熟练的人也可能花更长的时间来完成任务。不是因为他或她不称职,而是因为对项目或数据库后端的实际结构不熟悉。
对我一直有用的格言是,一个月内不能让九个女人生一个孩子。