第3章 项目规划与项目监控
项目规划(Project Planning)的目的是为项目的开发和管理工作制定合理的行动纲领(即项目计划),使所有人员按照该计划有条不紊地开展工作。为了避免词义混淆,这里把动词Planning译为规划,把名词Plan译为计划(或计划书)。
项目监控(Project Monitoring and Control)的目的是通过周期性地跟踪项目计划的各种参数如进度、工作量、费用、资源、工作成果、风险等等,不断地了解项目的进展情况,以便当项目实际进展状况显着偏离计划时能够及时采取纠正措施。
项目经理正式上任后最主要的管理工作就是项目规划和项目监控。如果没有规划就不知道监控什么,反之如果只有规划而不去监控等于白规划。可见项目规划和项目监控是相辅相成、动态演化的两个过程域。最糟糕的下场是:经费用光了,进度远远落后了,人员累死了,还不知道什么时候能熬出头。
本章探讨项目规划与项目监控的方法和规范,让广大项目经理都能学会。
3.1 项目规划的概念
    为什么要进行项目规划?
    我们生活在城市里,经常发现某些道路被反反复复地挖掘修理,给老百姓的生活添加了很多麻烦。这种现象只有两种解释:(1)市政管理者为了拉动GDP的增长,营造欣欣向荣的景象,就拿马路开刀;(2)管理者根本没有进行市政规划,第一次挖马路铺设煤气管道,第二次挖马路铺设电缆,第三次挖马路铺设光缆,如此折腾简直劳民伤财。
    软件项目规划的重点是对人员角、任务进度、经费、设备资源、工作成果等等做出合适的安排,制定出一些计划(包括高层的和细节的),使大家按照计划行事,最终顺利地达到预定的目标。如果不对项目进行规划的话,一人天马行空、各干各的,项目进展不到一半就混乱不堪了。
    谁在什么时候进行项目规划?
在立项管理过程域的项目筹备阶段(参见第二章),机构领导首先任命一位项目经理,之后机构领导协助项目经理筹备项目经费、人力资源、软件硬件资源等。如果必要的资金和资源已经到位,那么项目经理和核心成员即可组成一个项目规划小组,开始进行项目规划。
有人疑问,在《立项建议书》中不是已经有了项目的开发计划了吗?为什么还要进行规划呢?
注意,《立项建议书》中的开发计划仅仅是一种设想而已,因为当时人们并不知道机构是否会采纳这个建议、也不知道领导支持的力度有多大。假设《立项建议书》中的计划需要10名开发人员和一百万元经费,但是当立项之后机构只能给予5名开发人员和50万元经费,那么原计划必须做出重大调整。
项目规划产生的成果是什么?
主要是一些计划书(plan),可分两类:一是全局的计划书(Overall Plan),这里称为《项目计划》;二是一些下属计划书(Subordinate Plan),例如配置管理计划、质量管理计划、阶段开发计划和测试计划等。
下属计划书是对《项目计划》的补充,其内容不可与《项目计划》冲突。通常《项目计划》由项目经理负责制定,由机构领导审批。而下属计划书一般由项目成员制定,由项目经理审批即可。
项目规划的流程如图3-1所示。
图3-1项目规划流程图
3.2 如何进行项目估计
在制定项目计划之前,理应采用恰当的方法对重要的数据进行估计,否则计划就乱写了。一般地,项目
估计的要素是软件规模、工作量和人力成本,如果这些要素估计得比较准确得话,那么后续制定的项目计划就比较合理。对于一些外包项目而言,项目估计得到的数据是双方讨价还价的依据。
项目估计几乎不可能成为一门精确的科学,因为在项目刚开始时,人们对产品需求和技术的了解还比较肤浅,而项目实际能够拥有经费和资源很大程度上是靠项目经理争取来的,不确定因素比较多。在这种情况下人们很难作出准确的估计。但是大家都认同:依据某种方法(规则)进行估计显然比瞎猜好得多。
    常用的项目估计方法大体分为两类,第一类是数学模型,第二类是简单直观的“分解-累计”方法;
3.2.1 数学模型真的好用吗
    采用数学模型这种方法是学术界热衷的,因为有数学公式的东西更显得有学术味道。这类方法适合于非常成熟的软件机构,该机构积累了丰富的历史数据,以至于能够归纳出数学模型来指导新项目的规划。
典型的数学模型如
E = A + B×(ev) C
其中A,B,和C是由经验导出的常数,E是以“人月”为单位的工作量,ev是估算变量如代码行(LOC)或者功能点(FP)。
例如基于代码行的数学模型有:
Walston-Felix模型      E = 5.2×(KLOC)0.91
Bailey-Basili模型      E = 5.5+0.73×(KLOC)1.16
Boehm简单模型      E = 3.2×(KLOC)1.05
基于功能点的数学模型有:
Albrecht模型        E = -13.39 + 0.0545 FP
Kemerer 模型          E = 60.62×7.728×10-8 FP3
Maston模型            E = 585.7 + 5.12 FP
通用性更强的是 Barry Boehm 研制的COCOMO模型(构造性成本模型),分为初级、中级、高级3种形式。(参考[Pressman99,p83-p86])
我从事软件开发十多年,从来没有采用数学模型进行项目估计,因为根本无法套用,所以我从来就不信这些公式。
我公司的一些员工参加了CMM培训课,CMM讲师照本宣科地推荐了COCOMO模型,学员们如获至宝。
有一天,某个同事打电话问我:“用COCOMO模型估计工作量时,我们公司的常数是多少?”
我说不知道,我从来就没有用过。
对方很吃惊地问:“你不是专家吗,怎么连那么着名的COCOMO模型都不会用呢?”
我哭笑不得,只好对他说:“你顺便些数据来计算,就当电脑算命好了。如果你算对了,将来大家都请你来算。”
3.2.2 简单直观的估计方法
我自己一直都采用简单直观的“分解-累计”方法来估计产品规模、工作量和人力资源成本。
产品规模估计方法如下:
(1)项目规划小组先分解产品的功能,制定“产品功能分解与规模估计表”(如表3-1所示)。产品的模
块以及模块的主要功能是比较容易确定的,因为这是项目规划小组必须知道的最起码的功能需求。软件规模的度量单位主要有:代码行、对象个数、页面数等等。我通常用“对象个数”来度量。
模块名称
模块的主要功能
新开发的软件规模
(度量单位如对象个数)
复用的软件规模
(度量单位如对象个数)
模块A
A.1
A.2
A.3
模块B
B.1
B.2
B.3
汇总
表3-1 产品功能分解与规模估计表
(2)规划小组各成员独立填写表3-1。
(3)汇总每个成员的表格,进行对比分析。如果各人估计的差额小于20%,则取平均值。如果差额大于20%,则转向第(2)步,让各成员重新估计产品的规模,直到各人估计的差额小于20%为止。
    第(3)步的目的是消除大的差异后取平均,总误差控制在20%以内。如果所有的估计值同时偏大或者偏小,那么就将错就错了。因为在项目刚开始的时候,谁也不知道估计准确不准确,只要大家观点相似就行了。
工作量估计方法如下:
(1)首先确定工作量的度量单位,可以是“人小时”、“人天”、“人月”或“人年”。注意单位换算:
1人年 = 12人月
1人月 22人天
1人天 = 8 人小时
(2)估算开发工作量。一般地可以把开发过程划分为需求开发、系统设计、实现、测试四个阶段,分别估计每个阶段的工作量,然后累计得出总的工作量,见表3-2。人均生产率是指每个人每天完成的工作成果规模。假如在设计阶段,每人每天可以设计2个对象,若软件总共有100个对象,那么设计阶段的工
作量就是50人天。依此类推。
(3)估算管理工作量。除了开发之外,项目规划、项目监控、配置管理、质量管理等等也是很费时间的。一般地,项目的80%以上的工作量用于开发,20%以下的工作量用于管理。项目规划小组可以根据经验,给出一个比例系数,简便地估算管理的工作量。
爱过了我就不会哭
工作量的度量单位
1人年 = 12人月,1人月 ≈ 22人天,1人天 = 8 人小时
开发工作量估算公式
项目开发工作量 新开发的软件规模 / 人均生产率
开发阶段
人均生产率
软件规模
工作量
需求开发
系统设计
实现
测试
开发工作量汇总
管理工作量估算公式
项目管理工作量 开发工作量 * 比例系数
项目管理的主要事务
项目规划、项目监控、需求管理、配置管理、质量管理
比例系数
例如20%
管理工作量汇总
表3-2 工作量估计表
如果已经估算出项目的工作量,那么估算人力资源成本就比较容易。每人每年的成本显然高于年薪,因为每个人除了拿工资外,日常还要消耗公司资源,公司要额外支付各种保险金等。一般地,对于软件企业,每人每年的成本大约是其年薪的1.5至2.0倍(姑且称之为成本系数)。如果成本系数太高的话,表示该公司要么福利极好要么铺张浪费;反之如果系数太低的话(最低为1.0),表示该公司福利极低。
举个简单的案例:如果乙方想承包甲方的项目,假设乙方估计该项目的工作量为10人年,乙方人员的平均年薪为8万元,成本系数为2.0。请问乙方的人力资源报价如何?(设备成本、差旅费等等另外计算)
乙方的人力资源报价应该是 10×8×2.0=160万元吗?
不对,如果这样报价的话,乙方的老板只好喝西北风了。报价必须考虑利润,假设双方可以接受的利润率为20%,那么乙方报价应该是160×1.2=192万元。
乙方应该把报价的详细清单(不是最终结果)给甲方看,表明这个报价是合理的,而不是狮子开大口。
甲方要检查这个报价清单,尽可能把里头的“水分”挤出来。双方必然有个讨价还价的过程,如果想说服对方,一定要拿出经得起推敲的数据来,以理服人。否则双方尽是胡侃,最后在酒桌上解决,这是比较低俗的商业谈判(也算得上是国粹了),不值得大家效仿。
本节介绍的项目估计方法既可以用在立项建议过程域中,也可以用在项目规划过程域中。
在某种情况下,任何的项目估计方法都没有实际价值,那就是:
(1)项目的人员已经被上级领导限定死了,再多的活也是那几个人干;
(2)除了办公计算机和工资外,这个项目没有其它经费,项目经理只有干活的权利没有用钱的权利;
(3)项目的结束日期早就被领导和客户指定了,不管合理不合理,反正时间一到就要交付软件。
如果人员、资金、时间都已经被毫无道理地指定了,你进行科学地估计还有啥用?这样的项目在国内并不少见,如果你碰上了,那么就自认倒霉吧。
3.3 制定项目计划