2 我的源码被猫吃了
把坏消息从借口和归责转成事实、影响、选项、恢复和防复发的责任协议。
学习目标
- 能把“2 我的源码被猫吃了”中的坏消息拆成事实、影响、责任边界和可选恢复路径
- 能用“提示4:提供选择,别找借口”向用户和协作者说明至少两个方案、代价、时限和需要的决策
- 能在恢复后保存回归证据、根因假设和防复发动作,避免把诚实沟通误解成一次性道歉
为什么 2 我的源码被猫吃了不是教人找借口
“2 我的源码被猫吃了”用一个荒诞借口提醒程序员:坏消息迟早会到达用户和团队,差别在于它是带着事实、影响和选择到达,还是被拖延、包装和推诿后才暴露。务实的沟通不要求假装一切可控,而要求及时说明已知、未知、影响和下一步。
责任不是把所有事故归到一个人身上。责任是让受影响者得到可行动的信息,让团队知道谁可以决定什么,让恢复优先于争论,让回归证据证明承诺已经兑现。
↡不加解释性借口地记录发生了什么、何时发生、影响哪些对象、证据在哪里以及仍未知什么。Incident Fact 先回答事实,再回答原因。原因未确认时要标为假设,不能用一个听起来合理的故事替代日志和样本。
↡事故对用户、数据、收入、合规、团队节奏和后续承诺造成的可观察变化。Impact Surface 把“服务坏了”展开成谁不能做什么、影响持续多久、是否有数据风险以及哪些用户需要被告知。
↡在当前授权内能采取的恢复、降级、替代、延期或暂停路径,必须附带代价和决策人。Recovery Options 让提示4变成服务:选项不是把问题推回用户,而是帮助用户在真实代价下作出选择。
↡从发现问题到恢复可接受状态的目标时间,并说明每个阶段可以向受影响者承诺什么。Recovery Window 不等于拍一个乐观日期。它要区分确认、缓解、修复、验证和复盘的时间,并在信息变化时更新承诺。
↡证明恢复没有只修复表面路径的记录,包括回归样本、监控变化、用户确认和仍未覆盖的边界。Regression Evidence 让“已经好了”可被复核;一次成功点击不能证明数据、权限、并发和恢复路径都安全。
从借口到责任协议
先说事实,不编故事
事故开始时先冻结时间线、日志、输入和当前状态。把事实、推断、未知和需要验证的假设分栏记录。如果不知道,就明确说不知道以及何时更新,而不是用“猫吃了源码”遮住信息缺口。
再展开影响
检查用户功能、数据一致性、权限、财务、合规、内部流程和后续发布。Impact Surface 让不同受众得到不同但一致的事实:用户需要知道如何继续,管理者需要知道选择和风险,工程师需要知道证据和恢复动作。
最后提供选择
提示4:提供选择,别找借口要求至少给出两个有代价的路径,例如降级到只读、切换人工流程、延后高风险操作、回滚到安全版本或继续修复并保持观察。每个选项都要写 Recovery Window、谁批准以及失败后如何恢复。
先预测:如果事故更新只写“正在处理中”,最可能被隐藏的是影响范围、恢复时限、用户可选动作还是责任人?先做判断,再用一份真实事故消息逐项检查。
事故响应证据链
主链是 Incident Fact → Impact Surface → Recovery Options → Recovery Window → Regression Evidence。每一条边都要有证据和接收者:事实由日志和时间线支撑,影响由用户与系统观察支撑,选项由恢复能力支撑,时限由阶段性检查支撑,回归由样本和监控支撑。
若某个依赖未确认,链条应在该处停下。可以承诺下一次更新,而不能承诺尚未验证的修复结果。事故沟通的质量不由文字多寡决定,而由受影响者能否据此行动、团队能否据此复核决定。
三步坏消息处理路径
先冻结事实与影响
保存 Incident Fact 的时间线、日志、输入、当前状态和未知项,画出 Impact Surface,确认用户、数据和合规风险。
选项不是甩锅
Recovery Options 的价值在于让受影响者参与现实取舍。例如导出服务失败时,可以继续等待修复、提供昨天的快照、改走人工审批或暂停高风险导出。每个方案都有成本:数据新鲜度、人工负担、合规风险、用户等待和未来返工。
提供选择也有边界。工程师不能把安全和合规风险伪装成用户偏好,不能让用户在不了解后果时替团队批准高风险操作。选择表应标出必须由产品、运营、安全或用户确认的决策。
回归证据与防复发
恢复后不要只删除临时开关。Regression Evidence 应包含:原事故输入、修复触达路径、正常样本、边界样本、依赖不可用样本、日志与监控变化、用户确认、回滚测试以及仍未覆盖的条件。
防复发动作要对应首个偏差:如果事实缺失,补观测;如果影响未展开,补受众和告警;如果选项不足,补降级或人工路径;如果时限失真,拆阶段承诺;如果回归不完整,增加边界样本。这样,提示4不止改变一句事故消息,也改变系统恢复能力。
incident_protocol:
unit: tpp20-topic-02-cat-ate-source-code
claim: 坏消息应带着事实、影响、选择和验证到达
fact: 时间线、日志、输入、当前状态、未知项
impact: 用户、数据、收入、合规、团队负担
options:
- 回滚到已知安全版本
- 降级到只读或人工流程
- 继续修复并按阶段更新
recovery_window: 确认、缓解、修复、验证、复盘
regression: 正常、边界、依赖失效和用户确认
decision: 继续、降级、回滚、暂停或升级选择与拒绝矩阵
| 评审问题 | 可以接受的证据 | 应拒绝当前判断的信号 |
|---|---|---|
| 事实 | Incident Fact 有时间线、日志和未知项 | 用借口或未经验证的原因代替记录 |
| 影响 | Impact Surface 指出用户、数据和责任接收者 | 只说“服务受影响”,不说明谁受影响 |
| 选项 | Recovery Options 有至少两条路径和代价 | 只承诺修好或把选择推回用户 |
| 时限 | Recovery Window 拆成阶段并能随证据更新 | 给出无法验证的乐观日期 |
| 回归 | Regression Evidence 覆盖正常、边界和依赖失效 | 修复后只点一次成功路径 |
| 责任 | 恢复、批准、沟通和防复发各有所有者 | 复盘变成找人承担羞耻 |
常见误区
本章回顾
掌握 2 我的源码被猫吃了,不是学会更有说服力地找借口,而是能按提示4把坏消息变成 Incident Fact、Impact Surface、Recovery Options、Recovery Window 和 Regression Evidence。务实的责任让用户知道如何继续,让团队知道谁能决定什么,也让下一次事故更早被发现、更小范围地恢复。
可验证练习
练习
本组练习覆盖 2 我的源码被猫吃了 和 提示4:提供选择,别找借口,要求提交事故更新、选择表和回归证据。
问题 1: 导出服务失败时,第一条面向用户的更新应包含什么?
问题 2: 如何实践“提示4:提供选择,别找借口”?
问题 3: 服务恢复后,什么证据才能支持关闭事故?
名词解释
名词解释
本章出现的专业名词,用大白话再讲一遍。
- Incident Fact
不含借口的事件时间线、当前状态、证据和未知项记录。
- Impact Surface
事故对用户、数据、收入、合规和团队造成的可观察影响范围。
- Recovery Options
带有代价、负责人和批准边界的恢复、降级、替代或暂停路径。
- Recovery Window
从确认到缓解、修复、验证和复盘的阶段性时间范围。
- Regression Evidence
证明恢复覆盖正常、边界、依赖失效和用户结果的可复核记录。
前后导航
来源与改写范围
- Pragmatic Programmer 作者页面:核对 Topic 2 和提示4的版本位置与主题范围。
- 中文目录页面:核对 2 我的源码被猫吃了与提示4:提供选择,别找借口的公开目录范围。
- 出版社书目信息:交叉核对中文译本的出版信息与版次边界。