轻量级的架构决策记录机制

news2024/11/28 12:31:12

作者:倪新明

ADR是一种性价比非常高的架构决策文档化实践,团队引入和实践成本很低,却能为团队带来极大收益!

1 团队研发面临的问题

不论是在传统的IT行业,还是互联网行业,研发团队在架构决策层面或多或少的都会面临以下问题或挑战

•新成员加入团队,对系统现有的架构决策可能会盲目遵守,只知其然,不知其所以然;或者挑战或违反约束,持续挑战当前决策,“质疑”决策的合理性和正确性,负责人需要不间断的解释、同步、推动达成共识

•架构决策的潜在问题随着时间推移暴露,但,如果决策时进行充分分析这些问题可能会提前发现和规避

•现有系统架构决策是如何演进?当前决策背后的动机是什么?有可能团队内已经没有人能准确的回答

•相似架构决策场景在系统中重复出现,由于遗忘决策原因,或团队成员变化等因素,仍要花时间去分析、设计和推动干系人达成共识

•团队内只有少部分人负责架构设计,其他团队成员无机会参与,但实际上团队成员有相应诉求,至少能够了解某项关键架构设计的决策过程

•即使团队内部接手的项目,你能快速获取系统关键架构决策及其原因吗?你可能会从代码库中寻找架构决策的蛛丝马迹,但很难获取架构决策背后的动机以及决策的演进过程

基于以上这些问题,我们想

•通过最小但依然高效的方式记录系统的架构决策

•能够识别系统关键决策的演进过程

•架构决策以及设计最佳实践能够在团队间高效同步

•团队成员都有机会参与到架构设计决策过程中

通过文档形式记录架构决策首当其冲的问题是:文档过期!!

确实,过期问题是文档化必然面临的问题。无论通过什么机制,比如强流程、自动化更新等都存在过期风险。那为什么还要选择记录架构决策呢?基于以下两个原因:

性价比:架构决策文档化的收益远大于维护过期带来的成本

轻量级:保持ADR的简短、轻量,规模越小的文档越容易保持与实际的同步

2 ADR剖析

Architecture Decision Record,缩写ADR,即架构决策记录,该实践最先由Michael Nygard发起,是记录架构决策最有效的方式之一。简单来说,ADR是一种对架构决策的文档化记录,其目的是通过文档化的形式记录系统的架构决策、原因以及决策过程

通过对系统架构决策进行有效记录,团队可以从以下几个层面获得收益:

•新人引导,便于快速熟悉系统新的团队成员可以快速获取系统的历史架构决策,理解决策背后的背景、决策过程以及相关影响

•项目交接,对已有决策进行文档化积累敏捷环境强调团队对知识的快速学习,基于ADRs团队可以快速熟悉已有系统的架构演进过程

•对齐认知通过推动落地ADRs,团队成员更容易对设计最佳实践达成一致认识和理解,进一步避免后续建设过程中的“重复造轮子”,提升设计知识在团队间复用

建议的ADR的基本结构包括标题、状态、背景、决策、影响共五个部分,一般情况下,推荐增加一致性和备注两个极具价值的额外章节作为补充。

需要说明的是,团队可以按需增加其他章节以增强ADR的表现能力,比如增加可选方案章节对可选方案进行详细描述。





标题【必选】

ADR的 “标题” 部分主要包括两部分,其一是顺序编号,其二是对架构决策的简短描述。标题的描述需要确保对架构决策进行准确描述、清晰无歧义,同时,也要保持简短明了

例如:ADR 01. 订单服务和履约服务之间采用异步消息机制

状态【必选】

ADR的 "状态" 限定为 待审核 , 审核通过,被取代 三种状态之一。

•待审核:决策必须被高级别决策者或ARB审核

•审核通过:架构决策已经被审核,并已准备就绪进行实现

•被取代:架构决策已发生变更,并被另一个ADR取代。该状态表明,之前的ADR一定是被审核通过的,处于提议状态未审核通过的ADR是不允许流向该状态。处于提议状态的ADR只能持续修改直到审核通过。被取代状态提供了一种有效的架构决策追溯机制,能够帮助团队识别架构决策的演进过程

背景【必选】

推动架构师对此项架构决策的具体背景或问题进行描述,以及简洁扼要地表述可能的可选方案。决策背景在一定程度上也是对系统架构的一种描述。

说明:不建议在此章节进行详细的替代方案分析和说明,如果确实需要进行详细阐述,则建议增加额外的章节进行说明。

可选方案【可选】

对可选的替代方案进行详细描述,对比不同方案的优劣势

决策【必选】

该部分包含了具体的架构决策以及相应的决策依据,原则上要使用肯定式、命令式的描述方式表述具体的架构决策,不要存在主观的、消极的、模棱两可的、可能存在歧义的措辞。说明:关注Why 而非 How,理解架构决策的原因比理解怎么实现更加重要

影响【必选】

该部分描述此项架构决策的整体影响。每项决策都会或多或少的对现有系统产生影响,包括好的影响和坏的影响,通过该章节推动架构师思考这些影响是否超过架构决策的收益

一致性【可选】

该部分并不是标准ADR元素,但同样颇具价值,其作用在于推动架构师从架构一致性的视角思考所作架构决策如何进行度量和治理架构师必须确定该项架构决策的一致性保证是通过人工方式还是通过自动化方式实现。如果可以通过自动化方式进行,则在该章节明确说明自动化的执行方案。

备注【必选】

备注部分并不是标准ADR的结构,但是强烈推荐增加该章节。备注部分主要包含的ADR的各种元数据,例如:

原作者、审核日期、审核人、替代日期、最后修改日期、修改人、最后修改内容

说明:有些团队认为备注部分的元数据信息没有太大价值,特别是,当团队将ADRs与代码一同存储在配置库时(并不推荐该种存储方式)。但实际上,将元信息作为ADR的一部分比依赖配置库更具价值和优势

3 ADR的组织和存储

ADR文档具体存放在什么位置,比如FTP服务器、WIKI或者同项目代码配置库,不同的团队可以根据情况进行灵活选择。原则:ADR能够被干系人便捷地获取。

方式一:基于类似Git的配置库存储

优点:

•架构决策离代码很近,方便研发人员获取

•通过配置库的版本管理能力轻松的实现ADR的变更管理

缺点:

ADR的干系人不仅仅是研发人员,还有技术经理、产品经理、业务人员等其他角色的项目干系人。基于太技术性的配置库进行存储,显然对除研发以外的角色不太友好。同时,还需要对非研发人员开通仓库权限,代码安全性也是须要考虑的因素。另外,基于配置库存储不太方便存放同一系统不同应用下通用的架构决策以及应用间的集成架构决策。

方式二:类似WIKI的在线协同编辑共享系统内

优点:干系人友好在线协作方便处理跨应用的架构决策

缺点:开发人员不友好,离开发库较远

基于对跨应用架构决策的存储,团队选择将ADR存储在在线协同文档平台,并通过合理的文件夹结构进行组织,参考以下组织形式:





4 ADR融入研发流程

如果要落地ADR,则须要将其融入到现有的研发过程中。ADR涵盖的流程活动主要是:





制定ADR

•活动名称:制定架构决策记录(ADRs)

•前置要求:无

•干系人职责: 子系统负责人负责制定子系统作用域内的ADR,系统架构师负责跨系统架构决策制定

•活动输入:PRD活动输出:《架构决策记录》

•执行形式:线下,或非正式的头脑风暴

•执行时间:属于系统设计的一个子活动,在系统设计阶段进行

评审ADR

•活动名称:评审ADR

•活动目的:评审ADR的完整性和正确性,确保架构决策的合理性

•前置要求:已完成ADR制定

•干系人职责:ADR指定人发起评审,系统架构师及核心研发参与评审活动

•活动输入:ADRs

•活动输出:ADR评审记录(在ADR文档上更新评审信息)

•执行形式:正式或非正式的评审会

•执行时间:技术方案内部评审时,对该方案相关的ADR进行评审

5 ADR实践过程中的常见疑问

问题一:写ADR的 “时间成本较高” ,延长了技术方案设计周期 ?

答:否!

该疑问可能主要来自于以下几个原因:

•写文档 = 费时间?大多数研发人员排斥文档,且没有写文档的习惯。

•对ADR模板理解不够深入和准确,撰写过程中无从下手

•决策缺少必要的分析习惯,对架构决策缺少必要的对比、分析,在撰写ADR时,缺少必要的依据,不得不额外查找资料,所以写的“很慢”

但实际上,如果作为架构决策者具备决策分析的习惯,特别是在技术方案设计时,进行过充分的决策分析,1-2页的ADR文档撰写不会超过 1 个小时,甚至在半个小时内完成。即使制定和评审ADR影响了一小部分设计时间,通过对关键决策的充分分析和审重决策所带来的价值远胜过返工造成额外成本

问题二:遗留系统没有必要再写ADR ?

答:否!

价值是决定是否写ADR的因素之一,切忌ADR只对当前架构决策进行记录。对于遗留系统,在团队遗忘之前,记录其关键架构决策依然具有较大价值。

问题三:ADR这种文档化机制与敏捷冲突 ?

答:否!

敏捷宣言中指出:可以工作的软件胜过面面俱到的文档。其强调左侧更有价值,但不否定右侧的价值。

因此,文档化并不一定与敏捷理念发生冲突通过采用轻量级的文档机制,记录具有核心价值的东西,确保文档机制不会成为团队负担,本身与敏捷文化相互契合

问题四:ADR评审是不是流程太重 ?

答:可能,但是有必要!

ADR评审是引入ADR机制的重要活动之一,不可忽略!正是通过多干系人参与下的评审活动,才能产生ADR的诸多重要价值。通过这种正式或非正式的评审活动:

•提升架构决策的合理性和正确性

•提升团队的技术氛围

•提升团队成员的技术思考能力、技术水平、架构决策的参与感,实现架构决策在团队成员间的高效同步......

因此,ADR的评审活动是必要的,从效率考虑,团队可以优化评审过程。

问题五:ADR模板很多,团队应该如何选择?

答:没有标准的,只有最适合的 !

ADR没有统一的模板,选择适合团队的,建议:

模板保持轻量,不要试图覆盖所有的场景,否则,ADR会成为团队成员的负担

更重要的是,ADR模板和模板元素的含义一定要在团队成员间达成一致

问题六:什么时候需要写ADR没有量化条件,所以很难落地?

答:否!

原则上:对系统产生显著影响的架构决策需要写ADR。

如何定义 "显著影响" 没有量化指标,但如果存在以下场景可能是需要写ADR的信号:

•直接影响高优先级的架构属性

•修改对外接口:对外提供的接口修改往往需要进行充分影响分析

•引入或者移除依赖:依赖的加入和移除往往标示着组件能力的引进和废弃

•改变系统的通用结构:工程结构是应用架构的重要维度之一

•迫使研发人员改变开发方式接受战略性技术债:重构影响较大的技术债往往对现有系统会有较大影响

以上场景只是可能需要写ADR的一些信号,但并不是强制约定。

是否需要写ADR的终极实践准则是:具体情况,具体分析

6 ADR撰写中的常见误区

ADR的结构虽然非常简单,但团队在开始实践过程时对于每个章节的内容表述极易出现偏差,在撰写ADR文档时常见的问题如下:

【背景】部分

典型反例:

未直接说明推动进行决策的原因:正确的方式是要明确说明进行此次架构决策的背景或动机是什么,明确 WHY对可选方案进行详细说明:ADR实践初期,团队常犯的错误式在 “背景” 部分对方案进行详细的大篇幅论述

【决策】部分

典型反例:

缺少决策依据说明:决策依据过于简单,不充分,不能推到选择当前决策的论据决策结果表述措辞不够明确、模棱两可

【可选方案】部分

典型反例:分析角度存在明显倾向性,不够客观

【一致性】部分

该章节的目的是推动架构师对如何确保决策被团队遵守进行深入思考,特别是考虑是否可以通过自动化方式进行。典型的反例词汇是:系统落地、开发实现......

如果不能不同自动化方式进行检查,可能 设计评审、同行代码评审、专家代码评审是可能的方式如果可以通过自动化方式进行,则要说明如何进行自动化方式进行约束校验。例如,如果工程实践通过Archunit进行单测,则可以表述基于Archunit的规则代码。

7 结语

ADR不仅仅是一份文档,团队将获得以下收益:

•系统关键决策知识留存有助于新团队成员快速融入,知其然也知其所以然

•提升团队技术氛围提升团队技术思考力和技术能力,同步最佳实践

•提升架构决策的合理性和正确性

•管理技术债的能力

•更高效的架构决策沟通机制

•减少重复性的决策讨论和分析

•架构决策一致性推动系统架构约束自动化检查

开始团队的ADR之旅吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/91795.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在Arduino IDE上开发ESP32(离线安装SDK)

用过Arduino的朋友都知道,Arduino的整个生态强大得让你不能不服。大家所贡献出来的各种库让基于Arduino的开发虽然还没有变得无所不能,但也算是相当得心应手了。你所能想到的功能大体都能在网上找到对应的库和文章。可能是因为这个原因吧,所以…

Redis整理-未完成

目录 1. Redis安装 1.1 单机 1.2 主从 1.3 哨兵 1.4 集群 1.4.1 方式一 redis-cli --cluster命令 1.4.2 方式二 cluster meet/addslots/replicate 2. Redis配置 2.1 基本参数配置 2.2 持久化配置 2.3 内存策略设置 2.4 主从配置 2.5 哨兵配置 2.6 集群配置 2.6.…

吃透这份 “ 自动化测试 ” 核心技术栈,月薪30K还不是随便叫

为了帮助大家快速回顾学习自动化测试中的知识点,分享一下这些年来,我对于技术一些归纳和总结,和自己对作为一名 高级测试工程师需要掌握那些技能的笔记分享,希望能帮助到有心在技术这条道路上一路走到黑的朋友! 一、L…

[附源码]Python计算机毕业设计SSM基于JAVA快递配送平台(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

语音怎么转换成文字?这几个实用方法分享给你

当我们在听一些流行的英文歌曲时,发现它没有附带翻译的时候,是不是常常听不懂歌曲的意思内容呢?面对这种情况应该怎么办呢?其实也不难,我们只需要利用软件来将歌曲转换成文字的格式就可以了,那你们知道如何…

分布式系统(交互、协作)

文章目录进程组织进程交互传染病协议反熵(Anti-Entropy)闲聊(Gossiping)P2P 路由Circular routingPastry应用层多播ESMScribe中间件通信协议RPCMOM进程协作有序组播基本组播FIFO 组播全排序组播定序者分布式协商因果序组播分布式互…

基于SSM框架的酒店管理系统

基于SSM框架的酒店管理系统开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字): 看每个等级模块:客白模块,屋工模垫,反怠管理员模垫 客户可…

如何实现采购管理流程的优化?

采购管理流程优化指的是一种整体方法,而不是个人主义的方法。它指的是利用人员、流程和技术来实现最佳价值创造的过程。采购优化的方法可以是:最初的范围界定,数据收集和分析,改进和实施以及跟进和监控。 理解采购管理流程优化 …

oracle学习篇(二)

oracle学习篇(二) 1添加约束 1.1 添加主键约束 1.1.1 语法 alter table 表名 add constraint 约束名 约束关键字 key(添加约束的字段);1.1.2 示例代码 alter table infos add constraint pk_stuid primary key(stuid);1.2 添加检查约束 1.2.1 语法 alter table 表名 ad…

[附源码]Node.js计算机毕业设计高校学生心理健康信息咨询系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

numpy.pad()函数详解

目录 函数定义: 示例讲解: 示例1.1 constant: 示例1.2 maximum 示例1.3 constant: 示例2.1 constant: 示例2.2 constant: 函数定义: numpy.pad()函数用于对Numpy数组进行填充。有时需要对Numpy数组进…

Docker 项目快速部署Flask项目

前言 打造 flask gunicron nginx Mysql 环境 nginx Mysql 使用docker 快速部署 使用 supervisor 对 gunicron 做监控 环境:centos7 ,python3.7 flask 篇 flask 项目就不多赘述了。这里贴一下项目的目录,便于解释下面的命令参数。 运行…

​Word怎么转换成PDF格式?这三种方法教你如何转换

怎么把Word文档转换成PDF文件格式呢?相信小伙伴们在办公过程中会习惯使用Word文档来编辑文件,编辑好后如果需要发送文件的话会将文档转换成PDF格式来发送,原因就是PDF格式独有的兼容性和稳定性能够让我们的文件格式不会错乱,这也是…

深入理解Maven的全部配置

深入理解Maven的全部配置1. Introduction1.1 Big Data -- Postgres2. Install2.1 Maven Install2.2 Config Setting.xml2.3 Local Package Install Maven3. Project4.AwakeningMaven Document: https://maven.apache.org/. Maven Download: https://maven.apache.org/download.…

前端富文本设置的表格样式无法展示解决方案

当我们在富文本编辑器里编辑好文本后,发布一看,为什么编辑器预览的内容和实际保存后展示的内容不一致呢。这是因为,大部分编辑器本身会自带一些样式属性,而当获取富文本内容的时候往往是不带这些样式属性的,所以才导致…

【Java_GUI编程】--基本操作你要知道

文章目录一、组件和容器1、JFrame2、面板JPanel3、布局管理器流式布局(从左到右)东南西北中网格布局4、事件监听输入框事件监听键盘监听5、JDialog弹窗6、Icon、ImageIcon标签IconImageIcon7、按钮单选按钮复选按钮8、列表下拉框列表框9、文本框密码框文…

醉三皇酒特别的爱:孙子15年买酒送爷爷,爷爷90箱好酒赠重孙

小强没有万万没有想到,自己不仅会被裁员,而且还妻离子散,最敬爱的爷爷又意外去世。 一、惨遭裁员,一蹶不振 都说程序员是吃年轻饭的,以前不以为然,现在看着手里的裁员告知单,小强也不得不信了。…

Mybatis源码分析(三)SqlSessionFactoryl的初始化

目录一 解析配置文件入口二 解析properties文件三 解析settings文件四 解析typeAliases文件五 解析 Plugin文件六 解析 Environments 文件七 解析Mapper 文件官网: mybatis – MyBatis 3 | 简介参考书籍:《通用源码阅读指导书:MyBatis源码详解…

vscode无法读取头文件问题,改变exe生成路径问题,头文件,源文件分离问题

首先声明一点,我这里演示的基础是源文件都位于项目根目录下的,然后exe文件和头文件可以放在项目的其他任何文件夹中的。 目录 1. vscode自定义头文件包含问题 1.1 首先是我们的c_cpp_peoperties.json文件 1.2 接下来是我们的settings.json文件 2.改变…

String(2)

字符串中的库函数,基本上只要对原来的字符串进行修改,基本上返回的都是一个新的对象 我们先来看一个内存布局图: String s1new String("hello"); String s2new String("world"); String s3s1; 下列程序的输出结果是:输出good和gbc p…