为什么增加人手并不能使项目进度提高到想象的程度?
假定一个项目估算出来,一个人做需要12个月(客户哪能等那么久,黄花菜都凉了);那么增加到4个人来做,是不是就可以3个月来完成呢,因为总共12个人月嘛。答案是否定的。
因为,如果项目真是一个人来做,不存在沟通的问题,不会存在接口的问题,不会有这样的场景出现:
项目经理:我们每周开个例会,讨论一下目前的进度;
技术经理:来,讨论一下设计方案;
程序员甲:这个需求好像不太明确,你自己弄清楚了再来找我;
设计人员:方案有变,得重新讨论一下新方案;
程序员乙:我写的程序没问题,你调用的数据有问题;
......
其实,很多人一起做一个项目,有点类似于现在多核时代的并行处理系统,有个阿姆达尔定律对并行系统的处理能力给出了定量的计算公式:
百度百科 阿姆达尔定律 写道
阿姆达尔曾致力于并行处理系统的研究。对于固定负载情况下描述并行处理效果的加速比s,阿姆达尔经过深入研究给出了如下公式:
S=1/(a+(1-a)/n)
其中,a为串行计算部分所占比例,n为并行处理结点个数。这样,当a=0时,最大加速比s=n;当a=1时,最小加速比s=1;当n→∞时,极限加速比s→ 1/a,这也就是加速比的上限。例如,若串行代码占整个代码的25%,则并行处理的总体性能不可能超过4。这一公式已被学术界所接受,并被称做“阿姆达尔定律”(Amdahl law)。
项目由单个人完成,其实就是一种串行计算模式,一环套一环,一件事情接着一件事情完成;而增加到多个人来完成,就变成了并行计算,需要对工作任务进行并行化设计和分解,某些工作肯定是很难进行并行化的,而且工作任务需要同步,彼此协作才能完成这个项目。(有时候,系统的一些设计方式,就是为了方便多人协作,但往往会增加开销)
假定我们需要串行工作的部分是20%,那么上面一个人12个月完成的事情,在增加到4个人时,会提速多少呢?我们用阿姆达尔定律公式计算如下:
S = 1 / (0.2 + (1-0.2) / 4) = 1 / (0.2 + 0.2) = 1 / 0.4 = 2.5 倍速
意思是说,进度是原来的 2.5 倍,那么原来需要 12个月的,现在 需要
T = 12 / 2.5 = 4.8 月
比原来设想的3个月搞定的计划要落后差不多两个月时间。
那,有人说,那我继续来增加人手,增加到 8个人来干,总能更快些了吧?我们重新来计算:
S = 1 / (0.2 + (1-0.2) / 8) = 1 / (0.2 + 0.1) = 1 / 0.3 = 3.33 倍速
时间
T = 12 / 3.3 = 3.6 月
也就是说,新增加的那4个人带来的效率,就是可能使项目再提前1个月完成。果真如此吗?
我们前面假定a的值是20%,对于只是计算机执行的任务来说也许可以这样来假定,但对于由人组成的“并行”系统呢?计算机的并行系统,比如使用多核处理器,每核的处理能力相同;但每个人的能力都是由差别的,对于项目人员配置,总是技术好的带几个技术一般的(甚至是学徒工),因此每个人对提速的贡献是不同的。而且随着人员的增加,沟通的成本会急剧上升,由于模块之间接口增加,相应的缺陷也会急剧增加,因此 a 的值也会随着人员的增加而变大。我们假定在 8 个人参与项目的时候,a 的值估计为 30%,我们重新来计算:
S = 1 / (0.3 + (1-0.3) / 8) = 2.58 倍速
发现这个结果与4个人参与项目时差不多,也就是说新增加的这4个人,除了增加了人员成本之外,并没有带来项目效率上的提升。(也可以预计到,再增加人手,项目将会更慢更慢些)
这一点,毋庸置疑,增加人手并不能使项目进度加快到想象的速度,甚至相反,Brooks 在《人月神话》中早就提及(有人也把此称之为布鲁克斯定律):
Brooks 人月神话 写道
人月
人月(英语:man-month)指的是“一个人要花几个月”才能完成软件开发的单位,通常用来评估一件软件项目的大小。以成本会计(cost accounting)为基础的进度预估技术,使我们误把工作量和项目进度混为一谈,人月是个危险并很容易就遭到误解的迷思(myth),因为它假设人力和工时可以互换。
Brooks法则
在一个进度已经落后的软件项目中增加人手,只会让它更加落后。根据Brooks法则,增加人员到一个已经延误的项目里,等于是火上加油。除非你可以把工作区分,让新进人员可在不影响他人工作的状况下有所贡献。
把工作切分给更多人做将造成额外的沟通(communication)代价——训练和相互的交流(intercommunication)。欲增加软件项目的人手,总共必须付出的代价可分为三方面:工作重新切分本身所造成的混乱与额外工作量、新进人员的训练、新增加的相互交流。
网上也有人写了文章来讨论“布鲁克斯定律”,比如:
柳记 浅谈软件开发定律系列之布鲁克斯定律 http://eilfei2000.blog.51cto.com/2956473/738324
下面的文章也很不错:做一个艺术品,只有一个人才可以做好。规模庞大的工程,需要多个人来完成。
云风的Blog 软件项目需要很多人一起完成可能是一个骗局 http://blog.codingnow.com/2011/05/solo.html
关于分工合作 http://blog.codingnow.com/2012/01/_oeouoeie.html
PS:为什么会写这么一篇文章呢?因为今天刚好看到最新的《程序员》杂志上的《1024核CPU上的并行编程》一文,突然想到在项目中好像也存在这种并行计算的影子。该文说道“同步所带来的串行化开销是并行程序最大的性能杀手”,同样也可以说“沟通 所带来的时间成本开销是项目的最大进度杀手,但沟通是不可以省略的”。(当然,本文并不是否定团队协作完成项目,因为大多数项目都不可能一个人搞定:一是时间不允许,二是精力不允许,三是能力不允许,四是客户不允许,五是......,最大的原因是没有必要也没有能力一个人扛,钱是公司赚滴,身体是自己的哦)
分享到:
相关推荐
首先,甘特图的原理是通过条形图来展示项目的各个任务、阶段以及它们的起止时间,使团队成员能清晰地看到项目的整体进度和每个任务的状态。在Excel中制作甘特图,可以利用其内置的图表功能和数据管理工具,实现...
项目管理是现代企业运营中不可或缺的一部分,而一个高效的项目进度管理系统则是确保项目顺利推进的关键工具。本文将深入探讨“项目进度管理系统(甘特图)”这一主题,解析其核心功能,并提供相关的实践指导。 一、...
这个名为"人手检测训练数据库"的资源是专为训练一个人手检测系统而设计的,它包含了大量的图像样本,以及与之配套的Matlab文件,这些文件详细标注了图像中人手的位置和大小信息,为机器学习模型提供了必要的标注数据...
该项目的失败原因可以归结为五个方面:缺乏合理的时间进度、不科学的估算技术、人员过多、缺乏跟踪和监督、意识到进度偏移时的不当反应。 首先,缺乏合理的时间进度是造成项目滞后的最主要原因。时间进度的合理性...
在Android开发中,自定义视图是提升用户体验和实现独特设计的重要手段。本文将深入探讨如何在Android中创建一个自定义...自定义视图不仅能够提高应用的个性化程度,还能锻炼开发者对Android图形绘制和事件处理的理解。
在其他工程领域中,严格的进度追踪被视为常态,但在软件工程中,这种做法往往被忽视,直到项目偏离轨道,才试图通过增派人手来补救。然而,这种“用汽油灭火”的做法实际上会使问题变得更糟,因为增加的人员需要时间...
在项目管理实践中,项目经理常常会遇到客户要求压缩项目工期的情况,这可能源于甲方对于成本、进度等方面的压力,或者是对乙方项目管理能力的不信任。针对这种情况,项目经理需要有一套系统的应对策略,来妥善处理...
Java练手项目是针对初学者设计的一...通过实践这些Java练手项目,初学者不仅能巩固Java Web的基本概念,还能体验实际项目开发流程,提高解决问题的能力。不断练习和深入学习,将有助于成长为一名合格的Java Web开发者。
在实际操作中,如果资源有限,可能需要采取进度控制措施,比如增加资源投入(如雇佣更多油漆工)、延长工作时间、调整工作范围或提高工作效率,以加速项目的完成。 总之,有效的资源配置是项目管理中的核心策略,它...
总结,"项目案例"这个压缩包为Project 2003的学习者提供了一手的实践资料,通过深入学习和理解这些案例,可以大大提高项目管理的专业素养,无论是在理论知识还是在实际操作上,都能得到显著提升。对于从事项目管理...
在计算机视觉领域,人体手臂识别是一项重要的技术,广泛应用于手势识别、人机交互以及智能安全监控等场景。OpenCV(开源计算机视觉库)是实现这一技术的常用工具,它提供了丰富的图像处理和机器学习功能。本项目专注...
易语言是一种专为中国人设计的编程语言,它以简体中文作为编程语法,降低了编程的门槛,使得更多非计算机专业的人也能轻松学习编程。"易语言人手必备三万源码+一千模块"是一个非常宝贵的资源集合,对于易语言的学习...
作为项目经理,其实脑子里就是几样东西:做哪些事情、做到什么程度、怎么交货、手上的资源以及各个事情的优先级。所谓多快好省那是人类的梦想,这四个方面 都是相互矛盾的,属于典型的又要马儿跑,又要马儿不吃草的...
在项目管理领域,甘特图是一种广泛使用的工具,它通过图形化的方式清晰地展示了项目的进度计划,帮助管理者有效地跟踪和控制项目进程。"项目管理-甘特图模板.rar" 文件提供了一套便捷的Excel模板,为项目管理初学者...
这些项目涵盖了从基础到进阶的各种技术点,包括但不限于: 1. **基础操作**:如变量、数据类型、控制结构(if...else, switch)、循环(for, while, do...while)以及函数的使用。 2. **字符串与数组处理**:涉及...
项目开发环境包括硬件环境:PC Server 服务器,人手一台 PC 机,软件环境:Tomcat+Maven+JDK+MySQL+Eclipse 及插件网络环境:100M 及以上速率局域网,TCP/IP 协议等。 项目团队组织结构包括开发组、测试组、文档组...
在Windows 7操作系统中,有时用户在尝试对文件夹进行重命名、剪切或复制操作时,可能会遇到“找不到该项目”的错误提示。这个问题通常与Windows的文件系统或注册表设置有关,尤其是涉及到文件夹的元数据描述。在这个...
这个项目的核心在于利用软件技术对机械手的动作进行精确编程,使其能够执行点位插补、直线、画弧以及jump和moveOP等复杂运动。以下是关于这一主题的详细知识讲解: 1. **C#编程语言**:C#是微软公司推出的一种面向...
- **用户方全程参与**:为了确保项目的顺利进行,用户方需成立由高层领导带领的项目小组,并积极参与到项目的各个阶段(如调研、设计、编码等)。这种做法不仅有助于培养用户方的技术团队,还能加强双方的沟通与协作...