专业书籍精读 · Chaos Engineering · 第 18 章
Chaos Engineering: System Resiliency in Practice · Ch 18 · HOP Meets Chaos Engineering · 2020
前面十几章讲的都是「怎么给系统制造故障」。这一章换了个角度:系统里最重要、也最常被冤枉的那一部分,是人。线上出事时,我们第一反应往往是「谁手滑了?」。这一章借来工厂、电厂这些重安全行业几十年的经验,告诉你这个问题问错了。
你会以为:把犯错的人处分一下、再培训一遍,事故就会变少。工业安全领域的经验恰恰相反——罚得越狠,事故往往越「突然」。因为大家学会的不是「别出错」,而是「出了小错别说出来」。小问题全藏进抽屉里,直到哪天攒成一个藏不住的大问题。
同样一次演习,如果目的是「看谁会出错」,大家会紧张、会作假;如果目的是「看系统哪里撑不住」,大家才会把真实的弱点亮出来。所以这一章说:设计故障演习时,要把人当成帮系统兜底的力量,而不是要被抓的嫌疑人。一句诚实的代价:不追责不等于不负责,这套做法需要长期的信任积累,组织里只要有一次「秋后算账」,前面攒下的坦诚就可能一夜清零。
人会出错是常态;该修的是让出错变成大祸的那个环境——混沌工程就是提前演练这件事。
想看 HOP 的五条原则各自讲什么、它们怎样改写混沌实验的设计与复盘,以及「无责」最常被误解在哪? → 切到精读版
你以为事故复盘的终点是找到「犯错的人」,其实那只是起点。本章把工业安全领域的人与组织绩效(HOP)五条原则——出错是常态、责备无助于修复、情境驱动行为、学习与改进至关重要、怎样回应很重要——搬进软件,并指出混沌工程本身就是这些原则的一种落地:它主动、受控地制造故障,研究系统(含人)在压力下如何应对,并据此改环境而不是改人。
全书第 18 章,Part V「演进」,作者是 HOP 实践者 Bob Edwards,背景是工业安全而非软件。上接 Ch17 把混沌工程推向信息物理系统,下启 Ch19 数据库上的混沌实验;本章是全书唯一一章专门讲「系统中的人」,对应现实里的事故复盘、值班文化和安全文化建设。
设想一个凌晨三点的场景:值班工程师按运维手册执行一条下线命令,参数多敲了一个字符,删掉的不是 2 台而是 200 台机器,服务中断数小时。传统复盘很快给出结论——「人为失误,加强培训、增加审批」。案子结了,但那条允许一次删掉 200 台的命令、深夜单人操作的排班、和实际干法对不上的手册,都还在原地。
工业安全领域在化工、电力、制造现场反复看到同一个结局:把事故归因到个人、以处分收尾,下一个人在同样的情境里犯同样的错;更糟的是,处分让一线不再上报未遂事件和小毛病,管理层看到的「安全数据」越来越好看,直到一次大事故打破幻觉。
软件团队面临同样的问题,只是更快:变更每天上百次,系统复杂到没人能装进脑子。本章要回答的是:怎样看待系统里的人,才能真正降低事故的严重度——以及这如何改变混沌实验的设计和复盘方式。
人与组织绩效(Human and Organizational Performance,HOP)是工业安全领域发展出的一套理念,深受 James Reason、Sidney Dekker、Todd Conklin 等安全学者的影响。它不是一套工具,而是一种看待事故的视角转换:
① 出错是常态(Error is normal)。再训练有素的人也会出错,这不是态度问题而是人的属性。所以目标不是「零失误」,而是让系统在失误发生时仍能安全失败:限制单个操作的影响、让错误尽早被发现、能快速撤回。混沌工程的前提与此完全一致——故障一定会来,与其祈祷,不如提前验证系统接不接得住。
② 责备无助于修复(Blame fixes nothing)。责备让人感觉问题解决了,实际只是换了一个人站到同一个坑边。更大的代价是信息:一旦说出错误会招来惩罚,人们就会隐瞒未遂事件,组织失去最便宜的预警信号。这也是为什么本书在多处强调复盘要无责。
③ 情境驱动行为(Context drives behavior)。人的选择是被时间压力、工具设计、激励与流程塑造的。要改变行为,就去改变情境:与其要求「小心输入参数」,不如让工具拒绝一次下线超过 5% 的容量。这里有一对有用的概念——想象中的工作(work-as-imagined),即手册和流程描述的干法;与实际中的工作(work-as-done),即一线为了在约束下完成任务真正采用的干法。两者之间的缝隙,正是风险藏身的地方。
④ 学习与改进至关重要(Learning and improving is vital)。组织要主动、持续地从一线学习,而不是只在出事后学。工具之一是学习小组(learning team):把真正干这活的人请来,不带审判地问「这件事平时是怎么做的、哪里别扭、哪里靠运气」。
⑤ 怎样回应很重要(Intentional response matters)。管理者听到坏消息时的第一句话,决定了下一次还有没有人说真话。回应要是有意识设计过的:先感谢上报、先问情境,再谈改进。
本章的核心论点是:混沌工程与 HOP 指向同一件事——承认失败不可避免,在它造成伤害前主动去了解系统如何失败。HOP 多年来在工业现场靠访谈和学习小组「间接」研究系统,混沌工程则提供了一种可以直接、受控地观察系统(包括人)应对故障的方法。把五条原则映射到实验上:
HOP 视角下的核心取舍是:事故或实验暴露出问题后,你把改进的力气花在人身上,还是花在情境上。
出问题后的四种典型回应
| 回应 | 见效速度 | 真正改变的 | 代价 / 副作用 |
|---|---|---|---|
| 处分责任人 | 立刻「结案」 | 几乎没有;情境原样 | 压制上报,未遂事件消失于报表;同类事故重演 |
| 再培训 + 加规定 | 快 | 少量;依赖人在压力下记住 | 流程越来越厚,work-as-done 与手册分得更开 |
| 加审批 / 人工复核 | 中 | 多一道人工防线 | 拖慢变更;审批流于形式时只是转移责任 |
| 改情境 + 建防线 | 慢,要工程投入 | 工具限速、二次确认、自动回滚、可撤销 | 需要预算与耐心;要靠实验持续验证防线真管用 |
五条原则如何改写一次混沌实验
| 原则 | 传统演练 | HOP 式演练 |
|---|---|---|
| 出错是常态 | 假设操作者会照手册做 | 假设人会出错,验证系统能否安全失败 |
| 责备无助于修复 | 记录谁做错了 | 记录哪里让「做错」变得容易 |
| 情境驱动行为 | 白天、资深人员、提前通知 | 逐步贴近真实的排班、信息与压力 |
| 学习至关重要 | 通过 / 不通过 | 产出一份「我们新学到了什么」 |
| 回应很重要 | 发现问题 = 有人要解释 | 发现问题 = 实验成功,先致谢 |
判据:如果一个改进措施只有在「人永远不犯错」时才有效,它就不是改进。优先选择那些在人犯错时依然起作用的措施,并用混沌实验去证明它们真的起作用。
无责复盘如今已是 SRE 团队的标配,但很多团队只学了模板,没学背后的 HOP 逻辑:复盘结论里仍有「加强培训」「操作需谨慎」这类针对人的行动项。本章给的检验标准是:每条行动项都应该改变情境,而不是要求人更小心。面试或架构评审里被问到「事故是人为失误造成的,怎么防」时,标准回答也是这个方向:限制单次操作的影响面、加可撤销与限速、让错误可见,并用演练验证。
大厂实证
① 人为错误是症状而非根因;事故报告停在「谁做错了」就等于停在冰山尖上。
② HOP 五原则:出错是常态、责备无助于修复、情境驱动行为、学习与改进至关重要、怎样回应很重要。
③ 目标不是零失误,而是让系统在人出错时仍能安全失败。
④ 责备会压制上报,让组织失去最便宜的预警;学习循环让弱点更早浮现。
⑤ 关注 work-as-imagined 与 work-as-done 的缝隙,风险藏在那里。
⑥ 混沌工程是 HOP 的实验化:把值班的人写进稳态假设,实验找缺口不找人。
⑦ 判据:只在「人永远不出错」时才有效的措施不算改进;优先改工具与情境。
⑧ 实证:Google SRE 无责复盘、Etsy 公正文化、AWS S3 2017 复盘改工具而非罚人。
⑨ 无责不等于不负责;领导者对坏消息的第一反应,决定这套做法能否持续。