无法预防时降低后果
别名: 后果降级 · 错误容忍 · blast radius · error tolerance
概念解释
有些动作消不掉出错可能:自由文本、外部服务、别人同时改同一份数据。这时流程要做的不是写得更好的失败声明,而是把一次错的爆炸半径收小——默认走可逆方向、一次只动一条、失败停在局部而不是整单作废。这条谈预防失败之后的代价结构,不谈撤销入口怎么摆、回收站怎么找、崩溃后草稿怎么回来。
机制
预防假设设计者能预先枚举非法态;开放输入和分布式系统打破这个假设。人仍会滑、仍会判错,系统能控制的是错完之后还剩什么。安全默认(safe default)让最常见的点击落在可改回的一侧:归档而不是粉碎、停用而不是销户、保存为草稿而不是直接对客发布。作用域限制让一次手滑只打中当前行,而不是选中集合里的四百条。时间上把「生效」从「点击」上拆开,给后果一个可以被发现的间隔。降低后果不是原谅错误,是承认错误会发生,并拒绝让一次滑变成不可修的终态。
怎么研究
把同一高风险任务做成「失败即全量回滚 / 失败只回滚出错项 / 失败仍提交成功项」三种,比较损失与可理解性。
自变量:默认是否可逆、单次操作的作用范围、失败是整单还是逐项、生效是否延迟。 因变量:不可逆损失件数、用户发现损失的时间、误伤范围、事后恢复成功率、是否把部分成功误读成全部失败。
实验室很难制造真实金钱或数据损失,常用「刚输入的一段文字被删」或积分作为代价代理。注意被试在实验里会异常谨慎,真实产品里的爆炸半径要靠事故复盘量,不能靠问卷里的「我会很小心」。
边界
监管要求「点下去即生效且留痕」的场景,不能用可逆默认去稀释法律责任,只能把作用域做小、把生效前的摘要做清楚。安全响应(吊销被盗会话、冻结异常支付)必须立即扩大作用范围,降低后果在这里等于放任攻击。有些失败的「局部成功」本身会造成账实不符,这时宁可整单失败,也不要留下半成品。降低后果也不能替代把能消掉的非法态先消掉。
怎么落地
- 为每个破坏性动作写清:默认落在可逆侧还是不可逆侧、一次最多动几条、失败时已成功的部分是否保留。
- 把「删除」默认做成移出当前视图而不是立即销毁;把「发布」默认做成仅自己可见,直到人明确选择对外。
- 批量接口按项提交,禁止一个失败码把已成功项一起抹掉,除非业务上半成品比全失败更危险。
- 验证:用一次故意的错误操作走主路径,记下实际被改写的对象数量和能否在五分钟内还原;爆炸范围大于操作时所见图,后果就没被限制住。