一次平台宕机,事故报告最后往往会压缩成一行:某位工程师改错配置,审核流程未能拦截。

这句话通常没错。问题在于,它只解释了最后一根手指按下了什么,没有解释系统为什么允许一次操作穿透多层防线,也没有解释同类操作此前为何能安全完成几十次。

Richard I. Cook 写于 1998 年的短文《复杂系统为何失败》,用 18 条判断拆开了这件事。它讨论的并非某一场事故,而是医疗、交通、电力、软件平台等系统共有的麻烦:危险藏在正常运行内部,安全每天都要重新做出来。

这套观点没有说事故可以听天由命,也没有否定责任追究。它真正挑战的是一种省事的管理习惯:找到一个“根因”,处分一个人,增加一道流程,然后宣布问题已经解决。

复杂系统一直在“带病运行”

复杂系统很少处于教科书里的完美状态。

医院设备会老化,电网负荷会波动,互联网平台会有过期依赖和告警盲区,交通系统还要面对天气、拥堵与人的临场判断。它们能够继续运行,靠的并非所有部件始终正常,而是多层防线暂时兜住了彼此的缺口。

Cook 的 18 条论点,可以压缩成下面这张表:

编号核心论点落到现实意味着什么
1危险内生于复杂系统高耦合、高负荷和不确定性本来就是任务的一部分,无法彻底清零
2系统依靠多层防御运行监控、审核、冗余、培训和人工判断共同挡住故障
3灾难通常需要多重失效单个故障往往不足以击穿系统,事故来自多个缺口同时对齐
4潜伏故障一直存在并持续变化旧代码、设备老化、权限漂移和组织变动会改变风险组合
5系统经常处于退化模式部分组件失效、人员不足或负荷过高时,业务仍会继续
6正常与事故之间的余量可能很薄长期无事故不等于风险很低,也可能只是防线一直勉强有效
7单一“根因”会扭曲事故解释它把耦合网络压成一条线,遗漏多个条件如何共同起作用
8事后判断带有结果偏见知道结局后,原本模糊的信息会被误认为早已清楚
9一线人员同时负责生产和防御他们既要完成任务,也要识别异常、减速、回滚和止损
10临场决策都带有下注性质信息不完整、时间有限,任何选择都有收益和代价
11系统歧义最终由现场人员消化规则覆盖不了的灰区,会落到值班员、医生、司机和工程师手里
12一线人员是关键安全屏障自动化失效、流程冲突时,人的适应能力往往是最后防线
13专业能力必须持续更新系统、工具和故障模式会变化,过去的经验可能迅速过期
14技术变化会带来新型失效升级能减少旧错误,也可能引入更隐蔽、更相关的故障
15对“原因”的理解会限制整改原因被定义得越窄,防御措施越容易只修表面
16安全是系统整体呈现的属性单个组件合规,不代表组件组合后仍然安全
17人每天都在持续创造安全调整节奏、补充检查、绕开异常,都是维持运行的实际工作
18稳定运行需要故障经验演练、近失事件和真实故障能训练识别与恢复能力

危险内生,不等于事故注定发生。Cook 的意思更接近:复杂系统无法靠一份设计稿获得永久安全,防线必须在运行中不断更新。

交通信号、车辆制动、道路规则和调度共同生成交通安全;医生、药品系统、护士复核和患者信息共同生成医疗安全;电网冗余、保护装置和调度员共同维持供电。互联网平台也一样,限流、监控、回滚、容量储备和当班工程师缺一不可。

安全因此带有“涌现性”。它无法被塞进某个部门,也不能只归功于某项技术。

James Reason 提出的“瑞士奶酪模型”更容易理解:每层防线都有孔,事故发生在孔洞偶然对齐时。Cook 往前又走了一步——这些孔会移动,防线也会退化,一线人员还在不断挪动和修补它们。

“祸患常积于忽微。”放到复杂系统里,所谓“忽微”并非一串孤立的小错误,而是长期被容忍的小偏差,终于在某个时刻发生耦合。

“根因”让报告好写,却可能让系统更脆

根因分析并非毫无价值。

轴承断裂、证书过期、代码存在确定缺陷,这些边界清楚的问题,当然可以追到具体原因。“五个为什么”也适合梳理相对稳定、因果链较短的流程。

麻烦出现在另一种场景:高耦合系统被迫交出一个唯一答案。

复盘方式主要问题如何看待一线人员常见整改容易遗漏什么
单一根因分析谁或哪个部件导致事故错误执行者处分、培训、增加审批组织压力、防线退化、系统耦合
系统型复盘哪些条件共同击穿防线信息有限条件下的决策者调整架构、负荷、权限和恢复能力成本更高,责任边界也更难划清

事故发生后,所有人都已经知道答案。调查者可以从时间线中轻易挑出“正确选择”,再回头质问现场人员为何没有选它。

可在当时,告警可能互相冲突,仪表可能延迟,回滚也可能扩大损失。值班人员看到的世界,和复盘会议室里看到的世界,不是同一个世界。

这就是事后偏见。它最危险的地方不在于语气苛刻,而在于会生成错误整改:再培训一次,再增加一个确认框,再多签一级审批。表面上更严密,实际反应速度更慢,现场人员也更不愿报告异常。

组织的生产压力同样容易从报告中消失。

医院要提高床位周转,电网要维持供电,平台团队要赶发布时间,运营部门要保住转化率。一线人员每天都在效率和安全之间做局部权衡。管理层享受了这些权衡带来的产出,事故后却可能把代价全部算到执行者头上。

我不赞成把“无责复盘”理解为无人负责。隐瞒风险、伪造记录、明知会造成严重后果仍违规操作,当然需要追责。管理层长期压缩安全余量、忽视重复告警,同样要进入责任范围。

公平问责和简单甩锅,差别就在这里。

Google 在 2016 年出版的《Site Reliability Engineering》系统介绍了无责复盘文化。它和 Cook 的理论并不完全相同,但实践方向一致:复盘要还原当时掌握的信息和决策约束,目标是让下一次事故更难发生,而非证明某个人本应全知全能。

好的整改要保护适应力,也要提防整改本身

很多事故报告的最后一页,会列出技术升级和流程加码。两者都有用,也都有副作用。

自动部署可以减少手工错误,却可能让一个错误配置更快扩散;医疗决策系统可以减少遗漏,却可能把同一条错误规则复制到更多患者;电网数字化控制可以加快响应,也会增加对通信、软件和时间同步的依赖。

旧风险下降,新风险常常变得更低频、更隐蔽,后果也更集中。

因此,每项整改都该多问一句:它挡住了哪种旧故障,又制造了什么新耦合?如果答案只有“增加一道审批”,大概率还没有碰到系统问题。

不同角色需要做的事也很具体:

角色事故后应该做什么应避免什么
技术与运营管理者按当时信息重建时间线;检查负荷、排期、人员配置和防线退化;给整改设置回滚方案和副作用指标只统计谁操作失误,用新增流程代替架构修复
一线工程师保留告警、判断依据和替代方案;记录近失事件;通过演练验证降级、隔离和恢复能力为了避免问责而隐藏临时调整,或把个人英雄主义当成长期防线
监管者检查系统实际如何运行;关注近失报告、跨系统依赖和人员是否有权暂停高风险操作把合规清单等同于安全,把所有偏离流程一律认定为违规

如果你负责主持事故复盘,会议开场最有用的问题不是“谁改了配置”,而是“当时哪些信号让这个决定显得合理”。随后再画出防线如何逐层失效,哪些组织目标压缩了安全余量。

如果你是一线工程师,接下来最现实的变化也不该只是多填一张表。你需要明确的停机权、可用的回滚工具、不过载的告警系统,以及报告近失事件后不会立刻受罚的环境。没有这些条件,“依靠一线适应”只会退化成让人长期救火。

这套理论也有边界。它是一份概念框架,并非统计研究;并非所有事故都同样复杂,也不是每个错误都必须上升到组织结构。把系统思维用成免罪工具,同样是在偷懒。

我判断一家企业是否真的重视安全,只看几个动作:复盘是否还原当时信息,管理层是否进入责任链,整改是否评估次生风险,一线人员是否仍有调整和叫停的空间。

根因报告给管理层一个句号。复杂系统真正需要的,往往是一张仍可修改的地图。