瀑布式开发濒死24小时,敏捷实战全解:从僵尸站会到高绩效团队的蜕变指南
引子:上线前 24 小时,系统炸了
先讲一个故事。
一家公司接了个 5000 万的大单:商城加 ERP,一整套。项目按最正统的瀑布流程走:先写需求文档,再画架构图,然后开发、测试、上线,每一步都排进一张巨大的甘特图里。
开发的第 179 天,距离上线还有 24 小时。项目经理在进度表上画下最后一个对钩,宣布所有模块按"完美计划"开发完毕。架构师很得意,他那本《系统架构设计说明书》足足 800 页,连数据库字段的命名规范都精确到了大小写。
测试工程师是唯一清醒的人。她吼了一句:你今天才把代码给我,让我怎么测这 800 页的功能?
开发不在乎。他的逻辑无懈可击:文档是完美的,代码是照着文档写的,所以代码也是完美的,测试只是个过场。
然后老板来了。他宣布上线顺利,又临时加了个需求:那个"立即购买"按钮,要改成"五彩斑斓的黑",放在屏幕正中间,还要会闪。有人搬出公司规范流程:填变更申请单,财务总监签字,技术总监签字,架构委员会评估风险,大概三个工作日。
老板把申请单撕了:我是 CEO,我现在就要改。
一行 CSS 熬夜改完。老板要看完整演示,把所有模块连起来。系统开始连接订单模块、库存模块、支付模块,然后警报齐响:数据库死锁,接口参数不匹配,内存溢出。主机冒烟了。
瀑布死在哪:它假装未来可以预测
复盘的时候,所有人都在互相甩锅。前端说后端接口变了不告知,后端说前端乱动按钮,测试说直到今天才把代码合在一起,之前测的全是假数据。有人翻出实锤:文档里写的是 user_id,代码里写的是 uid。
一位请来的敏捷教练给这个场面起了个名字:大爆炸式集成(Big Bang Integration)。各自闭门造车半年,最后一天才发现轮子和车轴对不上。
他对老板说了三句很难听但很准的话:
第一,你们没骗我,你们只是在假装知道自己在做什么。
第二,瀑布模式就是个黑盒子。半年前凭猜想写文档,然后把头埋进沙子里开发半年,祈祷出来的是宝贝。但这半年里市场变了,需求变了,技术也变了。
第三,那张甘特图不是计划,是幻想。它假设未来完全可以预测,可软件开发不是造桥,软件是复杂系统。
知识卡上补了一组数据:项目刚启动时正处于"不确定性锥"的底部,对未来的估计偏差可以从 0.25 倍到 4 倍。试图用文档锁死需求,就像用渔网锁住水。
敏捷宣言:先把文档和甘特图撕了
教练给出的第一步建议很粗暴:把那些文档和甘特图都撕了。
架构师跳起来了:那是我的心血,没有文档怎么开发,这不专业。
教练的回答是整场转型的起点:真正的专业是交付价值,而不是交付文档。
这就是敏捷宣言的四条价值观:
- 个体和互动,高于流程和工具
- 可工作的软件,高于详尽的文档
- 客户协作,高于合同谈判
- 响应变化,高于遵循计划
这里有两个常见的误读要掰正。敏捷不是不要文档,而是如果文档不能帮助写出好代码,它就是废纸。敏捷也不是不做计划,而是不做死计划,做活计划。另外,如果你发现团队一边写几百页需求文档一边宣称敏捷,要求签字画押后不许改,那你们只是披着敏捷外衣做瀑布,行话叫 WAgile。
用户故事:把"灵魂下单"翻译成人话
止损方案定了:明天不上线整个 ERP,只上线一个能用的功能。就一个,下单。
老板嫌寒酸。教练问他:你想要一个完美的幻觉,还是想要一个丑陋但能赚钱的现实?
老板选了赚钱。紧接着就开始得寸进尺:既然要响应变化,那我现在就要变,我要一个"至尊 VIP 灵魂下单体验",用户一点进去就被贵气包围,AI 能读懂他的心,货自动送到家门口。
架构师当场石化:这需求文档怎么写?
教练拿出的是一套句式模板:作为某个角色,我想要某个功能,以便于获得某种价值。他要求老板别提"灵魂",说出要解决谁的什么痛点。
老板套着句式憋出来了:作为一个有钱的懒人,我想要一键购买推荐商品,以便于不用在那堆列表里翻来翻去浪费时间。
教练说,这才叫用户故事(User Story)。之前的"灵魂体验"是废话,现在的"一键购买"才是需求。写不出"以便于"的功能,多半根本不需要做。
纵向切分:像切蛋糕一样切需求
接下来架构师犯了个典型的错。他把任务横向拆开:第一周做数据库表结构,第二周写后端接口,第三周做前端页面。分工明确,效率最高。
老板问:第一周结束我能看到那个按钮吗?不能,只有数据库表。第二周呢?也不能,只有一堆 JSON 数据。老板拍了桌子:这和瀑布有什么区别?
教练用一块蛋糕讲清了两种切法。横向切分,等于让用户先吃一层面饼(数据库),再吃一层奶油(接口),最后才吃到草莓(页面)。纵向切分,是切下一块带草莓的小三角蛋糕:第一周就做"这一个功能"的数据库加接口加页面。虽然这块很小,但它能吃,能用。
需求太大切不动怎么办?用 INVEST 原则继续切。"用户管理"可以切成手机号注册、手机号登录、找回密码、上传头像、微信登录五片,然后问老板:为了下周能体验一键购买,哪一片必须先吃?
老板挑了:只要能登录就行,头像和找回密码以后再说,微信登录太麻烦先不要。
手机号登录要接短信服务商,申请资质得一周。怎么办?教练说故事是可以讨价还价的,我们的目的是"识别用户",不是"发短信"。初级程序员提了个土方案:先硬编码一个超级账号,输入 admin 就能进。架构师嫌弃这不符合架构美学,教练却给了个名字:行走的骨架(Walking Skeleton)。丑,但打通了全流程。
三天后演示。输入 admin,点购买,屏幕上跳出"购买成功,扣款 100 元"。老板激动得快哭了:动了,它真的动了。功能很薄,但从数据库到前端的全链路走通了,价值是 100% 交付的。
估算:故事点不是时间,"做完"不是感觉
需求清楚了,老板逼问"用户登录"多久做完。架构师说这种 CRUD 两小时搞定,初级程序员说至少两天,理由是光配环境就要半天,还得写单元测试。老板把两小时拍板成了工期:做不完别吃晚饭。
教练叫停了这场逼供:你这是在逼他撒谎。估算是先做待办列表梳理(PBR),把模糊的大石头敲碎、细节问清楚,只有 Ready 的故事才有资格进入估算。
然后他换了个玩法,忘掉时间,看大小。假设改一个文案的工作量是一颗葡萄,那登录功能是几个葡萄?大家说像个苹果,五颗。重构支付系统呢?大西瓜,二十颗起步。写代码有快有慢,但对任务复杂度的判断可以一致,这就是相对估算。
正式工具是计划扑克(Planning Poker),牌面上是 1、2、3、5、8、13、20、40、100 这些斐波那契数,叫故事点(Story Points)。规则是背靠背出牌,不许互相看,防的是锚定效应。三个人针对登录功能同时亮牌:架构师 3 点,初级程序员 13 点,测试工程师 8 点。
老板炸了:差别这么大,听谁的?
教练说,估算的价值不在于数字,而在于分歧。架构师觉得只是查库校验密码,几行代码。初级程序员说:现在的密码是明文存储的,要先做 MD5 加密,要做防暴力破解的验证码,还要适配手机端 UI。架构师听完收回了 3 点。第二轮,三个人齐刷刷打出 8 点。
故事点定了,老板又问:8 个点是几天?教练说,等跑完一个 Sprint、算出团队速率(Velocity)才能换算。速率是团队一个 Sprint 里实际完成的故事点总和,用过去的平均速率预测未来,而不是用老板的愿望预测未来。
紧接着就来了一记耳光。周日架构师宣布"用户登录"做完了,老板实测,APP 闪退。架构师辩解:我电脑上是好的。教练给他贴了个标签:伪完成。敏捷里的"做完"不是感觉,是清单,叫 DoD(完成的定义):代码写完、单元测试通过、代码审查通过、测试环境验证通过、无严重 Bug、部署到演示环境。六项全打钩,卡片才能从 Doing 移到 Done。缺一项都叫未完成。
教练还给老板画了张冰山图:你以前看到的"两小时写完代码"只是水面一角,测试、修 Bug、部署、文档是水面下的 90%。不把这些算进估算,项目永远会延期。
看板:别把勤奋变成便秘
Sprint 开跑,看板上贴满卡片,人人都在忙。老板看着热火朝天的场面很满意,直到测试工程师被如山的 Bug 淹没,崩溃了:他们只管写代码不管修,接口文档也不更新,我一个人怎么测得过来十个功能?
教练指着看板上堆爆的 Doing 列说:这不叫效率,这叫便秘。大家都堵在肠道里,拉不出来。
他画了条高速公路做比喻:每辆车都在路上,但没有一辆到终点。老板问要不要再修几条路,也就是招更多人。教练说不用修路,限流就行,然后板书了利特尔法则(Little’s Law):在制品(WIP)越多,交付周期越长。
于是看板被胶带划了限制:全队三人,进行中的卡片永远不能超过三张。架构师抗议手里任务卡住了难道干坐着,教练的回答成了这个 Sprint 的口号:Stop Starting, Start Finishing。停止开始,聚焦完成。
很快架构师的支付接口卡住了,第三方 SDK 文档打不开。他想先挂起,去做优惠券,教练拦下:WIP 满了。这叫阻塞(Blocker),被阻塞时你的工作不是换个任务做,而是消除阻塞。一张粉色便签贴上看板,全员放下手头的事围过来,有人试下载文档,有人打电话催客服,十分钟搞定。这就是蜂群战术(Swarming):瓶颈出现时集中火力攻克它,敏捷团队要的不是"I 型"专才,而是一专多能的"T 型"人。
卡片唰地移到 Done。架构师空出卡槽去拉新任务,说了句掏心窝的话:一张卡片彻底冲过终点线的感觉,比写一堆半成品爽多了。
后来有张知识卡把这一段总结得很好:敏捷的目标不是每个人都忙碌,而是让价值快速流动。闲着并不可耻,制造半成品库存才可耻。
评审会和回顾会:一个是体检,一个是洗澡
Sprint 结束,评审会。架构师准备了 50 页 PPT,教练直接拔了投影仪电源:在敏捷评审会上,PPT 是违禁品。老板不关心你写了多少代码加了多少班,他只关心软件能用了吗。
现场演示。老板上手体验,很快发现问题:只能单件"立即购买",没法把薯片和可乐加进购物车一起结账。团队里有人急了,翻出需求文档自证:您当初就说不要在列表里翻来翻去,我们是严格照做的。
教练用餐厅打了个圆场:厨师按菜谱做了道菜,顾客尝了一口说太咸。这时候厨师能拿菜谱吼"我是按标准放的盐,你必须觉得好吃"吗?评审会不是为了证明我们没错,而是为了试吃。用户的不爽不是找茬,是最有价值的反馈。
争执放下,便利贴写上"购物车功能",老板拍板下个 Sprint 必须做。旧计划作废,新计划生成,这就是敏捷的适应性。演示日不是为了表演,而是为了体检。
评审会散了还没完。教练留下团队开回顾会(Retrospective),并解释了两者的分工:Review 聊产品,问的是"我们做对了吗,用户喜欢吗";Retro 聊过程,问的是"我们配合得好吗,怎么能更快"。哪怕产品很完美,如果做它的人累吐血了,流程也是失败的。
回顾会开场前有个硬规矩:全员朗读诺姆·克思的"最高指导原则",无论发现了什么,必须理解并坚信,每个人在当时的情况下,鉴于他们所掌握的数据、技术和能力,都做出了最好的工作。
为什么要立这个规矩?因为刚散场时团队在互相追责。初级程序员承认演示前有个"金额显示为 0"的 Bug 没被发现,架构师拍桌大骂,测试工程师抱怨通宵回归。教练喊停:他不是故意搞砸的。既然不是故意的,那他犯错是因为我们的系统允许他犯错。我们要审判的是流程,不是人。
接着玩 5 Whys,像剥洋葱一样追问:
为什么金额是 0?因为折扣率被硬编码成 0 了。
为什么硬编码?因为那天测试环境数据库挂了,先写个假数据调通前端。
为什么上线前没改回来?后来忙新功能,忘了。
为什么忘了却还能合并进主分支?因为负责人忙着做 PPT,没做代码审查,直接让他合了。
为什么测试没测出来?因为测试环境的数据库一直是坏的,测试用的也是假数据。
结论出来了:数据库不稳定,加无强制 Code Review,加测试环境脏乱差,等于必然的事故。瑞士奶酪模型里每一层都有洞,光正好穿过去。在这个破烂流程里,换谁来写代码都会出 Bug,出事的这个人只是那个倒霉的执行者。
改进措施也不能是口号。"以后我拿本子记下来"和"大家要更加细心"都被驳回了,靠记忆力和靠态度都靠不住,要靠机制。最终的 Action Item 长这样:申请一个稳定的测试数据库,责任人明确,明天中午前;Git 仓库开启两人 Approve 才能合并的开关,立即生效;写个脚本扫描硬编码数字,有则报错,周五前交付。每条都符合 SMART 原则:具体、可衡量、可达成、相关、有期限。
散会时有人说感觉像洗了个澡,把脏东西都洗掉了。教练在心里补了一句:敏捷不是一次性的变革,而是持续改进(Kaizen)。每个 Sprint 哪怕只修补一个流程漏洞,一年下来,这艘破船也能变成航母。
MVP:别做完美的废物
业务刚有起色,老板的新战略来了:元宇宙购物。VR 眼镜进 3D 超市,虚拟导购 AI 能聊天能唱歌,能根据用户心情推荐薯片。两个月后的双十一就要,这是风口。
架构师算了笔账:VR 渲染加自然语言处理加情感计算,得招 50 个博士开发两年,烧光你所有的钱。
教练没有正面开杠,只问了句:用户来买薯片,真的想听 AI 唱歌吗?这只是你的假设(Hypothesis)。敏捷的核心不是"做出来",而是"验证假设"。
他在白板上画了两条路线。增量(Increment):先造轮子再造车门,用户等两年才能用上车。迭代(Iteration):先造滑板,虽然简陋,但用户马上能动起来,嫌累再加把手变滑板车,再进化成自行车、摩托车。
老板还是想要 AI。教练出了个损招:MVP(最小可行产品),不开发 AI,用人工冒充 AI。首页放个"智能导购"图标,点进去是个聊天窗口,后台连着初级程序员的电脑,用户发什么,他回什么。如果连真人都聊不起来,冰冷的机器能聊起来吗?
结果很扎心。一万个访客,只有 5 个人点了"智能导购",其中 3 个误触,2 个进来骂人的。用户的第一条消息是:点错了,怎么关掉?挡着我抢优惠券了,垃圾功能。
教练说:老板,承认吧,用户来这里是为了快,不是为了聊。想象一下如果真花两年几千万开发了那个 AI,现在的损失就是几千万。而这次,我们只浪费了一下午。白板上写着一行对比:MVP 的成本是 0,全量开发的成本是几千万。这就是快速失败(Fail Fast),如果注定要失败,请在花掉 5000 万之前失败,请在第一周失败。
那用户到底要什么?测试工程师翻出客服记录:很多人在问"这个薯片辣不辣"“这个衣服偏大吗”,他们不信官方介绍,想看真人评价。于是方向从"元宇宙"转向(Pivot)“买家秀社区”。
新的 MVP 砍到了极致:商品详情页下面加一个评论框,只能发文字。架构师嫌简陋,教练说如果连文字都没人发,更没人会发图片视频,我们要验证的是"用户有没有分享欲"。一周后评论区热了起来,有好评有避雷。老板乘胜追击要加图加视频,教练说别急,先让轮子转起来,再把它变成法拉利。
这里有三个经典 MVP 形式值得记:滑板模式,每一步都能用;奥兹国的巫师(Wizard of Oz),假装置背后是人工操作,适合验证 AI 类需求;假门测试(Fake Door),放个按钮看有多少人点,验证需求强度。Pivot 不是失败,是以最小代价发现此路不通。唯一的失败是做完了整个产品,才发现没人要。
技术债:出来混,迟早要还的
节奏起来了,老板越跑越快:上周拼团,这周秒杀,下周积分兑换,三天能搞定吧?
初级程序员面如死灰。架构师说了实话:不是不想干,是干不动了。现在打开一个代码文件要 5 分钟,改一行代码要祈祷半小时。
老板不信邪:代码不就是打字吗?他点了个最简单的需求,把"立即购买"按钮从红色改成橙色。改动触到一个全局变量,然后测试工程师尖叫:后台崩了,所有用户的订单金额都变成了 0 元。改个颜色为什么会影响订单金额?老板觉得这就像换了件衣服,结果家里房子塌了。
教练让他戴上"眼镜"看看系统的真面目。代码化作一团缠绕的意大利面:有人为了省事,把颜色定义和金额计算写进了同一个全局变量,这叫高耦合;有人为了赶进度复制粘贴了 5 份一样的代码,改了一份,另外 4 份就炸了,这叫重复代码。你们造了一只意大利面条怪兽。
然后是那笔账。教练说,你们这两个月跑得快不是因为能力强,是因为在借高利贷。敏捷里这叫技术债务(Technical Debt):本金是当初为赶进度省下的设计、测试和代码规范;利息是现在每做一个新功能,都要花双倍时间理清之前的烂代码。利息已经高到还不起本金,这叫技术破产。老板算了算,付出去的工资里 80% 都在还利息,只有 20% 在干活。
解法有三件套。
第一,重构(Refactoring)。注意重构不是重写:重写是推倒重来,风险巨大;重构是在不改变软件外部行为的前提下改善内部结构,像打扫厨房,是为了下一顿饭做得更快更卫生。
第二,童子军军规(Boy Scout Rule)。停工一周大扫除是大忌,业务不能停。正确姿势是每次修 Bug 或做新功能时,顺手把碰到的那个小块烂代码重构了。看到脏盘子就洗一个,不要等堆满了再洗。离开时,要比来时更干净。
第三,自动化测试。初级程序员怕动祖传代码,一动就塌。教练说那是因为没有测试网:重构之前,先写测试把现有逻辑锁死,保存基准,然后才敢大刀阔斧。没有测试的重构就是裸奔。
最后老板定了新规矩:以后不只看功能,还要看绿灯,测试不通过的代码等于没做。另外每个 Sprint 在需求池里预留 20% 的带宽,专门偿还必须集中处理的大额技术债。老板咬牙:就当是付保险费,总比系统炸了强。
知识卡上还有一条破窗效应:一段烂代码长期没人修,大家就会觉得反正已经很烂了,我再加点垃圾也无所谓。对策是零容忍,发现坏味道立刻消除。
CI/CD:告别上线惊魂夜
又一个上线日,出事了。负责部署的架构师吃坏肚子,发烧 39 度在医院打吊瓶。老板让初级程序员顶上,他坦白:部署脚本只有架构师看得懂,服务器密码只有他知道,上次我碰了一下生产库,把库删了。
老板决定亲自上。凭记忆 FTP 上传、改配置、重启服务,然后:依赖包版本冲突,系统已崩溃。教练悠悠点评:恭喜你,手动制造了一场环境雪崩。
诊断结果摆在三块图板上:开发机是 Windows 加 Java 8,测试机是 Mac 加 Java 11,服务器是 Linux 加 Java 17,权限还被锁死。只要人工配置环境,就一定有差异,这叫环境漂移。"在我电脑上能跑"这句话,等于是把淡水鱼丢进海里。
解法是两条。
一条是 CI/CD 流水线。代码一提交(Git Push),管道自动启动:自动构建打包、自动跑单元测试、静态扫描代码坏味道。持续集成像自动售货机,投币即验真伪,写了 Bug 警报马上响,把问题拦在第一时间。
另一条是容器(Container)。把代码、配置、依赖全部封装进集装箱,不管箱子放在谁的机器上,里面的东西永远一样。老板的理解很传神:就像送外卖,不管骑手是谁,披萨都在盒子里,不会变味。专业说法叫 Build Once, Run Anywhere。
流水线跑通那天,教练让不会写代码的老板亲自按发布按钮。老板吓退了半步,教练说所有风险都在流水线里被拦截了,现在上线像发朋友圈一样简单。按钮按下:Deploy Success。
架构师病愈归来,发现自己的"首席部署官"地位没了,慌了。教练安慰他的话值得每个技术人记住:你的价值不是"只有你会部署",而是"你设计了一套谁都能部署的系统"。墙上挂着那条格言:You build it, you run it,谁开发,谁运维。
以前这个团队一个月上线一次,每次都像杀鸡祭天。现在大屏上写着:今日部署次数,12 次。老板悟了:以前觉得稳就是不动,现在才明白,稳是因为动得快且小。教练补了个比喻:就像骑自行车,越慢越容易倒,骑快了反而稳。
假敏捷:你们这不是站会,是汇报会
故事到这就该圆满了,但最狠的一段才刚开始。
新办公室里摆上了 Scrum 看板,每天开站会,每人限时一分钟,超时扣款。老板拿着秒表主持:下一个,快汇报!看起来纪律严明,无可挑剔。
教练拿着一台警报大作的仪器闯进来:警告,发现大量僵尸活动,生命体征为零。你们这不是每日站会,这是每日向老板汇报会。
区别在哪?刚才一个人汇报的时候,另一个人一直在玩手机,因为他觉得那个进度是汇报给老板听的,跟他没关系。真正的站会是团队成员之间的协作,是"我卡住了,谁来帮我",而不是"向老板表明我没偷懒"。
老板不服,又甩出一整卷 Excel:把未来一年的 Sprint 计划都填好!教练说这不叫中西合璧,这叫 Water-Scrum-Fall。像汉堡:上层面包,需求一年前定死;下层面包,运维和预算僵化;中间夹着的肉,是拼命跑 Sprint 的开发团队。用百米冲刺的速度跑马拉松,早晚会累死。
接着是 KPI 惨案。上个 Sprint 30 个点,这个 Sprint 必须 50 个点,做不到扣奖金。于是估算会上集体注水:原本 3 点的"更换 Logo"报成 8 点。报表很好看,实际产出的功能并没有变多。教练称之为点数通货膨胀,背后是古德哈特定律:当指标变成目标,指标就失效了。速率只用于团队内部自我规划,永远不要横向比较,更不要拿来考核。
教练还放了一部纪录片:一群土著在机场跑道举着木棍,模仿引导飞机的动作。他说你们现在的行为就像这些土著,模仿了敏捷的所有动作,就以为飞机会降下来。这叫货物崇拜敏捷(Cargo Cult Agile)。你只是把命令与控制换了个名字叫 Scrum Master,你们只是把摸鱼换了个名字叫自组织。没有灵魂的敏捷,就是僵尸。
最后一刀捅向根本问题。上个 Sprint 完成 50 个点,完成率 100%,但老板自己用着都别扭:注册 1 秒,被强制绑卡卡了半小时。教练说你们在做功能工厂(Feature Factory),不是在解决问题,把 50 个互不相关的器官拼在一起,每个器官都是好的,拼出来是个怪物。你们的 Sprint Goal 是什么?把卡片做完?速率达到 50?错。没有业务目标的忙碌就是瞎忙,僵尸 Scrum 最大的特征,就是丢失了心脏(Sprint Goal)。
老板问:那我不盯着,他们乱来怎么办?教练让他照镜子自问:你到底想要安全感,还是想要结果?然后下猛药:从明天起,老板禁止参加站会,进度在看板上,自己看。站会只讨论一件事:我们要怎么配合才能搞定今天的卡片。
第一天,尴尬的沉默。第三分钟,测试工程师终于爆发了:你那个接口到底什么时候好?我测不了啊!以前老板在我不敢催,现在你给我个准话!架构师坦白卡在鉴权逻辑上,主动求助,初级程序员两眼放光地凑过去,三个人围在电脑前吵得热火朝天。老板在门外看呆了:没我盯着,他们居然也在干活,还挺投入?
教练说:当僵尸拥有了意志,他们就变回了人。
人多了怎么带:给团队一颗北极星
业务起飞,老板一口气招了 50 个程序员,分成交易、社区、会员等五个 Scrum 团队,然后办公室炸了:社区团队重构 User 表,把交易团队的下单功能搞挂了,有人发现数据库表被删时正在尖叫。老板想不通:五个敏捷团队,速度应该是五倍,怎么一个功能都上不了线?
教练在黑板上画了三个箭头:A 队追求极速下单做精简,B 队追求丰富社区做堆砌,C 队追求安全合规做拦截。都在用力,方向是反的,合力为零。这叫内耗。
老板问要不要让大家全听我的。教练说不用,你需要给他们一个北极星。
先破掉"做大做强"这种模糊口号(教练拿飞镖靶砸过去的那种破法),然后上 OKR。目标(Objective)必须定性、鼓舞人心,比如"攻占年轻人的心,成为 Z 世代首选的零食平台";关键结果(Key Results)必须定量、可衡量:日活突破 10 万,18 到 25 岁用户占比 40%,复购率提升 30%。定完有一条铁律:任何不服务于这三个 KR 的功能,统统不做。老年版大字模式?不符合 Z 世代,砍掉。
有了北极星,还要解决协同。50 个人一起开站会开到天黑也不现实,所以引入 Scrum of Scrums:每天各队开完自己的站会后,派一名"大使"开二级站会,专门同步依赖和风险。A 队要动订单接口,B 队注意适配;B 队要动 User 表,其他队先别发版。把问题消灭在萌芽状态。
知识卡把规模化敏捷的三个坑总结为依赖地狱、信息孤岛、目标发散;解法是 OKR 对齐加 SoS 协同。还有一个四象限值得贴在墙上:低一致加高自治是游击队,各自为战;高一致加低自治是军队,听令行事,缺乏创新;双低是混乱;敏捷组织追求的是双高:共同的目标,自己决定怎么走。
一个月后,日活和年轻用户占比双双上涨。教练说了那句收束整个篇章的话:只要目标一致,同时给予团队自治权,大船也能像快艇一样灵活。
守破离:教练离开之后
教练宣布任务完成,要走了。所有人慌了:没有你主持计划会怎么办?再遇到技术怪兽怎么办?
教练说,我不能永远当你们的拐杖,剩下的路要自己走。留下一句话:敏捷不在脑子里,在心里。
教练走后的第一周,团队陷入了"守"的阶段:死抠规则来找安全感。站会上有人掐秒表,指责别人发言超时违反规则第几条;两个人为 5 点还是 3 点的估算辩论到脸红;一个会开两小时,老板憋屈得想骂人又强迫自己"自组织"。刻板,笨拙,但这是内化之前的必经之路。
真正的考验来了:竞争对手突袭上线直播带货,抢走一半流量。初级程序员还按规则说 Sprint 中途不能插需求,等下个 Sprint 吧。老板拍了桌子:公司都要倒闭了还守什么规则!
这次站出来的是架构师:如果要快,就不用 Scrum 了,仪式感太重,切换到看板模式极速流。不做估算,需求直接拆成最小颗粒度,谁有空谁领;砍掉非核心文档,只保留核心自动化测试。老板冒汗问你们敢改教练留下的流程?架构师扶了扶眼镜:流程是为人服务的,不是人服务流程。
教练的声音在此时以"幻影"的方式出现,点破了这三重境界:
守,初学者,严格遵守规则,建立肌肉记忆。 破,熟练者,根据实际情况打破规则,适配上下文。 离,大师,忘掉规则,所有决策都下意识地符合敏捷价值观,无招胜有招。
那个周末成了整个故事里最"敏捷"的一次冲刺。没有开站会,没有写卡片,甚至没做回顾,但所有人进入了一种心流状态:开发喊接口好了,下一个人接住,测试说测过了,不需要指挥,每个人都知道自己该干什么。
还有个细节我特别喜欢。老板看着埋头干活的团队,突然失落:我不懂代码也不懂测试,以前觉得我是司机,现在发现他们才是引擎,那我算什么?然后他推着披萨和饮料走进来:吃吧,我不懂技术,帮不上忙,但我能保证你们不饿着、不被外人打扰。转身在走廊对着电话吼:别催!我的团队正在创造奇迹,谁敢现在打扰他们我跟谁急!
他不再是挥鞭子的监工,而是为团队挡子弹的盾牌。这就是仆人式领导:领导者的任务不是管人,而是问团队"我能为你做什么"。有句拗口但准确的话:领导者的地位最低,因为他支撑着整个团队。
上线成功那天,数据大屏上自己的曲线反超了对手。架构师若有所思:这次既没开站会也没写卡片,却是我感觉最敏捷的一次。因为敏捷从来不是仪式,是快速响应变化、交付价值的能力。
写在最后
回到开头那个炸掉的项目。故事的结局是:团队用三天上线了唯一的一个下单功能,然后一个 Sprint 一个 Sprint 地迭代,从登录、购物车到评价社区,从计划扑克到 CI/CD 流水线,从互相甩锅到互相补位。5000 万没有白花,但救活它的不是那张 800 页的架构说明书,而是价值观的转向。
把这一路学到的招式打包,大概就是这些:
价值观上,可工作的软件高于详尽的文档,响应变化高于遵循计划。
需求上,用"作为谁我想要什么以便于什么"写用户故事,纵向切分,按 INVEST 打磨,尽早交付能用的薄切片。
估算上,故事点衡量相对大小,计划扑克对齐认知,DoD 防止伪完成,速率用于自我预测而非考核。
流动上,限制 WIP,暴露阻塞,蜂群攻坚,停止开始、聚焦完成。
改进上,评审会体检产品,回顾会体检流程;对事不对人,5 Whys 挖根因,用机制代替口号。
验证上,MVP 先行,快速失败,数据不好就 Pivot。
质量上,技术债记账,重构小步走,童子军军规,测试先行,预留 20% 带宽还债。
交付上,CI/CD 流水线加容器化,让上线从惊魂夜变成发朋友圈。
组织上,警惕僵尸 Scrum 和货物崇拜,用 OKR 对齐方向,用 SoS 管理依赖,给团队自组织的空间。
成长上,守破离,先守规则,再破规则,最后内化为本能。
漫画的最后有一幕:新员工问,书上说站会必须早上开,我们可以下午开吗?当年那个连估点都不懂的初级程序员,如今拿着指南回答:只要团队觉得下午效率高,那就下午开,我们这里没有死板的规定。
因为敏捷已经不在墙上,而在他们心里。
如果你的团队也正在经历从瀑布到敏捷的转型,欢迎在评论区聊聊你们踩过的坑:你们做过 Water-Scrum-Fall 吗?你们的站会还活着吗?