ADR 是什么?什么时候应该编写架构决策记录?

摘要:如果你做出了一项会显著影响工程师开发软件方式的技术决策,就应该写一份架构决策记录。

架构决策记录(Architecture Decision Record,ADR)是一种用于记录重要技术决策的文档。它通常会说明决策背景、可选方案、最终选择,以及采用该方案可能带来的影响和后果。

对于研发团队来说,ADR 的价值在于保留关键技术上下文,帮助团队理解“为什么这样设计”,并减少重复讨论、知识流失和架构分歧。

在海外某大型流媒体平台,一些团队会使用 ADR 来记录重要技术决策。其中,一个负责为内容创作者提供工具和数据能力的团队,会用 ADR 记录与系统设计和工程最佳实践相关的决定。

这些决策通常会先通过征求意见稿(Request for Comments,RFC)或工程会议进行讨论。团队达成共识后,再使用 ADR 将最终结论固定下来。

ADR 是什么?什么时候应该编写架构决策记录?

使用架构决策记录有哪些好处?

自从开始使用 ADR 后,团队发现它带来了许多明显收益。

帮助新成员快速了解技术决策背景

未来加入团队的成员,可以通过阅读历史 ADR,快速了解过去做过哪些技术决策、为什么这样决定,以及这些决策产生了什么影响。

例如,2019 年,某创作者业务团队的 Web 工程师决定采用 React Hooks。

这项决定最初在一次双周 Web 工程会议中提出,随后在应用程序的一小部分中进行了试验。经过验证后,团队正式决定不再新增类组件,而是统一采用函数组件。

如果没有 ADR,这类决策往往只能依靠口头传递。随着时间推移和人员变化,新成员很难理解团队为什么采用当前方式,也可能重新引入已经被放弃的模式。

ADR 可以帮助新成员迅速补齐上下文,减少重复讨论和无效试错。

降低系统所有权移交成本

在敏捷开发模式下,组织会根据用户需求和业务变化不断调整团队结构。

组织架构发生变化时,某个系统的所有权也可能从一个团队转移到另一个团队。过去,这类移交经常伴随着大量背景信息和历史知识的丢失。新团队需要花费很长时间重新理解系统,从而影响交付效率。

引入 ADR 后,这一问题得到了明显缓解。

系统的新负责人只需要阅读相关 ADR,就能快速了解系统架构经历了哪些变化、每次变化的原因是什么,以及当时为什么选择当前方案。

ADR 无法替代完整的系统文档,但它能够保留一类极其重要的信息:

系统为什么会变成今天这样。

帮助不同团队统一工程实践

ADR 还可以帮助不同团队在技术标准和工程最佳实践上达成一致。

这种一致性能够带来多方面收益,包括:

  • 减少重复劳动;
  • 提高代码和方案的复用程度;
  • 避免同一问题出现多个相互竞争的解决方案;
  • 减少平台团队或基础设施团队需要支持的技术方案数量。

例如,一个地区的工程团队可以阅读、引用并采用由另一个地区团队编写的 React Hooks ADR,而不必重新进行同样的技术讨论和验证。

ADR 不只是单个团队的历史记录,也可以成为跨团队传播工程实践的重要载体。

什么时候应该写 ADR?

你可能会想:

ADR 听起来很有价值。它既能帮助团队形成决策,也能为未来的团队成员和现在的自己保留决策记录。但究竟应该在什么时候写一份 ADR?

原则上,每当团队作出一项具有较大影响的技术决策时,都应该编写 ADR。

当然,不同团队对“较大影响”的定义可能不同,因此每个团队都需要先对判断标准达成一致。

下面列出几种常见场景,以及判断是否应该编写 ADR 的思路。

场景一:补充记录已经形成的架构决策

有时候,一项决策早已作出,或者某种隐性的技术标准已经自然形成,但它从未被正式记录下来。

因此,并不是所有人都知道这项决策的存在,尤其是后来加入团队的新成员。

这就像那个经典问题:

如果森林里有一棵树倒下,但周围没有人听见,它是否真的发出了声音?

同样,如果团队已经作出某项决策,却从未留下记录,它还能算作一项真正的团队标准吗?

识别这类未记录决策的一种常见方式,是观察代码评审中出现的分歧。

例如,当某位工程师引入一种与现有做法相冲突的代码模式、框架或第三方库时,评审人员可能会说:“我们团队并不这样做。”

如果这项约定从未被记录下来,那么问题并不完全在提交者,而在于团队一直依赖隐性知识。

此时,可以使用下面的判断思路:

  • 我是否遇到了一个问题?是。
  • 是否已经存在一个公认的解决方案?是。
  • 这个解决方案是否已经被记录?没有。

那么,就应该补写一份 ADR。

通过补充 ADR,团队可以把隐性规则转变为显性标准,避免以后继续依赖口头传递。

场景二:提出一项重大架构变更

在系统生命周期中,团队经常需要作出一些会显著影响系统设计、维护方式和扩展能力的决策。

例如,随着业务需求不断变化,团队可能需要对 API 进行重大调整,而这项调整又要求使用方进行迁移。

为了就方案和实现方式达成一致,团队通常会进行系统设计评审、架构评审,或者撰写 RFC。

但当这些讨论完成后,还需要回答一个问题:

最终决定应该如何被正式记录下来?

可以使用下面的判断思路:

  • 我是否遇到了一个问题?是。
  • 是否存在一个显而易见、没有争议的完美方案?没有。
  • 我是否已经提出了一个候选解决方案?是。
  • 这项变更是否影响较大?是。

那么,应该先编写一份 RFC。

RFC 的作用,是帮助团队讨论不同方案、收集反馈,并推动形成共识。

接下来再判断:

  • RFC 是否已经形成最终结论?是。

那么,就应该编写一份 ADR。

RFC 记录的是讨论过程和备选方案,ADR 记录的则是最终决策及其后果。两者的作用不同,但可以相互衔接。

场景三:记录影响较小但可能长期存在的决定

在日常开发中,团队也会作出很多影响较小、甚至看起来微不足道的决定。

单独看,每项决定似乎都不值得专门记录。但如果大量小决定长期处于未记录状态,往往会产生隐性成本。

这种成本可能表现为:

  • 其他工程师重新研究同一个问题;
  • 不同团队采用功能相似的第三方库;
  • 代码库中出现多种互相竞争的模式;
  • 长期积累后,需要投入大量精力进行统一迁移。

虽然未记录决策的成本很难精确衡量,但它确实会不断积累。

好消息是,记录这类决定并不需要花费太多时间。ADR 可以非常简短,不必写成一篇长篇设计文档。

可以使用下面的判断思路:

  • 我是否遇到了一个问题?是。
  • 是否存在一个显而易见的完美方案?没有。
  • 我是否已经找到一个可行方案?是。
  • 这项变更是否影响很大?没有。

那么,仍然可以写一份 ADR。

即使决定本身不大,只要它可能成为团队未来反复遵循的技术标准,就值得留下记录。

ADR 应该写多长?

很多团队迟迟不愿采用 ADR,是因为他们担心这会增加大量文档工作。

但 ADR 并不需要很长。

一份有效的架构决策记录,通常只需要回答几个核心问题:

  • 我们面临什么问题?
  • 当时有哪些可选方案?
  • 最终选择了什么?
  • 为什么作出这一选择?
  • 这项决定会带来哪些积极或消极后果?

对于影响较小的决策,几段文字可能就足够了。

在实践中,团队可以借助 PingCode Wiki 统一沉淀 ADR、RFC、架构评审结论和相关技术文档,并将这些内容与需求、开发任务、缺陷和版本关联起来。这样既能保留决策背景,也能让团队在后续开发、系统交接和技术复盘中快速找到完整上下文。

ADR 的价值不在于篇幅,而在于它能否让未来的读者快速理解当时的背景和判断。

RFC 与 ADR 有什么区别?

RFC 和 ADR 经常被混淆,但它们解决的问题并不相同。

RFC 更适合用来推动讨论。它通常会列出问题背景、多个候选方案、开放问题和需要征求的意见。

ADR 则用于记录已经作出的决定。

可以简单地理解为:

  • RFC 回答:“我们应该怎么做?”
  • ADR 回答:“我们最终决定怎么做,以及为什么。”

并不是每一份 ADR 都必须先有 RFC。

如果某项决定非常明确,或者团队已经通过会议、实验和代码评审形成共识,那么可以直接编写 ADR。

同样,并不是每一份 RFC 最终都会形成 ADR。有些 RFC 可能被否决、搁置,或者没有形成明确结论。

如何判断一项技术决策是否值得记录?

如果你仍然不确定是否应该写 ADR,可以问自己以下几个问题:

  • 这项决定会影响多少工程师?
  • 它会持续影响多长时间?
  • 它是否会改变团队开发、测试、部署或维护软件的方式?
  • 未来是否可能有人再次提出同样的问题?
  • 如果不记录,新成员是否很难理解当前做法?
  • 如果这项决定出错,回退或迁移成本是否较高?
  • 它是否会成为多个团队需要遵循的标准?

如果其中多个问题的答案是“是”,那么这项决定通常值得写入 ADR。

结论:什么时候应该编写架构决策记录?

架构决策记录的目的,并不是增加文档负担,而是帮助团队保存最重要的技术上下文。

ADR 可以帮助新成员更快理解系统,降低所有权移交成本,促进跨团队协作,并减少重复讨论和相互冲突的技术方案。

你不需要等到一项决策足够宏大,才开始记录。

无论是补充已经形成但从未写下来的隐性标准,记录重大架构变更,还是固化一个可能长期影响团队的小决定,ADR 都能发挥价值。

判断标准其实很简单:

如果你作出了一项会影响工程师未来如何开发软件的技术决策,就应该写一份 ADR。

文章包含AI辅助创作:ADR 是什么?什么时候应该编写架构决策记录?,发布者:shang,转载请注明出处:https://worktile.com/kb/p/4026703

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
shang的头像shang

发表回复

登录后才能评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部