复盘救不了你的团队
又一起线上事故。凌晨三点的告警,值班同学爬起来处理,应急响应、回滚、止血,一气呵成。第二天上午,事故复盘会准时召开。PPT做得很漂亮,时间线梳理得清清楚楚,根因分析写得明明白白,action items列了七八条。所有人都认真地点了点头,表示"以后一定注意"。
三个月后,同一个系统,同一类事故,再次发生。
这个场景太熟悉了。每个经历过线上事故的技术人,大概都对这种循环不陌生。复盘会开了一轮又一轮,文档写了一篇又一篇,"改进措施"列了一条又一条,但该来的事故还是会来,该踩的坑还是会踩。
问题到底出在哪?
复盘变成了一场仪式
大部分复盘会的真实目的,早就不是"从错误中学习"了。它承担的职能更接近一种组织仪式——事故发生了,总得有个交代。复盘会就是一种交代:你看,我们重视了,我们分析了,我们有改进计划了。
这种仪式感会带来一个隐蔽的副作用:它让所有人都觉得事情正在被处理。管理者觉得团队在反思,团队觉得管理者在推动改进,大家心里都松了一口气。但"感觉在改进"和"真实在改进"之间,隔着一道巨大的鸿沟。
我观察到一个现象:复盘会的质量,和团队的成熟度关系不大,倒是和组织的安全感高度相关。在一个真正有心理安全的团队里,复盘可以非常直接——"我那天脑子抽了,犯了个低级错误",然后大家一起想怎么防止这种低级错误再犯。但在大部分团队里,复盘是一场话语权的博弈。谁先定性,谁先定义"根因",谁就掌握了叙事权。于是复盘变成了一个精巧的话术游戏:每个人都在努力证明"这不是我的问题",或者至少"问题不止在我这里"。
结果就是,所谓的"根因分析",往往停留在最安全的层面——流程没跟紧、监控不够及时、测试覆盖不全面。这些说法没错,但它们只是表象。真正的问题藏在更深的地方,但没有人愿意在复盘会上把它翻出来。
你治的是症状,不是病因
大多数复盘产出的action items,本质上都是在治症状。
加了监控告警?那是让你更快发现问题,但问题本身还在。补了自动化测试?那是降低手动遗漏的概率,但如果架构本身就容易出错,测试也拦不住。增加了代码review环节?理论上没错,但如果review的人没时间认真看,这一条就形同虚设——而"没时间"恰恰才是真正的问题。
这就好比一个人反复感冒,每次都吃退烧药压下去,然后告诉自己"已经处理了"。退烧药当然有用,但如果你住在漏风的房子里,吃再多退烧药也改变不了反复感冒的事实。
举个具体的例子。某个服务的数据库连接池被打满,导致全链路超时。复盘结论是"需要增加连接池大小"和"加限流"。这两条都没错,做完之后确实不会再因为同样的问题出事了。但真正该问的问题是:为什么一个边缘功能能把核心链路的连接池打满?为什么服务之间没有做资源隔离?为什么流量突增的时候没有熔断机制?
这些问题的答案,通常指向架构层面的设计缺陷,甚至是更早期的技术决策失误。但在复盘会上,很少有时间也没有人有动力去追问到这个深度。因为一旦追问到这个层面,牵扯出来的就不只是"这次事故的责任",而是一系列"当初为什么这么设计"的历史决策。这些决策背后可能有业务压力,可能有人事因素,可能有权力博弈。谁愿意在复盘会上掀开这层盖子?
所以大家默契地停在"症状层",写几条不痛不痒的改进措施,散会。
无责复盘的虚伪
"无责复盘"这个概念近几年在技术圈被大力推广,出发点是好的:让人们不怕承认错误,从而真正暴露问题。但现实是,"无责"三个字在大部分组织里只是一句口号。
真正的无责需要两个前提:第一,说真话不会带来任何负面后果;第二,组织有足够的资源去修复根因而不是修复人。这两个前提在大多数公司都不成立。
一个更隐蔽的问题是,"无责复盘"反而让某些系统性问题更容易被掩盖。当所有事故都被归因为"个人疏忽"或"流程缺失"的时候,没有人会去质疑更底层的东西——比如团队是否长期人手不足、技术债是否已经积累到不可控的程度、业务方不合理的需求排期是否在压迫工程质量。
在一个我了解的团队里,半年内出了四次类似的事故,每次复盘都说是"沟通不够充分",每次的改进措施都是"加强跨团队沟通"。到了第五次,终于有人忍不住了,直接说:不是沟通的问题,是两个团队的利益根本不一致,一个要快,一个要稳,你让他们怎么沟通?这个观点一出来,复盘会的气氛瞬间就变了。这才是真正触及根因的讨论,但这种讨论在"无责复盘"的安全语境下反而更难出现——因为涉及利益博弈意味着涉及权力结构,而权力结构是不能在复盘会上讨论的。
复盘真正有用的场景
说了这么多,并不是说复盘完全没有价值。复盘在特定场景下确实有效,但前提是满足一些容易被忽视的条件。
复盘有效的一个典型场景:事故的根因确实是知识盲区或操作疏忽。某个冷门配置项的值设错了,某段代码的边界条件考虑不周——这类问题通过复盘让团队共享经验,确实能避免重犯。一个人的教训变成整个团队的认知,这是复盘最本源的价值。
但这类问题在事故中的占比,按照我的观察,大约只有三成。剩下七成的事故,根因都指向结构性的东西:资源不足、架构不合理、技术决策失误、职责边界模糊。而复盘对这类问题的改善能力极其有限。
复盘有效的另一个条件是:团队规模足够小,决策链条足够短。在一个5个人的团队里出了事故,复盘之后改进措施很可能真的会落地——因为人少,沟通成本低,每个人都知道问题在哪,也都有动力去改。但当团队扩展到30人、50人,跨了三个部门,改进措施的落地就需要协调多个利益方,推动成本指数级上升。这时候复盘产出的action items,大概率会在某个人的待办列表里静静躺到过期。
还有一个经常被忽视的条件:复盘是否有持续跟踪机制。大部分团队开完复盘会就算完成了,action items有没有人跟进、有没有deadline、没做到怎么办——这些都没有人管。一个没有闭环管理机制的复盘,本质上就是一场集体心理按摩。
真正的改变不发生在复盘会上
如果一个团队反复出现同类事故,复盘明显已经失效了,那真正该做什么?
我觉得答案不在复盘本身,而在复盘之外。
首先得承认一个事实:很多问题的根因不在技术层面,而在组织层面。资源分配、激励机制、权力结构——这些才是决定技术系统可靠性的底层变量。如果一个人连续加班两周之后出了错,复盘时说"要加强代码review"是没用的,有用的是回答:为什么让他连续加班两周?下次能不能避免?如果答案是不能(因为业务排期不允许),那这就是一个组织决策导致的技术后果,用技术手段解不了。
其次,真正有效的学习机制是嵌入在日常工作中,而不是事后补救。Code review、架构评审、灰度发布、故障演练——这些都是"事前"机制。一个健康的工程体系,大部分问题在设计阶段和开发阶段就被拦截了,而不是等到线上爆炸再复盘。复盘越频繁、越"重要",越说明你的事前防线形同虚设。
还有一个容易被忽略的角度:技术团队的学习方式。复盘本质上是一种"案例学习",靠具体的事故来提炼教训。但很多通用的工程最佳实践,根本不需要通过事故来学习。数据库连接池要做隔离,服务间要有熔断,关键路径要有降级——这些都是前人用无数事故换来的经验,早就有成熟的方案。你的团队还在用踩坑的方式学习这些,本身就是工程体系建设的失败。
什么时候该停止复盘
这个标题可能有点极端,但我想表达的核心观点是:复盘不应该成为事故处理的默认终点。
一次事故发生之后,如果复盘发现根因是某个人不知道某个知识点,那复盘就是对的——把知识补上,结束。
但如果复盘连续两次指向同一个结构性问题,那就说明复盘这条路已经走不通了。你需要的是一次真正的决策:要不要增加人力?要不要重构架构?要不要和业务方重新谈判交付节奏?这些都是管理决策,不是技术复盘能解决的。
最怕的是那种"永远在复盘,永远在出事"的循环。每次事故的复盘报告都写得很漂亮,改进措施数量在增长,但事故频率没有下降。这是组织在用复盘来回避真正的问题——因为开复盘会比做结构性改革容易太多了。
说到底,复盘只是工具,不是目的。当一个工具无法解决它本应解决的问题时,问题可能不在工具本身,而在你用错了场景,或者你就不该指望这个工具。
回到最开始那个场景。三个月后同一类事故再次发生的时候,真正该做的不是开第二次复盘会,而是问自己一个问题:上次的改进措施为什么没起作用?答案大概率会指向某个你不愿意面对的结构性原因。面对那个原因,比写十份复盘报告都有用。
只是面对它需要的不是分析能力,而是决策勇气。
添加新评论