我需要在一个月内完成这个任务-给我九个女人!

184

在已经延误的项目中,什么情况下添加程序员实际上会加速开发进度?


我理解你想要表达的比喻,但是一个更具描述性和不那么震撼的标题可能是个好主意... - Adrian Petrescu
将“women”替换为“couples”。 - just mike
无论你添加多少男人(只要数量不为零),你仍然需要9个女人。 - Windows programmer
9
只要其中一个女人怀孕八个月,它就可以起作用。 - Toon Krijthe
16个回答

87

具体情况显然非常特定于您的项目(例如开发团队、管理风格、流程成熟度、主题难度等)。为了更好地限定范围,以便我们可以进行讨论而不是简单而笼统的概括,我将重述您的问题:

在什么情况下,如果有的话,在软件开发项目已经延迟的情况下增加团队成员可能会导致实际发布日期的缩短,并保持与现有团队工作直到完成时相同水平的质量?

以下是我认为必要但不充分的条件(无特定顺序):

  • 提议添加到项目中的人必须:
    • 对项目的问题领域至少有合理的理解
    • 精通项目语言和他们将执行的任务所需的特定技术
    • 他们的能力水平不能比最弱或最强的现有成员差太多。弱团队成员将消耗现有员工的精力,而新人如果太强会因其认为旧有的一切都是错误的而破坏团队。
    • 具备良好的沟通技巧
    • 高度积极(例如能够独立工作而不需要推动)
  • 现有团队成员必须具备:
    • 优秀的沟通技巧
    • 优秀的时间管理技巧
  • 项目领导/管理必须具备:
    • 良好的优先级和资源分配能力
    • 得到现有团队成员高度尊重
    • 优秀的沟通技巧
  • 项目必须具备:
    • 良好、完整且有记录的软件设计规格说明书
    • 已实施事项的良好记录
    • 模块化设计以允许清晰划分责任区块
    • 具备足够的自动化流程来保证所需缺陷水平的质量保证,这可能包括单元测试、回归测试、自动化构建部署等。
    • 一个由团队当前在使用的错误/功能跟踪系统(例如 trac、SourceForge、FogBugz 等)。

首先应该讨论的是船期是否可以推迟,是否可以削减功能,以及两者的某些组合是否能够让你利用现有人员实现发行。很多时候,一些占用团队资源但投资回报不高的功能会导致项目进度滞后。因此,在开始其他事情之前,认真评估项目的优先级。

如果上述段落的结果不足以解决问题,那么查看上面的列表。如果你早期意识到进度滑坡,那么在正确的时间添加适当的团队成员可能会挽救发布。不幸的是,船期越近,添加人员出现问题的可能性就越大。在某个时刻,你将跨过“不可逆转点”,除了发布当前的开发分支,没有任何变更可以拯救你的发布。

我可以继续讲下去,但我认为我已经涵盖了主要的观点。除了项目之外,从事你的职业和公司未来的成功等方面来看,你绝对应该弄清楚为什么会延迟,是否可以提前发现并采取措施避免这种情况再次发生。项目延期通常是因为你要么:

  • 开始时就已经延迟(任务量超出时间);
  • 逐渐滑坡,一小时、一天。

希望这有所帮助!


3
好的清单。然而,我担心许多项目恰恰因为没有你列出的所有内容而延迟了... - sleske
1
只是轻松一下,但如果团队拥有所有这些功能,他们可能不会首先落后 :) - rtpHarry

29

只有在您有一个资源驱动的项目时才有帮助。

例如,考虑以下情况:

您需要绘制一个大海报,比如4米乘6米。这么大的海报,你可能可以让两三个人站在前面,同时涂漆。然而,在前面放置20个人是行不通的。此外,除非你想要一张烂海报,否则你需要有技能的人。

但是,如果您的项目是用预先打印好的信件(例如“您可能已经赢了!”)装信封,则添加更多人员,处理速度就越快。在分配工作堆栈方面有些开销,因此您不能获得每个信封一个人的效益,但是您可以从远远超过2或3个人中获得效益。

因此,如果您的项目可以轻松地分成小块,并且团队成员可以迅速上手(例如...即时),则增加更多人员将使项目进展更快,直到某个点为止。

遗憾的是,在我们的世界中很少有这样的项目,这就是为什么docgnome关于神话般的人月书籍的提示是一个非常好的建议。


我认为软件本质上不是这样的一个项目,所以除非你增加人手来做非程序员的工作(比如创建图像和翻译文本),否则你可以放心地说它不会有帮助,以TMMM为参考。 - Mike Stone

17

也许只有在以下条件同时满足时:

  1. 新程序员已经了解项目,不需要任何上手时间。
  2. 新程序员已经熟练掌握开发环境。
  3. 不需要任何管理时间将程序员添加到团队中。
  4. 团队成员之间几乎不需要进行沟通。

我会在第一时间告诉你是否同时满足以上所有条件。


1
基本上是把某人重新加入他们曾经离开的项目(最近离开,以至于他们还没有忘记任何东西) - Mike Stone
1
我会在第一时间告诉你,如果我同时看到所有这些东西。屏住呼吸!!! - Stu Thompson
我喜欢你尝试总结成功团队成员加入的条件。我认为(2)和(3)是显而易见的。只有在将他们重新分配到他们已经参与的项目上时,才可能出现(1)。只有当现有员工被转移到与其他程序员具有现有关系的项目中(来自以前的项目)时,才可能出现(4)。 - Anonymous Type

11

根据《人月神话》,将人员添加到已经延迟的项目中导致项目更加延迟的主要原因是O(n^2)的沟通开销。

我遇到了一个主要的例外情况:如果一个项目只有一个人,那几乎注定会失败。增加第二个人几乎总是能提高速度。这是因为在这种情况下,沟通不是开销,而是一个有益的机会,可以澄清思路并减少愚蠢的错误。

此外,正如你发问时显然已经知道的,来自《人月神话》的建议仅适用于已经延迟的项目。如果你的项目还没有延误,增加人员不会使它变得更糟。当然,前提是你做得正确。


9
如果现有程序员完全无能,那么添加有能力的程序员可能会有所帮助。
我可以想象一种情况,您拥有一个非常模块化的系统,而现有的程序员甚至还没有开始处理一个非常孤立的模块。在这种情况下,将该项目的部分分配给新程序员可能会有所帮助。
基本上,《神话般的人月》的参考资料是正确的,除了像我编造的那种人为情况。布鲁克斯先生进行了扎实的研究,以证明在某一点之后,添加新程序员到项目中的网络和沟通成本将超过从他们的生产力中获得的任何好处。

并不完全是这样...仍然需要花费时间学习代码库...如果他们完全无能,项目可能会失败。 - Mike Stone
我在这里同意Mike Stone的观点。代码库和架构可能存在缺陷,对于一个严肃的项目,每个开发人员需要2-4个月的上手时间,还有各种关于技术领导力的问题等等。想到这些问题我就感到不安。 - Stu Thompson

5
  • 如果新人专注于测试
  • 如果您可以隔离独立的功能而不会创建新的依赖关系
  • 如果您可以将项目的某些方面正交化(尤其是非编码任务,如视觉设计/布局、数据库调整/索引或服务器设置/网络配置),以便一个人可以在其他人继续应用程序代码的同时处理它
  • 如果人们彼此相识,并且了解技术、业务需求和设计,足以能够在知道何时会互相干扰以及如何避免这样做的情况下进行操作(当然,如果这种情况不存在,这很难安排)

4

与其增加程序员,我们可以考虑增加行政帮助。任何能够消除干扰、提高集中精力或提高动力的事情都是有益的。这包括系统和管理,以及更加平凡的事情,比如准备午餐。


1
好的建议,我认为这与《神话般的程序员月度》中的建议精神是一致的。++ - Ed Guiness

4

只有当你在项目的后期阶段还有一些独立的任务(与项目的其他部分几乎没有交互)尚未被任何人解决,你才可以引入一个在该领域专家的团队成员。添加团队成员必须最大限度地减少对其余团队的干扰。


3
我认为如果以下条件成立,末尾增加人员可能会加快工作速度:
1. 工作可以并行完成。 2. 增加资源所节省的时间大于那些熟悉项目的人向不熟悉项目的人解释事情所花费的时间。
编辑:我忘记提到,这种情况并不经常发生。通常是非常简单的任务,比如管理屏幕对表格进行简单的CRUD操作。现在这些类型的工具可以自动生成大部分代码。
要小心那些依赖这种工作交接的经理。听起来很好,但实际上通常没有足够的时间来显著缩短项目时间。

3
显然,每个项目都不同,但大多数开发工作都可以保证在开发人员之间有一定的协作。在这种情况下,我的经验是新资源实际上可能会无意中减慢他们依赖于将他们带入速度的人,并且在某些情况下,这可能是您的关键人员(顺便说一句,通常是“关键”人员会花时间教育新手)。当他们适应了速度后,不能保证他们的工作会符合团队中已经建立的“规则”或“工作文化”。因此,它可能会做更多的坏事而不是好事。因此,除此之外,以下是可能有益的情况:
1)新资源有一个紧密的任务,需要最少的与其他开发人员的交互,并且已经展示了技能集。 (即将现有代码移植到新平台,外部重构目前在现有代码库中被锁定的死模块)。
2)项目以这样的方式管理,使得其他更高级别的团队成员的时间可以共享,以帮助新手提速并沿途指导他们,以确保他们的工作与已完成的工作兼容。
3)其他团队成员非常有耐心。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接