4.7 技术风险与止损

一句话

风险管理的产出不是一张风险清单,而是事先写好的止损条件:风险 = 概率 × 损失,处置只有四种(规避 / 减轻 / 转移 / 接受);而止损的前提是——触发条件必须可观测,否则它只是决心。

先算期望损失,再决定处置

处置 典型手段 代价 什么时候选
规避 不引入这个技术 / 不做这个需求 放弃收益 期望损失 > 收益,且损失不可承受
减轻 灰度、限流、降级、双跑、多活 工程成本 + 复杂度 概率降得下来(多数场景)
转移 买 SLA、供应商责任条款、保险 溢价 损失由别人承担更便宜(合规、赔付型)
接受 登记 + 监控,不额外投入 0(但要占监控位) EL 低,或减轻成本 > EL

排序用年期望损失 EL = 概率 P × 单次损失 L,和 4.2 成本-收益分析 里避险类项目的算法同一套:P = 0.2/年 × L = 300 万 → EL = 60 万/年。EL 小于减轻成本时,正确动作是 “接受 + 登记”,不是 “再排一个整改项目”。

🔑 全对冲 = 全不投。 把所有风险都减轻,等于把所有预算都花在 “不出事就看不见收益” 的地方;按 EL 排序是唯一能同时回答 “该花多少” 和 “先花在哪” 的方法。

技术风险八类:先有清单,才谈识别

类别 典型表现 早期信号(可观测)
选型风险 POC 通过,生产长尾不达标 灰度后 P99 比基线劣化 > 30%
人才风险 只有 1 人能改核心模块 bus factor = 1;关键路径只有 1 个 CODEOWNER
锁定风险 数据导不出、API 无替代 导出功能缺失 / 只能走厂商工单
规模风险 10 倍数据量下方案失效 单表月增 15%,且无分区方案
维护风险 上游停更、issue 无人回 6 个月无 release;中位响应 > 7 天
供应链风险 传递依赖爆漏洞 / 投毒 SBOM 中未知来源组件 > 20%
合规风险 数据出境、留存超期 法务口径变化、新增审计要求
成本风险 账单随流量线性上涨 单位请求成本连续两季度上升

其中 “锁定风险” 与 “维护风险” 若选择继续承担,要按 58.2 技术债管理 的格式登记本金与利息,否则它会以 “一直都能跑” 的形式消失在视野里。

清单的作用不是 “列全”,而是让讨论从 “我感觉有风险” 变成“你指的是哪一类、信号是什么”。八类里,前四类必须在选型阶段就过一遍——它们决定了项目的形态;后四类可以进登记册,按季度看。

止损线:四要素,缺一个就只是口号

要素 合格写法 不合格写法
可观测指标 “订单接口 P99(5 分钟窗口)” “系统变慢”
阈值 + 时间窗 “连续 3 天 P99 > 500ms” “效果不好就停”
预设动作 “切回方案 B;冻结新功能上线” “再评估”
执行人 “交易域 TL 有权直接切,事后 24h 内通知” “大家一起判断”

止损单与决策记录是同一次决策的两个侧面:决策记录写 “为什么这么选、什么条件下失效”,止损单写 “失效时怎么观测、谁按按钮”,字段与台账见 4.6 决策框架与决策记录。

# stoploss/D-2026-041.yaml —— 止损单:决策落地时一起写,不另开会
decision: D-2026-041(订单库分库分表)
scope: 订单写入链路(占交易域 70% 流量)
signals:
  - metric: order_create_p99_ms
    window: 5m
    trigger: 连续 3 天 > 500ms                  # 阈值 + 时间窗
  - metric: shard_hotspot_ratio
    window: 1d
    trigger: 单分片承载 > 35% 写入
actions:                                        # 触发后做什么,按序执行
  - 切回单库写入(双跑期内 ≤ 2 小时可回)
  - 冻结新分片迁移任务
  - 24h 内召回复盘,更新决策记录
owner: 交易域 TL                               # 谁有权拍下这个按钮
review_at: 2027-Q1

🔑 止损线写不进监控,就只是决心。 落地验收标准:trigger 里的每个指标都能在告警系统里点到,且有人收到过测试告警。

可靠性上其实早就有同构的东西:35.2 SLA / SLO / SLI / 错误预算 的 “错误预算烧完就冻结变更”,就是一条组织级的止损线——预定阈值、预定动作、预定执行人,唯一区别是它按季度算,技术风险按项目算。

退出方案:四问 + 一次真演练

问题 合格答案 常见的不合格答案
数据能不能导出? 全量导出脚本 + 耗时(例:50 亿行 6 小时) “应该可以”
依赖能不能替换? 替换点清单 + 工作量估算 “接口是标准 SQL”
回滚要多久? ≤ 一个发布窗口,且演练过 “改回去就行”
谁签字执行? 具名 + 授权范围 “运维会处理”

四个问题的判据与 4.3 技术选型的评估维度 的 “退出成本” 同源:换回来要多久、要谁配合、数据能不能导出。

锁定的止损方式是演练,不是合同条款。 每半年做一次 “把主链路切到备用实现” 的演练:不需要真迁走,但要证明 “能迁”。演练不做的退出方案,在出事当天会退化成聊天记录。代码与数据侧的回滚设计见 55.3 回滚设计。

沉没成本:止损只算边际

止损失败几乎从来不是算不出来,而是算错了分母:

错法 后果
“已经投了 6 人月,不能白费” 用过去决定未来,继续投 12 人月去救 6 人月
“再给它一个季度” 每季度都这么说,触发条件永远不满足
“换方案等于承认失败” 把技术决策变成面子问题,风险被隐藏而不是被处置

正确算法只有一句:比较 “继续投的边际成本” 与 “继续投的边际收益”,已投入的部分与这个比较无关。这件事靠人性做不到,所以要靠机制:把止损条件写在启动时(那时没人觉得会失败),而不是写在下坡路上(那时每个人都在找理由)。

Pre-mortem:开会先假设它已经失败

Gary Klein 提出的 pre-mortem(前瞻性后见,HBR 2007)把一个团队从 “预测成功” 切换到 “解释失败”,10 分钟就能问出常规评审问不出的东西:

步 做什么 时长 产出
① 假设 “12 个月后这个项目惨败”,每人独立写 3 条原因 5 分钟 15–20 条原因
② 聚类 + 按 P × L 排序 10 分钟 前 3 条
③ 给前 3 条各写一条早期信号 + 一条止损动作 10 分钟 进止损单

独立写是关键:先发言的人会锚定全场,先写再念才能拿到分歧。

第 ③ 步产出的 “早期信号 + 止损动作” 里,凡是要占用工程的减免项,按 58.4 演进路线图 的分波方式排进下一波,并写清 “这一波没做完时,风险由谁承担”。

反模式

反模式 后果
风险登记册只登记不触发 表越来越长,没人知道哪个该动了
止损条件写成 “效果不好就停” 无法判定,等于没写
止损指标没接监控 触发靠人感知,通常晚 2–4 周
退出方案没演练 出事当天才发现导不出数据
用 “已投入” 当续投理由 沉没成本放大损失
只做规避不做接受 预算全花在低 EL 项,真正的风险没覆盖
风险负责人写成 “团队” 触发时没人有权停
事故后才补风险清单 清单只覆盖上一次事故的形态

三条铁律

🔑 止损条件在启动时写、写进监控、指定执行人;三件事缺一件,止损就只是表态。

🔑 只算边际,不算沉没:继续投的决策只看 “再投多少、还能拿回多少”。

🔑 退出方案必须演练过;没演练过的退出方案,与没有退出方案等价。

自检

Q1 团队说 “这个新数据库的风险我们评估过了,可控”。你要追问哪三样,才能把这句话变成可执行的止损?

▸ 答案:① 信号(哪个指标、什么窗口、阈值多少);② 动作(触发后切回什么、多久内切完、谁有权拍);③ 复核(谁在什么日期回看)。三样齐了才算止损线;只说 “可控”,等于把风险交给运气——而它的 EL 也没算过(P × L 多少、减轻成本多少)。

Q2 一个项目已投入 6 人月,现在发现方案在新的数据量下不达标。为什么 “不能白投” 是错的论证?

▸ 答案:因为 6 人月是沉没成本,无论继续还是停止都不会回来。唯一相关的是 “再投 X 人月,能拿回多少”——若再投 3 人月只能挽回 20% 的目标,而换方案需 4 人月能达成 100%,正确选择是换。这个计算与已投入无关;把它写成 “已投入” 的形式,是在用过去绑架未来。

Q3 供应商锁定风险的 “止损” 为什么是演练,而不是合同条款?

▸ 答案:因为合同只能事后追责,不能恢复服务。锁定的真实损失是 “迁移不出去” 的时间,而时间只能靠 “证明能迁” 来压缩:导出脚本跑过、替换点清单存在、切换演练过。条款写得再漂亮,若没人跑过一次导出,出事当天仍是从零开始。

Q4 风险清单上 30 条都是 “高”,该怎么排?

▸ 答案:用 EL = P × L 算成钱再排,而不是用 “高/中/低” 三档贴标签。30 条全高说明两件事:① 没有量化(P 和 L 都没估);② 处置预算没有上限约束。算出 EL 后通常会发现前 3 条占 80% 的期望损失——剩下的要么接受(登记 + 监控),要么排进后续季度,而不是同时开工。

Q5 Pre-mortem 与普通风险评审有什么不同,为什么它更有效?

▸ 答案:普通评审问 “可能有什么风险”,答案受 “社会赞许” 影响(说 “应该没问题” 更安全);pre-mortem 先设定 “它已经失败了”,把任务变成解释一个既定事实,心理负担从 “唱衰” 变成 “分析”,于是能说出真话。加上 “独立写再汇总”,避免第一个发言的人锚定全场。

关联