在描述项目的规模时,特别是在软件外包公司中,我们最常听到项目经理说的,应该就是类似“这个项目投入了XX人月”这样的话了吧。
这样的描述方法,虽然直观,但是却隐藏掉了很多特别的内容。比如说,30人月的项目,到底是10个人做了3个月?还是5个人做了6个月?布鲁克斯在他的《人月神话》(一本有关软件项目管理的书)很明确的指出,人和月之前是不可互换的。也就是说,“10个人花3个月”和“5个人花6个月”之间有非常的不同。考虑一下极端的情况:依然是30人月的项目,是否可能投入30个人在1个月内完成?
除了项目完成的可能性外,还有一个更大的不同,那就是做项目的支出,也就是成本。
项目的成本从客户看来,或许的确仅仅就是人月数。客户可以用最简单的方法计算出他们的成本(也就是项目款):
【每个人月的价格 × 人月数】
或者直接给出价格以及期限,无需关心人月。除此之外,他们能做的,可能也就是想方设法去询到最低价,以及讨价还价——因为他们并不知道,也不需要去知道,实际来做这个项目的程序员有多少,以及他们的工资是多少。
而从外包公司来看,情况就有所不同了。首先在期限内完成项目肯定是毫无疑问的,期间投入的人数,以及人员的配置,会有很大的不同。在外包公司看来,他们做项目的成本,即所有参与此项目的员工的工资(简单起见,其他开支暂且不考虑)。那么,由于每一个员工的工资并不相同,所以不可能以客户计算成本的方式计算它自己的成本。而在和客户商讨的时候,虽然也会用人月来和客户对话。但这主要还是用于预估,和实际的开销并无多大关系。
几乎每一家公司都会有定岗定职定薪的做法。比如,把员工分为初级程序员,高级程序员,软件架构师,项目经理等。其作用一方面是为了内部的管理。另一方面,也为项目的成本计算提供了一定的依据。——毕竟,要罗列每一个员工的实际工资是一件比较麻烦的事情。同时,也要避免员工之间互相得知彼此的工资。
考虑某A公司的职位的成本:
# | 职位 | 成本 |
1 | 初级程序员 | 3500 |
2 | 高级程序员 | 6000 |
3 | 系统架构师 | 8000 |
4 | 项目经理 | 12000 |
回过头重新考虑一下上面30个人月的项目:
如果按10个人做3个月来计算,假设人员配置如下:
# | 职位 | 成本 | 人数 | 合计 |
1 | 初级程序员 | 3500 | 6 | 21000 |
2 | 高级程序员 | 6000 | 2 | 12000 |
3 | 系统架构师 | 8000 | 1 | 8000 |
4 | 项目经理 | 12000 | 1 | 12000 |
合计 | - | - | 10 | 53000 |
那么,整个项目的成本就是
【53,000元/月 × 3个月 = 159,000元】
如果按5个人做6个月来计算,情况又如何呢?(假设在项目中,每个职位都至少需要有1个人担任)
# | 职位 | 成本 | 人数 | 合计 |
1 | 初级程序员 | 3500 | 2 | 7000 |
2 | 高级程序员 | 6000 | 1 | 6000 |
3 | 系统架构师 | 8000 | 1 | 8000 |
4 | 项目经理 | 12000 | 1 | 12000 |
合计 | - | - | 5 | 33000 |
那么,整个项目的成本就是
【33,000元/月 × 6个月 = 198,000元】
可见,按第二种配置,整个项目的成本增加近25%。
又或者,同样是5个人做6个月,撤销高级程序员和系统架构师,仅由一名项目经理带4名初级程序员来完成的话:
# | 职位 | 成本 | 人数 | 合计 |
1 | 初级程序员 | 3500 | 4 | 14000 |
2 | 项目经理 | 12000 | 1 | 12000 |
合计 | - | - | 5 | 26000 |
这时,整个项目的成本就下来了:
【26,000元/月 × 6个月 = 156,000元】
这样的配置虽然成本降低了,但仅仅降低了大约2%。同时,还不得不面对一个问题:项目经理由于需要负责很多管理方面的事务,不可能有太多时间去指导其他人如何去写代码,整个软件的制作,仅仅由初级程序员来完成,品质无法得到足够的保证。
就上面的这个项目来说,假设项目款是200,000,那么第一种方法则大概获利25%;而第二种方法项目虽然同样也做成功了,但没赚到钱,去掉其他费用很可能还亏了;第三种方法则有面临项目失败的风险。可见,在相同人月的项目中,人和月的分配不同,甚至仅仅是人的分配不同,都会让项目有着根本上的不同。这不仅影响到项目成功与否,就算做成功了,利润是否达标,满足公司利益,也会有决定性影响。当然,以上的几个假设的例子,都有一个大前提,就是所有参与项目的人至始至终都在项目中,而没有去考虑人员的流动。
在实际的项目中,人员流动是一个非常常见的现象:
在项目刚刚启动的时候,一般只有项目经理,软件架构师和少数几名程序员参与到项目。作为先头兵对项目做整体的规划,理解业务逻辑,以及制定一些规则等。这个阶段参与者通常都比较少,一是减少开支。二是人少便于管理,在项目的大部分事情还未决定的时候,也可以减少由于规则改变而导致的无用功。
到项目中期,不断得有人新加入到项目中来。这个阶段,项目的大部分规则,流程应当已经确定,并不会随意更改。新加入的大批人员会统一开会,熟悉这些规则和流程。然后各自负责各自所担当的模块,作业大范围铺开。
而到了项目中后期,对已经编写好的代码进行测试也提上日程,一些专职测试的人员也会加入进来,编码和测试都在进行。这个时候项目进入高峰期,人数最多,加班也最多。同时也是最容易暴露问题的阶段。由于人数多,一些工作流程上的不合理会导致混乱。规则的不合理导致的问题,很可能直到测试时才发现。
到了项目后期以及收尾阶段,绝大部分代码都已经完成并交付给了客户,测试也完成了大部分。这时,已无需维持臃肿庞大的体制。人员也被大量撤走,加入其他的项目。最后,可能仅仅留下项目刚刚启动时的那几个人。
通过这种人员调配流动,一般都能减少成本。这也就是为什么,很多人会经常被拉去别的项目组。没做多长时间,又被撤走。有人或许会认为,自己被撤走,或者总是没人叫去帮忙,是因为自己做得不好。但事实上大多数情况下并非如此,也可能是因为项目成本过大。而有的人被拉去帮忙,也并不意味着他一定就是非常的能干,也可能仅仅是因为他的成本低而已。对,项目经理关注的不是你,而是成本。
另外,也会有一些项目经常延期,拖延1年多,就是做不完。项目组里的人个个都想吐,但是项目经理却对此轻描淡写,完全不在意。更奇怪的是,部长对此竟然也无动于衷,甚至还觉得项目经理干的不错!究其原因,不外乎“做项目”这件事本身的性质。
生意上的经典公式:
【项目款 - 成本 = 利润】
所谓“项目”,总是先有了需求才给予供给。所以,项目经理除了项目能否完成外,首要考虑的就是如何通过控制成本来提高利润。假如某个项目的成本控制得很好,而客户又同意一再拖延,这就意味着源源不断的利润。项目经理和部长的一大收入来源便是项目利润,何乐而不为呢?反倒是其他的项目经理,由于找不到有空的人,自己的项目无法启动,只能瞪眼吹胡子了。至于部长,他所要做的,就是让所有项目的利润总和最大化。只要能达到他的目的,一整年做一个项目和每个月做一个项目又有什么区别呢?