11 可逆性
把架构和工具决定设计成可撤回的赌注,以有效期、隔离边界、数据出口和退出演练保存选择权。
学习目标
- 能把“11 可逆性”解释为带假设、有效期、隔离层、替代方案和退出演练的决策合同
- 能用“提示18:不设最终决定”和“提示19:放弃追逐时尚”识别锁定成本、验证窗口和工具承诺的风险
- 能在真实项目中只改变一个决定条件,执行数据/流量退出演练,记录首个失配并让独立复核者重放恢复
为什么 11 可逆性不是拒绝做决定
本页依据 David Thomas、Andrew Hunt《程序员修炼之道:通向务实的最高境界(第2版)》,云风译,电子工业出版社,2020年4月,ISBN 9787121384356 的公开完整中文目录,独立重构 11 可逆性。本页不复制原书正文、插图、练习答案或代码,而把目录命题转写成可撤回决策、退出演练、反例和复核证据。
可逆性不是让团队无限等待,也不是把所有决定都做成临时开关。它要求在信息仍不完整时,把高代价承诺拆成有期限、可观察、可退出的小步骤;一旦证据显示假设不成立,团队知道如何撤回流量、保护数据、通知相关人并恢复旧路径。
本单元把问题拆成 假设 → 决策期限 → 适配边界 → 替代方案 → 退出路径。每一步都写明锁定成本、owner、接受条件、退出触发器和重放证据。
11 可逆性:决策合同
| 节点 | 要问的问题 | 可观察产物 | 失败动作 |
|---|---|---|---|
| 假设 | 这次选择要验证什么未知 | 假设、证据和反例 | 降低范围或延后承诺 |
| 决策期限 | 何时重新检查是否继续 | 有效期、观察窗口和 owner | 到期自动复审,不让临时变永久 |
| 适配边界 | 哪些外部细节被隔离 | 协议、开关、数据出口 | 建立替代路径或停止扩大 |
| 替代方案 | 如果假设失败,下一条路是什么 | 旧路径、候选方案和迁移成本 | 先演练退出再扩大投入 |
| 退出路径 | 怎样撤回流量、数据和责任 | 回滚、重放、通知和回归记录 | 在安全边界内暂停并恢复 |
Reversibility 不是“什么都能撤销”,而是把不能撤销的部分显式列出并降低其暴露范围。
↡一旦继续投入就难以迁移、回滚或改变的时间、数据、人员、供应商和流程代价。Lock-in Cost 包含退出时丢失的数据、重写接口、培训、合同、用户迁移和组织惯性。
↡决定必须重新评审、继续、缩小或退出的日期、流量窗口或证据门槛。Decision Deadline 让临时安排拥有自动复查时点,避免“先这样”变成没人负责的永久承诺。
↡把供应商、工具或实现细节隔在稳定协议之后,使替换和退出不必穿透业务规则的边界。Adapter Boundary 保护业务语义、数据出口和替代路径,但也要通过真实错误和迁移样例验证。
↡在停止当前决定时可执行的流量、数据、配置、通知、回滚和回归动作集合。Exit Path 不是文档里的愿望清单,而是能在低风险样本上演练、计时和复盘的实际路径。
提示18:不设最终决定
提示18:不设最终决定 要求团队区分“当前最合理的选择”和“永远不可改变的承诺”。当架构、数据存储、供应商或工具仍有未知时,先写假设、观察窗口、有效期、替代方案和退出触发器,用小范围实验换取信息。
这不意味着每次评审都推迟。对于不可逆的合规、数据删除或安全承诺,要尽早升级并明确责任;对于仍可隔离的实现选择,则先保留出口和替换点。决策合同要说明哪些部分已承诺、哪些部分仍在学习。
提示19:放弃追逐时尚
提示19:放弃追逐时尚 不是拒绝新工具,而是拒绝把流行度当成项目证据。比较工具时,记录目标问题、当前约束、学习收益、迁移成本、团队熟悉度、退出路径和有效期。新工具若无法在本项目边界内降低风险或缩短反馈,就不应仅因为热门而扩大承诺。
工具实验可以先隔离在 Adapter Boundary,使用低风险数据和真实工作流验证。若它的接口、数据格式或供应商合同提高 Lock-in Cost,就必须把替代方案、导出能力和退出演练列为接受条件。
从命题到可失败的因果链
本页主链是 假设 → Decision Deadline → Adapter Boundary → 替代方案 → Exit Path。每条边要写明传递的是数据、流量、责任、控制还是反馈;每个节点都要有输入、输出、owner、触发器和恢复动作。只有写“可回滚”而没有执行路径,不能证明可逆。
先写预测,再执行正常样本、边界样本和一次故障样本。三类样本共享项目版本和输入,只改变一个决定条件;如果撤回后用户结果、数据状态或通知责任不一致,记录第一个失配并停止扩大演练。
用合同拆开锁定成本
把决定拆成四种承诺:业务承诺、数据承诺、接口承诺和工具承诺。业务承诺可能不能撤回,必须先经风险和合规审查;数据承诺要有导出、保留和删除规则;接口承诺要有版本与兼容层;工具承诺要有替代方案和退出期限。
Lock-in Cost 不应只写成“迁移很贵”。列出数据量、消费者数量、重放难度、流量切换时间、通知对象和团队技能,才能判断是先做出口、先做适配、先缩小流量,还是直接拒绝当前方案。
退出路径与演练
Exit Path 的最小演练包括:关闭新流量、恢复旧路径、保护或重建数据、通知受影响人、运行回归、记录时间和首个失配。演练要使用隔离环境或低风险样本,但必须触达真实的权限、格式、监控和责任边界;假按钮不能证明可退出。
演练失败时不要只修最后显示的错误。先恢复安全状态,定位数据、流量、配置或通知中的首个分叉,再更新决策合同和替代方案。若退出成本已超过可接受范围,Decision Deadline 应触发停止扩大或重新评审。
三步完成一次可逆决策
先写假设、期限和锁定成本
写出当前选择要验证的未知、接受条件、Decision Deadline、Lock-in Cost 和不能撤回的承诺。让团队明确“这次只是实验”与“已经改变用户或数据”的区别。
可重放的可逆性记录
reversible_decision:
unit: tpp20-topic-11-reversibility
assumption: 新支付供应商能在不改变订单语义时降低失败率
decision_deadline: 低风险租户运行两周后复审
lock_in_cost: 数据格式、供应商合同、迁移和团队培训
adapter_boundary: PaymentPort 与供应商错误映射
alternatives: 保留旧供应商,支持按租户切换
exit_path: 关闭新流量 -> 恢复旧路由 -> 重放未完成支付 -> 通知并回归
injected_change: 只缩短观察窗口,不改输入和旧路径
first_mismatch: 供应商导出的退款状态缺少时区
recovery: 停止扩大、补齐状态映射、重放低风险退款这份记录让“可逆”变成可重建的选择权。如果数据出口只在理论上存在、旧路径已经被删除,或通知责任没有 owner,就不能把决定标为可逆;应降低范围或重新设计退出路径。
选择、拒绝与迁移矩阵
| 判断 | 接受证据 | 应拒绝的信号 |
|---|---|---|
| 假设 | 有可观察结果、边界和反例 | 只说“新工具更先进” |
| 期限 | 有复审日期、owner 和触发动作 | 临时开关没有到期日 |
| 适配 | 业务语义与外部实现隔离 | 供应商字段渗入全链路 |
| 数据 | 可导出、重放、保留和恢复 | 没有可验证的迁移样本 |
| 流量 | 能按租户、比例或环境切换 | 只能一次性全量切换 |
| 退出 | 关闭、回滚、通知和回归演练过 | 只有“必要时手工处理” |
迁移到云服务、数据系统或 AI 辅助开发时,分别记录供应商合同、数据敏感性、权限、版本、自动化反馈和责任人。工具能帮助执行迁移,却不能替代对不可撤回承诺和用户影响的判断。
常见误区
本章回顾
掌握 11 可逆性,不是拒绝做决定,而是把未知拆成有期限、可隔离、可替代和可退出的实验。按 提示18:不设最终决定 保存选择权,按 提示19:放弃追逐时尚 用当前项目证据而非流行度评估工具;真正的证据是数据、流量、责任和用户结果都能通过 Exit Path 被安全重建。
可验证练习
练习
本组练习覆盖 11 可逆性、提示18:不设最终决定 和 提示19:放弃追逐时尚,要求提交 Reversibility、Lock-in Cost、Decision Deadline、Adapter Boundary 和 Exit Path 的证据。
问题 1: 团队要采用新的支付供应商,但数据格式和合同都存在未知。怎样设计一个可逆决策?
问题 2: 如何实践“提示18:不设最终决定”,避免临时方案变成永久架构?
问题 3: 如何实践“提示19:放弃追逐时尚”,判断一个热门工具是否值得采用?
名词解释
名词解释
本章出现的专业名词,用大白话再讲一遍。
- Reversibility
在信息不完整时先做有范围实验,并能按预先设计路径撤回的决策性质。
- Lock-in Cost
继续投入后难以迁移、回滚或改变的时间、数据、供应商和组织代价。
- Decision Deadline
决定必须重新评审、继续、缩小或退出的日期、窗口或证据门槛。
- Adapter Boundary
把供应商、工具或实现细节隔在稳定协议之后的边界。
- Exit Path
停止流量、处理数据、通知责任方、回滚并验证结果的可执行动作集合。
前后导航
来源与改写范围
- Pragmatic Programmer 作者页面:核对 Topic 11、提示18和提示19的版本位置与主题范围。
- 中文目录页面:核对 11 可逆性、提示18:不设最终决定、提示19:放弃追逐时尚的公开目录范围。
- 出版社书目信息:交叉核对中文译本的出版信息与版次边界。