技术方案评审框架(RFC 怎么写、怎么评)
一句话速记
RFC(Request for Comments)的目标不是”写出完美的方案文档”,而是在写代码之前,用最低成本暴露方案的缺陷和遗漏。写 RFC 的四个必须回答的问题:① 要解决什么问题(为什么现在必须解决);② 怎么做(核心设计,不超过一页纸);③ 为什么不那么做(不在方案里的备选方案 + 被拒绝的理由);④ 变了什么(对现有系统的破坏范围 + 迁移 Plan)。评审时关注”这个方案会怎么失败”,而不是”这个方案好不好”。
通俗解释(5 分钟版)
RFC 的本质:在写代码之前花 1 小时写文档 + 大家花 30 分钟读 +
开会花 45 分钟讨论 = 省掉写代码 2 周后发现方向错了重新做的痛苦
没有 RFC:
一个哥们花 2 周写了一套方案,MR 提出来:
审查者:"你这个设计在 X 场景下会挂。为什么不直接 Y?"
工程师:"…我没想过 Y。"
审查者:"重构吧。"
工程师:(内心崩溃,又要花 1 周重写)
→ 浪费了 3 周,团队矛盾 + 1
有 RFC 轻量流程:
工程师花 1 小时写了一份 2 页的方案概要(RFC),发到团队群:
"新需求的设计思路,大家帮忙看看有没有坑。"
3 个人 async 评论了 5 条建议,其中有 2 条直接避免了架构陷阱。
作者修改了方案,2 天后开始写代码。
→ 省了 2 周返工时间
关键细节
RFC 的结构
一份好的 RFC 应该在一页内解决大部分可预见的疑问:
1. 元信息(3 行)
标题:"RFC: XX 功能的方案设计"
作者 + 日期
状态:Draft / In Review / Approved / Rejected
2. 问题定义(3-5 行)
- 解决什么问题?谁受这个问题影响?
- 为什么现在要做?(做了能带来什么,不做的代价是什么)
- 成功标准:怎么判断这个方案"达到了目标"?
3. 核心设计思路(半页)
- 不是完整的架构文档,是"关键设计决策"
- 数据怎么流(画一个简单的流程图)
- 如果有接口变更,放接口定义
- 如果有 DB schema 变更,放新表结构
4. 备选方案(至少一个,半页)
"我们考虑了以下方案但没有采用:
方案 A:XXXX
优点:
缺点:XXX 决定不采纳
方案 B:同上"
为什么这个部分重要:
- 让审查者知道你想过其他路
- 防止审查者提出一个你考虑过但已经排除的方案
(节省至少 10 分钟的讨论时间)
5. 影响范围(3-5 行)
- 这个改动会影响哪些现有功能?
- 有没有 breaking change?
- 迁移策略:一次性切还是灰度?
6. 风险(3-5 行)
"这个方案最可能失败的三个方式是什么?"
(如果作者自己说不出来风险 = 作者还没想清楚;
如果能说出来 = 审查者可以帮忙评估风险程度)
评审 RFC 的方法
评审者的角色:
不是"我来挑毛病",是"我来帮作者找到 TA 没看到的维度"。
评审的四个角度:
1. 正确性:这方案在核心场景下能工作吗?
2. 边界:极端/边缘/失败场景下呢?
3. 影响:它会破坏什么现有的东西?
4. 演进:3 个月后如果有新需求,这个设计还能容纳吗?
还是需要推翻重来?
评审流程:
1. Async review(至少 1 天)
作者发 RFC 到群里/文档里,审查者 async comment。
不要在开会时才第一次看。
2. 同步讨论(45 分钟,可选)
只在以下情况下开:
- async 讨论出现了分歧
- 方案确实复杂需要当面对齐
如果 4 个审查者都没有在 async 阶段提任何问题 →
不用开会了,直接 Approve。
3. Approve 标准
方案不需要"完美",只需要:
✓ 核心场景能 work
✓ 没有已知的导致线上事故的风险
✓ 未来 6 个月内不太可能需要推翻重来
什么情况下不需要 RFC
✗ CRUD 小功能——任何一个靠谱的 IC 都能独立搞定
✗ Bug fix——修 bug 不需要设计评审
✗ 配置变更——但如果是影响多个团队的配置,要通知
✓ 跨服务的新接口设计
✓ 数据库 schema 变更(特别是线上已有大量数据的情况)
✓ 引入新技术栈/新中间件
✓ 架构重构(改核心模块的实现方式)
✓ 影响安全/隐私的设计(需要安全同学 review)
延伸追问
- Q:RFC 应该写到多详细? → 一页纸原则。如果审查者要花超过 15 分钟读完,太长——过于详细的方案里往往藏着”还没想清楚所以写很多细节来充数”的陷阱。越不确定的地方越要写详细(因为你最需要在那上面获得反馈),确定的地方一句话带过就行。
- Q:如果有人一直不 Review RFC 怎么办? → 设一个 deadline。(“周五前给意见,没给默认为 No Objection”)。如果超过 3 次完全不 review,1on1 里问问是不是有顾虑或者沟通障碍。
- Q:RFC 被 Reject 了怎么跟作者沟通? → 不要用 Reject 这个词。方案被拒绝 ≠ 人不行。说:“这个方案目前情况下风险大于收益。我们一起看看有没有其他路?“或者”这个方案在另一个时机/另一个前提下是可以的,但现在 XX 条件不具备”。
我的记法
- RFC 六个要素:元信息、问题定义、核心设计、备选方案、影响范围、风险
- 评审看四点:正确性、边界、影响、演进
- 不需要 RFC:CRUD、bug fix、简单配置
- 一页纸原则:15 分钟内读完 = 刚好;写成小论文 = 还没想清楚
- 一句话:「RFC 不是为了写完美的方案——是为了用最低成本在你还没写代码的时候暴露缺陷」
状态
- 已背速记
- 能讲通俗版
- 能答追问