# 第 14 章 祸起萧墙(Hatching a Catastrophe)
带来坏消息的人不受欢迎。
——索福克里斯
项目是怎样延迟了整整一年的时间?…一次一天。
None love the bearer of bad news.
——SOPHOCLES
How does a project get to be a year late? ... One day at a time.
当人们听到某个项目的进度发生了灾难性偏离时,可能会认为项目一定是遭受了一系列重大灾难。然而,通常灾祸来自白蚁的肆虐,而不是龙卷风的侵袭。同样,项目进度经常以一种难以察觉,但是残酷无情的方式慢慢落后。实际上,重大灾害是比较容易处理的,它往往和重大的压力、彻底的重组、新技术的出现有关,整个项目组通常可以应付自如。
但是一天一天的进度落后是难以识别、不容易防范和难以弥补的。昨天,某个关键人员生病了,无法召开某个会议。今天,由于雷击打坏了公司的供电变压器,所有机器无法启动。明天,因为工厂磁盘供货延迟了一周,磁盘例程的测试无法进行。下雪、应急任务、私人问题、同顾客的紧急会议、管理人员检查——这个列表可以不断地延长。每件事都只会将某项活动延迟半天或者一天,但是整个进度开始落后了,尽管每次只有一点点。
# 里程碑还是沉重的负担?
如何根据一个严格的进度表来控制项目?第一个步骤是制订进度表。进度表上的每一件事,被称为"里程碑",它们都有一个日期。选择日期是一个估计技术上的问题,在前面已经讨论过,它在很大程度上依赖以往的经验。
里程碑的选择只有一个原则,那就是,里程碑必须是具体的、特定的、可度量的事件,能够进行清晰定义。以下是一些反面的例子,例如编码,在代码编写时间达到一半的时候就已经"90%完成"了;调试在大多时候都是"99%完成"的;"计划完毕"是任何人只要愿意,就可以声明的事件。
然而,具体的里程碑是百分之百的事件。"结构师和实现人员签字认可的规格说明","100%源代码编制完成,纸带打孔完成并输入到磁盘库","测试通过了所有的测试用例"。这些切实的里程碑澄清了那些划分得比较模糊的阶段——计划、编码、调试。
里程碑有明显边界和没有歧义,比它容易被老板核实更为重要。如果里程碑定义得非常明确,以致于无法自欺欺人时,很少有人会就里程碑的进展弄虚作假。但是如果里程碑很模糊,老板就常常会得到一份与实际情况不符的报告。毕竟,没有人愿意承受坏消息。这种做法只是为了起到缓和的作用,并没有任何蓄意的欺骗。
对于大型开发项目中的估计行为,政府的承包商做了两项有趣的研究。研究结果显示:
- 如果在某项活动开始之前就着手估计,并且每两周进行一次仔细的修订。这样,随着开始时间的临近,无论最后情况会变得如何的糟糕,它都不会有太大的变化。
- 活动期间,对时间长短的过高估计,会随着活动的进行持续下降。
- 过低估计在活动中不会有太大的变化,一直到计划的结束日期之前大约三周左右。
好的里程碑对团队来说实际上是一项服务,可以用来向项目经理提出合理要求的一项服务,而不确切的里程碑是难以处理的负担。当里程碑没有正确反映损失的时间,并对人们形成误导,以致事态无法挽回的时候,它会彻底碾碎小组的士气。慢性进度偏离同样也是士气杀手。
# "其他的部分反正会落后"
进度落后了一天,那又怎么样呢?谁会关心一天的滞后?我们可以跟上进度。何况,和我们有关的其他部分已经落后了。
棒球队队长知道,进取这种心理素质,是很多优秀队员和团队不可缺少的。它表现为"要求跑得更快","要求移动得更加迅速","更加努力尝试"。对软件开发队伍,进取同样是非常必要的。进取提供了缓冲和储备,使开发队伍能够处理常规的异常事件,可以预计和防止小的灾祸。而对任务进行计算和对工作量进行度量,会对进取超前会造成一些消极的影响——这时,人们往往会比较乐观地放缓工作节奏。就这一点来说,它们是令人扫兴的事情。不过,如同我们看到的,必须关心每一天的滞后,它们是大灾祸的基本组成元素。
并不是每一天的滞后都等于灾难。尽管会如上文所述,事先估计会给工作进度的超前带来影响,但对活动的一些计算和考虑还是必要的。那么,如何判断哪些偏离是关键的呢?只有采用 PERT 或者关键路径技术才能判断。它显示谁需要什么样的东西,谁位于关键路径上,他的工作滞后会影响最终的完成日期。另外,它还指出一个任务在成为关键路径时,可以落后的时间。
严格地说,PERT 技术是关键路径计划的细化,如果使用 PERT 图,它需要对每个事件估计三次,每次对应于满足估计日期的不同可能性。我觉得不值得为这样的精化产生额外的工作量,但为了方便,我把任何关键路径法都称为 PERT 图。
PERT 的准备工作是 PERT 图使用中最有价值的部分。它包括整个网状结构的展开、任务之间依赖关系的识别、各个任务链的估计。这些都要求在项目早期进行非常专业的计划。第一份 PERT 图总是很恐怖的,不过人们总是不断地进行努力,运用才智制订下一份 PERT 图。
随着项目的推进,PERT 图为前面那个泄气的借口,"其他的部分反正会落后",提供了答案。它展示某人为了使自己的工作远离关键路径,需要超前多少,也建议了补偿其他部分失去的时间的方法。
# 地毯的下面
当一线经理发现自己的队伍出现了计划偏离时,他肯定不会马上赶到老板那里去汇报这个令人沮丧的消息。团队可以弥补进度偏差,他可以想出应对方法或者重新安排进度以解决问题,为什么要去麻烦老板呢?从这个角度来看,好像还不错。解决这类问题的确是一线经理的职责。老板已经有很多需要处理的真正的烦心事了,他不想被更多的问题打搅。因此,所有的污垢都被隐藏在地毯之下。
但是每个老板都需要两种信息:需要采取行动的计划方面的问题,用来进行分析的状态数据。出于这个目的,他需要了解所有开发队伍的情况,但得到状态的真相是很困难的。
一线经理的利益和老板的利益是内在冲突的。一线经理担心如果汇报了问题,老板会采取行动,这些行动会取代经理的作用,降低自己的威信,搞乱了其他计划。所以,只要项目经理认为自己可以独立解决问题,他就不会告诉老板。
有两种掀开毯子把污垢展现在老板面前的方法,它们必须都被采用。一种是减少角色冲突和鼓励状态共享,另一种是猛地拉开地毯。
减少角色的冲突。首先老板必须区别行动信息和状态信息。他必须规范自己,不对项目经理可以解决的问题做出反应,并且决不在检查状态报告的时候做安排。我曾经认识一个老板,他总是在状态报告的第一个段落结束之前,拿起电话发号施令。这样的反应肯定压制信息的完全公开。
不过,当项目经理了解到老板收到项目报告之后不会惊慌,或者不会越俎代庖时,他就逐渐会提交真实的评估结果。
如果老板把会见、评审、会议明显标记为状态检查(status-meeting)和问题-行动(problem-action)会议,并且相应控制自己的行为,这对整个过程会很有帮助。当然,事态发展到无法控制时,状态检查会议会演变成问题-行动会议。不过,至少每个人知道"当时游戏的分数是多少",老板在接过"皮球"之前也会三思。
猛地拉开地毯。不论协作与否,拥有能了解状态真相的评审机制是必要的。PERT 图以及频繁的里程碑是这种评审的基础。大型项目中,可能需要每周对某些部分进行评审,大约一个月左右进行整体评审。
有报告显示关键的文档是里程碑和实际的完成情况。图 14.1 是上述报告中的一段摘录。它显示了一些问题:手册(SLR)的批准时间有所冲突,其中一个的时间比独立产品测试(Alpha)的开始时间还要迟。这样一份报告将作为 2 月 1 号会议的议程,使得每个人都知道问题的所在,而产品构件经理应准备解释延迟的原因,什么时候结束,采取的步骤和需要的任何帮助——老板提供的,或者是其他小组间接提供的。
图 14-1:
Bell 实验室的 V. Vyssotsky 添加了以下的观察意见:
我发现在里程碑报告中很容易记录"计划"和"估计"的日期。计划日期是项目经理的工作产物,代表了经协调后的项目整体工作计划,它是合理计划之前的判断。估计日期是最基层经理的工作产物,基层经理对所讨论的工作有着深刻的了解,估计日期代表了在现有资源和已得到了作为先决条件的必要输入(或得到了相应的承诺)的情况下,基层经理对实际实现日期的最佳判断。项目经理必须停止对这些日期的怀疑,而将重点放在使其更加精确上、以便得到没有偏见的估计,而不是那些合乎心意的乐观估计或者自我保护的保守估计。一旦它们在每个人的脑海中形成了清晰的印象,项目经理就可以预见到将来哪些地方如果他不采取任何措施,就会出现问题。
PERT 图的准备工作是老板和要向他进行汇报的经理们的职责。需要一个小组(一至三个人)来关注它的更新、修订和报告,这个小组可以看作是老板的延伸。对大型项目,这种计划和控制(Plan and Control)小组的价值是非常可贵的。小组的职权仅限于向产品线经理询问他们什么时候设定或更改里程碑,以及里程碑是否被达到。计划和控制小组处理所有的文字工作,因此产品线经理的负担将会减到最少——仅仅需要作出决策。
我们拥有一个富有热情的、有经验的、熟练的计划和控制小组。这个小组由 A. M. Pietrasanta 负责,他投入了大量创造天分来设计有效的、谦逊的控制方法。结果,我发现他的小组被广为尊重,而不仅仅是被容忍。对于这样一个本来就十分敏感的角色而言,这的确是一个成功。
对计划和控制职能进行适度的技术人力投资是非常值得赞赏的。它对项目的贡献方式和直接开发软件产品有很大的不同。计划和控制小组作为监督人员,明白地指出了不易察觉的延迟,并强调关键的因素。他们是早期预警系统,防止项目以一次一天的方式落后一年。