用一个例子讲清关键路径(CPM)
如何计算最早和最晚开始、完成时间,总浮动和自由浮动时间,以及哪些任务不能延误——用一个七项活动的项目逐步演算。
项目延期,并不是因为所有任务都延期了,而是因为关键路径上的某个任务延期了。常见的情况是:一份进度表里有二十个任务都“稍微落后”,项目却照样按时交付;另一份进度表里,只有一个两天的任务出了问题,交付日期就被推后了。区别在于你是否知道哪些任务有余量、哪些没有。
一句话讲清楚
关键路径是相互依赖的任务中最长的那条链。它的总时长就是项目的工期。只要其中任何一个任务推迟一天,整个项目就会推迟一天。
计算之前需要准备什么
为每项活动记下三件事:
- 工期,以工作日计(由实际干活的人估算,而不是由盼着它完成的人估算)。
- 前置任务:之前必须完成什么。
- 依赖类型及延迟(如有)。
四种依赖类型,简单来说:
| 类型 | 含义 | 示例 |
|---|---|---|
| FS(完成-开始) | A 完成后 B 开始 | 抹灰完成后再刷漆 |
| SS(开始-开始) | A 开始后 B 开始 | 隔墙施工开始 2 天后开始布线(SS +2) |
| FF(完成-完成) | A 完成时 B 完成 | 电气测试在安装完成 1 天后结束(FF +1) |
| SF(开始-完成) | A 开始前 B 不能完成 | 下一班到岗前,当班不能下班 |
延迟会增加等待天数;负延迟(提前量)则允许任务重叠。FS 最常用;拿不准时,先用 FS。
逐步计算
- 正向推算。任务的最早开始(ES)等于其前置任务中最大的最早完成(EF)。EF = ES + 工期。
- 逆向推算。从项目结束往回推,任务的最晚完成(LF)等于其后续任务中最小的最晚开始(LS)。LS = LF − 工期。
- 总浮动时间 = LS − ES(或 LF − EF)。即任务可以推迟多少而不影响交付日期。
- 自由浮动时间 = 后续任务中最小的 ES − 本任务的 EF。即任务可以推迟多少而不影响任何其他任务。
- 总浮动时间为零的任务构成关键路径。
演算示例
假设你要装修一家新门店。所有依赖都是 FS,按天计算:“第 4 天完成”指第四天结束时完成。
- A. 设计与图纸审批:4 天,无前置任务。
- B. 采购材料:6 天,在 A 之后。
- C. 土建施工:8 天,在 A 之后。
- D. 电气安装:5 天,在 C 之后。
- E. 定制家具制作:7 天,在 B 之后。
- F. 刷漆与收尾:4 天,在 D 之后。
- G. 安装与交付:3 天,在 E 和 F 之后。
正向推算:A 在第 4 天完成;B 从 4 到 10,C 从 4 到 12;D 从 12 到 17;E 从 10 到 17;F 从 17 到 21。G 要等 E(17)和 F(21)中较晚的那个,所以从 21 到 24。项目工期为 24 天。
从 24 逆向推算:G 最晚 21–24;F 17–21;E 必须在 21 前完成,所以 14–21;D 12–17;C 4–12;B 必须在 E 的最晚开始(14)前完成,所以 8–14;A 必须在 B 和 C 中较小的 LS(4)前完成,所以 0–4。
| 活动 | 工期 | ES | EF | LS | LF | 总浮动 | 自由浮动 |
|---|---|---|---|---|---|---|---|
| A. 图纸 | 4 | 0 | 4 | 0 | 4 | 0 | 0 |
| B. 材料 | 6 | 4 | 10 | 8 | 14 | 4 | 0 |
| C. 土建 | 8 | 4 | 12 | 4 | 12 | 0 | 0 |
| D. 电气 | 5 | 12 | 17 | 12 | 17 | 0 | 0 |
| E. 家具 | 7 | 10 | 17 | 14 | 21 | 4 | 4 |
| F. 刷漆 | 4 | 17 | 21 | 17 | 21 | 0 | 0 |
| G. 安装 | 3 | 21 | 24 | 21 | 24 | 0 | 0 |
关键路径是 A → C → D → F → G(4 + 8 + 5 + 4 + 3 = 24)。另一条链 A → B → E → G 合计 20 天:有 4 天余量。
注意 B:总浮动为 4,自由浮动却为 0。B 一旦延误,E 就会立刻推迟开始;这 4 天余量由 B 和 E 共享,而不是每个任务各有 4 天。
如果某项任务延误 2 天
- C(关键任务)延误 2 天:D、F、G 都顺延 2 天,交付推迟到第 26 天。没有任何缓冲。
- E(非关键任务)延误 2 天:在第 19 天而不是第 17 天完成;G 仍要等 F(21)。交付仍是第 24 天,但 B–E 这条链只剩 2 天余量。
- B 延误 2 天:E 改为 12–19;交付不变,但共享浮动时间已用掉一半。如果这条链累计延误超过 4 天,它就会开始决定交付日期。
所以,汇报时应说明还剩多少浮动时间,而不仅仅是完成百分比。
如何缩短工期
赶工(Crashing,用资源压缩)。为关键任务增加人手、班次或设备。假设增加一支施工队,把土建从 8 天缩短到 6 天,额外花费 Bs 3,000(每缩短一天 Bs 1,500)。项目工期降为 22 天。规则:
- 只压缩关键任务;缩短 E 毫无作用。
- 先压缩每缩短一天成本最低的任务。
- 每次调整后重新计算:如果把 C 缩到 4 天,两条链都是 20 天,两条都成为关键路径。
风险:成本上升且收益递减(两支施工队挤在同一空间,效率不会翻倍)。
快速跟进(Fast-tracking,任务重叠)。把 FS 改为带延迟的 SS。如果刷漆可以在电气安装开始 3 天后开始(SS +3),F 为 15 到 19,G 为 19 到 22,不额外花钱就能节省 2 天。风险:如果前一个任务修改了后一个任务已完成的部分,就要返工。
让进度表保持“活”的
- 每周更新进度和实际日期,而不是等到最后。
- 每次更新后重新计算关键路径:它可能转移到另一条链上。
- 保存基准,用于对比计划与实际;如果还跟踪成本,挣值管理能告诉你是否同时既延期又超支。
- 每周例会只需检查浮动时间为 0 到 2 天的任务,而不是全部任务。
常见错误
- 任务没有后续任务:“悬空”的任务在计算中会得到虚假的浮动时间。
- 手工填写日期而不是设置依赖:进度表就不再自动重算。
- 把浮动时间当作每个任务各自的空闲时间,实际上它由整条链共享。
- 为了“凑上”承诺的日期而使用过于乐观的工期。
- 忽视资源:同一个人负责的两个并行任务,并不是真正的并行。
检查清单
- 每项活动都有工期、前置任务和后续任务(开始和结束除外)。
- 非 FS 的依赖都有充分理由。
- 完成了正向和逆向推算,两种方式算出的总浮动时间一致。
- 已识别关键路径和余量很少的链。
- 已保存基准。
- 每周有固定的更新日。
用系统来管理
这种计算用 Excel 也能做,但每当任务延误就手工重算一遍,十分繁琐。像 MKA 这样的 ERP 支持带延迟的 FS、SS、FF 和 SF 依赖,计算浮动时间并在甘特图中标出关键路径;在项目演示中,你可以拉长一项任务,看看哪些任务会变成红色。