线上出了故障,全队连夜把问题摁下去,第二天早上群里只有一句”已恢复”。这件事就算过去了吗?在不少团队里,答案确实是”算过去了”——毕竟业务恢复了,用户没再投诉,谁也不想再提那段狼狈的凌晨。但恰恰是这个”不提”,让同一个坑在半年后以一种略微不同的面貌重新出现。事故复盘的价值,不在于追责,也不在于写一份漂亮的报告交差,而在于把一个偶然发生的痛,换成一套以后不会再痛的结构。这篇文章想聊的就是:一场有用的复盘,到底该长什么样。
一、复盘的第一层:把”发生了什么”钉死成事实

大多数复盘会开不起来,或者开成了吵架现场,根源都在第一层就没做扎实:大家对”到底发生了什么”各执一词。张三记得是数据库先抖动,李四记得是发布引起的,王五只记得自己一直在重启服务。三个人说的都是真话,却拼不出同一张图。所以复盘的第一步不是分析,而是还原时间线。
时间线的正确写法是只写”可观测量”,不写判断。比如”21:47 监控告警 P99 延迟超过 2 秒”,而不是”21:47 服务开始变慢”;写”22:03 运维执行了服务重启,重启后 30 秒恢复”,而不是”22:03 重启解决了问题”。后者带着结论,会悄悄把讨论引向单一路径,也会让没参与的人误以为已经找到了答案。事实越干净,后面的分析才越不容易跑偏。
这里有一个很实用的原则:把时间线写到”外人能看懂”为止。假设一个完全没参与当晚处理的同事来看这条时间线,他能不能自己复述出整个经过?如果他要不停追问”那这个监控是什么时候开始的””这次重启是谁决定的”,说明时间线还缺料。这一步看着笨,却是整场复盘中投入产出比最高的一步——很多问题在画完时间线的那一刻就自己浮出来了,根本不用进入”为什么”的环节。
还有一点常被忽略:时间线也要记录没能观测到的部分。比如”这段时间没有数据库层的指标,因为该实例未接入监控”。空白本身就是一条极其重要的事实,它往往直接指向下一个改进项。
二、复盘的第二层:从”人的失误”退回到”系统的缺口”

时间线画完,最常见的下一步是找责任人:”为什么这个配置写错了?””为什么上线前没测到这个场景?”这类追问并非完全无意义,但如果止步于此,复盘就变成了批斗。更麻烦的是,一旦开始找”谁错了”,信息就会立刻停止流动——没人愿意在一个可能被追责的场合里承认”我当时不确定,凭感觉按下了回车”。
换个问法,结果完全不同:不问”谁做错了”,而问”是什么让这个错误变得可能,又是什么让它没被拦住”。一个配置写错能被发到线上,通常意味着至少三道闸门同时失效:变更没有校验、灰度没有覆盖这个场景、监控没有对这个指标报警。每一道闸门都是可以修的,而”让某个人以后小心点”是修不了的。
这里可以用一个简单的二分法来检查自己的分析有没有到位:把每条原因问一遍”如果我把它去掉,这次事故还会发生吗?”如果答案是”还会”,那它就不是根因,只是恰好同时在场。真正的贡献因素通常有 3 到 5 条,交织在一起才酿成了这次事故。找出这些交织点,比揪出一个”罪人”有用得多,也更接近真相——现实中几乎没有哪次线上事故是单一原因造成的。
特别值得警惕的是那类”看起来是人的疏忽”的原因,比如”值班同学漏看了告警”。往下再挖一层往往会发现:那晚一共推了十几条告警,其中八条是噪音,真正重要的那条恰好被淹在里面。这时候要修的不是”认真一点”,而是告警的收敛与分级。把系统问题当成人的问题来修,是复盘里最昂贵的一种错。
三、复盘的第三层:把结论变成有主有期的动作

一份复盘报告写得再漂亮,如果没有变成几个具体的、有负责人、有截止时间的动作项,它就只是一篇文学创作。这一层最考验执行力,也最容易缩水——会议开完大家都很激动,散会后各自回到工位,动作项就躺在文档里慢慢过期。
好的动作项有三个特征。第一是具体到可验证:”加强监控”不是动作项,”为订单服务的 P99 延迟增加阈值 1.5 秒的告警,并接入值班群”才是。第二是有唯一负责人,不是”后端组”,而是一个具体的人——挂到团队名下等于没人负责。第三是有截止日期和被复查的机制,比如把动作项直接建进项目看板,下一次复盘会的第一件事就是回看上次的动作项完成了没有。
这里推荐一个朴素但有效的分类方式,把动作项按三道闸门归位:预防(让这个错误不再发生,比如增加校验、补测试)、检测(发生得更早被发现,比如补监控和日志)、止损(发生后恢复得更快,比如一键回滚、预案演练)。经验上,团队最容易只做”预防”,因为那最像”解决问题”;但现实里错误永远防不完,检测和止损的投入回报往往更高、见效更快。
最后一点关于文化:复盘要真正起作用,前提是那场会议里没有惩罚。这不是要求对明显的失职视而不见,而是要把”决策失误”和”违规操作”区分开——前者应该被讨论,后者应该被流程约束。当一个团队能坦然说出”我当时判断错了”,复盘的燃料才真正充足。反过来,如果每次故障之后都要有人写检讨,那大家学到的最重要一课就只会是:下次尽量别让别人知道。
结语
事故复盘本质上是一次组织级的”事前演练”:我们付出了一次真实的故障代价,换来的应该是下一次故障的免疫。把事实钉死、把归因从人退回到系统、把结论变成有主有期的动作——这三层缺一层,复盘就会退化成一次形式主义的过场。
下一次事故过去之后,不妨先问一句:这次我们学到的东西,写进系统里了吗?如果答案只有”大家都记住了”,那多半等于什么都没记住。