建築的強弱力
良好的技術設計決策非常依賴於背景。定期共同為共同目標而努力的團隊能夠定期溝通並快速協商變更。這些團隊展現出強大的力量,並能做出利用該強大力量的技術和設計決策。當我們在一個較大的組織中縮小範圍時,在獨立工作且較少頻繁合作的團隊和部門之間存在越來越弱的力量。認識到這些強弱力量的差異,讓我們能夠做出更好的決策,並針對每個層級提供更好的指導,讓團隊更有能力且能更快速行動。
2021 年 11 月 10 日
技術治理和什麼被認為是「良好的架構」通常被認為是「一體適用」的方法。許多組織嘗試在所有層級套用相同的嚴格治理,限制技術選擇,並剝奪團隊的權力。其他組織則允許團隊在所有層級完全自主,這表示團隊可以自由做出自己的選擇,完全沒有任何限制。這兩種方法都不是理想的。
舉一個具體的例子,我們長期以來看到整合架構師在架構的所有層級都努力追求「唯一正確」的整合方法。他們引用「最佳實務」,強制要求極度鬆散的耦合、向後相容的介面,以及在所有層級的每個系統互動中進行仔細的封裝。這種通用方法在許多情況下造成了許多不必要的複雜性和延誤,但你如何找出在何處可以加快速度並放寬這些需求?
MYOB 的團隊
在 MYOB,我們根據現代數位產品組織的成熟原則來安排我們的團隊。團隊與我們的產品功能和業務功能保持一致,並負責軟體和基礎設施的規劃、交付、維護和支援等所有方面。
團隊被分組為網域,網域彙集相關功能,並由一些領導和支援角色在網域層級運作。網域進一步分組為稱為垂直的更大組織單位。垂直代表我們客戶群的主要區塊。
當然還有更多內容,包括支援功能和內部平台,這些平台提供架構,讓整個組織能有效地交付成果。然而,這個簡化的模型對於技術治理的推理很有用。

在本文中,我想說明這個結構如何影響我們的技術選擇和設計決策,不同的方法可能適合於不同範圍(或「爆炸半徑」)的決策。我喜歡的觀念模型是組織不同部分之間的吸引力。
在一個網域內 = 強力
在一個網域內,我們有多個團隊,每個團隊負責網域內的一些功能和基礎系統。有時候這會完美地對齊,每個團隊都是一組界線分明的系統的管理員。在現實中,這通常是不完美的,一些系統的管理會由多個團隊共同負責,通常是出於遺留原因。對於網域內的團隊,存在著非常強大的對齊力量。

網域結構旨在彙集在功能上具有凝聚力的系統,它們密切相關,處理相同概念,依賴於共同的網域專業知識,而且它們經常同時變更以滿足客戶需求。
單一團隊的成員通常在相同的系統上工作,因此需要非常清晰且一致的工作方式、標準、技術選擇和設計方向。這是最強大的對齊力量。
在同一個網域內的團隊之間,對齊力量仍然非常強大。知識共享容易且流暢。協商系統互動,例如架構,相對容易。當需要交付一個跨越網域內系統的功能時,通常同一個人會實作每個整合點的「雙方」。
這表示網域內系統之間的「私有」互動(API 呼叫、事件、資料檔案)可以有更緊密的耦合,而不會有那麼嚴重的成本。透過允許一些更緊密的耦合,我們可以減少版本控制、向後相容性以及避免共用依賴項所付出的努力。網域層級的系統耦合並不總是必須不惜一切代價消滅的邪惡怪物,事實上,在這個範圍內的耦合可能是一件有用的事情。
在一個垂直範圍內 = 弱化力
在中間區域,我們有我們的垂直結構,包含多個網域。一個網域與另一個網域之間的人員社會距離正在拉大。這使得協商和達成共識變得更加緊張和緩慢,因此勢必會影響我們的技術選擇和方法。

整個組織 = 弱力
當我們將焦點拉遠到整個組織時,垂直之間的共識力道確實非常薄弱。在整個組織中原子化地進行變更相當困難,主要是因為每個垂直的優先工作事項都是刻意獨立的。在此層級協調工作勢必會慢很多,而且有其限制。這表示我們的設計決策和方法需要相應調整。

我們如何應用這個模型?
讓我們透過探討一些技術決策制定領域,來讓這個模型更具體,這些領域可能會根據其範圍而有所不同。以下清單並非旨在詳盡無遺,僅提供一些有趣的範例供您參考。
技術選擇
垂直(力量減弱)
在垂直層級,將會有一組稍大的已同意技術選擇,以滿足多個網域的不同需求。
垂直能夠將人員移往優先工作事項,對垂直來說是有利的,因此在此保持技術一致性非常重要。
更正式地分享解決方案選項和建議,可以有效地讓選擇保持一致。
整個組織(力量薄弱)
在整個組織層級,對齊和管理技術選擇的力量最薄弱。
MYOB 技術雷達在首選技術方面設定方向。
解決方案選項和建議鼓勵對話並改善共識。
共用程式碼和基礎架構
網域(強大力量)
在單一網域內,即使橫跨 3-5 個團隊,我們都應該有高頻寬的溝通,並且與授權領導之間的距離很短。
這表示當共享程式碼或基礎架構需要變更時,我們可以快速通知並準備變更。
共享程式碼和基礎架構引入的耦合影響較小,而且好處通常大於成本。
垂直(力量減弱)
共享程式碼、人工製品和基礎架構通常可以在垂直層級管理,但應仔細監控引入的拖累。
整個組織(力量薄弱)
整個組織層級的共享程式碼僅限於高度穩定、高度有用的項目。這些項目大多限於可分發、可建立版本並小心變更的函式庫。
共享基礎架構類似,在組織層級,共享基礎架構必須具有極高的價值,而且封裝良好(「作為服務」、「自助服務」)。它很少需要針對單一團隊的需求進行核心變更。
程式碼貢獻模式
網域(強大力量)
在單一網域中,在實務和技術方面高度一致,團隊可以跨團隊界線貢獻程式碼,而一種集體程式碼擁有權延伸到整個網域。
每個系統的管理職責仍應清楚了解,通常最好保留在一個團隊內。
垂直(力量減弱)
在垂直層級中,跨系統進行程式碼貢獻很常見,例如原始碼控制中的拉取要求,只需少量延遲和返工。
整個組織(力量薄弱)
在整個組織層級中,有效管理跨垂直層級的貢獻通常相當困難(有時甚至有害)。
這在系統本質上複雜、在準確性、效能、隱私和相容性方面極為關鍵或敏感時尤其如此。
當建立全新系統功能時,即使進行結對程式設計,跨部門合作也能發揮良好的效果。然而,隨著功能建立完成,來自其他部門的變更需求增加,就需要投資才能讓這些系統安全地進行擴充和組態。這些變更通常具有架構性質,例如將「核心」和複雜的子系統分開,並引入模組化,讓擴充更容易管理。
整合模式
網域(強大力量)
在單一網域中擁有的系統,在緊密協調的情況下,變更相對容易。例如,這表示維護介面的向下相容性所需要付出的努力(稍微)較少。
即使是「禁止」的方法,例如資料庫層級整合,在單一網域中的系統中影響也會較小。雖然我們不應該刻意以這種方式建構系統,但如果系統已經存在,我們可以將影響限制在單一網域中。
垂直(力量減弱)
必須在垂直部門中的多個網域中協調的變更應該很少見,但必要時可以管理。當影響限制在垂直部門中時,擴充-收縮 API 合約變更 非常有效。
整個組織(力量薄弱)
發布到整個 MYOB 的 API 和介面(例如事件)必須最注意發布的架構、版本控制、向下相容性、合約和棄用策略。
高度耦合整合(例如 ETL、資料庫整合)的影響非常大,應絕對避免。
結論
在任何規模不小的組織中,每天都會做出許多技術決策。多年來,我們一直致力於讓團隊能夠在更接近工作的地方做出決策,而無需對每個決策進行嚴格的集中管理。達成「協調的自主」並不容易,需要不斷平衡和調整。簡單的模型可以幫助團隊了解如何在特定情況下做出好的決策。在本文中,我描述了 MYOB 如何將我們的技術治理方法與組織結構和動態相結合。了解組織內部的這些協調力量,讓我們能夠了解什麼容易,什麼困難,並因此做出更好的技術選擇。
致謝
本文最初是 MYOB 內部的部落格文章,引發了一些精彩的對話,幫助我完善了這個想法。感謝 MYOB 同事 Heaton Cai 和 Thoughtworkers Rebecca Parsons、Birgitta Böckeler、Mark Taylor 和 Peter Gillard-Moss 對草稿提供的深入見解。
重大修訂
2021 年 11 月 10 日:已發布