线上故障后的组织复盘(不是技术复盘)

一句话速记

技术复盘关心”代码哪里写错了”(第二根因),组织复盘关心**“什么样的流程、决策、信息断层让这个错误被写出来、被合入、被上线而且没有被拦住”(第一根因和超前 2 年)。组织复盘的目标不是追责,是找出系统的漏洞**——每次故障都是你的工程质量体系的一次免费安全测试,不学就浪费了。

通俗解释(5 分钟版)

技术复盘:
  "这个 OOM 是因为 ThreadLocal 没 remove —— 修了。"
  → 关注的是这次的具体 bug 和 fix

组织复盘:
  "我理解代码为什么会写错。但我们接着问:
   ① 为什么 code review 没发现?(是没有 checklist 还是
      reviewer 太忙?如果是后者——TL 是不是在 review
      工作量里没给足够时间?)
   ② 为什么 CI 没测出来?(没有 ThreadLocal 泄漏的测试?
      还是测试覆盖不到这类场景?)
   ③ 为什么灰度放量了 30 分钟后才炸?(Old 区一直接近
      临界点——为什么没有提前告警?)
   ④ 团队里其他人有没有同样的问题?(排查了 5 个服务,
      发现 2 个也有同样的 ThreadLocal 没 remove 的模式)
   
   所以我们要改的不只是这行代码。
   我们要改的:
     - Code review checklist 增加一条
     - CI 流水线增加一个 ThreadLocal 泄漏检测
     - 监控告警阈值从 Old > 95% 调低到 85%
     - 写一个 AutoCleanupThreadLocal 包装类让以后不可能再犯"

关键细节

组织复盘的五问

1. 信息问:错误是什么时候被引入的?
   - 写代码的那一天
   - 不是上线的那一天!

   "这个 bug 是 6 周前写下的。为什么这 6 周里我们没有发现?"
   → 如果代码在 review 阶段、CI 阶段、灰度阶段被发现的概率
     分别是 30%、80%、95%——为什么这次三道防线全漏了?

2. 防线问:每一道你自认为的防线为什么没拦住这次错误?
   - Code Review:为什么没发现?
   - CI/CD:为什么没测出来?
   - 灰度/金丝雀:为什么没抓到?
   - 监控告警:为什么是用户先发现的而不是你先发现的?
   
   (如果答案是"我们根本没有这道防线"——
    那就是你这季度最大的改进优先级)

3. 信息问:做决策的人在关键时刻有没有掌握到必要的信息?
   - 那个写 bug 的工程师,在写的时候知不知道
     ThreadLocal 需要 remove?
     → 如果不知道:培训/文档/工具提示缺失
     → 如果知道但忘了:有没有机制帮 TA 记住?
        (代码模板/linter 自动检查/工具封装)

4. 范围问:这个问题有没有在其他服务/团队里存在?
   - 5 个服务里搜了一圈,2 个有同样的问题模式
   → 你的问题是团队的还是系统的?

5. 速度问:从"事件发生"到"被发现"到"被修复",
   你的响应速度够快吗?
   - 被用户发现的:你的监控比用户慢了多久?
   - 修复用了多久?有没有因为信息不全或权限不足
     而拖延?

组织改进行动项

每个改进必须具体、必须有人做、必须有期限

坏例子:
  "我们要加强 code review 质量。"
  → 谁做?怎么做?什么时候做完?没写 = 不会做

好例子:
  "代码 review checklist 增加一条:涉及 ThreadLocal 的
  代码必须确认 finally 里有 remove。在团队 wiki 上更新。
  责任人:老王;完成时间:本周五。"
  → 下周五开会时,老王能不能说"做完了"是清晰的

改进行动分为三类

1. 时间防护(拦住它别再进入主干):
   linter 规则、CI 检查、单元测试、review checklist

2. 空间防护(拦住它到不了生产):  
   灰度放量、金丝雀、影子流量、预发环境
   
3. 观察防护(在它伤人之前发现它):
   监控告警、异常检测、每周巡查

组织复盘会的组织

参与人:
  - 值班/oncall 人(这次故障的经历者)
  - 故障相关的 TL(不一定是直接写代码的人)
  - 相关方的 TL(如果有跨团队影响)
  - 不需要全团队参加
  (如果团队有 10 个人,不要让 8 个无关的人旁听)

时长:30-45 分钟(不是 2 小时)
  
会前准备:
  - 事故的时间线已经理清(精确到分钟)
  - 技术根因已定位(到代码行)
  - 改进建议草稿已有(不需要在会上动脑想)

会中议程:
  1. 故事(5 分钟):oncall 人讲一遍时间线
  2. 防线扫描(15 分钟):每一道防线为什么没拦住
  3. 行动项(10 分钟):最多 3 个改进行动项

会后:
  - 发事故复盘记录到团队(不只是参加的几个人)
  - 下次复盘会第一件事:检查上次的行动项完成了吗?

延伸追问

  • Q:小故障也需要组织复盘吗? → 不需要每次都做。但同样类型的故障第二次出现时,必须做——因为第一次你认为它是”偶发的”,第二次证明你的防线有系统性漏洞。
  • Q:复盘会上有人开始互相指责怎么办? → 立刻打断,要求”到此为止,会后单独聊”。复盘会的规则是:只讨论”怎么会这样”(系统层面),不讨论”这是谁的错”(个人层面)。如果你没信心控制住这个边界,会前先和关键人单独沟通。
  • Q:怎么确保复盘不变成走过场? → 看行动项。如果连续 3 次复盘的行动项都按时完成了——是真的。如果每次都是”要加强 code review”没有 Owner 没有 deadline——你在走过场。

我的记法

  • 组织复盘 vs 技术复盘:技术复盘问”代码错哪了”(第二根因),组织复盘问”防线为什么全漏了”(第一根因)
  • 五问:信息、防线、决策、范围、速度
  • 行动项三要素:Owner + 截止日 + 可验证(下个月开会时能不能说”做完了”)
  • 一句话:「每次故障都是一次免费的安全测试——你花 2 小时做复盘,省的是下次同样的故障再花 2 周」

状态

  • 已背速记
  • 能讲通俗版
  • 能答追问