《敏捷估算与规划》- Agile Estimating and Planning

作者:Mike Cohn | 312页 | 7大部分23章

核心观点:估算与规划过程本身也必须是敏捷的。规划的目的不是在第一天就给出”正确的计划”,而是通过持续迭代地规划,找到”构建什么、何时交付、投入多少资源”这一产品开发根本问题的最优解。


一、为什么传统规划会失败(Part I:问题与目标)

1. 规划的目的与不确定性

  • 规划的目的:找到产品开发根本问题的最优答案——做什么功能、投入多少资源、什么时间交付
  • 规划的价值:降低风险、减少不确定性、支持可靠决策、建立信任、传递信息
  • 好计划的标准:足够可靠,能作为产品和项目决策的依据
  • 敏捷规划的特点:更关注”规划过程”而非”计划本身”;鼓励变化;计划易于变更;贯穿整个项目

不确定性之锥(Cone of Uncertainty):项目早期的估算偏差可达 ±60%~160%;需求确定后仍有 ±15% 偏差。估算精度随项目推进逐步提高。

2. 传统规划失败的五大原因

原因说明
基于活动而非功能甘特图/WBS 关注活动完成,但客户只关心功能交付。活动完成不等于价值交付
多任务的隐性成本团队成员同时处理多个任务,上下文切换导致效率下降,项目更晚交付
末位砍功能功能按开发者认为最高效的顺序开发,时间不够时砍掉的不一定是最低价值的功能
忽视需求不确定性按最初需求计划,但用户真实需求在项目过程中会变化,导致按时交付了错误的东西
估算=承诺组织混淆估算是预测还是承诺,一旦给出估算就被迫承诺,导致估算失真

3. 敏捷方法的核心思想

  • 团队角色:产品负责人(PO,负责愿景和优先级)、客户、用户、开发者、管理者
  • 短迭代交付:按固定时间盒迭代,每个迭代交付可用软件,按业务优先级选择功能
  • 用户故事:表达用户需求的基本单元
  • 项目产生两类新知识:产品知识 + 项目知识,两者都用于完善计划
  • 三层规划:发布规划(3-6个月)→ 迭代规划(1-4周)→ 每日规划(站会)
  • 满意条件(Conditions of Satisfaction):PO 对发布/迭代的验收标准,包括范围、进度、资源等

二、估算规模(Part II:Estimating Size)

核心原则:规模估算和时长估算必须分开。先估算”有多大”,再根据速率推算”要多久”。

4. 故事点(Story Points)

  • 定义:用户故事相对规模的度量。10点故事是5点故事的两倍大/复杂/有风险
  • 速率(Velocity):团队每迭代完成的故事点总数
  • 本质:故事点纯粹是规模估算,不是时间估算。项目时长 = 总故事点 ÷ 团队速率
  • 优势:相对性估算,不需要换算成时间,天然适配敏捷的迭代节奏

5. 理想人天(Ideal Days)

  • 理想时间 vs 流逝时间:美式橄榄球理想时间60分钟,实际流逝3小时以上。差异来自所有中断
  • 定义:排除所有干扰后,完成一个故事需要的专注工作日数
  • 优势:比故事点更容易向团队外人解释,更容易起步,更容易预测初始速率
  • 实践建议:每个故事给一个整体的理想天估算,而不是按角色拆分(程序员X天、测试Y天)

6. 估算技术

  • 投入回报递减:花更多时间估算不一定更准确。投入应与估算用途匹配
  • 估算三法:
    1. 专家意见:最常用,但依赖个人经验
    2. 类比法:与已知规模的故事比较
    3. 分解法:拆成小部分分别估算再加总
  • 规划扑克(Planning Poker):每人持估算卡牌,同时出牌,讨论差异直到达成共识。有趣且高效
  • 估算尺度:
    • 近期需求(需可靠估算):非线性尺度 1, 2, 3, 5, 8(斐波那契)或 1, 2, 4, 8
    • 远期需求(暂不实现):更大单位 13, 20, 40, 100

7. 重新估算

  • 何时重估:仅当你认为故事的相对规模发生了变化时才重估
  • 不要因为进度慢就重估:速率(Velocity)会自动修正估算偏差——这是速率的”均衡器”作用
  • 部分完成的故事:不给部分积分。要么全部完成计入速率,要么不计入。可以拆成”已完成部分”和”剩余部分”两个新故事重新估算

8. 故事点 vs 理想天:如何选择

维度故事点理想天
跨职能行为✅ 推动跨职能协作❌ 容易按角色拆分
估算衰减✅ 不会随团队技能提升而失效❌ 需要重估
纯粹规模度量✅ 是⚠️ 是但不够纯粹
估算速度✅ 通常更快❌ 较慢
人际可比性✅ 相对值,人与人可比❌ “我的理想天≠你的理想天”
对外解释❌ 难解释✅ 容易理解
起步难度❌ 需要转变思维✅ 容易上手
初始速率预测❌ 难✅ 容易

作者建议:优先选故事点。如果团队难以理解纯规模估算,先从理想天开始,再逐步引导切换到故事点。


三、为价值而规划(Part III:Planning For Value)

规划不只是按时交付,更是确保交付最有价值的东西。

9. 功能优先级的四大因素

  1. 财务价值:功能带来的收入/成本节约
  2. 开发成本:开发(及后续维护)的成本
  3. 学习与新知识:开发功能带来的产品/项目知识增量
  4. 风险消除:开发功能消除了多少不确定性和风险

方法:先按价值和成本排序,再根据学习和风险因素调整顺序。高风险高学习价值的项目可以提前做。

10. 财务优先级分析

  • 价值来源四分类:
    1. 新收入:来自新客户
    2. 增量收入:现有客户购买更多
    3. 留存收入:防止客户流失到竞品
    4. 运营效率:降低运营成本
  • 时间维度:通常预测未来2年即可,季度粒度足够
  • 四种财务评估方法:
    • 净现值(NPV):未来现金流折现到今天的价值
    • 内部收益率(IRR/ROI):投资回报率
    • 回收期(Payback Period):多久收回投资
    • 折现回收期(Discounted Payback):考虑货币时间价值的回收期

今天的钱比未来的钱更值钱。比较不同时间的收益需要折现。

11. 需求优先级:Kano 分析与相对权重

Kano 模型:功能分为三类

类别特征举例
必备型(Must-have)有了理所当然,没有会极度不满酒店要有床、浴室
线性型(More is better)越多越好,满意度线性增长床的舒适度、房间大小
兴奋型(Exciter/Delighter)有了惊喜,没有也不会不满健身器材上的电视、免费矿泉水
  • 相对权重法:综合考虑实现收益、不实现惩罚、成本,算出单一优先级值

12. 拆分用户故事

何时拆分:

  • 故事太大,装不下一个迭代
  • 需要更精确的估算时(大故事估算精度低)

拆分方法:

  1. 按数据类型:不同的数据实体分开
  2. 按操作类型:CRUD 拆分(创建/读取/更新/删除)
  3. 按横切关注点:先做功能,安全/日志/错误处理做单独故事
  4. 按性能:先实现功能,性能优化做单独故事
  5. 按优先级:如果故事包含多个不同优先级的需求,按优先级拆

避免的坑:

  • ❌ 不要把用户故事拆成开发任务(按工作步骤拆)
  • ❌ 不要为了凑数把无关改动塞进大故事
  • ⚠️ 小的 bug fix 可以合并处理

四、排期规划(Part IV:Scheduling)

13. 发布规划(Release Planning)

  • 定义:覆盖比迭代更长周期的高层计划,通常3-6个月一次发布
  • 最简公式:预期速率 × 迭代次数 = 可完成故事点数 → 据此选择故事
  • 不需要精确到每个迭代做什么:规划前几个迭代即可,后面的随推进逐步明确
  • 迭代过程:从PO的满意条件(范围/进度/资源)出发,不满足就调整条件重新规划
  • 持续更新:每个迭代开始时更新发布计划

14. 迭代规划(Iteration Planning)

  • 定义:单个迭代内的详细工作计划,大故事拆成任务
  • 任务估算单位:理想小时
  • 两种方法:
    1. 速率驱动:按历史速率选择故事,再拆任务
    2. 承诺驱动:团队承诺能完成多少,按容量选故事

15. 迭代长度选择

  • 标准范围:1-4周,没有万能解
  • 选择因素:发布周期长度、不确定性大小、获取反馈的难易度、优先级稳定度、迭代开销、紧迫感维持
  • 避坑建议:不要把迭代对齐到月末——每三个月就会撞上季末,上市公司季末营收压力巨大

16. 估算速率(Velocity)

三种方法:

  1. 历史平均值:有历史数据时使用,但要考虑团队/项目/技术是否有重大变化
  2. 跑几个迭代再说:通常是最佳选择
  3. 任务分解预测:把几个故事拆成任务,看一个迭代能装多少(类似迭代规划过程)

速率估算应该给一个范围,反映内在的不确定性。参考不确定性之锥确定范围大小。

17. 不确定性缓冲(Buffering)

何时需要额外缓冲:

  • 项目提前很久规划
  • 有硬性截止日期且功能范围相对固定
  • 外包项目
  • 需求只停留在表面理解
  • 预估错误的影响(财务或其他)很大

两种缓冲:

类型做法适用场景
功能缓冲(Feature Buffer)优先级排序后,承认部分功能可能交付不了。DSDM 建议30%工作量作为可选抵御功能不确定性
进度缓冲(Schedule Buffer)在排期中加入反映不确定性的额外时间抵御进度不确定性
  • 功能缓冲和进度缓冲可以组合使用,通常组合更好——各自可以更小
  • 要警惕帕金森定律(工作填满所有可用时间)和学生综合征(不到最后不开始)

18. 多团队项目规划

四大协调技术(按需引入,从简到繁):

  1. 统一估算基准:所有团队用相同单位(故事点或理想天),并通过一组基准故事对齐单位含义
  2. 提前细化用户故事:多团队协作时需要更早把故事细化,通过PO的满意条件来明确
  3. 滚动前瞻规划(Rolling Lookahead):提前看2-3个迭代,团队间协调近期工作
  4. 馈送缓冲(Feeding Buffers):在团队依赖链中加入时间缓冲,防止A团队延期导致B团队延期

五、跟踪与沟通(Part V:Tracking and Communicating)

19. 监控发布计划

  • 速率计算:全有或全无原则——故事完成才算全部点数,部分完成不计入
  • 发布燃尽图(Release Burndown Chart):纵轴剩余故事点/理想天,横轴迭代次数
    • 不总是平滑的:估算不准、需求变更、范围增加都可能导致波动
    • 甚至可能出现”燃烧上升”(burnup):完成了工作但剩余工作量反而增加了(因为发现了更多工作或范围扩大)
    • 净进度:燃尽图反映的是进度减去新增工作的净值
  • 发布燃尽柱状图:区分计划内进度和范围变更,更有信息量但可能引发组织内争论
  • 停车场图(Parking Lot Chart):高层展示各主题的完成进度

20. 监控迭代计划

  • 任务板(Task Board):列是状态(待办/进行中/完成),团队成员移动任务卡片
    • 不提前分配任务,谁有空谁领任务
  • 迭代燃尽图:纵轴剩余小时数,横轴迭代天数
  • 不建议跟踪实际投入小时:风险和成本通常超过收益
  • 不计算个人速率:速率是团队指标,不是个人指标

21. 沟通计划与进度

  • 三原则:频繁、诚实、双向
  • 甘特图的正确用法:可以用来沟通计划,但不要下钻到功能以下,功能在整个迭代期间都标为”进行中”
  • 速率沟通三值法:
    1. 最近一个迭代的速率(最新情况)
    2. 过去8个迭代的平均值(长期平均)
    3. 过去8个迭代中最低3个的平均值(最坏情况)
  • 迭代结束摘要报告:既是当前信息的传播,也是未来的历史文档

六、为什么敏捷规划有效(Part VI)

22. 敏捷规划成功的原因

  1. 多层规划 + 频繁重规划:不是一次性的,而是持续的过程
  2. 基于功能而非任务:客户价值是规划单位
  3. 先估规模再推时长:规模和时长分离,更科学
  4. 小故事保持工作流动:每个迭代末清理在制品(WIP)
  5. 团队级进度度量:速率是团队指标,鼓励协作而非个人英雄
  6. 承认并规划不确定性:用缓冲、范围等方式管理不确定性

七、案例研究(Part VII:第23章)

虚构公司 Bomb Shelter Studios 的第一个敏捷项目,通过故事演示全书核心要点的实际应用。


关键概念速查

概念一句话解释
不确定性之锥项目早期估算偏差极大,随推进逐步收敛
故事点相对规模单位,不对应时间
理想人天无干扰的专注工作日
速率团队每迭代完成的故事点
规划扑克团队估算游戏,同时出牌避免锚定效应
满意条件PO对交付的验收标准
功能缓冲预留部分功能作为可裁剪项
进度缓冲预留额外时间应对不确定性
发布燃尽图剩余工作量随迭代变化的图
滚动前瞻规划提前看2-3个迭代协调工作

关联笔记