主頁 > 軟體設計 > 輕量級的架構決策記錄機制

輕量級的架構決策記錄機制

2022-12-17 06:52:18 軟體設計

作者:倪新明

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之旅吧!

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/540180.html

標籤:其他

上一篇:輕量級的架構決策記錄機制

下一篇:時間片差分調度法-充分利用MCU的資源

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more