首页/开发/代码质量与评审速查/债务决策记录:把取舍写进 ADR
技术债与度量63 条

债务决策记录:把取舍写进 ADR

每个「有意负债」都留下决策记录:背景、选项、决定、代价与偿还条件(触发条件);将来复盘时能看清当初的约束,避免把有意选择误读为能力问题。

债务决策记录是什么

每个「有意负债」都留一份决策记录:背景是什么、有哪些选项、选了哪个、代价是什么、什么条件下偿还。将来复盘时能看清当初的约束,避免把有意选择误读为能力问题。载体可以是架构决策记录(ADR),也可以直接写进债务台账的对应条目。

基本信息

载体ADR(Architecture Decision Record)或债务台账条目
要素背景 / 选项 / 决定 / 代价 / 偿还触发条件
复盘按触发条件定期检视与清偿
存放与代码同仓库,随代码一起演进

记录要点

  • 背景写约束条件:交付窗口、人力、兼容要求,而不是「当时没时间」
  • 列出被否掉的选项与否定理由,避免后人重复评估同一方案
  • 代价写具体后果:复用受限、性能上限、后续迁移成本
  • 偿还触发条件必须可观察:支持第二种数据库时、模块首次大变更时
  • 状态可更新:已偿还、已失效、仍有效,三者含义不同
  • 决定改变时追加新记录,不改写旧记录

ADR 片段示例

ADR 片段示例
## Status
Accepted(2026-03)

## Context
v1 交付窗口 6 周,团队无 ORM 经验;报表口径仍在变动。

## Decision
直接使用字符串拼接生成 SQL,边界白名单兜底。

## Consequences
- 复用受限,含注入风险(由白名单与参数校验缓解)
- 后续支持多数据库需要重写取数层

## Repay When
支持第二种数据库,或本模块首次重大变更时。

ADR 结构

部分写什么常见缺失
Status提议 / 已接受 / 已废弃 / 已偿还只写一次状态,之后从不更新
Context约束条件与背景只写结论,看不出约束
Decision选择了什么描述模糊,后人无法判断范围
Consequences代价与收益只写好处,代价无人记录
Repay When可观察的触发条件写成「将来有时间时」
记录只写决定不写代价,后人无法评估偿还收益:看到「用了字符串拼 SQL」却不知道省下了什么,也就无法判断现在重写值不值。
触发条件不可观察等于没有条件:「将来有时间时」永远不会触发。写成「支持第二种数据库时」这类可判定的信号,复盘时才能自动筛出待偿还项。

易错点

  • 记录只写决定不写代价:后人无法评估偿还收益,重写与否只能靠猜
  • 触发条件不可观察:偿还永远不触发,记录沦为形式
  • 改写旧记录而不追加:历史背景被覆盖,复盘时看不到当初的约束
  • ADR 存在个人笔记里:团队看不到,讨论时重复评估同一方案

数据来源与参考

  • Michael Nygard · ADR 实践(documenting architecture decisions)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌