软件项目管理:PDM、ADM、关键路径、总浮动与自由浮动详解 写在前面在《软件项目管理》的进度管理章节中PDM、ADM、关键路径、总浮动、自由浮动是最容易混淆的一组概念。很多同学不是不会背公式而是不知道这些公式到底在解决什么问题。比如PDM 和 ADM 有什么区别为什么关键路径决定项目最短完成时间ES、EF、LS、LF 分别是什么意思总浮动和自由浮动到底差在哪里为什么有的任务总浮动大于 0但自由浮动却等于 0做网络图计算题时到底应该先算什么、后算什么这篇文章会从概念、公式、计算步骤、完整例题、考试易错点几个方面把这部分彻底讲清楚。一、进度网络图到底在解决什么问题软件项目不是一堆任务简单相加而是一组有先后依赖关系的任务。例如需求分析完成后才能开始概要设计 概要设计完成后才能开始详细设计 编码完成后才能开始测试 测试完成后才能上线。这些任务之间存在先后关系、依赖关系和约束关系。进度网络图要解决的问题就是在这些任务依赖关系下项目最早什么时候能完成哪些任务不能延期哪些任务可以延期最多可以延期多久所以进度网络图的核心任务有四个表示任务之间的先后关系计算项目最短完成时间找出关键路径计算每个任务的浮动时间。二、PDM 是什么1. PDM 的定义PDM 的全称是 Precedence Diagramming Method中文一般叫优先图法或者前导图法。PDM 的核心特点是用节点表示活动用箭线表示活动之间的逻辑关系。也就是说在 PDM 中方框 / 节点 任务或活动 箭线 任务之间的依赖关系例如A ─── B ─── C表示A 完成后B 才能开始 B 完成后C 才能开始。2. PDM 的直观例子假设一个软件项目有以下任务A需求分析 B系统设计 C编码实现 D系统测试 E项目上线它们之间的关系是A 完成后才能做 B B 完成后才能做 C C 完成后才能做 D D 完成后才能做 E。那么 PDM 可以表示为A ─── B ─── C ─── D ─── E这就是最简单的线性项目。3. PDM 的四种逻辑关系PDM 比 ADM 更灵活因为它可以表达四种任务关系。3.1 FS完成—开始FS 的英文是 Finish to Start。含义是前置任务完成后后续任务才能开始。这是最常见的任务关系。例如编码完成后才能开始测试。表达为编码 ─── 测试普通公式可以写成后续任务最早开始时间 ≥ 前置任务最早完成时间如果有滞后时间比如编码完成 2 天后才能测试则测试最早开始时间 编码最早完成时间 23.2 SS开始—开始SS 的英文是 Start to Start。含义是前置任务开始后后续任务才能开始。例如需求分析开始后原型设计可以开始。这说明原型设计不一定要等需求分析完全结束可以部分并行。3.3 FF完成—完成FF 的英文是 Finish to Finish。含义是后续任务的完成依赖于前置任务的完成。例如文档整理必须等开发工作完成后才能最终完成。也就是说文档整理可以提前做但最终完成不能早于开发完成。3.4 SF开始—完成SF 的英文是 Start to Finish。含义是后续任务开始后前置任务才能完成。这种关系在软件项目中比较少见。例如新系统正式上线后旧系统才能停止运行。这就是一种开始—完成关系。三、ADM 是什么1. ADM 的定义ADM 的全称是 Arrow Diagramming Method中文叫箭线图法。ADM 的核心特点是用箭线表示活动用节点表示事件。也就是说在 ADM 中箭线 活动 节点 事件或里程碑例如(1) ──A── (2) ──B── (3)表示活动 A 从事件 1 到事件 2 活动 B 从事件 2 到事件 3。2. PDM 和 ADM 的区别对比项PDMADM活动表示方式节点表示活动箭线表示活动箭线含义活动之间的逻辑关系活动本身节点含义任务或活动事件或里程碑是否常用虚活动一般不用经常需要表达方式更直观、更灵活更传统考试常见性很常见也常考一句话记忆PDM节点是任务箭线是关系。 ADM箭线是任务节点是事件。3. ADM 中的虚活动ADM 有一个重要概念虚活动。虚活动的特点是不消耗时间 不消耗资源 只表示逻辑依赖关系 通常用虚线箭头表示 工期为 0。为什么 ADM 需要虚活动因为 ADM 用箭线表示活动有些复杂的前后关系不能直接表达出来就需要用虚活动辅助表示逻辑依赖。例如D 必须等 B 和 C 都完成后才能开始。PDM 很容易表示B ──┐ ├── D C ──┘ADM 有时需要加虚活动来保证逻辑关系表达准确。四、关键路径是什么1. 关键路径的定义关键路径是从项目开始到项目结束持续时间最长的一条路径。关键路径决定项目的最短完成时间。也就是说项目最短工期 关键路径总工期如果关键路径上的某个任务延期整个项目就会延期。2. 关键路径的特点关键路径有几个非常重要的特点1. 关键路径是网络图中总工期最长的路径。 2. 关键路径决定项目最短完成时间。 3. 关键路径上的活动通常总浮动为 0。 4. 关键路径可能不止一条。 5. 项目执行过程中关键路径可能发生变化。 6. 压缩项目工期时通常优先压缩关键路径上的活动。3. 关键路径不是“最重要的任务路径”很多人会把关键路径理解成“最重要的任务组成的路径”这是不准确的。关键路径强调的是时间约束不是业务价值。更准确地说关键路径是时间上最紧张、不能拖延的路径。有些任务业务上非常重要但如果它有足够浮动时间它就不一定在关键路径上。五、四个核心时间参数ES、EF、LS、LF做关键路径题必须先理解四个参数ES最早开始时间 EF最早完成时间 LS最晚开始时间 LF最晚完成时间1. ES最早开始时间ES 是 Earliest Start。含义是在所有前置任务都满足的情况下某任务最早可以开始的时间。如果一个任务没有前置任务通常ES 0如果一个任务有多个前置任务必须等所有前置任务都完成后才能开始所以ES 所有前置任务 EF 的最大值为什么取最大值因为只要有一个前置任务没完成当前任务就不能开始。2. EF最早完成时间EF 是 Earliest Finish。含义是某任务最早能够完成的时间。公式EF ES 工期例如某任务最早第 3 天开始工期 5 天。 EF 3 5 8说明这个任务最早第 8 天完成。3. LF最晚完成时间LF 是 Latest Finish。含义是在不影响项目总工期的情况下某任务最晚必须完成的时间。如果一个任务有多个后续任务它必须保证所有后续任务都不受影响所以LF 所有后续任务 LS 的最小值为什么取最小值因为后续任务中最早需要它完成的那个任务决定了它最晚能拖到什么时候。4. LS最晚开始时间LS 是 Latest Start。含义是在不影响项目总工期的情况下某任务最晚必须开始的时间。公式LS LF - 工期例如某任务最晚必须第 12 天完成工期 5 天。 LS 12 - 5 7说明这个任务最晚第 7 天开始。六、正推法求 ES 和 EF1. 正推法的含义正推法是从项目开始节点往项目结束节点推。目的求每个任务的最早开始时间 ES 和最早完成时间 EF。正推法回答的问题是如果所有任务都尽早开始项目最早什么时候能完成2. 正推法规则正推法有三条规则。第一条没有前置任务的活动ES 0。第二条EF ES 工期。第三条如果一个任务有多个前置任务 ES 所有前置任务 EF 的最大值。3. 正推法的逻辑正推时取最大 EF是因为当前任务必须等所有前置任务都完成。例如D 的前置任务是 B 和 C。 B 最早第 7 天完成。 C 最早第 5 天完成。 D 必须等 B 和 C 都完成后才能开始。 所以 D 的 ES max(7, 5) 7。七、反推法求 LS 和 LF1. 反推法的含义反推法是从项目结束节点往项目开始节点推。目的求每个任务的最晚开始时间 LS 和最晚完成时间 LF。反推法回答的问题是在不推迟项目结束时间的前提下每个任务最晚可以什么时候开始和完成2. 反推法规则反推法也有三条规则。第一条最后一个活动的 LF 项目总工期。第二条LS LF - 工期。第三条如果一个任务有多个后续任务 LF 所有后续任务 LS 的最小值。3. 反推法的逻辑反推时取最小 LS是因为当前任务必须保证所有后续任务都能按时开始。例如C 的后续任务是 D 和 E。 D 最晚第 7 天开始。 E 最晚第 9 天开始。 C 必须保证 D 和 E 都不被影响。 所以 C 的 LF min(7, 9) 7。八、总浮动 TF 详解1. 总浮动是什么总浮动的英文是 Total Float简称 TF。定义一个活动可以延迟的最大时间量且不影响整个项目最终完成时间。公式TF LS - ES也可以写成TF LF - EF这两个公式结果一样。2. 总浮动怎么理解如果某任务TF 5说明这个任务最多可以延迟 5 天而不会影响项目最终完工时间。如果某任务TF 0说明这个任务不能延误。 一旦延误项目整体就可能延期。所以总浮动为 0 的活动通常就是关键活动。3. 总浮动看的是项目整体总浮动关心的问题是这个任务拖了以后会不会影响整个项目最终完成它不关心某个后续任务是否被推迟开始只关心最终项目完成时间是否变化。九、自由浮动 FF 详解1. 自由浮动是什么自由浮动的英文是 Free Float简称 FF。定义一个活动可以延迟的最大时间量且不影响其紧后活动的最早开始时间。公式FF 紧后任务最小 ES - 本任务 EF更完整地写FF min(所有紧后任务的 ES) - 本任务 EF2. 自由浮动怎么理解如果某任务FF 3说明这个任务最多可以延迟 3 天 并且不会影响后续任务原本的最早开始时间。如果某任务FF 0说明这个任务只要晚完成一点 后续任务的最早开始时间就会被影响。3. 自由浮动看的是紧后任务自由浮动关心的问题是这个任务拖了以后会不会影响下一个任务原本最早开始所以自由浮动比总浮动更局部也更严格。十、总浮动和自由浮动的区别1. 一句话区别总浮动不影响项目最终完工。 自由浮动不影响紧后任务最早开始。2. 对比表对比项总浮动 TF自由浮动 FF关心对象整个项目紧后任务核心问题会不会影响项目最终完成会不会影响下一个任务最早开始公式TF LS - ES LF - EFFF 紧后任务最小 ES - 本任务 EF影响范围全局局部是否看 LS/LF看不看是否看紧后任务 ES不直接看必须看一般大小通常大于等于自由浮动通常小于等于总浮动3. 重要结论一般情况下自由浮动 FF ≤ 总浮动 TF原因是自由浮动要求不影响后续任务最早开始 总浮动只要求不影响项目最终结束。前者要求更严格所以可拖延时间一般更短。十一、完整例题从零计算关键路径、TF 和 FF下面用一个完整例子演示。1. 项目信息某软件项目共有 6 个任务任务工期前置任务A3无B4AC2AD5B、CE3CF2D、EPDM 网络关系可以表示为开始 | A(3) / \ B(4) C(2) \ / \ D(5) E(3) \ / F(2) | 结束十二、第一步正推求 ES 和 EF1. 任务 AA 没有前置任务所以ES_A 0A 的工期是 3EF_A ES_A 工期 0 3 3所以任务ESEFA032. 任务 BB 的前置任务是 A所以ES_B EF_A 3B 的工期是 4EF_B ES_B 工期 3 4 7所以任务ESEFB373. 任务 CC 的前置任务也是 A所以ES_C EF_A 3C 的工期是 2EF_C ES_C 工期 3 2 5所以任务ESEFC354. 任务 DD 有两个前置任务B 和 C。B 的 EF 是 7C 的 EF 是 5。D 必须等 B 和 C 都完成后才能开始所以ES_D max(EF_B, EF_C) ES_D max(7, 5) 7D 的工期是 5EF_D ES_D 工期 7 5 12所以任务ESEFD7125. 任务 EE 的前置任务是 C所以ES_E EF_C 5E 的工期是 3EF_E ES_E 工期 5 3 8所以任务ESEFE586. 任务 FF 有两个前置任务D 和 E。D 的 EF 是 12E 的 EF 是 8。F 必须等 D 和 E 都完成后才能开始所以ES_F max(EF_D, EF_E) ES_F max(12, 8) 12F 的工期是 2EF_F ES_F 工期 12 2 14所以任务ESEFF12147. 正推结果汇总任务工期ESEFA303B437C235D5712E358F21214所以项目最早完成时间是项目最早完成时间 14十三、第二步反推求 LS 和 LF反推从项目结束开始。项目总工期是 14所以最后一个任务 F 的 LF 是 14。1. 任务 FLF_F 14F 的工期是 2LS_F LF_F - 工期 14 - 2 12所以任务LSLFF12142. 任务 DD 的后续任务是 F。F 的 LS 是 12所以LF_D LS_F 12D 的工期是 5LS_D LF_D - 工期 12 - 5 7所以任务LSLFD7123. 任务 EE 的后续任务也是 F。F 的 LS 是 12所以LF_E LS_F 12E 的工期是 3LS_E LF_E - 工期 12 - 3 9所以任务LSLFE9124. 任务 BB 的后续任务是 D。D 的 LS 是 7所以LF_B LS_D 7B 的工期是 4LS_B LF_B - 工期 7 - 4 3所以任务LSLFB375. 任务 CC 有两个后续任务D 和 E。D 的 LS 是 7E 的 LS 是 9。C 必须保证 D 和 E 都不被影响所以取较小值LF_C min(LS_D, LS_E) LF_C min(7, 9) 7C 的工期是 2LS_C LF_C - 工期 7 - 2 5所以任务LSLFC576. 任务 AA 有两个后续任务B 和 C。B 的 LS 是 3C 的 LS 是 5。A 必须保证 B 和 C 都不被影响所以LF_A min(LS_B, LS_C) LF_A min(3, 5) 3A 的工期是 3LS_A LF_A - 工期 3 - 3 0所以任务LSLFA037. 反推结果汇总任务工期LSLFA303B437C257D5712E3912F21214十四、第三步计算总浮动 TF总浮动公式TF LS - ES也可以写成TF LF - EF这里用第一种公式计算。1. A 的总浮动TF_A LS_A - ES_A 0 - 0 02. B 的总浮动TF_B LS_B - ES_B 3 - 3 03. C 的总浮动TF_C LS_C - ES_C 5 - 3 24. D 的总浮动TF_D LS_D - ES_D 7 - 7 05. E 的总浮动TF_E LS_E - ES_E 9 - 5 46. F 的总浮动TF_F LS_F - ES_F 12 - 12 07. 总浮动结果汇总任务ESEFLSLFTFA03030B37370C35572D7127120E589124F121412140总浮动为 0 的任务是A、B、D、F所以关键路径是A → B → D → F关键路径长度是3 4 5 2 14因此项目最短工期 14十五、第四步计算自由浮动 FF自由浮动公式FF 紧后任务最小 ES - 本任务 EF注意自由浮动用紧后任务的 ES不是 LS。1. A 的自由浮动A 的紧后任务是 B 和 C。B 的 ES 是 3C 的 ES 是 3。紧后任务最小 ES min(3, 3) 3A 的 EF 是 3。FF_A 3 - 3 02. B 的自由浮动B 的紧后任务是 D。D 的 ES 是 7。B 的 EF 是 7。FF_B 7 - 7 03. C 的自由浮动C 的紧后任务是 D 和 E。D 的 ES 是 7E 的 ES 是 5。紧后任务最小 ES min(7, 5) 5C 的 EF 是 5。FF_C 5 - 5 0这里非常关键C 的总浮动是 2但自由浮动是 0。原因是C 只要晚完成一点就会影响 E 的最早开始时间。 但是 E 本身有浮动时间所以 C 延误一部分不一定影响项目最终完成。所以C 可以拖一段时间而不影响整个项目 但不能拖而不影响紧后任务 E 的最早开始。4. D 的自由浮动D 的紧后任务是 F。F 的 ES 是 12。D 的 EF 是 12。FF_D 12 - 12 05. E 的自由浮动E 的紧后任务是 F。F 的 ES 是 12。E 的 EF 是 8。FF_E 12 - 8 4这说明E 最多可以延误 4 天而不影响 F 的最早开始。6. F 的自由浮动F 是最后一个任务没有紧后任务。最后任务通常可以按项目完成时间计算FF_F 项目完成时间 - EF_F项目完成时间是 14F 的 EF 是 14FF_F 14 - 14 07. 自由浮动结果汇总任务EF紧后任务紧后任务最小 ESFFA3B、C30B7D70C5D、E50D12F120E8F124F14无140十六、完整计算表把所有计算结果放在一张表里任务工期ESEFLSLFTFFFA3030300B4373700C2355720D571271200E35891244F21214121400最终结论关键路径A → B → D → F 项目总工期14十七、为什么 C 的 TF2但 FF0这是最经典的易错点。C 的参数是参数数值ES3EF5LS5LF7TF2FF0C 的总浮动TF_C LS_C - ES_C 5 - 3 2这表示C 最多可以从第 3 天拖到第 5 天开始 只要不影响项目最终第 14 天完成即可。但是 C 的自由浮动FF_C 紧后任务最小 ES - EF_CC 的紧后任务是 D 和 ED 的 ES 7 E 的 ES 5 紧后任务最小 ES min(7, 5) 5所以FF_C 5 - 5 0这表示C 只要晚完成一点 E 就不能在第 5 天最早开始。因此C 延误会影响 E 的最早开始 但不一定影响项目最终结束 所以 C 的 FF 是 0TF 是 2。这就是总浮动和自由浮动的本质区别。十八、为什么 E 的 TF4FF4E 的参数是参数数值ES5EF8LS9LF12TF4FF4E 的总浮动TF_E LS_E - ES_E 9 - 5 4E 的自由浮动FF_E ES_F - EF_E 12 - 8 4说明E 最多可以延误 4 天。如果 E 延误 4 天E 从第 9 天开始 E 工期 3 天 E 第 12 天完成 F 原本第 12 天开始 F 不受影响 项目也不受影响。所以 E 的总浮动和自由浮动刚好相等。十九、关键路径的两种判断方法方法一找最长路径把所有从开始到结束的路径列出来。路径 1A → B → D → F工期3 4 5 2 14路径 2A → C → D → F工期3 2 5 2 12路径 3A → C → E → F工期3 2 3 2 10最长路径是A → B → D → F所以关键路径是A → B → D → F方法二找 TF0 的活动根据计算表任务TFA0B0C2D0E4F0TF0 的活动是A、B、D、F所以关键路径是A → B → D → F二十、关键路径计算题标准答题模板考试时建议按这个顺序写。第一步列任务表活动、工期、前置活动。例如活动工期前置活动第二步正推计算 ES、EF使用公式EF ES 工期如果有多个前置活动ES 所有前置活动 EF 的最大值第三步反推计算 LS、LF使用公式LS LF - 工期如果有多个后续活动LF 所有后续活动 LS 的最小值第四步计算总浮动 TF使用公式TF LS - ES或者TF LF - EF第五步计算自由浮动 FF使用公式FF 紧后任务最小 ES - 本任务 EF第六步找关键路径方法一总工期最长的路径就是关键路径。方法二总浮动为 0 的活动通常组成关键路径。二十一、Lead 和 Lag1. Lag滞后Lag 表示后续任务需要延迟一段时间才能开始。例如编码完成后等待 2 天再开始测试。这就是 FS 2 天 Lag。普通公式测试最早开始时间 编码最早完成时间 2Lag 会延长项目进度。2. Lead提前Lead 表示后续任务可以提前开始。例如编码还没有完全结束测试人员可以提前准备测试用例。Lead 可以压缩进度但可能增加返工风险。简单记忆Lead 提前 Lag 滞后二十二、赶工和快速跟进项目进度压缩常见两种方法赶工 快速跟进1. 赶工 Crashing赶工是通过增加资源来缩短关键路径上的活动工期。例如增加开发人员 安排加班 外包部分工作 增加测试资源。赶工通常会增加成本。单位压缩成本公式单位压缩成本 赶工成本 - 正常成本÷正常工期 - 赶工工期例如正常工期 10 天正常成本 10 万 赶工工期 6 天赶工成本 18 万。则单位压缩成本 18 - 10÷10 - 6 2 万/天2. 快速跟进 Fast Tracking快速跟进是把原本顺序执行的任务改成并行或部分并行。例如原计划设计完成 → 编码开始快速跟进后部分设计完成 → 部分编码提前开始快速跟进不一定直接增加成本但通常会增加风险和返工。3. 赶工和快速跟进的区别方法做法主要代价赶工增加资源压缩工期增加成本快速跟进串行改并行增加风险二十三、考试高频易错点1. PDM 和 ADM 不要混PDM节点表示活动箭线表示关系。 ADM箭线表示活动节点表示事件。2. 自由浮动不要用 LS自由浮动公式是FF 紧后任务最小 ES - 本任务 EF不是FF 紧后任务 LS - 本任务 EF自由浮动看的是后续任务最早开始所以必须用 ES。3. 多前置任务正推取最大 EF如果一个任务有多个前置任务ES 所有前置任务 EF 的最大值因为必须等所有前置任务都完成。4. 多后续任务反推取最小 LS如果一个任务有多个后续任务LF 所有后续任务 LS 的最小值因为要保证最早需要它的后续任务不被影响。5. 关键路径不一定只有一条如果两条路径工期一样长并且都是最长路径那么它们都可能是关键路径。6. 关键路径可能变化项目执行过程中如果非关键活动延期超过了它的总浮动它就可能变成关键活动。7. TF0 通常是关键活动但要看路径是否连续考试中通常可以用 TF0 找关键路径。但如果网络图很复杂最好确认这些活动能不能从开始节点连续连接到结束节点。二十四、考场速记版1. PDM 与 ADMPDM节点是活动箭线是关系。 ADM箭线是活动节点是事件。2. 正推EF ES 工期 ES 所有前置任务 EF 的最大值3. 反推LS LF - 工期 LF 所有后续任务 LS 的最小值4. 总浮动TF LS - ES LF - EF含义不影响项目最终完成。5. 自由浮动FF 紧后任务最小 ES - 本任务 EF含义不影响紧后任务最早开始。6. 关键路径最长路径 关键路径 TF 0 的活动通常在关键路径上 关键路径长度 项目最短工期二十五、最后总结PDM、ADM、关键路径、总浮动、自由浮动这一部分看起来概念很多但核心逻辑非常清晰正推看最早什么时候能做。 反推看最晚能拖到什么时候。 总浮动看会不会影响项目完工。 自由浮动看会不会影响下一个任务开工。 关键路径看哪条路径最长、最不能拖。PDM 用节点表示活动箭线表示关系ADM 用箭线表示活动节点表示事件关键路径决定项目最短完成时间总浮动衡量某任务对项目整体完工时间的影响自由浮动衡量某任务对紧后任务最早开始时间的影响。真正掌握这部分不是死背公式而是理解每个公式背后的项目管理逻辑。只要记住下面五句话进度管理计算题基本就不会乱1. 正推求 ES、EF。 2. 反推求 LS、LF。 3. TF LS - ES LF - EF。 4. FF 紧后任务最小 ES - 本任务 EF。 5. 关键路径是最长路径也是时间余量最小的路径。