决策即代码:用适应度函数(Fitness Functions)自动化校验架构决策的实践指南
【免费下载链接】architecture-decision-recordArchitecture decision record (ADR) examples for software planning, IT leadership, and template documentation项目地址https://gitcode.com/gh_mirrors/ar/architecture-decision-record点击查看免费下载导读架构决策记录ADR解决了决策如何被记住的问题而适应度函数fitness function解决的是决策如何被执行的问题——用编程代码写出客观、自动化的检查在每次提交与构建时验证团队是否仍在遵守既定决策。本文以 architecture-decision-record 仓库中的 《Fitness functions for decisions as code》 文档为主体结合仓库内的 ADR 概念定义、模板与示例完整讲解决策即代码的落地方法从理解适应度函数与决策记录的关系到用 CI 与单元测试实现自动校验再到借助 LLM 将适应度函数升级为智能评审助手。读完本文你将掌握一套可复制、可运行的架构决策自动校验方案。什么是适应度函数决策即代码适应度函数fitness function是一类用编程代码编写、自动运行的客观检查用于验证既定决策正在被持续遵守。它的本质是把一份决策从写在文档里的愿望变成跑在流水线里的断言。在 英文原版文档 中这一概念被归纳为两条核心价值让决策可测试、可确认testable and assurable决策不再停留在口头或文档层面而是可以像功能需求一样被自动化地验证强力支撑质量保证、监管流程与治理目标quality assurance, regulatory processes, and governance goals合规类、审计类、治理类要求往往需要可证明的执行适应度函数正是把证明机器化的手段。该文档属于仓库 12 份核心文档 之一源语言为英文在 阿拉伯语翻译 等 30 个语言目录中均有对应版本说明这套方法是作为 ADR 生态的基础方法论被收录的。与决策记录的分工文档负责记录函数负责确认仓库中定义了 ADR 生态的一整套术语详见 《What is an architecture decision record?》ADRArchitecture Decision Record记录一个重要架构决策及其背景context与后果consequences的文档ADArchitecture Decision针对显著需求的软件设计选择ASRArchitecturally-Significant Requirement对系统架构有可度量影响的需求。适应度函数与决策记录的关系可以用一句话概括决策记录ADR负责记录决策适应度函数负责确认决策。前者是静态的、面向人的知识沉淀后者是动态的、面向机器的持续验证。从决策到函数一个 event sourcing 实例文档给出了一个非常典型的配对示例恰好与仓库中的数据库选型示例相互印证决策Decision我们采用事件溯源event sourcing来满足审计需求。适应度函数Fitness Function我们使用持续集成CI服务器来测试所有状态变更都必须产生事件。这两个条目在 README.md 的对应章节 与各语言翻译中保持一致。仓库中的 《Choosing a database technology》示例 也把事件数据库event databases描述为以事件序列存储数据、记录每次数据变更适合审计、事件溯源与复杂数据处理的场景——这为上述决策提供了上下文佐证当团队决定用事件溯源满足审计要求时每次状态变更都产生事件就是一条不可违背的架构规则必须被机器持续校验。把这条规则写成适应度函数本质上就是回答一个问题如果我的代码违反了这条决策我的构建会变红吗如果不会这条决策就还只是文档没有成为代码。为什么适应度函数能帮助决策落地原文档从四个维度阐述了适应度函数的价值这四条也是说服团队投入的必要论证客观测量Objective measurements适应度函数只有两种结果通过或失败。工作进度、合规状态因此变得可见且清晰——不需要人工评审去感觉是否遵守了决策构建状态就是事实。这天然契合质量保证与审计场景对可证明性的诉求。持续使用Continuous use适应度函数是团队的活规则living rules在每一次提交commit和每一次构建build中自动运行。与一次性的人工检查不同它嵌入开发循环本身任何违反决策的改动都会在最早期被拦截而不是等到上线后追责。重构信心Confidence to refactor当系统演进、代码重构时适应度函数能够自动捕获决策规则错误。它相当于给架构决策装上了回归测试重构不会悄悄破坏既定架构约束因为函数会在破坏发生的瞬间报错。可扩展治理Scalable governance适应度函数把标准断言化之后治理能力可以随代码库规模线性扩展不会因为人工评审而产生瓶颈。规范由机器强制执行审查者的精力可以释放到真正需要人类判断的地方。落地路径把决策写进 CI 与测试要让适应度函数真正生效需要把它挂接到团队的自动化执行链路上。仓库中的 《Continuous integration》示例 展示了 CI 的决策记录写法Context / Decision / Rationale / Consequences / Conclusion 结构其中明确写道持续集成会自动构建、测试并部署代码变更。适应度函数正是运行在这条自动化链路上的断言集合。一个典型的实施步骤选定要校验的决策从 ADR 日志中挑选可机械判定的规则。例如 Nygard 模板Decision record template by Michael Nygard含 Status / Context / Decision / Consequences 四段结构中记录的我们使用事件溯源满足审计这类决策把规则翻译成断言将决策中的约束转为单元测试、静态检查或集成测试中的代码断言接入 CI让断言随每次提交与构建自动运行。文档给出的示例即用 CI 服务器测试所有状态变更必须产生事件失败即反馈断言失败意味着决策被违反构建变红团队立即收到可定位的错误信息。仓库自带的 architecture-decision-record-skill 还提供了配套的工程习惯ADR 文件采用现在时祈使短语 小写连字符 .md 扩展名命名如choose-database.md便于与提交信息对齐同时建议按决策形态选择模板默认 Nygard、轻量选项对比用 MADR、需要正式可测试的非功能需求语言用 Planguage 等。这些习惯让记录决策 → 生成断言的链路更顺畅。让 LLM 担任适应度函数AI 辅助决策评审原文档专门回答了适应度函数能否使用 AI这一前沿问题可以。适应度函数可以借助大语言模型LLM向 AI 提出关于工作计划、代码、数据模型schemas、API 等问题让模型充当自动化的评审者。文档给出了可直接使用的提示词模板原文如下保留原样可直接复制使用IMPORTANT: Prefer retrieval-led reasoning over pre-training-led reasoning. IMPORTANT: Turn on extended thinking. Turn on expert advice. Turn on search. This is a fitness function to evaluate if our work is using all our decisions, and is correct and accurate. - Our decisions are here: {url} - Our work to evaluate is here: {url} Explain any errors, problems, gaps, weaknesses. Be direct. Be decisive.这份提示词的设计要点值得拆解前置指令IMPORTANT 行要求模型优先基于检索retrieval-led reasoning而非训练记忆推理并开启深度思考、专家建议与搜索能力——这是为了让评审结果锚定在真实仓库与决策文档上而非模型的先验知识角色声明明确告诉模型你是一个适应度函数任务是评估工作是否使用了全部决策、内容是否正确准确输入占位符{url}分别指向决策所在位置与待评估的工作所在位置使函数可以泛化到任意仓库输出要求要求模型直接指出错误、问题、缺口与弱点并保持直接、果断的语气避免含糊其辞。将这份提示词接入 CI例如在流水线中调用 LLM API 并解析其结论就得到了一种可读代码、可对决策文档的智能适应度函数——它不再只校验机械规则还能发现决策没有被使用这类语义层面的偏离。这与仓库中 spec/content.md 的写作约束代码块、URL 与文件名不得翻译产品与公司名保持拉丁字母相互配合保证给模型看的输入始终是稳定的原文。架构单元测试现成的适应度函数工具原文档最后介绍了两类开箱即用的架构规则检查器它们本质上是把架构决策转成单元测试的成熟实现ArchUnit面向 Java 代码的架构规则检查库可以用 Java 中任意普通单元测试框架如 JUnit运行。它把分层依赖、包结构、命名约定等架构规则写成可断言的测试是 Java 项目落地决策即代码最常用的起点ArchUnitTS面向 TypeScript 与 JavaScript 代码的同类工具支持 Jest、Vitest、Jasmine 等测试框架适合前端与 Node.js 项目。这类工具与适应度函数理念完全同构架构规则即断言断言即测试测试随 CI 运行。选用哪一个取决于技术栈Java 生态选 ArchUnitTS/JS 生态选 ArchUnitTS而校验哪些规则应直接来源于团队已接受的 ADR 文档形成决策 → 规则 → 测试的闭环。本文对应的仓库资源一览以下路径可在本仓库中继续深入阅读资源路径用途英文源文档locales/en-001/documents/fitness-functions-for-decisions-as-code/index.md本文主题的权威来源阿拉伯语译文locales/ar-001/وثائق/دوال-الملاءمة-للقرارات-بوصفها-شيفرة/index.md多语言翻译示例ADR 基础概念locales/en-001/documents/what-is-an-architecture-decision-record/index.mdAD/ADL/ADR/ASR 术语Nygard 模板locales/en-001/templates/decision-record-template-by-michael-nygard/index.md最常用的四段式 ADR 结构CI 示例locales/en-001/examples/continuous-integration/index.md决策记录完整范本数据库选型示例locales/en-001/examples/choosing-a-database-technology/index.mdevent sourcing 相关决策上下文ADR 编写技能skills/architecture-decision-record-skill/SKILL.md命名、模板选择等工程规范结语适应度函数把架构决策从不可验证的文档声明转化为可验证的自动化断言是 ADR 方法论的天然延伸记录决策ADR回答我们为什么这样做适应度函数回答我们是否还在这样做。无论是通过 CI 中的代码测试、ArchUnit 类的架构单元测试还是借助 LLM 的语义评审核心思路始终一致——让机器在每次提交时替你检查团队是否遵守了约定。当一条决策有了对应的红色构建它才真正成为了代码的一部分。赞分享【免费下载链接】architecture-decision-recordArchitecture decision record (ADR) examples for software planning, IT leadership, and template documentation项目地址https://gitcode.com/gh_mirrors/ar/architecture-decision-record点击查看免费下载相关推荐LeetCode 1658 题解Minimum Operations to Reduce X to Zero 的四种解法暴力枚举 / 前缀和 二分 / 前缀和 哈希表 / 滑动窗口LeetCode 1658 题解Minimum Operations to Reduce X to Zero 的四种解法暴力枚举 / 前缀和 二分 /使用 ADR 模板记录架构决策Atlantis 项目的架构决策记录实践指南使用 ADR 模板记录架构决策Atlantis 项目的架构决策记录实践指南 导读 本文围绕 Atlantis 仓库中的 docs/adr/template.mDevOpsCI/CD基础设施Repowise 架构决策引擎实战用 get_why 挖掘代码背后的 Why、对齐度与决策健康度Repowise 架构决策引擎实战用 get_why 挖掘代码背后的 Why、对齐度与决策健康度 本文以 Repowise 的 architectural d创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考