第十二章 敏捷不是快
一
云智科技要搞"敏捷转型"了。
消息是在周一的全员大会上宣布的。张总——公司的技术副总裁,一个头发花白但精力充沛的中年人——站在台上,用激昂的语气说:
"各位,市场竞争越来越激烈,客户的需求变化越来越快。我们必须提高交付速度!从本月开始,全公司推行敏捷开发。敏捷的核心就是一个字——快!快速迭代,快速交付,快速响应!"
他在大屏幕上翻到一页 PPT,上面写着:
敏捷 = 快 - Sprint 周期从两周缩短为一周 - 需求评审和设计评审合并,节省时间 - 减少文档,多写代码 - 目标:交付速度提升 50%
台下响起了稀稀拉拉的掌声。
王志远坐在后排,看了一眼旁边的赵北辰。赵北辰的表情很微妙——嘴角微微抽动了一下,像是想笑又忍住了。
散会后,回到工位上,赵北辰对着电脑屏幕摇了摇头,自言自语了一句:
"又来了。"
二
"敏捷转型"的第一周,效果立竿见影——但不是好的效果。
Sprint 周期从两周缩短为一周,意味着每周都要做 Sprint Planning、Sprint Review、Sprint Retrospective。光是这三个会议就占了大半天。再加上每天的站会、需求评审、设计评审(虽然张总说要合并,但实际上根本合并不了),一周五天有两天在开会。
剩下三天写代码,但需求量没有减少——因为张总说了"交付速度提升 50%",产品经理李想只好往每个 Sprint 里塞更多的需求。
结果就是:大家疯狂加班,代码质量直线下降,bug 数量翻了一倍。
"减少文档,多写代码"这条更离谱。设计文档不写了,直接开始编码。结果两个开发同时做同一个模块的不同功能,因为没有设计文档对齐,接口定义冲突了,联调的时候才发现,又花了两天返工。
王志远在第一周的 Retrospective 上写了一张便利贴:
😐 一周的 Sprint 太短了,光开会就占了两天,实际编码时间不够。
他不是唯一一个这么写的。白板上的"可以改进"列贴满了类似的便利贴。
但周旋经理看了看,说了一句:"张总的决定,我们先执行。给一个月时间适应。"
三
第二周更糟糕。
马德华在站会上说:"我昨天的任务没做完,因为下午在开需求评审会。今天的任务估计也做不完,因为上午要开设计评审会。"
苏薇直接说:"一周的 Sprint 根本不够用。需求拆不到那么细,硬拆就没意义了,不拆就做不完,每次都延期。"
陈锐难得说了一句实话:"我上周的 PR 没有人 Review,因为大家都在赶自己的任务。代码质量在下降。"
赵北辰一直没说话。他在站会上听完所有人的反馈,然后说了一句:"今天下午我约了张总,聊聊敏捷转型的事情。有什么想法,可以跟我说。"
下午,赵北辰去了张总的办公室。
没有人知道他们聊了什么,但第二天,张总在管理层群里发了一条消息:
各团队的 Sprint 周期可以根据实际情况调整,不强制一周。但要保持迭代节奏,不能回到瀑布模式。
赵北辰把 Sprint 周期调回了两周。
四
那天下班后,王志远在茶水间遇到了赵北辰。
"赵哥,你跟张总说了什么?他怎么突然改主意了?"
赵北辰倒了一杯茶,靠在饮水机旁边:"我跟他说了一个故事。"
"什么故事?"
"2001 年,十七个软件开发者在美国犹他州的一个滑雪度假村开了一个会。他们来自不同的公司,用不同的开发方法——XP、Scrum、DSDM、Crystal——但都有一个共同的感受:传统的瀑布式开发太笨重了,需要一种更灵活的方式。"
"他们讨论了两天,最后写了一份只有 68 个英文单词的文档。这份文档后来改变了整个软件行业。"
"敏捷宣言?"王志远说。
"对。"赵北辰点头。"你知道敏捷宣言的四条价值观是什么吗?"
王志远想了想:"个体和互动高于流程和工具?"
"对,这是第一条。四条完整的是:
- 个体和互动 高于 流程和工具
- 工作的软件 高于 详尽的文档
- 客户合作 高于 合同谈判
- 响应变化 高于 遵循计划
"注意,宣言说的是'高于',不是'取代'。右边的东西也有价值,但左边的更重要。"
他喝了一口茶:"张总把'工作的软件高于详尽的文档'理解成了'不写文档',把'响应变化'理解成了'快'。这是对敏捷最常见的误解。"
五
"那敏捷到底是个啥?"王志远问。
赵北辰想了想,说:"敏捷啊,说白了不是让你跑得快,是让你转弯转得灵。"
他在茶水间的白板上(是的,云智科技的茶水间有一块白板,程序员的茶水间都有白板)画了一个对比:
瀑布模式:
需求 ──→ 设计 ──→ 编码 ──→ 测试 ──→ 上线
│←──────────── 6 个月 ──────────────→│
(6 个月后才知道做的对不对)
敏捷模式:
Sprint 1: 需求→设计→编码→测试→交付
Sprint 2: 需求→设计→编码→测试→交付
Sprint 3: 需求→设计→编码→测试→交付
│←─ 2周 ─→│←─ 2周 ─→│←─ 2周 ─→│
(每 2 周就能得到反馈,及时调整方向)
"瀑布模式的问题是:你花六个月做了一个东西,上线后才发现客户不想要这个。六个月的努力白费了。"
"敏捷模式的好处是:每两周交付一个可用的增量,客户看了之后给反馈,你根据反馈调整下一个 Sprint 的方向。即使方向错了,最多浪费两周,不会浪费六个月。"
"所以敏捷的核心压根不是'快',是'别跑偏了还不知道'。你隔两周就让客户看一眼,方向不对赶紧掉头,总比闷头跑半年发现跑反了强。"
王志远想了想:"那张总说的'交付速度提升 50%'呢?"
赵北辰笑了:"敏捷可没承诺让你写代码更快。它承诺的是——你做的东西更靠谱。两周确认一次方向,不至于在错路上狂奔半年。最后看起来好像快了?那是因为返工少了,不是因为手速快了。"
六
"那 Scrum 呢?Scrum 和敏捷是什么关系?"王志远问。
"敏捷是一种理念,Scrum 是实现这种理念的一个框架。"赵北辰说。"就像'健康饮食'是理念,'地中海饮食法'是具体的方法。"
他在白板上画了 Scrum 的 3-5-3 框架:
Scrum 框架:3-5-3
3 个角色:
├── Product Owner(PO):决定做什么,管理 Product Backlog
├── Scrum Master(SM):确保 Scrum 流程顺畅,移除障碍
└── Development Team:决定怎么做,自组织
5 个事件:
├── Sprint:固定时长的迭代(通常 2 周)
├── Sprint Planning:Sprint 开始时,确定做什么、怎么做
├── Daily Scrum:每天 15 分钟,同步进度
├── Sprint Review:Sprint 结束时,展示成果,收集反馈
└── Sprint Retrospective:Sprint 结束后,团队反思改进
3 个工件:
├── Product Backlog:所有待做的需求(PO 维护)
├── Sprint Backlog:本次 Sprint 要做的需求(团队承诺)
└── Increment:Sprint 结束时交付的可用产品增量
"我们组一直在用 Scrum,你已经体验了大部分。但有一个角色我们一直缺失——Scrum Master。"
"Scrum Master 是干什么的?"
"Scrum Master 不是项目经理,不是技术负责人。他的职责是确保 Scrum 流程被正确执行,移除团队的障碍。比如,如果团队发现一周的 Sprint 不合理,Scrum Master 应该去跟管理层沟通,而不是让团队硬扛。"
"那我们组的 Scrum Master 是谁?"
赵北辰笑了:"理论上应该有一个专职的。但咱组一直是我兼着干。今天去找张总掰扯,就是 Scrum Master 该干的活儿——帮团队把路上的石头搬开。"
七
"敏捷宣言还有十二条原则。"赵北辰说。"我不一条一条讲了,你自己去看。但有几条我觉得特别重要:
第一条:我们最重要的目标,是通过持续不断地及早交付有价值的软件使客户满意。
"注意这俩字:'有价值的'。不是做得越多越好,做十个没人用的功能,还不如踏踏实实做一个大家真需要的。"
第三条:经常地交付可工作的软件,相隔几星期或一两个月,倾向于采取较短的周期。
"注意:'可工作的'。不是半成品,不是 demo,是真正可以用的软件。每个 Sprint 结束时交付的增量,应该是可以上线的。"
第八条:敏捷过程倡导可持续开发。责任人、开发人员和用户要能够共同维持其步调稳定延续。
"这条啊,张总最该听。"赵北辰说。"敏捷可不是让大家拼命加班赶进度。你得找到一个跑得动、跑得久的节奏。Sprint 一个接一个地加班,要么是活儿塞太多了,要么是估算不靠谱,要么是流程有毛病。人又不是机器,跑太猛迟早趴窝。"
第十二条:团队定期地反思如何能提高成效,并依此调整自身的举止表现。
"这就是 Retrospective 的理论基础。敏捷不是一成不变的——团队要不断反思和改进。如果发现一周的 Sprint 不合适,就改回两周。如果发现站会太长,就想办法缩短。敏捷本身也要敏捷。"
八
王志远听完,觉得自己之前对敏捷的理解太浅了。
他以为敏捷就是 Scrum,Scrum 就是站会 + Sprint + 看板。但实际上,Scrum 只是一个框架,敏捷是一种思维方式。
框架可以照搬,但思维方式需要理解和内化。
他想起张总在全员大会上说的"敏捷 = 快",突然觉得这个误解很有代表性。很多公司推行敏捷转型,最后变成了"形式上的敏捷"——有站会、有 Sprint、有看板,但本质上还是瀑布式的思维:需求一次性确定,计划不允许变化,交付日期不能调整。
这种"假敏捷"比不敏捷更糟糕——因为它增加了会议和流程的开销,却没有获得敏捷的好处。
赵北辰好像看出了他在想什么,说了一句:"敏捷转型这事儿,最难的不是改流程,是改脑子。流程一天就能改,脑子嘛……可能得一年。"
九
那天晚上,王志远打开电脑,搜索了"敏捷宣言"的原文。
十七个签名者的名字列在页面底部。他一个一个地看过去——Kent Beck、Martin Fowler、Robert C. Martin、Ken Schwaber、Jeff Sutherland……
这些名字他在各种技术书籍里见过。原来他们不只是写书的人,还是改变了整个行业工作方式的人。
他想起赵北辰今天做的事——去找张总沟通,硬是把"一周 Sprint"这个拍脑袋的决定给顶了回去。这才是真正的 Scrum Master,不是照本宣科念流程,而是敢替团队挡子弹。
软件工程不只是写代码。它是一群人在不确定的世界里,试图找到一种更好的协作方式。代码是工具,协作才是核心。
:::{admonition} 小胖的笔记 :class: tip
本章知识卡片:敏捷开发
1. 敏捷宣言(Agile Manifesto, 2001)
我们一直在实践中探寻更好的软件开发方法,身体力行的同时也帮助他人。由此我们建立了如下价值观:
- 个体和互动 高于 流程和工具
- 工作的软件 高于 详尽的文档
- 客户合作 高于 合同谈判
- 响应变化 高于 遵循计划
也就是说,尽管右项有其价值,我们更重视左项的价值。
常见误解:
| 误解 | 正确理解 |
|---|---|
| 敏捷 = 快 | 敏捷 = 应对变化的能力 |
| 敏捷 = 不写文档 | 敏捷 = 写必要的文档,不写多余的 |
| 敏捷 = 没有计划 | 敏捷 = 计划是灵活的,可以根据反馈调整 |
| 敏捷 = 加班 | 敏捷 = 可持续的开发节奏 |
| 敏捷 = Scrum | Scrum 是敏捷的一种实现,不是唯一的 |
2. 敏捷十二原则(精选)
| # | 原则 | 一句话解读 |
|---|---|---|
| 1 | 持续交付有价值的软件 | 交付的东西要有用,不是越多越好 |
| 3 | 经常交付可工作的软件 | 每个 Sprint 交付可上线的增量 |
| 8 | 可持续开发 | 不要靠加班赶进度 |
| 10 | 简洁——尽最大可能减少不必要的工作 | YAGNI 原则 |
| 12 | 定期反思并调整 | Retrospective 的理论基础 |
3. Scrum 框架详解(3-5-3)
3 个角色:
| 角色 | 职责 | 类比 |
|---|---|---|
| Product Owner | 决定做什么,排优先级 | 导演(决定拍什么) |
| Scrum Master | 确保流程顺畅,移除障碍 | 制片人(保障拍摄条件) |
| Development Team | 决定怎么做,自组织 | 演员和摄影团队(执行) |
5 个事件:
| 事件 | 时间 | 目的 |
|---|---|---|
| Sprint | 1-4 周(固定) | 迭代周期 |
| Sprint Planning | Sprint 开始时 | 确定做什么、怎么做 |
| Daily Scrum | 每天 15 分钟 | 同步进度,暴露阻塞 |
| Sprint Review | Sprint 结束时 | 展示成果,收集反馈 |
| Sprint Retrospective | Sprint 结束后 | 团队反思改进 |
3 个工件:
| 工件 | 内容 | 维护者 |
|---|---|---|
| Product Backlog | 所有待做的需求 | Product Owner |
| Sprint Backlog | 本次 Sprint 的任务 | Development Team |
| Increment | Sprint 交付的可用增量 | Development Team |
4. 瀑布 vs 敏捷
瀑布:做完再验证(风险后置)
需求 ──→ 设计 ──→ 编码 ──→ 测试 ──→ 上线
↑
6个月后才知道对不对
敏捷:边做边验证(风险前置)
[Sprint 1] → 反馈 → [Sprint 2] → 反馈 → [Sprint 3]
每 2 周验证一次方向,及时调整
核心区别:敏捷通过"短反馈循环"降低风险,不是通过"加速"降低风险。
:::