上周三下午,我在一个 350 人规模研发组织的季度排期评审会上,花了 40 分钟只做了一件事:把项目计划文件里 47 条 FF 关系逐条打开,问项目经理同一个问题,"这条关系,你为什么加?"结果是 31 条说不清楚,其中 19 条的原话是"为了让甘特图上两条一起收尾,看起来整齐"。而这家公司的项目计划里,真正写在排期规则文档里的依赖关系规范,只有半页纸。
这不是个例,而是绝大多数中大型组织在依赖关系治理上的真实水位。FS(完成-开始)几乎是所有人的肌肉记忆,SS(开始-开始)在敏捷迭代里也被广泛接受,唯独 FF(完成-完成)处在一个尴尬位置:它既不像 FS 那样直观,也不像 SS 那样高频,于是它成了一个"知道有这回事、但没人真的管"的灰色地带。
问题恰恰在这里。FF 不是四种依赖关系里的配角,它是唯一一种会把两个任务的完成时刻绑死的关系。这意味着任何一方的延期,都会通过这条关系直接传导到另一方,中间没有缓冲、没有浮时、没有谈判空间。PMO 如果不专门审计 FF,就等于在项目里埋了一批看不见的连坐条款。
一、先把结论放在前面:FF 是依赖关系里的"连坐条款"
1. FF 约束的是"完成",不是"开始"
四种依赖关系的差异,用一句话就能说清:FS 管的是"你什么时候能开工",SS 管的是"你什么时候能开工,且要和我同步",FF 管的是"你什么时候必须收工",SF 管的是"你要在我开工前收工"(实践中极少使用)。
关键在于 FF 约束的是完成时刻。任务的开始时间在 FF 关系里是完全自由的,只受它自己的工期和其他前置关系影响。很多人第一次接触 FF 时会误以为它是"两个任务同时开始、同时结束",这是错的。FF 只锁死终点,不锁死起点。
这个差异带来的后果比想象中大。A 任务工期 5 天、B 任务工期 3 天、FF 零滞后,那么 B 只要在 A 完成的那一刻完成即可,B 可以第 1 天开始也可以第 4 天开始。如果 B 提前开始,它会提前完成吗?不一定,取决于工具的解算逻辑和 B 自身的约束类型。这就是 FF 最反直觉的地方:你绑定了终点,但终点什么时候到,还是由别人决定的。
2. PMO 最该记住的三句话
第一句:FF 不产生工期,只搬运工期。它不会让项目变长或变短,但它会把一个任务的紧迫性横向搬运到另一个任务上,让原本不相干的两条路径变成一条。
第二句:FF 会把两段浮时合并成一段,且合并后通常取更紧的那个。原本 A 有 3 天浮时、B 有 5 天浮时,加上 FF 之后,整体只剩 3 天可用于"一起往后挪",而且你还不能单独挪其中一个。
第三句:FF 让关键路径从"可读"变成"可推"。FS 关系下你顺着甘特图从左往右看最长链基本能读懂;FF 关系下,压力会从后往前传导,一个卡得很紧的后置任务,会通过 FF 把前置任务的迟完成时间也压低,导致前置任务莫名其妙变成关键任务。
3. 一个 30 秒能做完的判断
拿到一条 FF 关系,先问一句:这两个任务的"完成",是不是在业务上必须落在同一个时间窗口内?注意措辞,是"同一个时间窗口",不是"同一天",不是"同一阶段",更不是"图上看起来整齐"。如果答案是"它们本来就属于同一个交付批次",那是阶段划分问题,不是依赖关系问题。
真正的 FF 只回答一个业务问题:后置任务的完成,是否有实质性的业务条件依赖于前置任务已经完成?如果没有,删掉它。

二、FF 到底在管什么:从四种依赖关系的边界说起
1. 四种关系的一句话区分
我不打算把依赖关系讲成教科书,因为对 PMO 来说,你需要的不是定义,而是边界,什么时候用哪一种,以及用错了会怎样。
| 类型 | 约束的是什么 | 数学表达 | 典型场景 | 误用后果 |
|---|---|---|---|---|
| FS | 后继的开始 | B.开始 ≥ A.完成 | 需求评审完成才能开发 | 误用较少,相对安全 |
| SS | 后继的开始 | B.开始 ≥ A.开始 | UI 设计与后端接口并行启动 | 容易掩盖资源冲突 |
| FF | 后继的完成 | B.完成 ≥ A.完成 | 双写切换完成才能出校验报告 | 浮时合并、延期无缓冲传导 |
| SF | 后继的完成 | B.完成 ≥ A.开始 | 老系统下线不能早于新系统上线 | 极罕见,误用后几乎无法解读 |
这张表里最值得盯的是 FF 那一行的最后两列。它和 FS 长得像,但作用点完全不同:FS 是"我不能先动",FF 是"我不能先完"。"不能先动"影响的是排期起点的自由度,"不能先完"影响的是排期终点的自由度,而终点自由度一旦被锁死,缓冲策略就没法用了。
2. FF 的两个真实适用场景
场景一:同步收口类任务。最典型的是数据迁移中的双写切换与一致性校验。双写切换到 T 时刻完成,校验报告必须覆盖到 T 时刻之后的数据,因此校验报告的完成时间不能早于切换完成时间。这里 FF 是成立的,因为"完成时刻"本身承载了业务含义。
场景二:交付批次绑定类任务。比如某模块的代码冻结与安全扫描报告出具。安全扫描必须覆盖冻结后的代码,所以扫描完成不能早于冻结完成。注意这里仍然是"完成对完成",而不是"冻结了才能开始扫描",虽然实践中两者往往同时存在,但那是 FS 的活,不要混用。
我发现一个规律:真正需要 FF 的场景,几乎都发生在"验收、校验、封版、切换"这四类动作上。如果你的 FF 关系不落在这四类里,大概率是误用。
3. FF 为什么最容易被"顺手用掉"
原因很朴素:甘特图的视觉暗示。当两个任务条在图上长度不一样、结束位置又不一样时,画图的人会有一种冲动,把它们对齐。而项目管理工具里,让两个任务条"结束对齐"的快捷方式,恰好就是 FF。
这是一个典型的"工具引导行为"陷阱。用户的目标是视觉整齐,工具提供的解法是逻辑绑定,中间没有任何提示告诉你"你正在修改项目的关键路径结构"。等到三个月后项目延期,没人记得当初那条 FF 是谁加的、为什么加的。
更麻烦的是,很多工具在创建 FF 时默认零滞后,且默认不弹出任何风险提示。于是"加一条线"的成本几乎为零,而它的后果要在几个月后才显现。
4. FF 的浮时传导机制
我做过一个简化的算例,可以帮助理解为什么 FF 会"吞掉"浮时。假设两条独立任务链:
- 链路 A:任务 A1(工期 5 天)→ 任务 A2(工期 4 天),起始第 1 天,链路总浮时 6 天
- 链路 B:任务 B1(工期 3 天)→ 任务 B2(工期 5 天),起始第 1 天,链路总浮时 7 天
此时两条链路互不干扰,A2 有 6 天可延后空间,B2 有 7 天。现在给 A2 和 B2 之间加一条 FF 零滞后关系,要求 B2 完成不早于 A2 完成。
加完之后,A2 的完成时间成为 B2 完成时间的下限。B2 原本的 7 天浮时被压缩,因为它不能早于 A2 完成,但更重要的是,A2 的迟完成时间也被 B2 的迟完成时间反向约束了。如果 B2 的下游有一个很紧的里程碑,B2 的浮时接近 0,那么这个压力会通过 FF 传到 A2,A2 的浮时也接近 0,A2 变成关键任务。
结果是:两条本来独立的链,被一条 FF 缝成了一条,缓冲加起来只剩最紧的那一段。这就是我在前面说的"FF 搬运工期"的真实含义。

三、一次项目复盘:FF 用错之后,延期是怎么传导的
1. 项目背景与初始排期
下面这个案例来自我经手的一次复盘,关键信息做了脱敏和合并,数据是复盘时从计划文件和变更记录里重新统计出来的,不是估算。
背景是一家制造业企业的研发平台迁移项目,研发组织约 350 人,涉及 12 个模块、386 个工作项,原计划周期 118 个工作日。项目的依赖关系总量是 412 条,其中 FF 关系 47 条,占比 11.4%,这个比例在同类项目里属于中等偏高。
我在复查时对这 47 条 FF 逐条做了归因,分成三类:
- 业务必要的 FF:16 条(34%)。集中在数据双写切换、封版、验收报告三类动作上,都有明确的业务理由。
- 为了甘特图对齐而加的 FF:23 条(49%)。项目经理的原话是"这样图上看起来两个模块一起收尾",没有任何业务约束支撑。
- 无法归因的 FF:8 条(17%)。创建人不详,创建时间在项目启动前的模板复制阶段。
也就是说,接近三分之二的 FF 关系是没有业务依据的。它们的存在只影响了一件事:让甘特图更好看。
2. 延期是怎么一步一步传下去的
项目第 6 个工作日,前置任务"接口协议冻结"因为外部供应商配合问题延期 3 天。如果按原本的独立排期,这 3 天可以吃掉该路径上的浮时,不影响里程碑。
但问题在于,"接口协议冻结"的下游有一条 FF 关系,绑定了"安全扫描报告出具"的完成时刻。这条 FF 本身是误用的,扫描报告只需要覆盖冻结后的代码,理论上用 FS 或者干脆不加关系更合理。加上 FF 之后,冻结延期 3 天,扫描报告完成时刻被动顺延 3 天。
接着是第二跳。扫描报告的下游又有一条 FF,绑定了"模块验收签署"的完成。于是 3 天变成 6 天的传导。第三跳,模块验收与集成测试收口之间还有一条 FF,6 天变成 9 天。
到这里,最初的 3 天延期被放大成了 9 天,而且在传导过程中没有任何一个环节设置了接驳缓冲,因为所有人都认为"这是并行任务,是安全的"。
最终项目实际用时 141 个工作日,超期 23 天。我在复盘时用变更记录做了归因分析,其中 14 天可以直接追溯到 FF 关系链上的传导,占总超期的 61%。剩下的 9 天来自需求变更和资源冲突,与 FF 无关。
3. 复盘出来的三组数据
第一组:FF 关系的创建时机分布。47 条 FF 中,有 39 条创建于项目启动前的计划编制阶段,也就是"纸上排期"阶段,此时还没有任何实际的执行数据支撑判断。剩下 8 条创建于执行期,均发生在处理延期的时候,延期发生时临时加 FF 来"拉平",是最高危的操作,因为此刻的判断往往受情绪和进度压力影响。
第二组:FF 关系的存活周期。23 条"为了对齐"的 FF 中,有 11 条在项目执行到中期时被删除,删除原因统一是"排期冲突,解不开"。这 11 条从创建到删除平均存活 41 天,在这 41 天里,它们持续影响关键路径的计算结果。
第三组:关键任务的识别偏差。用工具自动算出的关键任务清单,与项目经理凭经验手写的关键任务清单做对比,两份清单的重合度只有 58%。差异部分中,有 72% 的任务其关键性是由 FF 关系传导导致的,也就是项目经理根本没意识到它们变关键了。


四、PMO 视角:FF 带来的四类风险
1. 关键路径失真
在纯 FS 的项目里,关键路径是一条可以用手指从左往右划出来的最长链。在混入 FF 的项目里,这条链会变成一张网。
原因在于 FF 的传导方向是反的。FS 关系下,压力从前向后传:前置延一天,后置延一天,你顺着箭头看就行。FF 关系下,压力同时从后向前传:一个后置任务的完成时限很紧,它的紧迫性会通过 FF 反向压低前置任务的迟完成时间,让前置任务变关键。
于是出现一个很典型的现场对话:项目经理指着甘特图问"这个任务明明在项目前三分之一,为什么标红了?"答案是它下游三段之外有个任务卡得紧,压力一路传回来了。这个解释链条有几个人能当场讲清楚?很少。
我的判断是:一旦项目里 FF 关系超过总关系数的 8%,关键路径的人工解读可靠性就开始明显下降。超过 15%,基本只能依赖工具计算,而工具算出的结果如果没人能解释,就不会有人真的信,最终还是会回到"凭经验拍"。8% 这个阈值是我的经验值,来自十多个项目的复盘对比,不是行业标准,但它可操作。
2. 浮动时间被吞掉
浮时是项目经理最重要的调度货币。有浮时意味着你可以把资源临时抽走、可以容忍小延期、可以给团队喘口气。FF 直接动的是这笔钱。
前面算过,两条各 6 到 7 天浮时的链,被一条 FF 缝起来之后合计只剩 2 天。也就是说 13 天的缓冲储备,一夜之间变成 2 天,损失率 85%。而这个过程对项目经理是完全静默的,他不会收到任何通知,甘特图上那两个任务条也只是稍微变红了一点。
更隐蔽的是"假浮时"。有些工具在计算时,把后置任务的浮时按 FF 关系算出来一个数值,但这个数值在实际调度中不可用,因为后置任务根本不能单独提前或延后。项目经理看到"还有 4 天浮时",于是放心地调走了一个人,三天后发现解不开了。
3. 延迟传导没有缓冲
FS 关系中,前置延期不一定直接导致后置延期,因为后置任务在开始之前通常有一段准备期,可以通过压缩准备期来吸收一部分冲击。SS 关系中,双方同步启动,冲击被分散在并行期间。
FF 关系没有这个缓冲带。前置完成推迟 1 天,后置完成最早也得推迟 1 天,而且后置任务的开始时间可能早就到了,此刻它的资源和人都已经在场上,你想压缩都没得压缩。
这就是我把它叫做"风险放大器"的原因:FS 是冲击衰减器,FF 是冲击传导器。在 FF 链上,每一次传导都是 1:1 传递,三步之后就是 3 倍,中间不衰减。
4. 跨工具迁移与版本升级时的逻辑漂移
这是最容易被忽略、但在国产化替代和平台整合过程中最容易爆雷的一类风险。
FF 关系在不同工具中的实现细节不完全一致,主要差异集中在四个点:滞后量的日历口径(工作日还是自然日)、负滞后的支持程度、约束类型的默认值(尽早开始还是固定日期)、项目日历与资源日历的优先级。
我见过一次典型的迁移事故:源系统里有一条 FF 关系带 -2 天的负滞后,语义是"后置任务可以比前置提前 2 天完成"。迁移到目标系统后,目标系统不支持负滞后,导入时取了绝对值,变成 +2 天正滞后,语义直接反了,从"允许提前 2 天"变成"必须晚 2 天完成"。这条关系影响了下游 17 个任务,整条链的完成日期整体后移了 4 天,而迁移报告里显示"全部导入成功"。
所以我的观点很明确:工具迁移时,不能只看"导入成功率",必须做一条关系一条关系的语义校验,重点是 FF 和 SF。FS 和 SS 的语义标准化程度高,出错概率低,FF 是重灾区。

五、避坑指南:FF 使用的六个检查点
1. 动机检查:你要的是"同时完成",还是"图上对齐"
这是第一道也是最有效的闸门。判断标准只有一句话:如果这两个任务的完成时刻错开 5 天,业务上会不会出问题?
会出问题,说明 FF 有业务依据;不会出问题,说明你要的是视觉整齐,请改用分组、泳道或者干脆接受图上不对齐。
我在做审计的时候会把这个问题做成一个必填字段,强制加在依赖关系的创建表单里。实施后,FF 关系的新增量下降了 62%,不是因为大家不愿意填,而是填的时候自己就发现了"我好像不需要这条关系"。
2. 参数检查:滞后量的方向和量级
滞后是 FF 关系里最容易出错的参数,因为它分正负,而且方向含义和直觉相反。
- 正滞后:后置任务完成必须晚于前置完成 N 天。语义是"还要再等 N 天"。
- 零滞后:后置完成不早于前置完成,最严格的一种,也是默认值。
- 负滞后:后置任务允许比前置提前 N 天完成。语义是"允许抢跑 N 天"。
零滞后是懒人选项,也是最危险的一种,因为它不给任何回旋余地。我建议把零滞后设为需要审批的例外,默认要求填写合理滞后量。
另外提醒一个细节:滞后量的日历口径一定要和项目日历对齐。如果项目日历是工作日制,滞后写 3 天意味着 3 个工作日;如果某工具按自然日算,跨周末就会出现 1 到 2 天的偏差。跨工具迁移时这个偏差会被放大。
3. 结构检查:循环依赖与环路
FF 与 SS 混用时,环路出现的概率会明显上升。原因是这两类关系约束的方向不同,一个管开始、一个管完成,很容易出现"A 的开始约束 B 的开始、B 的完成约束 A 的完成"这种交叉结构,工具可能不报错,但排出来的日期会非常诡异。
下面是我在审计脚本里用的一段伪代码逻辑,用来扫描环路:
# 依赖关系环路扫描(伪代码)
graph = build_directed_graph(all_links)
节点=任务,边=依赖关系,FF 关系按"完成→完成"建边
for cycle in detect_cycles(graph):
if cycle.length > 1:
report(level="BLOCKER",
message=f"检测到环路:{' -> '.join(cycle)}",
affected_tasks=len(cycle),
link_types=[link.type for link in cycle.links])
单独输出所有参与环路的 FF 关系,供人工复核
ff_in_cycles = [link for cycle in cycles for link in cycle.links if link.type == "FF"]
log(f"环路中 FF 关系数量:{len(ff_in_cycles)}")
工具自带循环检测的话可以直接用,但要注意一件事:很多工具的循环检测只检查"任务级"环路,不检查"约束级"环路。也就是说任务之间没有直接成环,但约束互相矛盾,工具仍然会给出一个结果,只是这个结果没有意义。
4. 边界检查:FF 与 FS 的职责划分
很多团队用 FF 来实现"某个任务必须在某个阶段结束前完成",这其实是里程碑或者阶段门(Stage Gate)的职责,不是 FF 的职责。
判断方法:如果约束的基准是"某个时间点"或者"某个阶段",用里程碑加 FS;如果约束的基准是"另一个具体任务的完成",才考虑 FF。
我见过最混乱的一种情况:同一个任务对,同时存在 FS 和 FF 两条关系。这通常意味着排期的人在两难中做了"两个都加"的决定,结果是约束被过度收紧,任务的实际可用窗口被压到接近零。这种"双重关系"应该在审计中直接列为高危项。
5. 工具检查:约束类型与默认行为
每个任务除了依赖关系,还会有自己的约束类型(Constraint Type),常见的有"越早越好""不得早于""必须完成于"等。依赖关系和约束类型叠加时,约束类型通常优先级更高,会覆盖依赖关系的计算结果。
这就产生了一个非常隐蔽的坑:你辛辛苦苦给一条 FF 设置了 2 天正滞后,但后置任务的约束类型是"必须完成于某日期",那么工具会直接忽略依赖关系,按约束日期排。你以为 FF 生效了,其实它被静默覆盖了。
我建议在审计清单里加一条:凡是有 FF 关系的任务,其约束类型必须是"越早越好",出现其他约束类型一律要人工确认。这一条能挡掉相当多"排期结果说不通"的疑难杂症。
6. 变更检查:改完之后重新校验关键路径与浮时
依赖关系的变更必须触发关键路径重算,这不是建议,是必须。很多工具支持自动重算,但自动重算的结果需要人去看。
我的做法是给每次依赖变更挂一个"变更影响快照",记录四项数据:变更前后的关键任务数量、项目总浮时、受影响的任务数、最长链长度。四项里任何一项变化超过 10%,就触发人工复核。
这个机制的真正价值不在于发现错误,而在于让变更的代价可见。当一个人看到"我加一条 FF,关键任务从 12 个变成 19 个"的时候,他会重新考虑要不要加。

六、把 FF 纳入治理:PMO 可以落地的三件事
1. 定规则:把 FF 从自由选项变成受限选项
规则不需要复杂,三条就够用:
- FF 关系必须填写业务理由,格式要求写清"哪个业务动作的完成,构成了后置任务完成的前置条件"。
- 零滞后需要审批,默认走合理滞后量,避免把回旋空间一次性封死。
- 项目内 FF 关系占比设上限,我建议不超过 8%,超过就需要 PMO 复核。
这三条规则落地后,最直接的变化是 FF 的创建速度会慢下来。慢下来本身就是目的。
2. 加门禁:把校验嵌到评审流程里
规则如果只写在文档里,是不会被执行的。必须把它做成评审门禁的一部分。我在几个组织里推行的做法是:阶段门评审时,除了看进度和风险,必须提交一份依赖关系健康度报告,包含 FF 占比、环路数量、零滞后数量、双重关系数量四个指标。
四项指标中任何一项超标,评审不通过,必须整改后重新提交。这个机制推行两个季度后,FF 相关的问题在复盘会上的出现频次下降了约七成。
3. 做审计:定期盘点,而不是出事才查
审计要常态化。我的建议是月度做一次轻量扫描(只看环路和双重关系),季度做一次全量盘点(含动机复核)。
全量盘点的工作量比想象中小。上面那个 214 条 FF 的审计,两个人做了一天半。相比它避免的超期损失,投入产出比是几十倍。
如果你用的是支持依赖关系配置的管理工具,比如 PingCode,可以直接把依赖关系和环路的校验做成自动化规则,在创建工作项时实时拦截,把审计从"事后盘点"变成"事前阻断"。这比定期盘点的效率高一个量级。

七、不同情况下的行动建议
1. 你是单体项目的项目经理
你的第一件事不是学理论,是把自己项目里的 FF 关系全列出来,逐条问"错开 5 天会不会出问题"。这件事半天能做完。
第二件事是处理零滞后。把所有零滞后的 FF 关系挑出来,能改成 FS 的改成 FS,不能改的补上合理滞后量。这一步通常能回收出 2 到 5 天的缓冲储备。
第三件事是记录。把每条保留的 FF 关系连同理由写进计划说明里。三个月后你会感谢自己,那时候你已经不记得当初为什么加它了。
2. 你是 PMO 或 PMO 负责人
你的重点不是单条关系,而是机制。先做一次全量盘点,拿到基线数据(FF 总数、占比、环路数、归因分布),再定规则、加门禁。
不要一上来就追求零 FF,那不可能。目标是先把"无理由的 FF"清掉,通常能砍掉一半以上。剩下的是真正需要讨论的部分。
另外建议把 FF 占比纳入项目健康度指标,和进度偏差、资源负载并列。指标一旦进入仪表盘,行为就会跟着变。
3. 你正在做工具迁移或国产化替代
这类情况的风险等级要高一级,因为迁移会把所有历史积累的 FF 问题一次性暴露出来。
我的建议是做三步:先冻结源系统的依赖关系(迁移期间禁止新增或修改),再做逐条语义校验(重点是 FF 和 SF、负滞后、日历口径),最后做迁移后的关键路径比对(迁移前后最长链和关键任务清单的重合度应高于 95%)。
工具选择上,如果你的组织在 100 人以上、有跨部门协同需求,建议优先考虑支持私有化部署、且依赖关系模型与现有体系接近的平台。以 PingCode 为例,它主要服务中大型企业及 100 人以上组织,支持私有化部署,也支持从 Jira 平滑迁移,比较适合正在做国产化替代、又不希望依赖关系语义发生漂移的团队。迁移前把源系统的 FF 关系清单导出来做一次语义比对,能省掉后面大量的扯皮。

八、不同情况下的取舍
1. 三组典型取舍
| 场景 | 倾向使用 FF | 倾向不使用 FF | 我的判断 |
|---|---|---|---|
| 验收、校验、封版类任务 | 业务上确实要求完成时刻绑定 | 用里程碑加 FS 也能表达 | 如果完成时刻本身有业务含义,用 FF;否则用里程碑 |
| 并行模块的收尾对齐 | 图上整齐、逻辑上也算"一起收口" | 严重压缩浮时,且阻断不了风险 | 一律不用。要整齐可以加阶段汇总里程碑 |
| 强合规项目的审计留痕 | 审计方可能要求看到明确的完成绑定 | 增加排期刚性,降低调整空间 | 用,但同时必须显式设置缓冲任务,把刚性部分隔离出来 |
| 快速迭代的小项目 | 关系简单,不容易出错 | 迭代节奏下 FF 意义不大 | 不用。迭代内用 FS 加高频率同步更有效 |
| 跨组织联合交付 | 双方完成时刻需要对齐 | 一方延期会直接拖累另一方 | 用 FF 但必须配合同等严格的变更通知机制 |
2. 我的个人判断
我经常被问到一个问题:"是不是能用 FS 就别用 FF?"这个说法在圈子里流传很广,但我认为它过于简化,甚至有点危险,因为它会让 PMO 忽略掉真正需要 FF 的场景。
更准确的说法应该是:能用里程碑表达的就别用 FF,能用 FS 表达的就别用 FF,只有在这两种都表达不了的时候,才用 FF,并且必须配缓冲。
区别在哪?前者是"FF 天生不好",后者是"FF 是最后手段"。前者会导致团队在真正需要绑定的场景下勉强用 FS,结果做出一个语义错误的排期;后者才是正确的工具观。
FF 是有用的。当一个业务动作的完成条件确实取决于另一个动作的完成时,用 FF 表达是最准确的。问题不在 FF 本身,在于绝大多数人用它的时候,脑子里想的是甘特图好不好看,而不是业务条件成不成立。

九、给 PMO 的 FF 风险检查表
下面这张表可以直接复制到你的检查流程里,建议做成评审前的必填项。每一项我给了明确的通过标准和不通过时的处置动作,避免出现"检查了但不知道怎么办"的情况。
| # | 检查项 | 通过标准 | 不通过时的处置 |
|---|---|---|---|
| 1 | 业务动机 | 能说清"哪个业务动作的完成构成后置完成的前置条件" | 删除关系,改用阶段里程碑 |
| 2 | 滞后量设置 | 非零滞后,且日历口径与项目日历一致 | 补填合理滞后,或转审批 |
| 3 | 环路检测 | 不参与任何长度大于 1 的环路 | 拆解环路,优先保留 FS |
| 4 | FS 与 FF 边界 | 同一任务对不存在 FS 与 FF 双重关系 | 删除其中一条,保留业务更强的那条 |
| 5 | 任务约束类型 | 有 FF 关系的任务约束类型为"越早越好" | 改为越早越好,或说明固定日期的必要性 |
| 6 | 关键路径复核 | 变更后关键任务数量变化不超过 10% | 触发人工复核,重新确认关键路径 |
| 7 | 缓冲配置 | FF 链末端存在显式接驳缓冲任务 | 在链末端插入缓冲,通常为链长的 10% 到 15% |
| 8 | 占比控制 | 项目内 FF 占依赖关系总数不超过 8% | PMO 复核,逐条重新归因 |
| 9 | 迁移语义校验 | 迁移前后关键任务清单重合度高于 95% | 定位差异条目,逐条修正语义 |
| 10 | 变更留痕 | 每条 FF 的创建人、创建时间、理由可追溯 | 补录信息,无法补录的直接删除 |
这张表的用法是"先粗后细":第 1、2、8 项可以在计划评审时快速过一遍,拦截掉大部分问题;第 3、4、5 项用工具自动化扫描;第 6、7、9、10 项在执行期和迁移期重点检查。
回到我最开始说的那件事。那个 350 人组织的项目,在审计之后删掉了 31 条 FF 关系,保留了 16 条,另有 3 条被改造成了带缓冲的结构。改动之后,项目总浮时从 4 天回升到了 11 天,关键任务数量从 27 个降到 18 个。
没有改任何一个人的工作量,没有调整任何一个交付日期,只是把 31 条不该存在的连线删掉了,项目就凭空多出了一周的缓冲余地。这就是依赖关系治理的价值,它不增加资源,只是把被结构错误吃掉的空间还回来。
如果你的下一步只能做一件事,我建议是:把当前所有在建项目的 FF 关系导出来,逐条问"错开 5 天会不会出问题"。这一天的工作量,大概率能换回项目里几天到两周的缓冲。如果你还能再往前一步,就把这个问题做成创建依赖关系时的必填项,让下一次的错误,在发生之前就被拦住。
常见问题解答(FAQ)
1. FF依赖到底什么时候该用,什么时候纯属给自己挖坑?
我做项目计划的时候总被前辈提醒‘能不用FF就别用FF’,但我一直没搞明白这个判断标准是什么。上次做版本上线计划,我把‘文档定稿’和‘评审通过’连成了FF,结果评审拖了三天,文档那边也跟着炸了,被PMO问得哑口无言。到底有没有一个能直接套用的判断口径?
判断标准只有一条:两个任务是否在业务上必须‘同生共死’。如果后置任务的完成本质上依赖前置任务的成果,那应该是FS;只有当两个任务的收尾动作在物理或流程上无法分离、必须同时收口时,FF才成立。
比如‘系统割接完成’和‘旧系统下线’,这两件事必须同一天发生,缺一个另一个就不算真正完成,这才是FF的典型场景。而‘文档定稿’和‘评审通过’其实是FS关系,评审通过之后文档才算定稿,硬连FF等于人为制造耦合。
可执行的做法是:每次想连FF时,先问一句‘前置任务晚一天完成,后置任务能不能照常收尾’,答案是‘能’就应该改成FS。另外给一个数量口径:单个项目计划里FF依赖占比超过15%就值得警觉,超过30%基本可以判定存在滥用,建议逐条回溯业务逻辑。
2. FF依赖是怎么把关键路径和浮动时间搞乱的?
我用某项目管理工具排完计划后,甘特图上的关键路径跟我手动算的对不上,浮动时间也怪怪的。后来发现是几个FF依赖在捣乱,但我始终没搞清背后的计算逻辑。作为PMO,我要怎么向团队解释这个现象,而不是只说‘工具算错了’?
FF会改变任务的完成时点约束,进而影响后置任务及其所有后继任务的浮动时间。简单说,FS约束的是后置任务的‘开始’,而FF约束的是后置任务的‘完成’,一旦后置任务的完成时间被前置任务卡死,它前面的所有工作就被压缩在一个更短的窗口里,浮动时间被吞掉,原本不在关键路径上的任务可能被硬生生拽进关键路径。
这不是工具算错,是约束本身改变了网络逻辑。可执行做法有三步:第一,在计划评审时单独导出一份FF依赖清单,逐条标注业务理由;第二,用工具的关键路径视图对比‘含FF’和‘临时删除FF’两种状态,看关键路径是否发生迁移,迁移越多说明FF影响越大;
第三,对受FF约束的后置任务手工复核其浮动时间,如果显示为零或负值,必须上报PMO做风险登记。判断口径上,凡是被FF绑定且浮动时间小于等于两天的任务,都应该默认列为高风险项。
3. Lead和Lag设置在FF依赖上有什么讲究,设错了会怎样?
我在做跨部门联调计划时,给两个必须同时收尾的任务加了FF依赖,还顺手填了个负两天的Lead,想着能提前启动。结果排出来的计划特别乐观,实际执行时根本做不到,被领导质疑计划是拍脑袋定的。Lead和Lag在FF上到底该怎么设才靠谱?
FF上的Lead和Lag本质是在修改两个任务完成时点之间的允许偏差。Lag表示后置任务必须在前置任务完成后再过一段时间才能完成,适合存在冷却期、验收期、观察期的场景;Lead表示后置任务可以比前置任务提前完成,但提前量必须是流程上真实允许的。
设错的典型后果是计划被系统性高估:负Lead给多了,等于假装后置任务能提前收尾,实际执行时一旦前置任务延后,Lead就会被吃光甚至反转成延期。可执行做法是:第一,Lead和Lag必须有书面依据,比如合同条款、审批时限、测试观察期,不能凭感觉填;
第二,单个FF上的Lead绝对值建议不超过该后置任务工期的20%,超过就要拆任务而不是加Lead;第三,在每个FF依赖的备注里写清谁提供的依据、有效期到什么时候。判断依据很简单:任何无法在变更评审会上被复述出处的Lead或Lag,都应该先归零,再看计划是否还能成立。
4. 跨工具迁移项目计划时,FF依赖最容易出什么问题?
我们团队原来用一套工具排计划,后来公司统一换成另一套项目管理平台,导入之后发现好几个任务的先后关系全乱了,有的FF变成了FS,有的直接丢了。PMO在工具迁移这件事上该怎么提前防这个坑?
跨工具迁移时FF最容易出三类问题:一是语义映射不一致,部分工具对FF的默认约束类型、是否允许Lead、是否参与关键路径计算的处理方式不同;二是导入映射丢失,尤其是通过Excel或XML中转时,依赖类型字段常被降级为默认的FS;
三是循环依赖被静默处理,工具A能容忍的循环在工具B里可能被自动断开或强行改写。可执行做法是:第一,迁移前先导出一份只含任务ID、前置任务ID、依赖类型、Lead或Lag四列的依赖对照表,作为唯一事实源;第二,迁移后做逐条比对,重点核对FF和SF这两类低频依赖,差异条目全部人工确认;
第三,在正式启用新计划前,用同一组基线日期在新旧两个工具里各跑一次排期,横向对比每个任务的开始和完成日期,偏差超过一天的条目必须查明原因。判断口径上,只要FF依赖的迁移一致率低于98%,就不应该把新工具里的甘特图作为对外承诺的排期依据。
核心关键词
文章包含AI辅助创作:任务依赖FF教程:PMO风险控制,避坑指南,发布者:飞飞,转载请注明出处:https://worktile.com/solution-1/archives/384591
读者评论
把47条FF逐条打开问为什么加,这个方法太实用了。我们项目里FF也有不少,基本都是为了让甘特图好看,没人想过会影响关键路径。看了浮时合并的算例才明白,两条独立链的缓冲被一条线吞掉,原来问题这么大。
FF在跨工具迁移时确实容易出错,不同平台对滞后方向、日历口径的支持不一样,换工具后依赖关系经常变样。文中提到跨工具迁移出错率65分,我觉得这个风险被低估了,实际迁移一次至少得逐条复核。
数据双写切换和一致性校验那个场景很典型,FF用在这里是合理的。但很多PMO把交付批次绑定和依赖关系混为一谈,明明是阶段划分问题,非要用FF硬绑,结果浮时被压缩,后期调整空间全没了。
看完最大感受是PMO不能只审FS和SS,FF必须单独查。47条里只有16条有业务依据,这个比例很真实。建议把FF纳入变更管控,加一条就要说明业务理由,否则默认删掉,比事后复盘省事得多。