我的 Vibe Coding 最佳实践——ADR文档

工作和业余也用AI写代码,大大小小项目都经历了。从 rules, skills, spec, agent 到 harness 都玩过了

从AI嘴里发现一条比较稳的套路——ADR文档

rule, skills, spec 这些东西最大的问题就是瞎jb指挥。ADR 的好处是记录why,以及决策演变历史。

贴一段我整理的 ADR 文档就明白了:

---
title: 如何使用 ADR
id: ADR-001
date: 2026-06-26 09:01:21
status: accepted
---

ADR

ADR(Architecture Decision Record,架构决策记录)的核心目标很简单:记录为什么做出了某个重要技术决策,而不是记录系统长什么样。

目前比较常见的是 MADR、Nygard ADR 两种风格,但组织方式都大同小异。

一个团队通常会按下面几个层次组织。

1. 一个 ADR 对应一个决策

不要一个 ADR 写整个系统设计。

好的粒度例如:

ADR-001 使用 PostgreSQL 作为主数据库
ADR-002 API 使用 REST 而不是 GraphQL
ADR-003 服务间通信采用 gRPC
ADR-004 用户认证采用 OAuth2 + JWT
ADR-005 使用事件驱动 Outbox Pattern

而不是

系统架构设计.md

因为几年以后,很难知道某个结论为什么来的。

2. 编号保持永久

一般都会固定编号。

adr/

0001-use-postgresql.md
0002-use-rest-api.md
0003-use-grpc.md
0004-use-oauth2.md

编号一旦存在,就不要修改。

即使后来废弃:

0003-use-grpc.md
Status: Superseded by ADR-0018

这样引用不会失效。

3. Status 非常重要

一般都有状态。

例如:

Status: Accepted
Date: 2026-06-19 01:02:03

如果后来换了:

Status: Superseded
Superseded by: ADR-0018

而新的 ADR:

ADR-0018
Supersedes: ADR-0003

形成完整历史。

4. 一个 ADR 的典型模板

---
title: ADR-008 使用 PostgreSQL
id: ADR-008
date: 2026-06-18 12:32:46
status: accepted
---


## Context

目前需要:

- ACID
- JSON 查询
- 成熟生态

候选:

- PostgreSQL
- MySQL
- MongoDB

## Decision

选择 PostgreSQL。

## Consequences

优点:

- SQL 功能完整
- JSONB 支持优秀
- 社区成熟

缺点:

- 运维复杂度略高
- 分库分表方案需要额外设计

可以再加:

Alternatives

Decision Drivers

Trade-offs

References

5. 按领域组织,而不是按时间(可选)

在一个目录,用文件名体现领域:

008.backend.use-grpc.md
010.security.use-oauth.md
012.frontend.react-query.md

这样编号保持连续,查找也方便。

6. ADR 之间允许引用

例如:

ADR-0015

Context

依赖:
- ADR-0002
- ADR-0008

Decision

由于 ADR-0008 已经确定 PostgreSQL,
因此 Outbox Pattern 可以直接利用事务。

形成决策网络,而不是孤立文档。

7. ADR 只记录"为什么"

这是很多团队最容易犯的错误。

不要写:

Controller
Service
Repository

这是设计文档。

ADR 应该写:

为什么不用 MongoDB?

为什么不用 GraphQL?

为什么采用 Saga?

为什么拆成多个 Service?

为什么 Event Sourcing 被放弃?

重点永远是 Why,而不是 What

8. 和设计文档分开

过去很多团队会这样组织:

文档 回答的问题
RFC / Proposal 未来准备怎么做?
ADR 为什么这样做?
Architecture Doc 系统如何组织?
Design Doc 某个功能如何实现?
Runbook 如何运维?

流程是 RFC → ADR → Design Doc → Code。

RFC 用于讨论方案,达成决策后沉淀为 ADR;随后具体实现细节写入设计文档,最终落实到代码。这样既保留了决策依据,又避免 ADR 演变成冗长的设计说明。

在AI 时代,更简洁,易维护的方式是:


AI编写的项目,到后期,泥潭就是大量的docs。ADR 的好处是不用修订,全面引用+supersed。保证决策链清晰,低上下文成本

Comments