第一次复盘会开到一半,有人问"这个操作是谁执行的",会议室安静了十秒。第二次同类事故,当事人说自己那天在休假,什么都没看到;再下一次,时间线里出现了一段没人解释的空白。
复盘会变成追责会,不是因为有人想追责,而是因为会议没有产出结构,讨论自然滑向最容易归因的地方——人。
复盘的组织设计,要解决的就是这件事:让人愿意说,同时不让"不追责"变成"不改进"。
1. 三样产出,缺一样就等于白开
| 产出 | 具体形态 | 缺了会怎样 |
|---|---|---|
| 时间线 | 带证据来源的事件序列,精确到能排序 | 讨论变成各人记忆的拼接,因果颠倒 |
| 判据缺口 | 人在当时缺了哪条信息、缺了哪个信号 | 结论落在"下次注意",无法改动任何东西 |
| 可执行改动 | 有 owner、有截止日、能验证的条目 | 会开得很好,行为不变 |
三者是一条链:时间线给事实,缺口给解释,改动切断复发路径。只有时间线,产出的是事故说明;只有缺口,产出的是一次情绪释放。
2. "不追责"的真实含义
不追责常被误解成"不记录、不点名、不写细节"。这会让复盘失去解释力。真实含义是三条分开处理的东西:
| 层面 | 处理方式 | 边界 |
|---|---|---|
| 事实 | 完整记录,含操作者与操作时刻 | 记录不等于评价 |
| 判断 | 讨论"当时掌握的信息下是否合理" | 不用事后信息评判当时决策 |
| 行为后果 | 故意违规、隐瞒、绕过流程另案处理 | 这一条必须事先说清,否则"不追责"是假的 |
第三行是"不追责"可信的前提:不敢写"隐瞒要处理",这句话在当事人听来就是"这次先骗过去";而把所有行为都归因于系统,真正的侥幸操作反而被免责。
─── 复盘开场必须说的三句话(占位)
1. 今天只讨论"当时看到什么、为什么这样判断",不评价人。
2. 故意违规与隐瞒不在此列,按 XX 流程另案处理,这条事先讲清。
3. 时间线精确到什么粒度
| 粒度 | 适用场景 | 代价 |
|---|---|---|
| 分钟级 | 有明确变更、有告警、恢复过程有人工介入 | 整理成本高,需要多源对齐 |
| 事件级(阶段) | 无外部影响、过程简单、以流程问题为主 | 容易掩盖顺序,因果判断变粗 |
| 秒级 | 并发竞争、超时叠加类,顺序决定结论 | 只在少数事故里值得 |
粒度选择的标准不是"越细越好",而是结论是否依赖顺序:结论若是"没人把告警转成工单",分钟级无收益;若是"回滚与扩容并发导致状态错乱",秒级才有意义。
时间线里的每条事件都要带证据来源(日志、指标、发布记录、工单时间)。无证据的推测单列一节,不混进时间线——混进去之后,后面所有推理都建立在一个可能错误的顺序上。
4. 判据缺口比"人为失误"更有解释力
"人为失误"是个结论终止符:它一旦写进纪要,讨论就停了。而它几乎从不是真实原因——人在当时的信息条件下做了一个合理决策,只是那个决策在事后看来是错的。
把"失误"翻译成缺口,有四类:
| 缺口类型 | 提问方式 | 例子 |
|---|---|---|
| 信息缺口 | 当时看不到什么? | 面板没显示下游超时,只显示本服务 QPS |
| 判据缺口 | 看到了但不知道算不算异常? | 延迟从 200ms 涨到 400ms,没有阈值定义 |
| 时间缺口 | 需要在几秒内决定,但没人能在几秒内确认? | 自动降级缺失,只能人工判断 |
─── 把"失误"改写成缺口(占位)
原句: 值班人误判为流量抖动,延迟 20 分钟才升级。
改写: 当时面板只有 QPS 与 CPU,无下游超时指标(信息缺口);
延迟阈值未定义,400ms 在历史区间内(判据缺口);
升级对象是"主管",非角色,且无备份人(流程缺口)。
改动: 补下游超时指标 / 定义 P99 阈值 / 升级对象改为角色 + 备份人。
三行对应三个 owner、三种验证方式;原句只能改出"加强判断"——那不是改动。
5. 五个为什么的失效与替代
五个为什么在机制简单的事故里有效,在系统型事故里会退化成猜测链:每层答案由会上最会说话的人提供,越往下越像编故事,最后停在"管理不到位"。
| 追问方式 | 失效原因 | 替代做法 |
|---|---|---|
| 连环为什么 | 每层答案无证据约束,可无限发散 | 只追问"这一步的证据是什么" |
| 找"根本原因" | 复杂系统里通常没有单一根因 | 找"必要条件的集合",逐个能否定 |
替代方法叫决策复现:在时间线的每个关键节点上问三件事——当时有哪些选项?当事人依据什么排除了其他选项?要改变这个选择,需要哪个信息在当时就存在?第三问直接给出改动项。
6. 参与者与会怎么开
| 角色 | 必须到场的原因 | 不承担 |
|---|---|---|
| 当事人(操作者/决策者) | 只有他知道当时屏幕上有什么 | 不承担被评价的压力 |
| 相邻系统 owner | 判断影响面与误判来源 | 不承担本系统的修复 |
| 值班人 | 提供响应时序与升级判断 | 不承担根因修复 |
会议运行有两条硬规则:先讲时间线,后讨论原因(顺序颠倒会让讨论提前进入归因);当事人先讲,其他人后问(否则当事人只剩辩解的位置)。
管理者在场必要,但发言要靠后:他先表态,会议就会围绕他的判断收敛。
7. Action item 的质量判据与关闭联动
| 判据 | 不合格的样子 | 合格的样子 |
|---|---|---|
| 有唯一 owner | "后端组跟进" | "ROLE_A 在 11-20 前完成" |
| 可验证 | "加强监控" | "新增下游超时告警,注入延迟可触发" |
| 能失败 | 无论做没做都算完成 | 验收时能明确判定未达成 |
| 有时间盒 | "尽快" | 与事故等级匹配的截止日 |
─── 改进项(占位):进缺陷库,不进复盘文档
- id: AI-2317
from: INC-2311
owner: ROLE_A
due: 2026-11-20
change: "新增下游超时指标 + P99 阈值告警"
verify: "注入 500ms 延迟,告警在 2 分钟内触发"
tier: L1 // 走对应的变更级别,不额外开审批
status: open
关键在最后两行:改进项本身就是变更,走变更分级而不是走"复盘文档"。留在文档里的改进项,完成率取决于有人想不想得起来;进了缺陷库并绑定 owner 的才会被排期。
关闭判据只有一条:验证动作被独立执行过一次;owner 说"已完成"不算关闭。
8. 同源聚合与频率匹配
单次复盘只看得到个案;同类事故反复发生,根因往往在流程:同一类缺口被三个团队各修一遍,第四次换个形态又回来了。
─── 同源聚合的标签方案(占位)
incident: INC-2311
labels:
trigger: [deploy, config-change] // 触发面
gap: [missing-metric, no-threshold] // 缺口类型
impact: [latency, no-user-loss] // 影响面
─── 每季度按 gap 聚合一次,而不是按团队聚合
按缺口类型聚合,才能看出"缺指标"这类问题是不是系统性的。按团队聚合只会得到三份互相独立的整改计划。
复盘频率要与事故量匹配:事故多而复盘少,只处理了症状;事故少而复盘重(每次两小时),会让人开始隐瞒小事故。小事故降级为异步记录,会议时间留给有缺口可挖的那几次。
9. 对外口径与对内真相
两者可以不同,但不可以矛盾:对外"部分用户短时受影响"、对内"影响 12% 请求、8 分钟"是允许的;对外"未影响用户"、对内"错误率 30%",一旦被对照,之后所有对外说明都失去可信度。
─── 对外口径(占位):三句话结构
1. 现象与范围:什么功能、多长时间、大致比例
2. 已采取动作:已恢复 / 已回滚 / 已加限制
对外的每一句都要能在对内文档里找到对应事实。做不到这一条时,正确的动作是缩小对外承诺,而不是改写对内记录。
10. 度量:四个能改变决策的数
| 指标 | 口径 | 用来决定什么 |
|---|---|---|
| action 完成率 | 到期已验收的比例 | 复盘是否只是文档生产 |
| 同源复发率 | 相同 gap 标签的事故占比 | 改动是否切在了机制上 |
| 复盘到落地时长 | 会议到验证通过的中位数 | 改进项是否被排期 |
| 参与人数变化 | 同类事故的到会人数趋势 | 会议是否已让人回避 |
最后一项是软信号但很灵敏:同类事故的到会人数逐次减少,通常不是"大家懂了",而是"说了也没用"。
11. 排错:复盘开坏的六种现场
| 现象 | 真实成因 | 处理方向 |
|---|---|---|
| 时间线里出现空白段 | 当事人不在场或不敢讲 | 补当事人,先讲后问 |
| 结论停在"人为失误" | 没有缺口分类框架 | 用四类缺口改写结论 |
| 改进项全是"加强" | 无验收判据 | 每条改动必须能被注入验证 |
| 每次都是同一批人发言 | 会议结构让管理者先表态 | 调整发言顺序 |
12. 边界:什么时候完整复盘是过度设计
| 场景 | 为什么可降级 | 降级形态 |
|---|---|---|
| 无用户影响的小故障 | 判据缺口通常是已知的 | 一页记录:现象、动作、是否需改动 |
| 纯外部依赖导致的不可控事故 | 内部无改动空间 | 记录依赖方 SLA 与降级策略是否生效 |
| 高压交付期 | 深度复盘会被挤压成形式 | 先记录,两周内补一次 30 分钟复盘 |
判断口径:**降级的唯一合法理由是"这次挖不出新的判据缺口",不是"没时间"。**用没时间降级,同一个缺口会在下季度以另一种形态回来。
13. 自测
- 只有时间线没有判据缺口的复盘,产出的是什么?
- "不追责"必须配上哪一条边界才可信?
- 时间线该精确到分钟级还是事件级,取决于什么?
- 把"人为失误"改写成缺口,能多得到什么?
- 改进项为什么要进缺陷库并定变更级别,而不是留在复盘文档里?
- 什么情况下,完整复盘可以合法降级为简要记录?