15 估算
从数量级、单位和假设开始估算,以范围和迭代校准替代伪精确的单点日期。
学习目标
- 能把一个需求拆成可数的估算单位,并写出边界、假设与拒绝条件
- 能用数量级和误差区间给出带证据的估算,并解释为何不承诺伪精确的单点日期
- 能回答:当真实进度偏离原区间时,哪一条新证据会触发重估,如何恢复旧记录?
为什么估算不可压缩
客户问“什么时候完成”,通常不是在要一个漂亮的日期,而是在要一条可以安排工作、暴露风险、重新协商的证据链。如果我们只报一个数字,任何隐藏的范围、依赖或等待都会在最后一天集中爆炸。
估算的作用是把不确定性提前摊开:先说明在估什么,再说明这个判断依赖什么。新的代码、反馈和阻塞出现后,估算应该留下可解释的更新轨迹,而不是逼团队维护已经失真的承诺。
本章把“多久”转成五个可观察的节点。读者可以用下面的实验台逐步推进,也可以停在任一节点检查输入、输出、首个偏差和回退动作。
15 估算:先给数字的边界
估算单位:先决定数什么
↡一次估算中可以独立计数、验收和记录进度的最小工作块。 不是“一个大功能”这种模糊标签,而是能被同一把尺子重复数出来的对象。例如,把“导入客户数据”拆成解析、校验、幂等写入和失败重试四个工作块;每块都有完成条件和拒绝条件。
单位一旦改变,数字就不能直接比较。把“接口数”换成“页面数”后,过去的速度记录只能作为背景,不能拿来证明新的估算可靠。先固定对象和边界,才有资格谈数量。
假设清单:把隐藏前提写出来
↡估算成立所依赖的人员、依赖、输入质量、技术路径和时间窗口的明确列表。回答“这个数字在什么条件下成立”。它可以包括熟悉的代码路径、可用的测试数据、已确认的外部接口、每日可投入时间,以及不纳入本次范围的迁移和运营工作。
每条假设都应该有验证方式和失效动作:依赖未交付就暂停承诺,数据质量不达标就扩大区间,范围变化就新建一条估算记录。假设不写出来,区间看起来越窄,风险反而越隐蔽。
数量级:先粗后细
↡对工作规模的粗粒度判断,用来选择合适的拆分方式和时间尺度,而不是假装已经知道精确工时。用于尽早发现“这不是两天的工作”。先判断是几个小时、几天、几周,还是需要拆成多个里程碑;只有当单位、依赖和边界稳定后,细化才有意义。
对一组相似工作,可以先记录单位数 n、每单位的典型耗时 t 和固定开销 o。一个可解释的粗算式是:
这个式子在说:总估算由可数的工作块、每块的典型耗时和不能按块复制的固定开销组成;它不是从历史平均数自动生成承诺。
误差区间:诚实表达未知
↡围绕一个估算给出的最乐观、最可能和最悲观边界,并写明每个边界成立的条件。不是给数字加一个装饰性的“±20%”。乐观边界要说明哪些依赖顺利,悲观边界要说明哪个阻塞会把工作推迟;如果边界没有对应证据,它只是伪精确的另一种写法。
可以用三点记录一次判断:O 是顺利路径,M 是当前最可能路径,P 是已知阻塞都发生的路径。对外沟通时给出 [O, P] 和关键假设,对内复核时保留 M 与实际反馈的差距。
提示23:通过估算来避免意外
提示 23 的重点不是让每个人更会猜,而是让意外更早获得名字。把需求拆成单位后,团队可以指出哪个工作块仍缺输入、哪个依赖没有 owner、哪个边界样例还没跑;风险就从“最后延期”变成可以行动的记录。
一次估算至少应保存:对象与边界、单位、假设、区间、时间窗口、责任人和触发重估的信号。缺少其中任一项时,应拒绝把结果写成确定承诺。
提示24:根据代码不断迭代进度表
代码并不会因为计划表写得更漂亮就按时完成。每次实现、测试、评审或集成得到新信息,都要把“已完成、剩余、阻塞、假设变化”写回原记录;更新的是剩余工作,不是把旧日期涂掉。
例如原估算是 8 个工作块、每天完成 2 块,跑完前 3 块后发现每块都要补一组兼容性测试。此时应该增加单位或扩大区间,并注明证据来源;不能继续用“还剩 5 块,所以再两天”来隐藏单位已经改变的事实。
三步复核一次估算
先预测:如果移除误差区间,哪一个节点应该最先改变?再动手试,观察实验台中的首个断点;最后恢复并比较原始记录。每一步都要保留图示中的状态,而不是只抄下最终日期。
第一步:先拆分对象和单位
写出工作对象、纳入范围、排除范围和完成条件。把“做一个报表”改写成可以单独验收的工作块,并为每个块指定估算单位。
第二步:再写假设和误差区间
先写最乐观、最可能和最悲观路径,再播放或单步推进实验台。点击“注入单故障”移除区间,观察校准为何必须回到更早的证据。
当前:第 1 步 · 拆分:先固定对象和边界
第 1 / 5 步 · 拆分:先固定对象和边界
先猜下一步会改变什么,再用单步或播放验证。
第三步:最后用反馈校准剩余工作
把实际完成的单位数、剩余单位数、等待时间和新增依赖写回记录。若首个偏差发生在单位定义,就重建单位;若发生在假设失效,就扩大区间并让责任人确认。
一个可复核的进度记录
estimate_record:
unit: tpp20-topic-15-estimating
object: 导入客户数据
unit_definition: 解析、校验、幂等写入、失败重试
assumptions:
- 外部接口在本迭代开始前可用
- 测试数据覆盖空值和重复记录
range:
optimistic: 2d
most_likely: 4d
pessimistic: 7d
feedback: 完成 3/8 个工作块,新增兼容性测试
first_mismatch: 单位定义漏掉兼容性测试
recovery: 拆出测试单位,更新剩余区间并保留旧记录这个记录的价值不在格式,而在于独立复核者能按相同边界重建一次判断。first_mismatch 必须写首个偏差,而不是写“最终多花了三天”;后者无法告诉下一次估算应该改变哪一个输入。
常见误区
小结
- 先冻结对象、边界和估算单位,再比较数字。
- 把假设写成可验证条件,并为失效准备动作。
- 数量级先发现规模,误差区间再表达未知。
- 真实进度改变模型时,更新剩余工作而非涂改旧承诺。
- 每次重估都保留首差、证据与恢复路径。
练习:把估算变成可检查的记录
练习
问题 1: 一个任务拆成 6 个单位,典型耗时 0.5 天,固定开销 1 天。请计算粗估 E,再为顺利路径和已知阻塞各写一个区间边界。
问题 2: 真实进度完成了 3/8 个单位,却发现每个单位都需要额外的兼容性测试。你会更新哪个字段,为什么不能只把结束日期后移?
问题 3: 在估算实验台中点击“注入单故障”,然后用单步推进找到首个变化;修改 Demo 代码或状态记录,使恢复动作把实验台和记录都回到初始边界,并提交一份正常、边界、故障三行证据。
名词解释
名词解释
本章出现的专业名词,用大白话再讲一遍。
- 估算单位
能单独数出来、验收并记录进度的一小块工作;单位不稳定时,历史速度就不能直接复用。
- 假设清单
这次估算要成立所依赖的条件列表,例如接口何时可用、数据是否齐全,以及哪些工作不在范围内。
- 数量级
对规模的粗粒度判断,用来尽早发现任务属于小时、天还是周的级别,不是假装知道精确工时。
- 误差区间
把顺利、最可能和受阻三条路径放在同一个估算里,并说明每条边界为什么成立。