其他
做重大技术架构决策时,用 ADR 记录上下文…
在采用框架、选择数据库、设计 API/安全/集成模式、记录设计取舍或回顾历史决策时,用架构决策记录(ADR)做结构化文档、评审与索引。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 48/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 55/100 ×0.15
适用场景
做重大技术架构决策时,用 ADR 记录上通用
解决思路
- 为每个重大技术决策创建 ADR,记录三要素:上下文(为什么需要决策)、决策(决定了什么)、后果(结果影响)。
- 用生命周期状态跟踪 ADR:提议(Proposed)→ 已接受(Accepted)→ 已弃用(Deprecated)→ 被取代(Superseded);未采纳则标记为拒绝(Rejected)。
- 采用标准 ADR(MADR)模板时,标题格式写为 ADR-0001: 使用 PostgreSQL 作为主数据库。
- 采用标准 ADR(MADR)模板时,写状态(Status)字段。
- 采用标准 ADR(MADR)模板时,写上下文(Context),描述背景、规模、需求和团队经验等。
- 采用标准 ADR(MADR)模板时,写决策驱动因素(Decision Drivers),列出必须满足和应该满足的驱动因素。
- 采用标准 ADR(MADR)模板时,写考虑过的选项(Considered Options),逐项列出每个选项的优点(Pros)和缺点(Cons)。
- 采用标准 ADR(MADR)模板时,写决策(Decision),明确最终选择。
- 采用标准 ADR(MADR)模板时,写理由(Rationale),说明选择理由。
- 采用标准 ADR(MADR)模板时,写后果(Consequences),分正面(Positive)、负面(Negative)、风险(Risks)。
- 采用标准 ADR(MADR)模板时,写实施说明(Implementation Notes),列出落地实施要点。
- 采用标准 ADR(MADR)模板时,写相关决策(Related Decisions),链接相关 ADR。
- 采用标准 ADR(MADR)模板时,写参考资料(References),附外部文档和内部资料链接。
- 采用轻量 ADR 模板时,写标题、状态(Status)、日期(Date)、决策者(Deciders)。
- 采用轻量 ADR 模板时,写上下文(Context)、决策(Decision)、后果(Consequences);后果分优点(Good)、缺点(Bad)、缓解措施(Mitigations)。
- 采用 Y-Statement 格式时,使用句式:在……背景下,面对……,我们决定采用……而不采用……,以实现……,并接受……。
- 采用弃用 ADR 模板时,写标题、状态(如 Accepted,Supersedes ADR-0003)、上下文(Context)、决策(Decision)。
- 采用弃用 ADR 模板时,写迁移计划(Migration Plan),并按 Phase 分阶段执行,例如创建新 schema 并双写、回填历史数据并校验一致性、切换读取并监控、停止旧写入并下线。
- 采用弃用 ADR 模板时,写后果(Consequences),分正面(Positive)和负面(Negative)。
- 采用弃用 ADR 模板时,写经验教训(Lessons Learned)。
- 采用 RFC 风格模板时,写标题、摘要(Summary)、动机(Motivation)、详细设计(Detailed Design)、缺点(Drawbacks)、替代方案(Alternatives)、未决问题(Unresolved Questions)、实施计划(Implementation Plan)、参考资料(References)。
- 采用 RFC 风格模板时,在详细设计(Detailed Design)中写事件存储(Event Store)、事件 schema、投影(Projections)、技术选型(Technology)和替代方案。
- 采用 RFC 风格模板时,在未决问题(Unresolved Questions)中用 checklist 列出待决问题。
- 建立 docs/adr/ 目录,放入 README.md、template.md 和按 NNNN-title-with-dashes.md 命名的 ADR 文件。
- 对弃用 ADR,在旧文件标注 [DEPRECATED],并在新 ADR 中写明 Supersedes。
- 在 docs/adr/README.md 中维护索引表格,列包括 ADR、标题(Title)、状态(Status)、日期(Date),并链接到各 ADR 文件。
- 在 README.md 中定义 ADR 状态:提议(Proposed)、已接受(Accepted)、已弃用(Deprecated)、被取代(Superseded)、拒绝(Rejected)。
- 创建新 ADR 时,复制 template.md 到 NNNN-title-with-dashes.md。
- 创建新 ADR 时,填写模板。
- 创建新 ADR 时,提交 PR 进行评审。
- 创建新 ADR 时,批准后更新索引。
- 安装 adr-tools:brew install adr-tools。
- 初始化 ADR 目录:adr init docs/adr。
- 创建新 ADR:adr new "Use PostgreSQL as Primary Database"。
- 取代旧 ADR:adr new -s 3 "Deprecate MongoDB in Favor of PostgreSQL"。
- 生成目录:adr generate toc > docs/adr/README.md。
- 链接相关 ADR:adr link 2 "Complements" 1 "Is complemented by"。
- 提交 ADR 前检查:上下文(Context)清楚说明问题。
- 提交 ADR 前检查:所有可行选项都考虑。
- 提交 ADR 前检查:优点(Pros)和缺点(Cons)平衡诚实。
- 提交 ADR 前检查:正面和负面后果均记录。
- 提交 ADR 前检查:相关 ADR 已链接。
- 评审 ADR 时检查:至少 2 名资深工程师评审。
- 评审 ADR 时检查:咨询受影响团队。
- 评审 ADR 时检查:考虑安全影响。
- 评审 ADR 时检查:记录成本影响。
- 评审 ADR 时检查:评估可逆性。
- ADR 接受后检查:更新 ADR 索引。
- ADR 接受后检查:通知团队。
- ADR 接受后检查:创建实现 ticket。
- ADR 接受后检查:更新相关文档。
- Do:尽早写 ADR,在实现开始前。
- Do:保持简短,最多 1-2 页。
- Do:诚实写权衡,包含真实缺点。
- Do:链接相关决策,构建决策图。
- Do:状态变化时更新,被取代时标记已弃用(Deprecated)。
- Don't:不要修改已接受的 ADR,写新的 ADR 取代它。
- Don't:不要跳过上下文(Context),未来读者需要背景。
- Don't:不要隐藏失败,被拒绝的决策也有价值。
- Don't:不要含糊,要具体决策和具体后果。
- Don't:不要忘记实现,没有行动的 ADR 是浪费。
适用边界 · 注意事项
- 小版本升级、bug 修复、实现细节、日常维护、配置变更等低影响或例行事项,不必写 ADR。
- 决策可逆、成本低、无需长期记录背景时,可跳过 ADR。
- 没有显著架构取舍或不需要团队对齐时,不适用 ADR。