Arch Day 16: ADR体系建设(高级)
ADR(Architecture Decision Record)体系建设不是简单地写决策文档,而是构建组织级的架构决策追踪系统——让每个重要的技术选择都有记录、可追溯、可审计,使架构决策从"口头约定"演化为"制度化资产"。
日期: 2026-04-15 (Day 16) 阶段: 第一阶段 - 架构基础 标签: #ADR #架构决策 #决策追踪 #技术雷达 #架构治理
核心概念
一句话定义
ADR(Architecture Decision Record)体系建设不是简单地写决策文档,而是构建组织级的架构决策追踪系统——让每个重要的技术选择都有记录、可追溯、可审计,使架构决策从"口头约定"演化为"制度化资产"。
为什么资深架构师仍需关注
在我十年金融软件经验中,经历过无数次这样的场景:
- "为什么当初选了MongoDB而不是PostgreSQL?" —— 没人记得
- "这个微服务拆分的决策是谁做的?基于什么理由?" —— 当初决策的人已经离职了
- "三年前我们评估过Kafka,为什么没用?现在要不要重新评估?" —— 找不到任何记录
这就是架构知识流失问题。在金融行业,监管审计经常需要追溯技术决策的依据——"为什么选择了这种加密方案?""灾备方案的设计依据是什么?"没有ADR体系,这些问题要么回答不了,要么每次都要从头研究。
资深架构师需要关注ADR体系的原因:
- 决策一致性:团队中多个架构师做决策时,ADR确保不出现矛盾
- 新人上手:新加入的工程师能快速理解"为什么系统是这样的"
- 决策复用:类似问题不需要每次重新讨论
- 技术债管理:标记为Deprecated的ADR就是技术债的显性化
- 监管合规:金融行业的审计要求
常见误区与反模式
| 误区 | 表现 | 正确做法 |
|---|---|---|
| ADR = 会议纪要 | 记录了讨论过程,但没有明确决策和理由 | ADR应该有明确的"决策"和"理由"部分 |
| 只记录采纳的方案 | 只写最终选择,不记录被否决的方案 | 必须记录考虑过的其他选项及其否决理由 |
| 写了不维护 | ADR写完就丢进wiki角落 | ADR需要有生命周期管理(review/deprecate/supersede) |
| 粒度不当 | 每个小决定都写ADR / 只写超大决策 | 建立分级标准,战略/战术/实现级 |
| 事后补写 | 系统已经上线了才开始补ADR | ADR应该在决策时写,即使是简短版本 |
| 缺乏模板 | 每个人写的格式都不一样 | 统一模板,降低写作门槛 |
知识点详解
知识点一:ADR分类体系
不是所有架构决策都同等重要。建立分级体系可以让团队把精力集中在最重要的决策上。
三级分类框架:
┌─────────────────────────────────────────┐
│ 战略级 ADR (Strategic) │
│ 影响范围: 整个系统/多个系统 │
│ 决策者: 架构委员会/CTO │
│ 示例: 微服务vs单体/主数据库选型/云厂商选择│
│ Review频率: 每年 │
│ 编号: ADR-S-XXX │
├─────────────────────────────────────────┤
│ 战术级 ADR (Tactical) │
│ 影响范围: 单个服务/模块 │
│ 决策者: Tech Lead/高级工程师 │
│ 示例: 缓存策略/消息序列化格式/API版本策略 │
│ Review频率: 每季度 │
│ 编号: ADR-T-XXX │
├─────────────────────────────────────────┤
│ 实现级 ADR (Implementation) │
│ 影响范围: 代码层面的关键选择 │
│ 决策者: 开发团队 │
│ 示例: ORM选择/日志框架/测试策略 │
│ Review频率: 需要时 │
│ 编号: ADR-I-XXX │
└─────────────────────────────────────────┘
分级判断标准:
| 判断维度 | 战略级 | 战术级 | 实现级 |
|---|---|---|---|
| 影响范围 | 跨系统/全组织 | 单系统/模块 | 单服务/代码 |
| 变更成本 | 极高(数月工期) | 高(数周工期) | 中低(数天) |
| 可逆性 | 极难逆转 | 困难但可逆 | 相对容易 |
| 涉及利益方 | 业务+技术+管理 | 技术团队 | 开发团队 |
| 典型决策频率 | 每年<10个 | 每季度5-15个 | 每月若干 |
知识点二:ADR生命周期管理
ADR不是"写完就不管了"的静态文档,而是有完整生命周期的活文档。
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Proposed │───→│ Accepted │───→│Deprecated│
│ (草案) │ │ (生效) │ │ (废弃) │
└──────────┘ └─────┬────┘ └──────────┘
│ │ ▲
│ │ │
▼ ▼ │
┌──────────┐ ┌──────────┐ │
│ Rejected │ │Superseded│──────────┘
│ (否决) │ │ (被取代) │
└──────────┘ └──────────┘
各状态说明:
| 状态 | 含义 | 触发条件 | 行动 |
|---|---|---|---|
| Proposed | 决策提案,待讨论 | 有人提出架构决策需求 | 安排review会议 |
| Accepted | 已通过,正在执行 | Review通过 | 团队遵循执行 |
| Deprecated | 不再推荐,但旧系统可继续 | 有更好的方案出现 | 新项目不再使用 |
| Superseded | 被新ADR完全取代 | 新ADR明确取代旧ADR | 标注新ADR编号 |
| Rejected | 讨论后被否决 | Review未通过 | 记录否决理由(很重要) |
状态转换规则:
1. Proposed → Accepted: 需要至少2位高级工程师+1位架构师review
2. Proposed → Rejected: 需要记录否决理由
3. Accepted → Deprecated: 需要说明废弃原因和迁移路径
4. Accepted → Superseded: 新ADR必须引用旧ADR编号
5. Deprecated ADR保留至少1年后才能归档删除
知识点三:ADR与技术雷达的联动
ThoughtWorks技术雷达将技术分为四个象限(采纳/试验/评估/暂缓),ADR可以与技术雷达联动形成完整的技术治理体系。
技术雷达 ADR体系
┌──────────┐ ┌──────────────────┐
│ 采纳 │──── 对应 ────→│ Accepted ADR │
│ (Adopt) │ │ "我们选择使用X技术" │
├──────────┤ ├──────────────────┤
│ 试验 │──── 对应 ────→│ Proposed ADR │
│ (Trial) │ │ "我们在项目Y试用X" │
├──────────┤ ├──────────────────┤
│ 评估 │──── 对应 ────→│ (暂无ADR) │
│ (Assess) │ │ 列入评估清单 │
├──────────┤ ├──────────────────┤
│ 暂缓 │──── 对应 ────→│ Rejected ADR │
│ (Hold) │ │ "我们决定不使用X" │
└──────────┘ └──────────────────┘
联动流程:
- 技术雷达每季度更新一次
- 新技术进入"评估"→安排POC→结论写入ADR
- POC成功→技术雷达标"试验"→ADR状态"Proposed"
- 试验成功→技术雷达标"采纳"→ADR状态"Accepted"
- 技术过时→技术雷达标"暂缓"→相关ADR"Deprecated"
知识点四:ADR Review机制
ADR Review流程:
1. 提交者写ADR草案(Proposed)
│
2. 发起Review请求(指定reviewer)
│
3. 异步Review阶段(2-5个工作日)
│ ├── 各reviewer独立审阅
│ ├── 在ADR文档上留下评论
│ └── 标注: 同意/有疑问/反对
│
4. 同步讨论会(如有分歧)
│ ├── 30分钟时限
│ ├── 提交者解释关键决策
│ └── 讨论分歧点
│
5. 最终决策
│ ├── 全部同意 → Accepted
│ ├── 有条件同意 → 修改后Accepted
│ └── 重大分歧 → Rejected或升级决策
│
6. 通知相关团队
Review清单:
## ADR Review Checklist
### 内容完整性
- [ ] 问题背景是否清晰?
- [ ] 是否列出了所有合理的替代方案?
- [ ] 每个替代方案的优劣分析是否客观?
- [ ] 决策理由是否充分且可追溯?
- [ ] 是否识别了主要风险和缓解措施?
### 质量属性
- [ ] 是否评估了对性能的影响?
- [ ] 是否评估了对可用性的影响?
- [ ] 是否评估了对安全性的影响?
- [ ] 是否评估了对可维护性的影响?
### 实施可行性
- [ ] 团队是否有能力实施?
- [ ] 时间线是否合理?
- [ ] 成本估算是否准确?
- [ ] 是否有迁移/回退计划?
### 组织对齐
- [ ] 是否与已有ADR一致(无矛盾)?
- [ ] 是否符合技术雷达策略?
- [ ] 是否获得相关利益方的确认?
知识点五:ADR模板(高质量版)
# ADR-[S/T/I]-[编号]: [决策标题]
## 元数据
- 状态: Proposed | Accepted | Deprecated | Superseded | Rejected
- 日期: YYYY-MM-DD
- 决策者: [姓名/角色]
- Reviewer: [姓名列表]
- 取代: [旧ADR编号] (如适用)
- 被取代: [新ADR编号] (如适用)
- 关联: [相关ADR编号列表]
## 背景与问题
### 业务背景
[为什么需要做这个决策?业务驱动力是什么?]
### 技术背景
[当前技术现状是什么?技术约束有哪些?]
### 约束条件
[预算/时间/团队能力/合规等约束]
## 决策驱动因素(Decision Drivers)
1. [因素1及权重]
2. [因素2及权重]
3. [因素3及权重]
## 候选方案
### 方案A: [名称]
- 描述: ...
- 优势: ...
- 劣势: ...
- 成本: ...
- 风险: ...
### 方案B: [名称]
- 描述: ...
- 优势: ...
- 劣势: ...
- 成本: ...
- 风险: ...
### 方案C: [名称] (如有)
...
## 方案对比
| 维度 | 方案A | 方案B | 方案C |
|------|-------|-------|-------|
| 性能 | ... | ... | ... |
| 成本 | ... | ... | ... |
| 复杂度 | ... | ... | ... |
| 团队经验 | ... | ... | ... |
| 厂商锁定 | ... | ... | ... |
## 决策
选择方案[X]。
## 决策理由
[详细解释为什么选择这个方案,而不是其他方案]
## 后果
### 积极后果
- ...
### 消极后果(及缓解措施)
- 消极: ... → 缓解: ...
### 风险
- ...
## 实施计划
- Phase 1: ...
- Phase 2: ...
## Review记录
- [日期] [姓名]: [意见]
- [日期] [姓名]: [意见]
对比分析
ADR工具与平台对比
| 工具 | 存储方式 | 版本控制 | 搜索能力 | 模板支持 | 协作 | 适用团队 |
|---|---|---|---|---|---|---|
| Markdown in Git | 代码仓库 | 天然支持 | Git搜索 | 自定义 | PR Review | 技术团队 |
| Confluence | Wiki | 页面历史 | 全文搜索 | 模板丰富 | 评论 | 混合团队 |
| adr-tools(CLI) | 本地文件 | 手动 | grep | 固定模板 | 无 | 个人/小团队 |
| Backstage | 集成平台 | 依赖后端 | 结构化 | 可定制 | 工作流 | 大型组织 |
| Notion | 云文档 | 页面历史 | 全文搜索 | 数据库 | 实时协作 | 创业团队 |
| ADR Manager | 专用工具 | 内置 | 结构化 | 内置 | 工作流 | 重度使用团队 |
我的推荐:
- 小团队(5-15人):Markdown in Git,和代码一起管理,零成本
- 中型组织(50-200人):Confluence + 结构化模板 + 定期review
- 大型组织(200+人):专用平台(Backstage/自研) + 自动化工作流
ADR与其他决策文档对比
| 文档类型 | 关注点 | 生命周期 | 受众 | 与ADR关系 |
|---|---|---|---|---|
| ADR | 架构层面的技术决策 | 长期维护 | 技术团队 | 核心 |
| RFC | 提案征求意见 | 决策前 | 全团队 | ADR的前序 |
| 设计文档 | 详细设计方案 | 项目周期 | 开发团队 | ADR的实现展开 |
| PRD | 产品需求 | 版本周期 | 产品+技术 | ADR的业务驱动 |
| 技术方案 | 实现细节 | 开发周期 | 开发人员 | ADR的细化 |
架构设计实操
实操目标
写5个高质量ADR,覆盖金融系统的核心技术选型,并建立ADR分类体系。
ADR-S-001: 主数据库选型
# ADR-S-001: 交易系统主数据库选型
## 元数据
- 状态: Accepted
- 日期: 2026-04-15
- 决策者: 首席架构师
- Reviewer: DBA团队Lead, 后端Tech Lead, 安全工程师
- 关联: ADR-S-003(缓存策略), ADR-T-002(读写分离)
## 背景与问题
### 业务背景
跨境支付平台核心交易系统需要选择主数据库。系统需要支持:
- 日均50万笔交易,峰值2000 TPS
- 强一致性(金融交易不允许数据丢失或不一致)
- 多币种实时汇率计算
- 7年数据保留(监管要求)
### 技术约束
- 团队有丰富的关系型数据库经验
- 需要ACID事务支持
- 需要成熟的高可用方案
- 云原生部署(AWS)
## 决策驱动因素
1. 数据一致性保证(权重40%)
2. 高可用性方案成熟度(权重25%)
3. 团队经验和生态(权重20%)
4. 性能和可扩展性(权重15%)
## 候选方案
### 方案A: PostgreSQL (AWS Aurora)
- 描述: 基于PostgreSQL的云原生数据库
- 优势: 强一致性/丰富的数据类型/活跃社区/Aurora多副本
- 劣势: 单写节点/Aurora vendor lock-in
- 成本: ~$3000/月(Multi-AZ, r6g.2xlarge)
### 方案B: MySQL (AWS Aurora)
- 描述: 基于MySQL的云原生数据库
- 优势: 极广泛的使用/成熟的运维工具/Aurora Global Database
- 劣势: 功能不如PostgreSQL丰富/JSON支持较弱
- 成本: ~$2800/月(Multi-AZ, r6g.2xlarge)
### 方案C: CockroachDB
- 描述: 分布式SQL数据库,原生多写
- 优势: 原生分布式/多写/强一致性/跨地域部署
- 劣势: 团队无经验/生态较小/成本更高/延迟略高
- 成本: ~$5000/月(CockroachDB Dedicated)
## 方案对比
| 维度 | PostgreSQL/Aurora | MySQL/Aurora | CockroachDB |
|------|------------------|-------------|-------------|
| 一致性 | 强(SERIALIZABLE) | 强(但默认RR) | 强(SERIALIZABLE) |
| 高可用 | Aurora多副本(成熟) | Aurora多副本(成熟) | 原生多写(新) |
| 团队经验 | 丰富 | 非常丰富 | 无 |
| 水平扩展 | 读扩展/写单点 | 读扩展/写单点 | 原生水平扩展 |
| 金融案例 | 很多 | 非常多 | 增长中 |
| 监控工具 | 成熟 | 最成熟 | 中等 |
| 迁移风险 | 低 | 低 | 高 |
## 决策
选择方案A: PostgreSQL (AWS Aurora)。
## 决策理由
1. PostgreSQL的SERIALIZABLE隔离级别和丰富的数据类型(如NUMERIC精确计算)最适合金融场景
2. Aurora提供了成熟的高可用方案(多AZ自动故障转移, <30s)
3. 团队有丰富的PostgreSQL经验,学习成本为零
4. 虽然CockroachDB的分布式架构更先进,但团队缺乏经验,且当前规模(2000 TPS)不需要分布式写入
5. 如果未来规模增长到需要分布式写入,可以评估迁移到CockroachDB(ADR预留)
## 后果
### 积极后果
- 成熟可靠的技术选型,团队可快速上手
- Aurora的运维负担低(自动备份/补丁/故障转移)
- 金融场景有大量参考案例
### 消极后果(及缓解措施)
- 写入是单点瓶颈 → 缓解: 读写分离(ADR-T-002) + 分库分表预案
- Aurora有AWS vendor lock-in → 缓解: 应用层使用标准SQL,避免Aurora特有功能
- 单写节点故障转移时有短暂不可用(~30s) → 缓解: 应用层重试机制
## 实施计划
- Phase 1(第1-2周): 搭建Aurora集群,配置Multi-AZ
- Phase 2(第3-4周): 数据模型设计,性能基准测试
- Phase 3(第5-6周): 应用适配,读写分离配置
ADR-S-002: 服务间通信方式
# ADR-S-002: 微服务间通信方式选型
## 元数据
- 状态: Accepted
- 日期: 2026-04-15
- 决策者: 架构委员会
- Reviewer: 后端Tech Lead, 基础设施Lead, QA Lead
## 背景与问题
微服务架构中,服务间通信方式直接影响系统的可靠性、性能和可维护性。
需要确定同步通信和异步通信的技术选型。
## 决策
### 同步通信: gRPC
- 内部服务间调用统一使用gRPC
- 理由: 强类型(Protocol Buffers)/高性能/双向流/成熟的服务治理
### 异步通信: Apache Kafka
- 事件驱动和异步处理统一使用Kafka
- 理由: 高吞吐/持久化/有序/金融行业广泛使用
### 外部API: REST(OpenAPI 3.0)
- 面向外部客户端的API使用REST
- 理由: 通用性/易调试/生态成熟
## 通信模式决策矩阵
| 场景 | 通信方式 | 理由 |
|------|---------|------|
| 交易链路(同步) | gRPC | 低延迟/强一致 |
| 交易事件通知 | Kafka | 解耦/可靠/可重放 |
| 对账/批处理 | Kafka | 高吞吐/有序 |
| 外部商户API | REST | 通用/易集成 |
| 实时行情推送 | gRPC Stream | 双向流/高效 |
ADR-T-003: 分布式缓存策略
# ADR-T-003: 分布式缓存策略
## 元数据
- 状态: Accepted
- 日期: 2026-04-15
- 决策者: 后端Tech Lead
- 关联: ADR-S-001(数据库选型)
## 决策
选择Redis Cluster作为分布式缓存。
## 缓存策略
| 数据类型 | 缓存策略 | TTL | 一致性方案 |
|---------|---------|-----|----------|
| 汇率数据 | Cache-Aside | 5s | TTL过期自动刷新 |
| 用户Session | Write-Through | 30min | Redis为主存储 |
| 热点查询结果 | Cache-Aside | 60s | 变更时主动失效 |
| 配置数据 | Refresh-Ahead | 5min | 发布时主动推送 |
## 缓存一致性保障
采用"先更新DB,后删除缓存"策略:
1. 更新数据库
2. 删除缓存(而非更新缓存)
3. 下次读取时从DB加载到缓存
不选择"先删缓存后更新DB"的原因:
并发场景下可能读到旧数据并缓存,导致长时间不一致。
## 缓存穿透/雪崩防护
- 穿透: 布隆过滤器 + 空值缓存(TTL=30s)
- 雪崩: TTL随机偏移 + 熔断降级
- 击穿: 分布式锁(Redisson) + 单Flight模式
ADR-T-004: 消息队列使用规范
# ADR-T-004: Kafka消息队列使用规范
## 元数据
- 状态: Accepted
- 日期: 2026-04-15
- 关联: ADR-S-002(服务通信)
## Topic命名规范
{domain}.{entity}.{event-type}
示例:
- payment.transaction.created
- payment.transaction.completed
- risk.assessment.flagged
- notification.email.sent
## 消息格式
统一使用Avro + Schema Registry:
- 理由: 强类型/向前向后兼容/Schema演进
- 编码: Avro Binary(非JSON,节省带宽)
## 关键配置决策
| 配置项 | 决策 | 理由 |
|--------|------|------|
| acks | all | 金融场景不允许丢消息 |
| enable.idempotence | true | 精确一次语义 |
| min.insync.replicas | 2 | 至少2副本确认 |
| replication.factor | 3 | 三副本冗余 |
| retention | 30天 | 满足审计和重放需求 |
## 消费者幂等性
所有消费者必须实现幂等处理:
- 方案1: 业务ID去重(推荐)
- 方案2: 数据库唯一约束
- 禁止: 依赖Kafka偏移量保证仅一次
ADR-T-005: 部署策略
# ADR-T-005: 生产环境部署策略
## 元数据
- 状态: Accepted
- 日期: 2026-04-15
- 决策者: DevOps Lead + 架构师
## 决策
采用蓝绿部署(Blue-Green) + 金丝雀发布(Canary)混合策略。
## 部署流程
1. 代码合并到main → 自动构建Docker镜像
2. 自动部署到Staging环境 → 运行全量回归测试
3. Staging通过 → 金丝雀部署(5%流量) → 观察30分钟
4. 金丝雀正常 → 分批扩量(5%→25%→50%→100%)
5. 每批次观察15分钟核心指标(错误率/延迟/业务成功率)
6. 任何异常 → 自动回滚到蓝色环境
## 回滚策略
| 触发条件 | 回滚方式 | 时间要求 |
|---------|---------|---------|
| 错误率>0.1% | 自动回滚 | <2分钟 |
| P99延迟>2x | 手动确认后回滚 | <5分钟 |
| 业务指标异常 | 人工判断 | <15分钟 |
| 数据库变更 | 需要执行回滚SQL | <30分钟 |
## 数据库变更原则
- Schema变更必须向后兼容
- 先加列后删列(分两次发布)
- 禁止在部署过程中执行破坏性变更
建立ADR索引与分类
# ADR索引
## 战略级 (Strategic)
| 编号 | 标题 | 状态 | 日期 |
|------|------|------|------|
| ADR-S-001 | 交易系统主数据库选型 | Accepted | 2026-04-15 |
| ADR-S-002 | 微服务间通信方式选型 | Accepted | 2026-04-15 |
## 战术级 (Tactical)
| 编号 | 标题 | 状态 | 日期 |
|------|------|------|------|
| ADR-T-003 | 分布式缓存策略 | Accepted | 2026-04-15 |
| ADR-T-004 | Kafka消息队列使用规范 | Accepted | 2026-04-15 |
| ADR-T-005 | 生产环境部署策略 | Accepted | 2026-04-15 |
## 决策关联图
ADR-S-001(数据库) ←→ ADR-T-003(缓存)
ADR-S-002(通信) ←→ ADR-T-004(消息队列)
ADR-T-005(部署) ←→ ADR-T-004(消息队列)
AI增强实践
AI辅助ADR编写
Prompt模板——ADR草稿生成:
你是一位资深金融系统架构师。我需要为以下决策写ADR:
决策问题: [描述需要做的技术决策]
业务背景: [业务场景和约束]
技术约束: [团队能力/预算/时间限制]
已知候选方案: [列出已知方案]
请按照标准ADR模板生成草稿,包括:
1. 至少3个候选方案的详细对比
2. 从性能/成本/复杂度/团队经验/厂商锁定5个维度评估
3. 明确的决策理由
4. 潜在风险和缓解措施
要求: 面向金融系统,重点关注数据一致性和合规性。
AI辅助ADR Review:
请review以下ADR,检查:
1. 是否遗漏了重要的候选方案?
2. 对比分析是否客观?
3. 决策理由是否充分?
4. 是否遗漏了重要的风险?
5. 是否与以下已有ADR存在矛盾?
[列出相关ADR摘要]
[粘贴ADR内容]
AI驱动的ADR知识图谱
# 概念:利用AI构建ADR之间的关联图谱
class ADRKnowledgeGraph:
"""
利用AI自动分析ADR之间的关联关系:
- 技术依赖: ADR-A选择的技术被ADR-B依赖
- 潜在冲突: ADR-C的决策可能与ADR-D矛盾
- 影响传播: ADR-E被废弃后哪些ADR需要review
"""
def analyze_dependencies(self, all_adrs):
"""自动发现ADR之间的依赖关系"""
pass
def detect_conflicts(self, new_adr, existing_adrs):
"""检测新ADR与已有ADR的潜在冲突"""
pass
def impact_analysis(self, deprecated_adr):
"""分析废弃某ADR的影响范围"""
pass
与Web3/DeFi的关联
DeFi协议中的"链上ADR"
DeFi协议的架构决策有一个独特特征:许多决策是通过DAO治理投票做出的,决策过程和结果永久记录在链上。
传统ADR DeFi "链上ADR"
┌──────────────┐ ┌──────────────────┐
│ Confluence/Git│ │ Governance Forum │
│ 内部可见 │ │ 公开可见 │
│ 团队决策 │ │ 社区投票决策 │
│ 可修改/删除 │ │ 链上不可篡改 │
│ 无执行约束 │ │ 智能合约自动执行 │
└──────────────┘ └──────────────────┘
DeFi治理提案作为ADR的类比:
| ADR要素 | DeFi治理提案对应 |
|---|---|
| 背景(Context) | Forum讨论帖 |
| 候选方案(Options) | 温度检查(Temp Check)的多个选项 |
| 决策(Decision) | Snapshot/链上投票结果 |
| 后果(Consequences) | 链上执行结果 |
| 状态(Status) | 提案状态(Active/Executed/Defeated) |
对PM的启示:Web3产品的架构决策流程比传统软件更透明、更民主,但也更慢、更复杂。作为Web3 PM,需要在"快速迭代"和"社区治理"之间找到平衡。
今日思考
问题一:ADR的投入产出比
写ADR需要时间。一个高质量的战略级ADR可能需要4-8小时。对于一个高速迭代的创业团队,这个成本是否值得?如何在"快速行动"和"记录决策"之间找到平衡?是否存在"最小可行ADR"(MV-ADR)的概念?
问题二:ADR的组织文化障碍
在我的经验中,推行ADR最大的障碍不是工具或模板,而是文化——"写ADR会暴露我的决策弱点""我不想被ADR约束"。如何在组织中建立"ADR是帮助而非束缚"的文化?ADR与心理安全(Psychological Safety)的关系是什么?
问题三:AI时代ADR会进化成什么?
如果AI能自动分析代码变更、推断架构决策、生成ADR草稿,ADR的形式会发生什么变化?是否会从"人写文档"变成"AI生成 + 人review"的模式?这对架构师的角色意味着什么?
面试题准备
面试题1: 架构决策如何追踪和治理?
30秒回答:
我使用ADR(架构决策记录)体系。每个重要决策都有标准格式记录——包括背景、候选方案、决策理由和后果。ADR分为战略、战术、实现三级,有完整的生命周期管理。这样确保决策可追溯、团队可共识、新人可理解。
2分钟回答:
架构决策治理我采用三层方法:
第一层是ADR文档。每个重要决策用标准模板记录,关键是不仅记录"选了什么",更要记录"为什么不选其他方案"。我把ADR分为战略级(跨系统)、战术级(单系统)、实现级(代码层面),不同级别有不同的review流程和决策者。
第二层是ADR生命周期管理。ADR不是写完就丢,而是有Proposed→Accepted→Deprecated→Superseded的完整生命周期。我们每季度review所有Accepted状态的ADR,检查是否需要更新。
第三层是与技术雷达联动。团队维护一个简版技术雷达,标注"采纳/试验/评估/暂缓"的技术,每个状态变更都对应ADR操作。
在金融系统中,这套体系还有一个重要作用——满足监管审计要求。审计人员问"为什么用这种加密方案"时,我们能直接给出ADR,包括评估过程和决策依据。
追问准备:
-
Q: 你写过最重要的ADR是什么? A: 一个金融系统从单体到微服务的迁移决策。这个ADR花了两周准备,评估了4种方案,最终选择了"Strangler Fig"渐进式迁移。这个ADR后来成为整个迁移项目的指导纲领,持续引用了2年。
-
Q: 如何让团队愿意写ADR? A: 三个关键:1)模板足够简单(实现级ADR15分钟可写完);2)把ADR纳入code review流程(重要变更必须附ADR);3)leader带头写,让团队看到ADR的价值(新人入职时ADR的价值立刻体现)。
面试题2: 你写过最重要的ADR是什么?
30秒回答:
最重要的一个是"是否将核心交易引擎从Java迁移到Go"。最终决策是不迁移,但为新服务采用Go。这个ADR的价值不在于技术选型本身,而在于它终结了团队内部长达半年的争论,让所有人达成共识向前走。
2分钟回答:
(根据个人经验展开,包含业务背景、候选方案分析过程、决策理由、最终效果。重点强调ADR的"达成共识"价值而非单纯的技术记录价值。)
学习资源
| 资源 | 类型 | 推荐理由 |
|---|---|---|
| Michael Nygard原始ADR博文 | 博客 | ADR概念的创始人 |
| 《Design It!》Ch12 | 书籍 | ADR在架构设计中的实践 |
| adr.github.io | 在线 | ADR最佳实践和模板集合 |
| ThoughtWorks Technology Radar | 在线 | 理解技术雷达与ADR联动 |
| 《Fundamentals of Software Architecture》Ch19 | 书籍 | 架构决策的现代实践 |
| Spotify Engineering Blog: ADRs | 博客 | 大规模团队的ADR实践 |
明日预告
Day 17: 企业级集成架构 —— 从ADR这样的"决策治理"转向"系统集成"这个架构师的核心战场。我们将深入CDC(Change Data Capture)、Event Mesh、Orchestration vs Choreography等高级集成模式,并结合金融系统中"银行核心↔支付↔风控↔外部渠道"四方集成的真实挑战。如果说ADR是"怎么做决策",集成架构就是"最复杂的那些决策"。