决策记录
决策记录与交付文档
结论先行
代码说明做了什么,文档说明为什么这样做、当时放弃了什么。
最值钱的文档不是教程,是决策记录——它防止下一个人(或下一个 Agent)把已经否掉的方案再试一遍。
什么时候写
| 该写 | 不该写 |
| --- | --- |
| 选框架、选数据库、选鉴权方式 | 显而易见的一行代码 |
| 不可逆或高成本的架构决定 | 一次性脚本、试验原型 |
| 交付给客户的安装/运维说明 | 重复代码注释的"翻译" |
| 反复被问到的同一件事 | 还没验证的猜想(要标"未验证") |
ADR 模板
存放:docs/decisions/0001-标题.md(编号连续,不要重开)
# ADR-0001: 用 SQLite 而不是 MySQL 存 Gitea 数据
## 状态
已接受(2026-10-31)
## 背景
单机部署、数据量 < 1GB、团队无 DBA、需要每日备份简单可靠。
## 备选方案
1. MySQL:功能全,但多一个服务、备份与升级成本高
2. PostgreSQL:同上,且内存占用更大
3. SQLite:单文件、零运维,备份即拷文件
## 决定
选 SQLite,配合每日 dump。
## 后果
- 好处:备份/恢复简单,迁移只需拷文件
- 代价:并发写入能力有限,未来多实例需迁移
- 触发重评的条件:日活写入 > 50 QPS 或需要多机部署
交付文档清单(To B 项目)
1. 安装说明:环境要求、安装步骤、首次启动、常见报错
2. 运维说明:服务启停、日志位置、备份与恢复命令
3. 权限与数据流:数据存在哪、经不经过服务器、谁能看到
4. 更新日志:版本、变更、已知问题
5. 故障排查:症状 → 原因 → 处理
步骤
1. 先写"背景与约束"——没有约束的决策无法评估;
2. 列 2-4 个备选方案,写清各自代价;
3. 写决定与后果,特别是"什么条件下要重评";
4. 交付文档要能被执行:命令可直接复制、路径是真实路径;
5. 文档与代码同仓库,改代码时顺手改文档。
坑
- 只写"我们用了 X",不写为什么不选 Y → 下次还会吵一遍;
- 文档里的命令没跑过 → 客户按文档操作必失败;
- ADR 编号重置或散落多处 → 找不到、引不准;
- 交付文档写了"支持多平台"却没测过 → 现场翻车。
验收清单
- [ ] 每个重要决定都有编号、日期、状态
- [ ] 背景里写清了约束(预算、人力、合规、时间)
- [ ] 至少列了两个备选方案与放弃理由
- [ ] 写了"何时需要重评"
- [ ] 文档中的命令实际执行过(或标注未验证)
别做的事
- 别把 ADR 写成技术教程;
- 别在文档里贴过时截图而不标注版本;
- 别用"后期优化"掩盖已知缺陷,写进"已知问题"。