为什么要在一个较晚的项目中增加更多的人会使其变得更晚?


25

这是一个很普遍的谚语,那就是在后期的项目中增加更多的程序员会使情况变得更糟。为什么是这样?


14
术语是布鲁克斯定律(en.wikipedia.org/wiki/Brooks's_law)。
Macneil 2010年

7
忠告:阅读布鲁克斯的“神话人月”。这将显示该格言的来源,这是一本非常易读的书,并且该领域的每个人都应该阅读它。
David Thornley,2010年

维基百科页面写得很好。
亨利

有关生产率如何随团队规模下降的证据(超过7个团队成员,您的回报就会减少),请参阅qsm.com/process_improvement_01.html
Joeri Sebrechts

Answers:


33

介绍费用

必须向每个新开发人员介绍代码库和开发过程,这不仅需要新人花费时间,而且还需要[一名]高级开发人员的帮助(指导他们完成构建过程,解释测试过程,帮助他们)以及代码库中的陷阱,更详细的代码审查等)

因此,您添加到项目中的新开发人员越多,花费的时间就越多,这样他们才能真正为项目做出贡献。


因此,如果您优化“简介”,那么影响会减小吗?
亨利

9
@亨利:问题在于您通常无法在不成为瓶颈的程度上优化该方面。首先,一个新的程序员对您的项目,代码和过程一无所知。这是添加新团队成员时始终需要的开销。但是,当一个项目已经运行得很晚时,团队通常没有时间进行适当的介绍,而如果这样做的话,那么实际开发中就没有时间了。因此,对于团队来说,这通常是个输球的情况,而新人要花更长的时间才能为项目做出有意义的贡献。
Baelnorn

关于介绍的费用,难道不能一次录制视频然后广播给很多人,这样它就可以一次培训大量新程序员吗?(例如:开发者会议。)
rwong 2010年

7
@rwong:这不是一个坏主意,但这通常是不实际的。您不能只显示信息,还必须确保新手理解。另外,如果他们真的很新(应届毕业生),通常会有太多信息无法一次呈现给他们。我们发现Wiki可以很好地运行,因为所有信息都集中在一个地方,如果有一些他们不理解的地方,人们可以发布问题。
TMN 2010年

一种可能是分配一个非常有能力的新人,让他们执行特定任务而不会打扰其他人。他们将陷入困境,工作缓慢,一些经理和/或团队无法忍受这一点。但是,以这种方式进行管理时,新开发人员可以成为一个净资产。
David Thornley,2010年

32

除了其他答案:另一个要考虑的因素是沟通。

完整的图表对于团队中的交流渠道数量(最常见的情况)是最坏的情况。可以想象,增加一名开发人员就可以大大增加沟通渠道。有了更简化的沟通方式,影响就更少了……但是它仍然会加总。


我大约在同一时间写相同的东西!但我不是新来的,它有一个名字(一个完整的图表),您的解释更好,所以我投了赞成票。
米格尔·韦洛索

+1。同意,这是添加更多团队成员时的最大问题。
马丁·威克曼

对于将人员添加到项目中的更长期的问题,+ 1。
indyK1ng 2010年

23

最初颁布该法的书中引用的问题,《神话人月》是交流。他首先说:

只有当任务可以在许多工人之间分配且彼此之间没有通信时,人和月份才是可互换的商品收割小麦或采摘棉花是正确的。甚至对于系统编程也不是正确的。

他确实提到培训是问题的一部分:

交流的额外负担由两部分组成:培训和交流。必须对每个工人进行技术,工作目标,总体策略和工作计划方面的培训。该培训不能划分,因此这部分工作随工人人数线性变化。

...但是请注意,互通是更大的因素:

由于软件构建本质上是系统工作-在复杂的相互关系中进行的练习-通信工作量很大,并且它很快支配了由分区带来的单个任务时间的减少。增加更多的人会延长而不是缩短时间表。

还值得注意的是,Fred Brooks(作者)确实有背景知道他在说什么。这本书的大部分内容基于他管理IBM OS / 360项目的经验。尽管数十年来坚持不懈地倡导各种方式的“改进”管理方法,并且有些人甚至在起步时甚至提出了很酷的名字(eXtreme,Agile,Scrum等),但从那时起本质1似乎并没有改变。

1对于“本质”的定义,见同一作者的“没有银弹:根本和次要软件工程”,包括在20 的周年纪念版人月神话


12

这不仅仅是格言。这是可验证的。看看布鲁克斯的《神话人月》


1
这是一句谚语。它可能是可验证的,还是不能验证的,但这并不能阻止它成为一句格言。
彼得·布顿

3
我没有这本书(显然)。这是硬数字支持还是轶事?
亨利

2
@亨利:自从我读了一段时间以来,但是IIRC,两者的数量都足以得出结论。
史蒂文·埃弗斯

@Peter:编辑了我的答案。
约翰

@PeterBoughton这是一句谚语。而且,这不仅仅是一句谚语。
SantiBailors

6

这是关于这个问题的一些想法...

  • 需要使用当前资源来加快新资源的使用,以加快项目的进度。
  • 新资源可能不熟悉代码库,因此需要更多时间来适应代码。

现在,添加新的测试资源可能不是一个坏主意……这可能会加快测试过程(如果您的测试用例编写得很好),是的,使用测试工具也将有所帮助。


1
+1用于向测试而不是开发添加资源。
Baelnorn

4

因为编程不是基本的生产线工作。加快软件项目的进度需要时间。新人需要问很多问题,这会导致生产力下降(例如,新人学习,老人教他们->没有完成任何实际工作)。

为了简化它,请设想一个相对简单的单人项目,该项目计划进行1周:在星期四,您意识到它不会按时完成,相反,一个程序员需要6-7天才能完成之5。如果此时添加另一个程序员,则他们将需要与Programmer1一起工作至少几个小时或一天左右,询问许多问题以加快速度,等等。您可能不会一周剩余时间内的任何净正生产率。新的程序员可能还会引入一些额外的错误(因为他们将不像程序员1那样了解现有代码),因此将使实现和测试周期再推迟一两天。该项目将轻松完成整整两个工作周,而不是原来的一周!


好吧,您的示例有点不合时宜地缩短了项目的最后期限。将其更改为一个月,您会发现它不是必须的。我个人认为报价被滥用。当考虑普通的,普通/较差的程序员时,这是事实。如果您有优秀的程序员,并且截止日期不是1天或1周这样的不切实际的话,那么引号是错误的:可以做到(帮助项目)。
n1ckp 2010年

@ n1ck它的概括-就像“厨师太多”一样-关键点在于,仅仅在项目上投入人力并不一定会使它更快地得到解决。1个人到2个人?可能会。2到4?变量太多-它取决于项目的大小和结构。4-> 8?绝对地处于边际状态(至少在成本回报方面)。
Murph 2010年

@Murph:您似乎在想与我大致相同的东西,但是您忘记了方程式中的一个非常重要的变量:增加的人力的技能水平。这是我的最后评论,因此您错过了它,我感到很奇怪。盲目增加人力当然不是解决方案。添加非常专业的人力(您不需要很多)当然可以提供帮助,而这正是神话般的人工月报价中所缺少的。那是我的意思。否则,我早就知道报价的含义。
n1ckp 2010年

好的,示例可能更好,但是泛化仍然有效吗?
Murph 2010年

1
我已经经历了足够的时间,才知道它可能是MIGHT在非常特殊的情况下起作用的东西之一,但是99%的时间它不会起作用。无论从理论上来说,它看起来多么出色。就是说,是的,这不是黑白绝对。更像是说,开放的关系是如何不起作用的。这个理论很好,很诱人;)....但是野兽的本质是如此,以至于在大多数情况下它以失败告终。有点“例外证明规则”的事情。
鲍比表

4

弗雷德·布鲁克斯(Fred Brooks)回答了这个问题,写了一整本书《神话人月》。

这是快速n脏的版本:

1)您可以将一个项目分解为不同的部分以分配给更多的程序员是有限制的。

2)将项目划分给更多的人,可以增加协调应用程序所有部分所需的通信量。更多的交流=更多的工作。

3)对于您添加到项目中的每个人,您都添加了多个必须导航到团队的沟通渠道。此数字呈几何增长,并增加了必须进行的通信量。更多的交流=更多的工作。

4)添加每个团队成员时,会有一个“ J曲线”。就是说,现有的生产资源必须花时间让新人们加快他们原本可以花在项目上的速度。最终,您可能会增加容量,但是这会暂时降低项目速度。在项目中越晚,必须学习的内容越多,因此效果越明显。


4

我没有提到的另一个因素是某些任务需要按特定的顺序完成。在完成任务3之前,您不能执行任务4,因为它依赖于3。雇用某人同时执行任务3来同时执行任务4并没有好处。通常是在项目结束时,那些需要先完成其他任务的任务就是剩下的任务。

它们通常也是一些需要完成的最复杂的任务,正是这些任务需要对整个设计有最好的了解,以避免破坏已经完成的工作。他们通常还需要最广泛的业务领域知识。经过几个月的工作,我也许可以在一周或更短的时间内完成任务。一个新来的人会花一个多星期的时间来加快速度(并把我从我的任务中拉出来,以便有足够的时间来回答问题),即使非常熟练的人也可能花更长的时间来完成任务。不是因为他或她不称职,而是因为对项目或数据库后端的实际结构不熟悉。


+1。这是我上一份工作的主要问题。管理层对大型项目的“人工月添加”热潮不计后果。一方面,我们的团队因工作缓慢而被训练-因为我们的工作需要与该主要项目集成。但随后,在重大项目的新员工不能起床的速度足够快,所以我们得太远(上的东西,需要他们的后端完成)。一方面,我们正在开发半成品后端和测试工具的前端。流量不好。
Bobby Tables

2

对我一直有用的格言是,一个月内不能让九个女人生一个孩子。


如果您认为一个软件项目像婴儿一样,就不会生活在现实世界中。引用中有一些道理,但这是使事情脱离上下文的完美示例:-1
n1ckp 2010年

1
显然不是。但是,您有销售时间表的人也不了解软件开发。类推正是出于这个目的,将未知概念与已知实体相关联。
重播

2
布鲁克斯的另一个比喻是在餐馆里吃饭。一个运行良好的厨房可以并行做很多饭,但是在不煮或不煮的情况下,制作一顿饭的速度是有限的。
David Thornley 2010年

@rerun:您的类比问题是孕妇没有工人类比。与您的公司相比,与您的公司相比,与公司相比,女性更容易。这就是为什么我认为它如此失败。我能想到的最接近的是食物,但这更像是代码行,所以没有,不是工人。
n1ckp 2010年

1
@ n1ck:老实说,我的印象是您不同意,因为您不了解。布鲁克斯并不是在谈论用有能力的人来代替无用的人,因为他处在每个仍被雇用的人被认为是有能力的人的情况下。
David Thornley,2010年

2

我还建议使用DeMarco和Lister的“ Peopleware”。

DeMarco的“ The Deadline”以轻松愉快且易于阅读的方式介绍了此问题以及其他许多软件项目管理的谬论和谬论。

它还深入研究了从事项目/团队工作的人员的动态,并详细介绍了诸如沟通和介绍之类的工作方式如何消耗了团队的可用工作时间。

这些书非常便宜,我建议您拿起它们(Amazon或The Book Depository拥有它们)并阅读。简短的回答无法真正解决所提出的问题。


2

因为没有人花时间对以下方面进行深思熟虑,计划性的,经过测试的过程:雇用,培训,开发和监督程序员,更不用说使他们适应特定项目了。

如果您正在管理一个开发人员团队,那么您现在应该与想要招聘的人员建立多个联系人。加入开发人员组。

您能以多快的速度安装全新的开发机器并准备就绪?

您是否曾经通过向其他项目的开发人员展示过您的项目文档和规范来进行测试?他们是否看过它并确定他们可以在必要时开始从事该项目?

最新的项目进度如何?

节省雨天,因为当项目落后时,更像是飓风。


1

除了交流问题(我认为其他所有答案都在讨论)之外,添加到项目中的人也很可能创建错误,因为他们还不太了解代码。

每当我被添加到项目中时,我总是非常努力地避免破坏事物。这意味着我一开始修复起来要慢得多。


0

我想指出到目前为止,其他答案完全忽略了某些内容。

当人们被添加到一个较晚的项目中时,整个组织通常都出了很多问题。管理层和客户都不满意。人们承受着继续前进的压力。事情很紧张。

现在想象您在那个团队中。显然,这都不是您的错。规划(没有一个是您的)过于乐观。所有错误的决定都是在没有咨询您的情况下做出的。您正在尝试最好地利用它,突然有一群新人涌入。这传达了什么信息?

楼上的人显然对你失去了信心。他们叫大个子男孩来弥补你的麻烦。

您还会继续努力取得成功吗?还是……您会更沮丧,还是宁愿看到整个事情崩溃?

慢慢来 :-)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.