线上问题发生以后,复盘会议里经常会出现一类问题:为什么当时没有发现,为什么没有提前提醒,为什么选择了这个方案。
这些问题有必要问。没有追问,团队很难找到改进方向。但如果所有问题都以“为什么你没有”为开头,复盘很容易从分析事情如何发生,变成判断某个人是否尽责。
结果已经发生以后,人会自然地觉得线索十分明显。真正需要还原的,是结果尚未发生时,参与者面对的是什么。
当时知道什么
复盘首先应该区分事后事实与当时信息。
今天已经知道某项配置会引起故障,不代表设计时它就是明确风险;今天看到完整调用链,也不代表当时每个人都掌握全部依赖。
需要重新列出当时可获得的信息:需求怎样描述,历史数据是多少,类似方案是否运行过,监控暴露了什么,还有哪些信息当时不存在。
如果关键事实当时已经存在,却因为检查不足没有被识别,这是可以改进的判断问题。如果事实只能在事后获得,就不能用今天的确定性要求昨天的人提前知道答案。
当时受到什么约束
技术方案从来不是只在正确与错误之间选择。
上线时间、可用人员、旧系统兼容、外部依赖和迁移成本都会影响决定。有时团队知道一个方案不够理想,仍然因为时间和风险选择它。这不一定意味着决定错误,但应该确认当时是否明确记录了代价。
复盘时把约束重新列出来,不是替错误找理由,而是判断下一次应改变哪一项条件。若问题来自排期不合理,增加一条代码规范没有帮助;若风险来自信息没有同步,只要求开发更加谨慎也很难奏效。
谁参与了判断
复杂项目很少由一个人独立决定。
产品确定目标,技术评估实现,测试判断覆盖范围,负责人平衡时间和资源。最后的方案可能经过多轮讨论,也可能在一次临时沟通中仓促确定。
复盘需要还原决策过程,而不是把结果压缩到最后执行的人身上。谁提供了什么信息,分歧如何解决,风险由谁接受,都应该尽量清楚。
这样做并非分摊责任,而是找到系统真正缺少的机制。否则,每次复盘都以个人“以后注意”结束,相似问题仍会在另一位同事身上重演。
风险是否被看见并接受
并非所有风险都能在上线前消除。
有些风险影响较小,可以通过监控和回滚承担;有些风险发生概率低,但解决成本极高,团队可能有意识地暂时接受。问题不在于系统存在风险,而在于风险是否经过讨论,是否有明确应对方式。
如果风险已经被识别并由相应角色接受,复盘重点应放在原有判断是否合理。如果风险从未进入讨论,则要检查信息收集、评审和升级机制为什么失效。
个人责任仍然存在
强调决策条件,不是为了否认个人责任。
有人遗漏了本应完成的检查,有人知道风险却没有同步,有人在缺少依据时作出了过度承诺,这些都需要准确说明。只是个人问题也应该具体到行为,而不是用“责任心不足”概括一切。
具体问题才有可能形成具体改进:增加检查项、调整权限、补充监控、明确决策人,或者让重大风险留下记录。
复盘最终要改变条件
一次有效复盘不必找到唯一责任人,也不一定能得到完整根因。但它至少应该让下一次面对相似问题时,团队拥有比上一次更多的信息和更好的条件。
如果会议最后只留下“加强意识”“提高重视”,通常意味着问题仍然没有被还原清楚。
复盘不是用今天的结果审判昨天。它要解释的是,在当时的条件下,事情为什么会沿着那条路径发生。