专业书籍精读 · Chaos Engineering · 第 10 章
Chaos Engineering: System Resiliency in Practice · Ch 10 · Humanistic Chaos · 2020
你半夜刷不开某个 App,第二天它恢复了。修好它的,除了服务器,还有一群被电话叫醒的人:谁先被叫醒、谁拍板、消息怎么传,决定了你等了五分钟还是五个小时。
前几章的混沌工程,是故意弄坏机器,看系统扛不扛得住。这一章说:团队本身也是一个系统,同样可以——也应该——被小心地「摇一摇」。
学校每学期搞消防演习。真正有用的演习不只是「拉警铃、大家往外走」,而是故意加点变数:「今天楼梯 A 封了」「平时带队的班主任请假了」。
一加变数,问题就冒出来:没人知道备用楼梯在哪;代课老师不知道集合点。这些问题在演习里暴露,比在真火灾里暴露便宜得多。
很多公司把机器备了两份、三份,却没发现人只有一份:某个系统只有老王懂,老王一休假,出事就没人会修。
另一个老毛病是改组织「一刀切」:明天起换一套值班办法,全公司同时生效,不试点、也没想过改坏了怎么退回去。换成机器,没人敢这样上线新版本。
好处是那些「只存在于某个人脑子里」的知识被逼出来写成文档、教给别人;团队出事时不再靠一两个英雄硬扛,而是谁在场谁都能接上。
一句诚实的代价:对象是人,搞砸了伤的是信任——不打招呼地「突袭」别人,或者拿演习结果去评谁表现差,会让大家从此不敢说真话。
团队也是系统:人可能是单点,沟通会有延迟,规矩会出 bug——用演习的办法,小范围、可喊停地去试它,在真事故之前把这些弱点找出来。
想看三个真实案例、怎么定假设、怎么控制范围? → 切到精读版
你以为混沌工程的对象是机器,其实组织本身就是一个复杂分布式系统:人是节点,沟通是网络,流程是协议。混沌工程的四条原则——定义稳态、提出假设、变化真实事件、控制爆炸半径——可以原样拿来安全地试探、甚至安全地改变一个组织。
全书第 10 章,Part III「人的因素」的第二篇,作者 Andy Fleener(体育类 SaaS 公司 SportsEngine 的平台运维负责人)。上承 Ch9 用设计会挖人脑里的盲区,下接 Ch11 人在回路;本章把「人」从实验的观察者变成实验的对象。
摆一个典型场景:一个 SaaS 平台,基础设施做了多可用区冗余,任何一台数据库宕掉都能自动切换。但凌晨三点的一次大故障里,真正卡住恢复的是:值班的人不确定该不该叫醒数据库负责人;三个团队在三个聊天频道各查各的;客服二十分钟后才知道出事。技术上没有单点,组织上处处是单点。
传统做法有两个盲区。一是只摇机器不摇人:故障演练检验的是自动切换,从没检验过「最懂的人不在」时会怎样。二是改组织不做实验:换值班制度、重组团队,通常全员一夜切换,没有灰度、没有回滚开关——这恰恰是混沌工程在技术侧最反对的上线方式。
所以本章的问题是:能不能把混沌工程的方法用在人和组织上,提前暴露组织的脆弱点,并且让组织变更像代码变更一样可试、可退?
本章的出发点是一个常被忽略的事实:事故里的系统从来不只有软件。一个告警响了,接下来发生的事——谁看到、怎么判断、找谁、何时升级——全是人的行为。组织是由系统组成的系统:每个团队有自己的目标、工具和习惯,团队之间靠沟通耦合。
一旦这样看,技术侧熟悉的概念都能找到对应:节点是人和角色,网络是沟通渠道,协议是流程,单点就是那个「只有一个人懂」的环节,而沟通的来回就是组织的网络延迟。
本章站在韧性工程的「新视角」上:大多数日子里系统没出事,不是因为没有扰动,而是人在不断地、往往没被看见地调整——有人顺手重启了卡住的任务,有人注意到某个指标怪怪的去问了一句。成功和失败来自同一种适应行为,只是结果不同(这就是 Hollnagel 所说的 Safety-II:研究「为什么平常没出事」,而不只研究出事)。
所以工程目标不只是「消灭错误」,而是培养适应能力:让更多人能识别弱信号、能接手陌生的局面。混沌实验在这里的作用,是在可控条件下给组织制造「意料之外」,看适应能力在哪里够、在哪里断。
本章用作者所在平台运维团队与产品研发组织的三个案例,把上面的原则落地。每个案例留一条可带走的判据:
在事故里,沟通就是组织的网络延迟:同一个发现在三个频道里各说一遍、IC 不知道哪条消息最新,等于丢包加重传。ICS 式的固定角色(指挥、操作、对外沟通)和单一事故频道,本质是给这张网络定协议。
另一条观察是:领导力是系统的涌现属性,而不是职位。事故中谁来协调,应由角色与训练决定,而不是谁职级最高——所以 IC 应当是可轮换、可被训练出来的角色,实验可以专门检验「平时那位 IC 不在时,别人能不能接上」。
第一张表:同一个原则,在机器上和在人身上的差别。
| 维度 | 技术混沌 | 人性化的混沌 |
|---|---|---|
| 注入什么 | 杀进程、加延迟、断网 | 关键人缺席、工具不可用、角色轮换 |
| 稳态指标 | 成功率、p99 延迟 | IC 就位时间、首次对外通报时间 |
| 可重复性 | 高,同样注入大致同样结果 | 低,人会学习,第二次就不一样 |
| 主要风险 | 用户受影响 | 信任受损、被当成绩效考核 |
| 知情同意 | 通知相关团队即可 | 参与者须知情,结果不评人 |
人会学习、会记住被「整」的感受,所以组织实验的爆炸半径要按信任算,而不只按用户影响算。
第二张表:几种组织层面的扰动方式怎么选。
| 方式 | 适合 | 代价 |
|---|---|---|
| 纸上推演 | 刚起步、流程还没成文 | 便宜,但不检验真实反应 |
| 游戏日(含人的变数) | 检验角色、沟通、交接 | 每次数小时、多人投入 |
| 流程变更小组试点 | 换值班、换升级规则、重组 | 周期长(数周),指标易受噪声干扰 |
| 真实事故中轮换 IC | 有成熟培训与后备时 | 真用户在线,须有资深者兜底 |
ICS 本身就是一个「把人当系统设计」的成功先例:它诞生于 1970 年代美国加州山火的多机构协同救火,后来被软件行业的事故响应广泛借用。本章的贡献是再往前走一步——不只照搬这套协议,还要用实验去检验它在你的组织里是否真的生效。
面试或架构评审里被问「你们的系统有没有单点」,只答数据库主从是一个层级;能接着说「我们也检查人员单点:游戏日会让主要负责人缺席,IC 是轮换角色、按流程培养」,说明你理解可靠性是社会技术系统的属性。
大厂实证
① 核心命题:组织是复杂分布式系统,混沌工程的四条原则可以原样用来试探和改变它。
② 痛点:技术冗余做足了,人仍是单点;组织变更常一夜全量切换、没有回滚。
③ 对应关系:人=节点,沟通=网络(延迟),流程=协议,「只有一个人懂」=单点故障。
④ 韧性观:成功与失败来自同一种适应行为(Safety-II),目标是培养适应能力、识别弱信号。
⑤ 平移原则:组织稳态(IC 就位、对外通报时间)、可证伪假设、真实变数(关键人缺席)、小爆炸半径+知情。
⑥ 三个案例:游戏日要演练人;把散落的弱信号连成线;改基本假设要像灰度发布一样可退。
⑦ 沟通是组织的网络延迟;领导力是涌现属性,IC 按角色轮换、可训练。
⑧ 易错:突袭伤信任、结果评人、以为可复现、只搬名词不演练。