Building Evolutionary Architectures : Support Constant Change 心得歸納6

CH.7 演進式架構的陷阱與反模式

ZONGRU Li
Sep 27, 2022

現實世界中許多損害專案演進能力的偶合

反模式:供應商霸王(vendor lock-in)

  • 例如有些大企業會購買企業資源規劃(ERP)軟體
  • ERP工具經常無法被訂製成完全實現開發人員所需要的功能
  • 開發人員被這種工具束縛
  • 最後陷入後面會提到的反模式:最後10%陷阱
  • i.e.不要讓自家的架構與供應商耦合

陷阱:有漏的抽象(The Law of Leaky Abstractions — Joel Spolsky)

  • 亦即所有非不證自明的抽象概念,都有某種程度的疏漏
  • 原始抽象洩漏(primordial abstraction ooze)指再較低層級損壞的抽象會導致意外的毀滅,這是技術堆疊的複雜性增加的副作用之一
  • 也就是技術堆疊越複雜的系統,除錯與採證分析就變得困難
  • 所以了解技術堆疊中脆弱的地方,並透過適應度函數來自動保護

反模式:最後10%陷阱

  • 工具、框架、或語言很容易完成客戶想要完成的80%內容
  • 但是接下去的10%可以實現,但是往往卻非常困難
  • 難以從80% →90%,甚至最後以失敗告終
  • IBM的San Francisco專案

反模式:隨便復用程式

  • 軟體的復用比較像器官移植,而不是拼裝樂高積木 — John D. Cook
  • 微服務捨棄復用,採用重複重於耦合

陷阱:履歷驅動開發

  • 架構師容易被令人興奮的新開發方法吸引,是履歷驅動開發陷阱 — 盡量利用所有的框架合程式庫,並且在履歷上兜售那些知識
  • 不要為了完成某種架構而建立架構 — 你的工作是解決問題

漸進變更

  • 如Continuous Delivery一書所述,許多現代工程做法都支援演進式架構了

反模式:不洽當的治理方式

  • 微服務架構有一個共同特性是它們支持多語言環境
  • 但是微服務專案的目標並不是隨興地選擇各種不同的技術,而是根據問題的大小選擇合適的技術
  • 但要我個人來說的話,技術棧收斂而施放的開發與DevOps遇到問題解決的效能更高
  • 但是書中也有提及要避免不同微服務團隊"無意間的耦合"這個問題,甚至可以因此考慮各團隊使用不同技術棧

陷阱:缺乏釋出速度

  • "釋出軟體的能力"與"演進軟體設計的能力"有很密切關係
  • 如果釋出是需要大量專業知識的工作,那麼利用演進式架構的好處的機會就減少很多
  • 持續交付追蹤的是週期時間(一個工作單位),i.e.從軟體開發啟動到完成所花費的時間
  • 減少週期時間是持續交付的關鍵目標之一

商業問題

陷阱:自訂產品

  • Sales希望能販賣可以自由訂製的軟體,但是這需要一系列的技術才能實現
  • 1.為不同顧客量身訂製版本
  • 2.永久性功能開關(i.e.為不同顧客建立不同版本,甚至有解鎖高級功能版本)
  • 3.產品驅動訂製(例如透過UI來加入訂製功能等)

反模式:報告

  • 架構師很難透過同一組"可復用"的服務來支援每個商業關注點
  • 服務越通用,它就越需要透過開發人員的客製化才能讓人使用
  • 報告是單體架構中無意耦合的好例子
  • 例如架構師和DBA都希望紀錄和報告系統使用同一個資料庫schema
  • 但是有時schema的設計沒有考慮那兩種系統

陷阱:規劃願景

  • 預算編列和程序規劃經常促使人們做出假設,以及為了實現那些假設而做出早期決策
  • 長時間的計畫週期會迫使架構師做出不可逆決策
  • 將大型工作程序分解成小規模的、可早期交付成果的程序,可以測試架構和基礎設施的可行性
  • 在透過最終用戶的回饋來驗證某項技術確實是和用來解決問題之前,架構師應避免使用在實際建構軟體之前需要投資大量資源的技術

其實之前金融業經驗都有踩到上面不好的,也有踩到好的

像是被綁死死的ESB

每每要跟其他系統介接真的會卡在那10%複雜度(技術成本up)

或是常常有台灣原廠搞不定的問題

然後這樣package系統也已經根深蒂固的形成

與公司內其他數十個系統高耦合狀態

未來要演進系統想必成本會非常的高(人力,技術,資源等)

也見識了很多履歷驅動開發的例子

(不管後面接手的人,甚至沒留文件,隨便開發,甚至沒有上到版控中...)

缺發釋出速度更是有卡UAT超過一年的專案完全不上PROD

這對Gitflow設計造成極大困擾(完全沒辦法考慮用feature branch模式)

規劃願景就是公司能不能做到敏捷的問題了

遇到的還是總經理交辦,該功能本週上線的隕石開發模式為主

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet