以對話方式擴展架構實務

架構不必是獨白;由少數中心化人員從上而下傳達。本文描述了另一種執行架構的方法;作為一系列對話,由分散且賦能的決策技術驅動,並由四種學習和調整機制支援:決策記錄、諮詢論壇、團隊來源原則和技術雷達

2021 年 12 月 15 日



當「傳統」架構方法失效時

坦白說,「傳統」軟體架構方法(即非編碼、決策制定、繪製圖表)對我來說很難在最佳時機發揮作用。但在我使用它們在持續交付自主團隊的世界中時,我發現自己一再面臨一項不可能的任務:無所不在,容忍顯著的脈絡差異,且不阻擋任何人。

這讓我想。是否有替代方案?

有:我停止做出架構決策。完全停止。

在本文中,我將介紹這種替代思維模式和相關的工具和實務,這些工具和實務使我能夠顛覆「軟體架構師」的傳統角色,同時將軟體架構的實務帶到開發團隊中。更重要的是,我將解釋在這種替代方法中,每個人都可以安全有效地執行他們需要的架構,而不會陷入混亂。 [1]

我們需要更多「執行」架構的方法,而不是更少。

在我看來,軟體交付朝向團隊自主權不斷提升的趨勢,增加了對更多架構思考的需求,並結合了架構決策制定中的替代方法。

確保我們的軟體團隊體驗真正的自主權會引發一個關鍵問題:一小群架構師如何才能滿足大量飢餓、與價值流一致的團隊?為什麼?因為在這種環境中,架構師[2]現在需要同時在更多地方執行所有傳統「架構」。

我們需要一種可行的方法來應對團隊自主權的人性化規模挑戰,以及由此產生的架構。

在本文的其餘部分,我將介紹一種執行和管理架構的替代方法。我將詳細說明它是什麼、如何運作,以及您如何自行採用它。最重要的是,我將重點說明如何失敗,以便您取得成功。

最基本的元素:透過「建議程序」進行決策

讓我們以一個我們旨在使其最大程度獨立的團隊作為起點。顯然,這個團隊需要以某種方式參與架構思考和決策制定,但如何做呢?

這些「許多決策中心」正是我們所需要的,但很明顯,傳統的由一群擁有所有權力的架構師做出所有決策的自上而下架構與這種分散式模型相悖。「然而」,挑戰被提出,「決策仍然需要做出,這就是架構」,這些懷疑論者是對的。

這些架構決策仍然必須經過深思熟慮地做出,否則我們將回到原點,甚至更糟。因此,這種替代方法的第一個方面,實際上是它的核心要素,必須描述它如何做出決策。它被稱為「建議流程」。

建議流程是這種無政府主義、分散式架構方法的核心要素。它最大的優點是它的極度簡潔。它包含一個規則和一個限定詞

規則:任何人都可以做出架構決策。

限定詞:在做出決策之前,決策者必須諮詢兩組人:第一組是會受到決策有意義影響的人。第二組是對決策所涉及領域有專業知識的人。

就這樣。這就是建議流程的全部內容。

然而,這種明顯的直截了當隱藏了一個值得明確表達的概念;雖然決策者絕不義務同意這兩組諮詢小組給予他們的建議,但他們必須尋求建議,並且必須聽取和記錄建議。我們在此不尋求共識,但我們正在尋求廣泛的意見和聲音。

針對此議題,經常提出的挑戰在於必須諮詢多少人。這是一個有效的疑慮,但可以緩解。在部署此技術時,我們會建立一份檢查清單,協助決策者找出需要諮詢的人員,以及諮詢的範圍。會影響資訊安全嗎?與 CISO 討論。接近個人身分資訊嗎?請資料團隊的 Mary 和法律團隊的 Vanessa 參與。使用者註冊流程可能會變更嗎?與 UX 主管討論。即將採用新的雲端服務嗎?與雲端架構師 Kris 討論。考慮變更 API 嗎?與所有使用者團隊的主管討論。

有時,此諮詢名單可能會很長。這沒關係。有些決策規模較大,而建議範圍清楚顯示規模和重要性。有時可以縮小決策範圍,因此許多決策會這麼做。其他時候,受影響的人數眾多,會讓決策者三思。這件事可能讓他們的作業稍微輕鬆一點,但真的值得諮詢所有那些人嗎?或者,他們可以將這個大型決策拆分成多個較小的決策嗎?當決策進行時,通常會純粹基於權宜考量而調整規模。[3]

我們可以進一步推動建議程序嗎?是的,我們可以,而且我們應該這麼做。我總是鼓勵遵循建議程序的人特別找尋會反對他們的人。在無需同意所聽到的意見的壓力下,他們必然會更認真地參與。因此,所收到的建議深度和廣度會更大。決策也不會因此而受損。他們的學習也不會受損。

這讓我們進一步探討建議程序的優點。在部署建議程序時,我總是看到更好、更快速、更負責任的決策,最重要的是,這些決策是由執行者理解和擁有的,原因在於決策者既有需求,也負有責任。

作為副作用,可用決策者的池子也會成長,每個人很快就會開始尋找需要做出的決策,而且,由於諮詢流程給予他們權力安全感,因此會標記它們並推動它們達成結論。團隊對決策的需求可以由他們自己滿足的事實,也會導致適當程度的行動偏見,而問責制在需要時會作為煞車。

透過這種方式工作,我們消除了對固定且永久的階層結構和遵守大師決策者的需求。由於這兩個原因,諮詢流程是這種架構方法中最基本的元素,因為分散式決策制定是任何自稱為「無政府主義」事物的核心元素。

但是等等,我們是否一下子就消除了對我們「傳統」架構師的所有需求?完全沒有,但很明顯我們的角色已經改變了。在本文的以下各節中,將介紹這種方法的支援元素,我們將看到一組重新調整的實務和工具,讓我們能夠讓團隊和他們支持的業務達到他們需要的地方。

在我們繼續討論這些支援元素之前,先花點時間來強調並討論這分散式方法中所有其他元素共有的唯一事項,以及與核心元素共通之處:它們專注於對話,以及它在有效達成並傳播共識中所扮演的角色。

對話的基本角色

事件風暴的發明者艾伯托·布蘭多里尼曾妙語說:「開發人員的假設會運送到生產環境」,而且他說的沒錯;開發人員對目標架構的理解才是最重要的,而不是首席架構師腦海中的想法或圖表。這個問題已經存在很久了。艾瑞克·埃文斯在「領域驅動設計:解決軟體核心中的複雜性」中解決了這個問題,而最近我的同事艾瑞克·多能伯格在他的簡報「沒有架構師的架構」中也談到了這個問題。

對我來說,這種架構,也就是寫程式碼的人腦海中的架構,才是最重要的。在採用這種分散式方法時,架構決策制定實務會更加分散,這個問題在許多方面都得到了緩解。

這有助於我晚上睡得安穩。

然而,這種分散式、無政府主義的方法隨後將另一個所有架構都必須解決的問題擺在最前線和中心位置:提供一個連貫的整體。在這裡,我們的替代方法似乎處於劣勢。如果每個人都被賦予做出決定的權力,我們這些「傳統」的建築師以及最關心整體最終結果的人,如何確保所有個人決策的總和結合起來形成一個連貫的整體?我們如何將更長期的觀點納入這些相同的決策?我們如何支持那些突然發現自己承擔了可能不自在的責任等級的人?

幸運的是,這個領域的另一位實務者兼思想家露絲·馬蘭之前已經看過這種情況,並在她的文章「我們仍然需要建築師嗎?」中分享了答案。

[為了讓一個架構成功],最重要的就是確保必要的對話正在發生 - 不一定總是發起這些對話,也不一定總是幫助關注或引導這些對話,而是確保這些對話確實發生 […] 並在需要時提供指導

-- 露絲·馬蘭

我們採用建議流程為任何人做出決策打開了空間,但它也將對話、尋求專業知識的責任以及思考影響力放在核心位置。此方法的其餘元素,每個元素都特別支持核心元素專注於確保這些對話盡可能及時、專注且有效。它們有四個

  1. 一個思考和記錄工具
  2. 一個對話的時間和地點;
  3. 一盞照亮並引導統一方向的燈;
  4. 一種感知當前技術環境和氣候的方法。

我們將在幾秒鐘內依序涵蓋每個元素,但首先我需要澄清兩件事。

策略和跨功能需求呢?

值得花幾句話來說明此方法中未涵蓋的內容:技術策略和跨功能需求 (CFR)。

顯然,這兩者對於任何有意義規模的軟體專案都是必不可少的

一個宣傳良好的策略可以幫助組織前進,讓分散式團隊優先考慮與組織的成熟度和需求最一致的技術活動。顯然,最好的技術決策是那些支持策略的決策,如果這是情況,就可以清楚地指出這一點。

一組明確可測試的 CFR 也有助於分散的一組團隊確保他們超越其直接的本地交付,並滿足在共享生態系統中協同運作的最低要求。

但是,技術治理是指這兩者,而不是包含它們 - 它們有助於它運作的背景 - 所以我在這裡沒有詳細說明它們。但是,除了確保良好技術決策的手段之外,治理還包括什麼?讓我們來看看。

四個支援元素

1. 思考和記錄工具:決策記錄

第一個支援元素是 架構決策記錄 或 ADR。這些是輕量級文件,通常與它們所描述的工件一起儲存在原始碼儲存庫中。現在,有各種格式供不同的採用者選擇,但我堅持的主要元素如下:[4]

ADR 的元素
名稱說明
標題其中包括唯一的識別碼,以及決策本身(例如“ADR001 - 為 Kubernetes Pods 使用 AKS”)
狀態通常為“草稿”、“建議”、“已採用”、“已取代”和“已停用”
決策用幾句話做出的決策(通常以粗體或斜體顯示,以便突出顯示)
背景需要做出此決策的力量和當前背景情況
考慮的選項每個考慮的選項,簡要說明,優缺點。(通常,建議/採用的選項在此清單中排在第一位)
後果此決策的影響,無論是正面的還是負面的
建議這反映了遵循建議程序的原始輸出。所有提供的建議都記錄在這裡。這應包括建議提供者的姓名和提供建議的日期。這通常可以採取評論的形式,如果這些評論是由建議提供者直接提供的,則記錄元數據是自動的。

我在實務中發現,擁有如此輕量級的 ADR 範本結構,不僅是記錄架構決策的絕佳方式,還能幫助團隊學習如何做出架構決策。這些關鍵元素就像思考清單一樣運作,並提示決策者需要思考什麼,更重要的是,進行討論。

此外,ADR 透過要求 ADR 作者擷取和記錄他們獲得的所有建議,來強化建議程序。我也鼓勵作者在他們的 ADR 選項部分直接採用這些建議,無論他們是否選擇遵循。尋求建議並寫下來是一回事,積極與之抗衡則是另一回事。你參與得越多,成果就越甜美。

因此,一系列 ADR 及其周圍的對話,為想要開始承擔決策任務的人們提供了絕佳的學習場域,這一點並不令人意外;所有內容都是公開的,包括異議和妥協。經驗較少的架構實務者可以快速輕鬆地瀏覽過去的歷史,查看好(很可能也有較不佳的)範例,並看到決策的制定(以及在情況改變/團隊了解更多時,可能會被撤銷)。它們幾乎是一組軟體的思考和決策傳說,由對其貢獻最多的人親手撰寫。

雖然很遺憾我無法與你分享與客戶進行這些對話的範例,但網路上有一些 ADR 的絕佳範例,感謝 Thoughtworks 校友 Wisen Tanasa 和他的新創公司Upmo。我鼓勵你看看。它們獲得Michael Nygard 本人的祝福

2. 對話的時間和地點:架構諮詢論壇

這種另類方法中的第二個支援元素的存在,是為了讓所有支援這種尋求建議的對話變得更容易:每週一小時的架構諮詢論壇(「AAF」)。

從根本上來說,這是一個定期且反覆進行對話的時間和地點。你的理想與會者是來自每個團隊的代表,以及建議程序清單中的主要代表。然而,邀請應保持完全公開,以鼓勵透明度和開放性。對話的時效性和品質是成功與否的關鍵指標,但觀點的廣度和多樣性同樣重要,對於貢獻者來說也是如此。如果架構是在這裡「完成」的,並且分享和學習了教訓,那麼你就成功了。

常設議程通常以以下方式開始

  • 團隊代表快速分享新的 尖峰(提早警告可能的未來決策,並讓與會者分享現有的知識和經驗)
  • 討論每個新的「建議」決策(由決策者提出,在 ADR 形式中事先擷取)
  • 重新檢視其他決策狀態(我們將其時間限制,以限制接收建議的時間範圍,並允許我們重新檢視我們在資訊不完整的情況下做出的決策)
  • 檢視我們的四個關鍵指標、雲端支出趨勢,最後是
  • 任何其他業務(又稱「AOB」)

粗略一看可能會給人一種印象,認為 AAF 只是標準會議的新名稱。通常稱為「技術諮詢委員會」、「架構決策論壇」或「架構審查委員會」。然而,有幾個關鍵差異。

首先,建議程序至上。提交給 AAF 的決策仍由發起人擁有和制定。其他與會者唯一能做的事情就是提供建議,或建議尋求建議的其他人選。因此得名。

這讓我們了解到第二個關鍵差異。考量建議程序的限定條件,AAF 的受邀者通常是受影響者 / 擁有相關專業知識者。這表示通常出席者包括每個功能團隊的代表(不只是負責人;BA/PO 和 QA 經常出席)、其他工作計畫、UX、產品、營運的人員,偶爾還有資深主管。

這兩個差異的結合讓我們了解到第三個,也是最重要的關鍵差異:對話。建議程序很棒,但對話通常可以是一對一。當它們在 AAF 中進行時,會有觀眾,因此許多人可以聆聽,每個人都可以學習。在這些會議中分享的組織、領域、傳統和經驗資訊以及架構技能部署,是我前所未見的,儘管這可能是一場枯燥的會議,但這是我們一週中出席人數最多、參與最廣泛的一小時。它是追求學習型組織最重要的貢獻者之一。AAF 鼓勵不同意見,並慶祝基於經驗教訓的分歧和決策改變。這一切都結合在一起,擴展和加深對架構的普遍理解,幾乎可以保證它最終會出現在執行軟體中。

3. 照亮統一目標的燈光:團隊來源的架構原則

擁有架構原則並非新鮮事,儘管遺憾的是我很少遇到實用的原則。在高度自主團隊的世界中,它們永遠重要,因為它們是達成一致交付方向的手段,而無需控制。

那麼,什麼構成了良好的架構原則?首先,它必須提供一個標準,用於評估我們的架構決策(在實務中,這表示它必須具體、可衡量、可達成、現實且可測試,又稱「S.M.A.R.T」)。其次,它必須支援企業的策略目標。第三,它必須清楚表達它必然包含的後果 / 影響。最後,它們作為一個集合,數量既不能太少,不足以涵蓋架構原則滿足的主要需求,也不能太多,以至於團隊無法全部記住。

我可以在這裡寫很多關於不良架構原則的文章,但我就堅持幾個重點。首先,它們不是實務。實務是您如何執行某件事,例如遵循 TDD、Trunk Based Delivery 或結對程式設計。這並不是說實務很糟糕(事實上,福斯格倫博士的「加速」一書中充斥著關於其環境的建議),它們只是不是架構原則。

也要注意不要滑落到另一端——一般原則。「保持簡單」和「不要重複自己」是原則,但它們不是架構原則。專案規劃和軟體品質管理中出現的各種原則也不是。我們需要的是指導和評估我們的架構實務和決策的方法。我們需要的是可以幫助我從實作微前端的各種方法中進行選擇,或幫助我決定是否真的有必要親手撰寫自己的 OAuth 2.0 實作,或引導我評估 AWS 上的LuceneAmazon Elastic Search Service的自我託管。

基於所有這些,現在讓我們分享一個好的原則,其基礎是團隊拓撲的「串流對齊團隊」組織模型

標題:團隊的價值獨立性最高

副標題:沿著團隊路線分割解決方案

理由:我們建置和執行產品的方法的優點基本上取決於團隊的獨立性。我們承認這種方法有缺點,但優點被認為大於缺點,特別是在考慮到預測未來需求的困難性時。

影響

  • 功能和資料的重複無可避免地會出現。與其對抗,我們接受它,承認在某些情況下需要明顯的最終一致性和資料複製
  • 多個第三方解決方案的合併授權、執行時間和支援成本可能高於單一、共用、跨產品團隊解決方案的成本
  • 可以根據擁有和執行解決方案的團隊的需求來設計解決方案。他們不必擔心其他團隊的需求
  • 系統和它們建立的第三方服務/解決方案往往較小,而且專注於更具體的任務
  • 自行其是的團隊需要自行支援他們獨立採用的任何第三方服務/解決方案

如果您想看到更多範例,請瀏覽公開可用的 John Lewis「軟體工程原則」[5]

到目前為止,一切都非常普遍。我在本節中所說的任何內容在任何架構方法中都不會引起爭議。那麼,為什麼我如此強調這些觀點?在這種分散式方法中,架構原則的重要性不僅會提升,而且每位相關人員都需要知道如何架構這些原則以及良好的原則是什麼樣子,因為這些原則將由團隊自行取得並維護。

我們的做法在很大程度上直接取自 Abbot 和 Fisher 所著的傑出著作 “The Art of Scalability”。儘管他們的書假設了一種比本文所呈現的架構更自上而下、更階層化的做法,但作者非常認可人類因素對其主題的影響。事實上,我讀的那一版已大幅重寫,以加強這種觀點的份量。其中一個關鍵面向是他們的論點,即對於任何架構原則要能成功,負責交付的團隊需要對此原則有歸屬感。

我鼓勵您閱讀他們的書,以深入了解如何從集體中取得這些原則。簡而言之,在提出企業的策略目標、前面提到的「S.M.A.R.T.」準則,以及來自技術領域及其他領域的廣泛受邀者(您的 AAF 受邀者清單在此將再次證明其價值)時,您將迅速且集體地得到 8-15 項原則,這些原則將對您有很大幫助。 [6] 將原則的採用記錄為 ADR 是非常值得的。這些原則將非常精簡(不要陷入重複原則本身的陷阱),並提供一個絕佳機會來說明此原則為何重要。

關於原則,還有一點最後的說明。請記住,此方法旨在支援團隊自主性,因此我們的原則所扮演的一個關鍵角色是作為每個人之間的最低可行理解和協議。這提出了關鍵的一點,因為我們要求團隊在他們的 ADR 中明確標示的其中一件事不僅是適用的原則,還有他們的決策與一個或多個原則相衝突時。這將成為啟動建議程序和 AAF 集體力量的絕佳時機,以真正讓所有最優秀的人才和不同的觀點針對問題提出看法,然後將所有這些內容記錄在 ADR 中。各種元素再次相互支援,擴大其效益,並幫助我們獲得成功的架構。請記住,如果因此而導致原則改變,請將其標示為一個獨立的 ADR,取代原始的 ADR。

這就是建築原則的涵蓋範圍,它扮演著指導方針的角色,供所有人遵循,但我們如何同時注意周圍的景觀和氣候?建築決策也經常基於其他人在做什麼、誰擁有哪些技能,以及科技產業的普遍趨勢。進入第四個也是最後一個支持元素:你自己的技術雷達。

4. 技術環境和當前氣候感測工具 - 您的技術雷達

許多人聽過 ThoughtWorks 技術雷達 - 一份關於軟體語言和架構、工具、平台和技術的當前趨勢(預測、當前和衰退)的見解指南。它的優勢在於它以視覺方式呈現當前景觀和各種「脈衝」在其中的移動,讓觀看者能非常快速地看到(例如)前端架構領域的新趨勢、本月的流行趨勢,以及什麼開始衰退。

遺憾的是,知道你可以建立自己的雷達的人少得多。作為一個集體,「BYOR」允許你擷取和繪製組織中看到的技術趨勢的在地版本。它也很容易設定。在我最近的使用中,我們保留了象限(技術、工具、平台和語言與架構),但改變了環,以反映技術通過我們的作業計畫的轉換(它們變成了「實驗」、「採用」、「暫停」和最後「退休」)。

與建築原則一樣,這些雷達脈衝需要在工作坊中群眾外包。第一次執行將擷取組織中現在擁有的一切 - 一個基準掃描或掃描,如果你願意。在此之前,你需要找出你的範圍有多廣(整個組織?僅限於你的專案?你會包含營運和 UX 等領域嗎?等等)以及你的象限是什麼。也可以新增額外欄位來擷取資料,但我通常會盡量保持簡單。你第一次執行時,可能會花費相當長的時間(我們之前花費四個小時以上),但這是因為讓所有團隊成員參與非常重要,而最終結果將提供景觀和普遍氣候的絕佳概觀,並帶來關於應將精力導向何處以及應減少何處的許多討論。就像原則一樣,產生團隊理解的一般對齊。

關於雷達的使用呢?就像原則一樣,我們的 ADR 中也有「相關雷達點」的位置。我們在此標記符合現有情勢的現有雷達,但更重要的是,此決策將引進現有雷達的潛在變更。或許是新架構的激增,或特定做法從「實驗」轉為「採用」。

同樣地,這是 AAF 討論論壇的絕佳素材,也是 ADR 本身中要捕捉的絕佳內容。您甚至可以進一步將特定類型的點出現和移動連結到提交 ADR 的需求,不過根據我的經驗,這會在沒有人明確推動的情況下發生。請記住,您在此的目標是盡可能廣泛地參與您的演化架構,以及所有團隊成員的架構思維成長。

如何讓您的雷達保持最新?我見過每季一次的頻率,也有每半年一次的頻率。重點是要注意 AAF 和其他地方如何使用(或不使用)雷達。這應該可以讓您清楚了解何時值得投資更新。

這通常在實務中如何運作

考量到這一切,您如何看待實際運作的狀況?讓我們來看看…

當架構決策的需求首次出現時,它很可能很模糊,而且可能理解不佳。因此,最好立即開啟新的 ADR 範本,並開始嘗試填寫。

首先要處理的是「脈絡」區段。要嘗試處理這個區段,我們需要了解我們決策的「原因」,以及我們需要平衡的周遭力量。我們可能會很快意識到,我們需要做一些研究才能完成這個簡短的區段。

本研究的早期停靠港口應為架構原則和雷達。您會記得,這些原則讓我們了解理想解決方案理想上將展現的旅行方向。並非所有原則都相關,但有些原則應有助於我們的決策。請記得,架構原則的主要目標是協助評估多種技術可能性,並強調最合適的可能性。

有時,經驗會有些不同。其中一種替代方案是,相關原則無法協助您在兩個選項之間做出選擇,表示兩者之間幾乎沒有差異,或者您的原則可能不夠 S.M.A.R.T。這是重新檢視原則並重新定義原則的充分理由。

另一種替代方案也可能以重新評估的一組原則告終,或許稍晚一些。當您為了做出決定而傾向於違反一個或多個原則時,就會出現這些原則。這沒關係;良好的決定可以違背原則,但為此您需要清楚說明為何採取此行動方針是正確的步驟。推翻原則是一個重要的步驟,因為這表示我們實際上偏離了旅行的一般方向。因此,必須清楚論證並有力地證明決策和產生的 ADR。這也可能表示根據此發展重新檢視原則的時候到了。

相較之下,雷達的性質更具諮詢性。它將提供一個概念,說明在我們的問題空間中,什麼(如果有)是現行的實際標準、過去已完成的事項,以及其他團隊可能正在嘗試的事項。採取不同的方式不太可能引起關注,但這再次是說明 ADR 中偏差的明確理由。

考慮到所有這些,我們可以開始提出關鍵標準,以評估選項,以及替代方案清單。或許我們已了解到我們真的需要做一些功課,在這種情況下,我們可能會衍生一個時間限制的 Spike,以進一步了解某事。我們的 ADR 思考將有助於在此撰寫超清楚的驗收標準。如果我們不需要執行 Spike,我們將考慮尋求建議。

從脈絡中獲得這些輸入(例如,技術策略、適用原則、雷達脈衝和主要標準/替代方案)將反過來幫助我們思考向誰尋求建議。根據我的經驗,當你對問題空間/需求有相當的信心時,參與其中是有幫助的,但在你過於依附於特定解決方案之前。當你尋求建議時,花費大部分時間和精力與那些與你意見相左的人交談;那些你知道想法不同的人,你知道你會有盲點。不僅如此,還要挑戰自己。考慮“這個替代方案有什麼不好?它的缺點是什麼?”花費大部分時間思考最直接和最根本挑戰你決策的替代方案。

在進行討論之前,準備好粗略形式的 ADR,並提前與他們分享,這會有幫助。這將給他們思考時間。然後,當你見面時,仔細查看 ADR 範本的每個元素。你是否錯過了脈絡中的某些內容?來自原則/脈衝?來自評估標準?徵求並收集他們對所有這些事情的建議。更重要的是,詢問他們為什麼提出這些建議。這些問題的答案是學習做出更好架構決策的關鍵。你的顧問將幫助你了解他們如何看待問題,他們過去遇到過哪些類似問題,甚至是你根本沒有想到的整個方面。 [7]

AAF 呢?那不是收集建議的地方嗎?是的,我在上面分享的所有內容都應該指導你在任何地方進行對話,但對於團隊或個人做出的前幾個決定,真的很有幫助,讓這些決定以更具針對性的方式與關鍵顧問一起做出。你在 AAF 之前提出的 ADR 將非常紮實且專注,然後再廣泛分享,這意味著產生的 AAF 對話將會更豐富、更專注。有時,在 AAF 中進行快速對話將導致後續更深入的 1 對 1 對話。

請記住,一旦你有了建議,無論來自何處,你都必須將其納入你的 ADR。你不需要採納給出的建議,但你必須記錄下來。這裡一個很好的做法是優先處理你寫作中人們會覺得不直觀或驚訝的事情。如果你不同意關鍵建議,請說明原因和理由。如果你正在做一些新的事情,請清楚說明當前的方式為何對你不起作用。請記住使用原則。有時它們會支持你的決定。清楚說明如何。有時你必須違反它們。清楚說明原因。你的目標是讓讀者了解你為何做出你所做的決定。如果你達到了這個目標,那麼你將不僅有一個穩固的決定,而且你很可能在這個過程中學到了很多東西。 [8]

在我結束本節之前,請記住,所有決定都是時間點,而且沒有人可以預見每種可能性,但你希望能夠在稍後回顧並對一個決定感到滿意,因為你當時知道/理解了什麼。在其中,你捕捉到的背景和標準是關鍵。這種重新審視決定的過程是另一個很好的學習工具。有了事後的好處,你現在可以提出諸如:「我們是否充分了解背景?」和「我們對自己所知道和不知道的事情是否足夠誠實?」等問題。

如何失敗

因此,這就是我們對架構的替代、分散、無政府主義方法的全部內容,以及它們通常如何組合在一起的一個想法。但在我們得出結論之前,我們應該解決一個最後的方面——你可以失敗的主要方式。讓我們一一列舉出來。

你將看到的大多數失敗實際上都是好的失敗——當經驗較少的人做出決定時的小失敗。這些很好,因為這個過程促进了那些需要它們的人快速做出決定,更重要的是,它促进了透明度和快速识别失败(因為做出决定的人将在编码时意识到这些问题)以及重新审视和分享经验教训的安全方法。接受這些,在 AAF 中特別指出並慶祝它們。這是建立學習文化的一個關鍵方面。

要最有效地學習,你需要感到安全,當集體學習時,每個人都可以從最廣泛、最多樣化的投入中受益,這些投入有助於討論。請記住,在這種方法中,我們明確不尋求共識,但我們正在尋求廣泛的投入和聲音。正是在這裡,下一個故障模式出現了,它比第一個故障模式更陰險、更具破壞性。當你作為對話發起人和空間持有者,未能納入所有應該做出貢獻、做出決定和學習的人時,就會出現這種第二種故障模式。對於這種架構風格的早期採用階段來說,很大一部分感覺就像巨大的成功。「它有效!越來越多的人做出決定,在 ADR 中寫下它們,提供建議並在 AAF 中討論它們!我從未見過如此符合原則的參與!」只有在稍後反思時,你才會意識到收益本可以更大。正是當這種滿足感第一次襲來時,你必須最小心。你真的在觀察大眾參與和學習,還是只是一群核心嫌疑人?你積極緩解這個問題。注意誰做出了貢獻。放大聲音,確保其他人聆聽那些較安靜的貢獻者。確保影響力是平衡的,而不是基於聲譽、任期或在層級中的位置。積極鼓勵多種觀點並強調其帶來的價值,以便它能夠自我維持。

第三種失敗模式是對您遭遇前述失敗模式的早期警告,然而,這一個更存在於理想與不受歡迎之間的灰色地帶。隨著您繼續這趟旅程,您將發現偏離常軌的決策。這些決策從未在 AAF 中出現,也從未進入 ADR。有兩種方法可以處理它們。第一種正確的方法是將發現視為您所希望的 - 一個誠實的錯誤,以及一個學習和教導他人的機會。也許決策者甚至沒有意識到他們正在做一個關鍵決策。也許他們來自其他地方的壓力。也許他們認為這沒有想像中那麼重要。也許他們覺得自己會在 AAF 中被大聲斥責。無論原因為何,都將其視為他們和您學習的方式。改善流程。對待這些問題的另一種錯誤方法是退回舊方法,並重新控制。這將我們很好地帶到了完全破壞這種方法及其所有承諾的失敗模式。

很容易陷入這種第四種也是最危險的失敗模式,因此您需要持續保持警覺。觸發此模式發生的唯一事情是像您這樣的「大寫 A」架構師不信任他人;不實踐您所宣揚的;沒有為剛才提到的微小失敗和後續的學習機會騰出足夠的空間;繼續在幕後執行「影子架構」,以確保事情仍然按照您認為應該進行的方式進行,儘管來自其他地方的所有信號。這種失敗模式的唯一好處是,由於我上面列出的所有好處都無法實現,因此它會非常迅速地顯現出來。

如果您想知道是否這種關鍵失敗模式讓這種架構方法難以實現,您的想法是正確的。我過去很幸運。當我為他人做決定時,同事會叫我出來,而我發現自己對人們不知道我知道的事情感到沮喪。但後來我意識到,我作為一名建築實務者未能完成我的真正任務 - 我未能讓正確的對話在正確的時間與正確的人發生。請記住這一點(甚至可以委派其他人當您未能堅持這個流程時叫您出來),您會驚訝於成功是多麼容易(且令人滿意)。

再次說明五個元素,以及可能的進一步步驟

由於我們現在有了好處和(潛在的)壞處,以及需要留意的失敗模式集合,讓我們做個結論。我們回顧一下,我們有架構的替代方法的五個要素

一個核心要素:建議流程

四個支持要素

  • 架構諮詢論壇
  • 輕量級 ADR
  • 團隊來源原則
  • 您自己的技術雷達

希望我已經清楚地說明,儘管這些要素對您來說可能都不是新的(除了建議流程之外),但它們之間存在著非常不同的相互作用/相互強化,背景是對話、學習和安全。至少根據我的經驗,令人興奮的事實是,這更有可能提供成功部署的架構,現在和未來。這是我的擴展首選,並確保我合作的團隊兌現我們對使用者的承諾,畢竟,這是目標。

後記:下一步是什麼?

當然,雖然我試著讓這篇文章保持重點,但還是有深入探討的可能。我見過以這種方式工作的團隊自然而然地開始鋪設自己的道路,在(交付)平台團隊出現之前,就自建了自己的交付平台。(請參閱我同事 Evan Bottcher 的優秀文章 “我在談論平台時所談論的”,以及 Skelton 和 Pais 的 團隊拓撲,以取得更多詳細資訊。)

我也見過團隊實施自己的 架構適用性功能(不只是圍繞 執行成本),以便他們知道集體架構何時超出預期範圍。

我學到最大的教訓是,一旦你賦予人們權力,給他們一個成功並認可他們成功的環境,他們將會迅速而集體地開始思考你甚至沒有想到的事情。這就是這種方法的真正好處:取用多數人的集體智慧,而不是過度依賴少數人的智慧,後者受到更多限制。


腳註

1: 儘管會有一劑健康的無政府主義...

2: 我將自己也包含在這個群體中。

3: 決策經濟學在 Donald G. Reinertsen 的 產品開發流程原則 中有非常詳細的探討。原則 E8:小決策原則、E10:第一個易腐敗原則和 E11:細分原則特別有趣,因為它們與我們在此討論的內容有關。

4: 實際上還有兩個,但我們將在支援元素 3 和 4 中分別詳細探討它們。

5: 請注意,在撰寫本文時,John Lewis 原則包含一些不符合我們「架構」原則定義的項目。例如,我想到了 「可理解性」「效能重要性」。這並不表示這些不是不好的目標,只是它們不符合我們的定義。

6: 值得指出的是,儘管下一章中的 JAD 和 ARB 與我們在此遵循的方法不太相符,但它們確實包含了一些關於何時重新審視/更新原則的絕佳想法,從而確保它們通過持續使用和重新評估保持新鮮。

7: 經典範例包括必須尋找、聘用和留住開發人員的人員,以及對於新技術有不同想法的決策「支援」端的人員。

8: 有些很棒的部落格文章符合此標準,在許多方面只是延伸的 ADR。 「為什麼不使用 Rust?」「不,我們不使用 Kubernetes」 是絕佳範例,如果您想看到一些真正偉大的決策制定(和避免盲從)正在進行中,它們值得一讀。

致謝

非常感謝所有幫助我完成這篇文章的人:Martin Fowler、Nimisha Asthagiri、Nick Robinson、Rob Horn、Ian Cartwright、Tim Cochran、Carl Nygard、Marty Abbot、Mel Mitchell、Pete Hunter 和 James Brown。感謝你們的所有腦力激盪和投入。

重大修訂

2021 年 12 月 15 日:完成出版

2021 年 12 月 13 日:發布 Tech Radar

2021 年 12 月 09 日:發布架構原則

2021 年 12 月 08 日:發布架構諮詢論壇

2021 年 12 月 01 日:發布決策記錄

2021 年 11 月 30 日:發布建議程序