事故复盘只盯结果不看前提,团队到底是怎么在同一个坑里反复跌倒的

一次事故,全员熬一阵子,写完复盘文档,好像一切解决了。
结果过了几周,同类型事故换个接口、换个脚本、换个同事,又重演一遍。

你会发现复盘开会很频繁,真正被消灭的事故模式却不多。
表面上在“找根因”,实际上只是在记录这次发生了什么,而没有追问:
当时团队是站在怎样的前提和约束下做那几个决定的。

这篇就讲清三件事
一是只盯结果的复盘为什么基本挡不住下一次
二是真正有用的复盘应该多看哪些前提条件
三是怎么把这些前提沉淀成团队防线,而不是一篇篇孤立的事故报告

==============================

一、只写“根因”为什么挡不住下一次

很多复盘文档长得很像流程模板

  • 直接原因:配置写错、字段没校验、边界没处理
  • 间接原因:测试覆盖不足、监控不完善
  • 改进措施:补用例、加告警、加强培训

看起来有板有眼,现实效果却往往是

  • 字段名换一个,同类问题再来一遍
  • 接口换一个,同类逻辑再翻车一次
  • 人员一换,新同事再走一遍老路

根本原因在于
这些复盘只在回答“这次为什么挂”,没有回答“为什么大家会在类似情景下做出同样选择”

真正推动事故发生的,往往不是那一行条件判断,而是背后的默认前提

  • 赶上线比补测试更重要
  • 临时配置随时可以改,没人记得回收
  • 多系统联动没有人负责整体视角,只管自己这一块

只改那一行代码,不碰这些前提
下次只要环境还一样,团队自然会重复同一条决策路径
结果就是同一类事故换个壳子再发生一次

==============================

二、不看“当时的世界”复盘只能怪人

一场事故真正有价值的信息,大致有三层

1、表层是“发生了什么”

这一层通常写得最详细

  • 哪个服务出错
  • 哪条配置有问题
  • 哪个脚本漏了校验

这层记录很重要,但如果只停在这里,复盘很容易变成“追责谁写错了”

2、中层是“当时大家看见了什么”

需要补充的是当时的认知环境

  • 指标是否足够清晰,能否支持判断风险高低
  • 有没有统一视图让人看到全链路状态
  • 文档和实际是否对得上,新人是否知道哪些部分已经很脆弱

很多决策看起来是“判断失误”,本质是信息不全
如果复盘不把这一层摊开,下次大家在同样信息缺失的情况下,还会做同样判断

3、深层是“当时默认的游戏规则是什么”

还有一层更隐蔽的东西,是团队日常已经习惯的规则

  • 需求有硬日期,上线挡不住,测试可以缩
  • 配置可以直接改线上,只要有人拍板
  • 出了问题先修再说,根因以后慢慢找

这些规则哪怕没写在制度里,也在每天影响每一个决定
如果复盘只谈“技术问题”,不碰这些规则,那同样的坑还会在那里等下一次

==============================

三、复盘时必须补上的几块前提信息

要让复盘真正有用,除了写“直接根因”,至少要多回答几类问题

1、当时有哪些约束被默认接受了

可以直接问团队

  • 这次迭代的时间压力有多大
  • 代码评审和测试是否被主动削减
  • 哪些风险当时已经看见,只是觉得“先上了再说”

把这些约束写清楚,是在提醒大家
问题不是“谁不够谨慎”,而是那种时间和资源分配方式,本身在推着人走捷径

2、当时缺了哪些关键信息

例如

  • 有没有任何监控能提前提示这条链路风险上升
  • 是否存在一键化脚本可以在上线前跑一轮全链路检查
  • 文档里有没有醒目标注“这一块已经老旧,动之前要特别小心”

如果每次事故现场都是一句“我们当时以为没问题”
那就该追问:当时是基于什么信息得出的这个判断

3、有哪些信号其实已经出现却被忽略

常见情况包括

  • 早期零星告警被当作偶发现象
  • 测试环境里出现过类似问题,但没人认为线上会放大
  • 评审中有人提过风险,但被一句“时间来不及”压过去

这些内容如果不好意思写在复盘里,就说明团队只敢谈“代码错了”,不敢谈“决策错了”和“组织方式有问题”
那同一类坑肯定还会反复踩

==============================

四、怎么让团队不再重复同一种掉坑模式

光写一份深刻复盘还不够,更重要的是把“踩坑模式”变成团队公共防线。

1、先给常见的翻车模式起名字

比如:

  • 无上限重试模式:错误一出现就疯狂重试,最后把系统自己打爆;
  • 配置组合爆炸模式:配置项越加越多,随便一改就造出新路径;
  • 无优先级抢资源模式:关键业务和低价值任务抢同一拨资源。

一旦有名字,大家在讨论设计时就能迅速对号入座。一看到类似味道,就有人会说“这很像某某模式,要小心”。

2、把坑写成检查清单嵌进日常流程

可以为每一种常见模式写一张简短卡片:

  • 典型表现:线上大概会出现什么现象;
  • 触发条件:什么组合最容易触发这种事故;
  • 检查问题:设计和评审时至少要问哪几句。

然后让这几张卡片进入日常流程:

  • 需求评审时,对照看有没有碰上这些模式;
  • 架构评审时,用来检查是否在重复老路;
  • 上线前自查一遍,确认没有踩到已知雷区。

3、让复盘文档按“模式”串起来

如果每一份复盘都是孤立文档,很难形成团队记忆。更好的做法是:

  • 按模式而不是按时间整理历史事故;
  • 把同一类问题归到同一个目录里;
  • 每次新事故发生时,先去翻一下这类模式之前出现时的决策经过和修复经验。

新人加入团队时,只要读完几类典型模式的合集,大致就能知道:

  • 这个系统最危险的地方在哪里;
  • 团队曾经被哪些假设和习惯坑过。

4、配合易路,把“踩坑模式”变成可观测、可控制的出口层结构

如果你的系统里大量流量都要经过代理出口,那这些“踩坑模式”最后往往会在出口层放大:重试风暴、配置漂移、优先级混乱,全都体现在某几批 IP 上。这个时候,用一个能分组、可观测的代理平台,会比单纯“换线”更有意义。

以易路代理为例,你可以:

  • 按业务模式建线路组:把“无优先级抢资源模式”拆成高优业务出口组、采集出口组、测试出口组,在面板上实时看到各组的 QPS、成功率和错误分布;
  • 用标签固化“安全组合”:把已经踩过坑的配置(国家、线路类型、并发上限)固化成一套出口标签,后续新脚本只能选标签,而不是随手拼接新组合;
  • 利用可视化统计,给“无上限重试模式”加硬约束:看到某一组线路错误率和重试数异常,就可以直接从面板层限流、下线,避免问题扩散。

简单说,你在团队层面给“翻车模式”起名字、写清单,帮助大家识别坑;在代理层面用易路把这些规则托住,让“少踩坑”不只靠自觉,而是靠结构和工具一起兜底。

==============================

团队为什么会在同一个坑里反复跌倒
往往不是因为大家不够聪明,也不是因为复盘不够认真,而是因为

  • 复盘只盯“发生了什么”,不问“当时为什么这么做”
  • 只改那一行代码,不改背后默认的游戏规则
  • 把每次事故写成一次性故事,而没有提炼出可复用的模式和检查点

更有用的做法是

  • 在复盘里把约束、信息缺失和被忽略的信号写出来
  • 把翻车模式命名、归档,做成简短检查清单
  • 让这些东西进入日常设计评审和上线流程

这样,当类似场景再出现时,团队里至少会有人说一句
“等等,这看起来很像我们以前那次事故的前奏,要不要先停一下”

从这一刻开始,你就不再只是记录事故,而是在一点点收回系统和团队的复杂度