傳統系統替換模式
傳統軟體系統的有效現代化
當面臨需要替換現有軟體系統時,組織經常陷入半完成技術替換的迴圈。我們的經驗教導我們一系列模式,讓我們得以打破這個迴圈,依賴於:明確認知替換傳統軟體的預期結果、將此替換分解成各部分、逐步交付這些部分,以及改變組織文化以認知到變更是不變的現實。
2024 年 3 月 5 日
在過去的幾十年中,我們大部分時間都在協助大型組織徹底檢修其傳統系統。在這樣做的過程中,我們學到了許多有用的知識,並看到了許多導致失敗的路徑。我們決定花些時間以我們看過的各種模式的形式寫下我們所學到的知識。
本文作為這些模式的樞紐。我們太常看到組織陷入半途而廢的傳統替換工作的困境。我們認為打破這個循環的關鍵需要四項活動,這些活動在公司的生命週期中以某種順序進行,但大多數是反覆進行的。我們使用這些活動作為組織我們所描述模式的主要結構。
我們一直相信有效的軟體開發涉及有價值功能的逐步發布,我們認為寫作也是如此 - 特別是在網路時代。我們從這篇文章開始,並將在撰寫詳細資訊時逐步新增模式,以及顯示它們如何結合的其他範例。我們無法承諾任何日期,因為我們的優先事項是我們的客戶工作,其中不乏要轉移的傳統系統。如果您有興趣進一步了解這項工作的其他部分,它們將在 Martin 的 Twitter 動態和本網站的 RSS 動態上發布。
傳統系統替換迴圈
我們曾與許多組織合作,這些組織多次嘗試移除傳統系統。在一個相當典型的組織中,他們經歷了一系列長達 3-5 年的現代化計畫。每次他們都會定義一種新的技術方法,然後作為大型多年現代化計畫的一部分朝向該新方法努力。
在每個計畫的某個時間點,他們會遇到一個危機點,在此時變化的業務需求將超越其目前的技術策略,因此觸發重新開始的需要。如果他們對計畫採取瀑布式「大爆炸」方法,這意味著放棄大部分工作。在其他情況下,採用更多增量交付方法,所採取的方法只是在已經複雜的環境之上新增一層稍新的技術。對於這兩種情況,他們都無法停用任何傳統堆疊,成本節省和風險降低的主要業務目標仍然無法達成,這是許多傳統替換工作中太常見的結果。
他們的重複失敗中,有幾個關鍵因素在發揮作用。
首先,他們所看到的糟糕結果在很大程度上是組織的產物;具體來說,是其領導力、結構和工作方式。他們認為,只要選擇更新的技術,但其他一切或多或少保持不變,他們就能獲得與過去不同的結果。事後看來,這顯然是不切實際的。
其次,現代化將通過一個大型變更計畫來交付,它本身包含一系列專案和團隊。這些專案被視為與任何 BAU(照常營業)工作正交。因此,在新的專案團隊根據替換計畫開始時商定的需求集交付時,BAU 將繼續根據現有系統交付業務需求。
隨著時間的推移,他們發現業務實際需要與計畫開始時實際簽署的內容之間的差距越來越大。每個計畫執行時間越長,計畫與 BAU 和未來需求之間的差距就越大。雖然變更控制流程已經到位,可以向計畫新增新需求,但這些流程非常耗時,而且由於前期供應商合約,成本高得令人望而卻步。
幾個失敗的第三個關鍵因素是希望與現有系統和業務流程實現功能同等。這些嘗試從承諾給業務提供他們今天所擁有的一切開始,不知何故,在幕後,技術已經「改進」。由於已經看到了多次失敗,並且擔心中斷,業務領導者認為這是一個風險較低的策略。這裡的挑戰在於,即使定義和同意當前「按原樣」的功能也是一項巨大的工作,並且導致了一個大型單一「大爆炸」切換版本的計畫。
我們從這家和其他許多組織的觀察中發現,技術最多只佔遺留問題的 50%,工作方式、組織結構和領導力對成功同樣重要。
打破迴圈
顯然有必要打破「技術替換計畫」的循環。簡而言之,組織需要能夠在替換過時技術的同時繼續滿足業務需求,所有這些都是在技術變革加速和競爭環境更嚴峻的背景下進行的。
我們發現一系列方法可以幫助應對這些挑戰。它們有助於將問題分解成更小的部分,以便在改進技術的同時並行交付新需求。廣義上來說,它們分為四類
- 了解您想達成的結果
- 決定如何將問題分解成較小的部分
- 成功交付各部分
- 改變組織,讓此過程持續進行
了解您想達成的結果
組織在處理遺留問題時,同意他們想要達成的成果至關重要。雖然這看起來很明顯,但組織的不同部門對於預期的成果往往有截然不同的看法。大多數遺留現代化計畫都包含我們在下面列出的幾個成果,但在開始執行之前,找出哪些成果是優先事項至關重要。
降低變更成本
許多組織在決定處理遺留問題時的一個關鍵轉捩點是,預期的業務變更開始花費遠高於預期的任何好處,這可能是因為機會成本(又稱延誤)或實施成本。一個早期警訊是必須花費數週和數十萬或數百萬來對網站進行變更,而這只會帶來業務績效的小幅提升。
在這個時候,通常不再可能證明進行任何無法帶來大量投資報酬率的變更。換句話說,技術狀態已開始決定企業可以進行的變更規模。對許多組織而言,這意味著進行「BAU」變更或必須啟動較大的專案之間的差異。這些較大的專案隨後會成為所有先前無法合理化的細微變更的磁鐵,從而增加其範圍、成本和風險
改善業務流程
我們看過許多業務流程演變為遺留系統的範例,這些流程與系統運作方式緊密結合,受到系統中的限制,而且經常出現「系統外」的解決方法,塑造人們執行工作所遵循的業務流程。
我們看到的一個範例是使用「綠色螢幕」終端的航空公司報到系統,由於遺留系統的限制,流程必須按照嚴格的順序進行,這表示更正或錯誤意味著重新開始報到流程。此外,航空公司最初並未提供轉機航班,當這項服務加入時,由於該技術的限制,必須在遺留系統中作為一個獨立的工作流程來執行。因此,如果乘客在報到時未提及他們有轉機航班,則會遵循錯誤的流程,包括列印錯誤的行李標籤,系統才會在之後標示轉機航班。報到人員的工作和乘客的體驗都可以透過變更流程獲得大幅改善,但由於遺留系統,這是不可能的。
有鑑於此,更新和變更業務流程反過來需要變更支援技術的運作方式,這不足為奇。嘗試在不改變技術的情況下變更工作流程,通常會導致「系統外」工作,人們會將資料擷取到試算表或類似工具中,在其中進行處理,然後再將資料匯入遺留系統。
在一個組織中,整個庫存訂購流程實際上是在團隊經理的電腦上執行 Microsoft Access 資料庫。由於舊系統無法支援供應商較新的作業方式,他們感到沮喪。他們會每週匯入和匯出資料幾次,同時,組織的其他成員會看到過時的數字,因為沒有人知道發生了什麼事。
值得注意的是,支援資料匯入和匯出的替換系統的需求通常會因為這種權宜措施而產生根本原因。
淘汰舊系統
淘汰舊系統的需求是舊系統現代化的常見原因。這通常是由於支援較舊硬體或軟體的挑戰所驅動,例如支援成本不斷升高,以及硬體和軟體的支援合約達到使用壽命終點。
我們發現透過業務的角度來看舊系統的淘汰是有用的。因此,建立在舊技術上的系統本身並不足以成為替換的理由。相反地,我們需要了解這對業務造成的影響,例如運作成本不斷升高,或由於缺乏支援或對系統的了解而產生的風險。
雖然有些組織確實對舊技術的過時性做好了規劃,但許多組織似乎忽視這個問題,直到它達到危機點。反過來,這往往會驅使組織採用看似低中斷選項或快速獲勝的現代化方法,這些通常是反模式,我們稍後會說明其中一些陷阱。
多年來,我們對許多大型組織在不受支援的硬體和軟體上經營業務感到震驚,在 eBay 上購買備用零件是令人驚訝的常見故事。如果您有舊技術,那麼進行適當的調查並建立一個包含各種使用壽命終止支援日期的行事曆是值得的。
雖然許多組織將淘汰舊系統視為舊系統現代化的關鍵成果,但發現這實際上並未發生並不少見,舊系統仍在使用,且相關業務目標仍未達成。
迫在眉睫的中斷
對於某些組織而言,處理舊系統的實際臨界點可能是由於外部因素,例如法規變更、新的「新創」競爭對手或現有競爭對手做出重大變更。通常在這個時候,當面臨「必須」變更時,很明顯地發現回應所需的金錢和時間已經變得太龐大。
外部事件讓組織的領導階層清楚了解到,他們不再有能力以相應的成本進行變更。
更新技術
採用較新的技術不應是現代化舊系統的原因,僅為了擁有較新的技術而擁有較新的技術很少是任何組織的主要目標。相反地,應以最能滿足企業當前和未來需求的方式選擇和採用。此處的挑戰在於技術變遷的速度正在加快,技術的「有用」壽命正在縮短。「有用」的實際定義取決於組織,但一般而言,我們需要考慮以下事項
- 允許競爭優勢
- 符合競爭對手或市場供應
- 允許更快的變遷速度
- 變更成本較低
- 執行成本較低
我們今天對最佳和最有用的技術所做的選擇,很可能會在相對短的時間內被更好的替代方案所取代。這使得在尋找技術以滿足未來需求時做出正確的決策可能會非常冒險。
此處一個好的方法是不做出任何不能在 2-3 年內輕易「重做」的選擇。這對技術選擇和整體設計與方法都有影響。在我們承認這種變遷速度正在加快時,很難為一個需要 5-10 年才能回本的龐大平台辯護。
決定如何將問題分解成更小的部分
廣義而言,這涉及在當前的業務和技術架構中找到正確的「縫隙」。重要的是,您必須考慮當前解決方案的元素如何對應到不同的業務功能。對於舊系統,這通常表示找出一個大型技術解決方案如何滿足多個業務需求,然後查看是否有可能使用新的解決方案提取個別需求以進行獨立交付。理想情況下,這些需求應可交付,且彼此之間的依賴性最小。
一個常見的異議是,找到這些縫隙太困難。雖然我們同意這一開始具有挑戰性,但我們發現這是一個比其他替代方案更好的方法,而這些替代方案往往導致功能同等性和大爆炸式釋出。我們還觀察到,許多組織會排除這種方法,因為他們孤立地看待技術或業務流程。僅變更技術的一部分或獨立更新一個業務流程很可能會失敗,但如果我們可以考慮並同時實施這兩者,就有辦法「一口一口吃掉大象」。
開始
在旅程開始時,傳統現代化似乎是一個最令人生畏的命題。就像任何旅程一樣,我們必須首先嘗試了解要採取的初始方向。此外,就像所有旅程一樣,你必須從你所在的地方開始。我們遇到的常見問題之一是,我們似乎經常在看不到前方景觀的森林中開始,因此不知道要採取什麼方向。因此,第一步是爬上樹,好好觀察一下周圍!這意味著在最短的時間內盡可能深入了解當前的系統和架構。這通常非常難以做到,而且很容易陷入過多的細節中。
幸運的是,有一些非常有用的工具可以協作使用,以獲得足夠的理解力來繼續進行。這些工具在其他地方有詳細討論,但摘要列表將包括 事件風暴、Wardley 映射、業務能力映射和領域映射。請注意,在此列表中,我們主要關注業務概念如何映射到系統架構中,以及反過來了解該 架構如何支援價值生成。這是一種觀點,特別是對於傳統系統而言,通常會遺漏。
建立城鎮規劃 † | 識別組織的穩定部分,以圍繞團隊和軟體進行架構 |
事件風暴 † | 用於了解業務流程的技術 |
識別業務能力 † | 識別組織的穩定部分,以圍繞團隊和軟體進行架構 |
價值流圖 † | 描述使用者如何完成其工作的製品 |
† 目前僅為存根
具體來說,我們發現人們經常在傳統系統的邊界處停止發現式活動,“這裡有龍”,不要再往前走了。如果不跨越邊界並揭示傳統系統如何支援(或阻礙)業務流程和活動,就難以找到並提取薄片以交付。
另一個常被忽略且非常有價值的資訊來源是系統使用者本身。事實上,根據作者的經驗,這通常是你能找到驚人有用資訊的地方,特別是揭露許多變通方法和影子 IT 生態系統,這些通常會在舊系統周圍建立起來,也就是說,實際上執行業務的 Access 資料庫和版本化 Excel 試算表。客戶旅程對應、建立服務藍圖和價值流程對應是已用於有效浮現此類詳細資訊的工具。
萃取產品線 | 依產品線識別並分離系統。 |
萃取價值流程 † | 識別並分離關鍵價值流程 |
功能對等 | 使用新技術堆疊複製舊有系統現有功能。 |
† 目前僅為存根
成功交付各部分
對變更速度的需求以及逐步交付和獨立變更業務元素的能力(無大型依賴關係)通常會導致「敏捷」交付方法與微服務為基礎的架構並行。持續交付成為這些個別可部署元件的必備條件。除了正常的軟體交付之外,這項挑戰在於找出從現有大型解決方案元素中切換、共存,以及最終取代的策略。有許多成功的策略,包括平行執行、輸入分岔和流程轉移。
金絲雀釋出 † | 對部分使用者釋出變更 |
關鍵聚合器 | 結合企業不同部分的資料,以支援做出重大決策 |
暗黑啟動 † | 呼叫新的後端功能,但不使用結果來評估其效能影響。 |
轉移流程 | 首先將跨組織活動從舊有系統轉移 |
事件攔截 | 攔截對系統狀態的任何更新,並將其中一些更新路由到新元件 |
傳統模擬 | 新系統與舊有系統互動的方式,使得舊系統不會察覺任何變更。 |
還原至來源 | 識別資料的來源,並整合到該來源 |
停止世界切換 † | 切換到新系統時暫停正常業務活動 |
過渡架構 | 安裝軟體元素以簡化舊系統的轉移,我們打算在轉移完成後移除該系統。 |
† 目前僅為存根
改變組織,讓此過程持續進行
如果我們退一步來看交付新業務需求的整個流程,我們可以很快地看出這只是一個技術問題。如果我們使用較新的技術來縮短建置解決方案的時間和成本,我們將突顯出在同意需求和將變更導入生產方面的任何問題。
我們需要組織結構和流程變更才能充分利用更好的技術,並且根據康威定律,我們也需要一個技術架構來促進這一點。如果團隊及其溝通是圍繞現有的舊解決方案和流程組織的,我們可能需要使用逆康威操作對其進行重新組織,以匹配新的解決方案及其架構。
舊系統可能會限制和限制採用更現代的工程實務的能力,特別是與極端程式設計和持續交付相關的實務。在更換舊系統時,重要的是確保改變工作方式,以確保我們不會最終回到一個緩慢、困難且昂貴的系統。
舊系統也是組織文化和領導力的產物,沒有更廣泛的變革,你應該期待與以前看到相同的結果。我們觀察到許多舊系統現代化工作都因「企業抗體」而失敗,這些抗體會發現有新事物發生並採取行動將其拒絕在組織之外。
僅舉一個廣泛組織如何拒絕變革的例子;我們與一家非常大型的電信公司合作,該公司希望為手機建置軟體。領導階層都明白這意味著比他們在專注於固定基礎設施的現有計畫中看到的更快的回饋週期和更頻繁的變更。
儘管領導階層了解這一點,但現有的工作實務或執行這些流程的中階管理階層並未做出任何變更。因此,現有的變更控制流程被嚴格執行。最後,軟體團隊花在填寫變更控制表單和參加變更控制會議的時間比生產軟體的時間還多。「公司抗體」成功地拒絕了新的工作方式。
組織變革是一個龐大的主題,已有許多文獻探討,傳統系統的主要挑戰通常與時間有關。很少有組織能負擔得起延遲傳統系統現代化,同時重新設計(或重建,針對外包受害者)其整個交付方式以及組織結構和關鍵業務流程。儘管組織轉型的廣泛主題超出了我們的範圍,但我們確實建議一些策略,以便在傳統系統的背景下應用和保護新的工作方式。如果你只是變更傳統系統而沒有做其他事情,預期你將在幾年後再次更換傳統系統是合理的。
按你打算繼續的方式建立 † | 以你上線後需要繼續的方式建立你的傳統系統替換品。 |
漸進式置換 † | 以你上線後需要繼續的方式建立你的傳統系統替換品。 |
新公司 † | 成立一家全新的公司來追求市場顛覆 |
受保護的試點 † | 為新的工作建立一個試點計畫,並將其與正常的公司治理流程分開 |
† 目前僅為存根
組織轉型絕對有其他策略和方法,我們只強調這兩種策略,因為它們在某種程度上允許盡早而不是延後開始傳統系統現代化工作。
範例:移除整合中介軟體
此範例說明我們的一個團隊如何使用多種傳統系統現代化模式來成功替換整合中介軟體,而該中介軟體對於其客戶業務的營運至關重要,並作為一個較大型的傳統系統現代化計畫的一部分。他們結合模式和重構來成功管理業務風險,並促進吃掉大象的這個特別難啃的部分。
了解結果
我們的團隊面臨的挑戰是如何替換已停止支援、難以變更且對企業來說非常昂貴的整合中介軟體,並以新的可支援、彈性的解決方案取代。在不中斷或危及現有業務營運的情況下。有問題的中介軟體用於後端系統和店面之間的整合。這些系統共同負責銷售每天價值數千萬英鎊的高價值獨特產品。
這項工作是一個較大型計畫中的高優先順序部分。支援業務的所有後端系統都正在更換,而店面也將在幾年內進行現代化計畫。
因此,根據上述步驟 1,定義團隊需要達成的業務成果
- 改善業務流程
- 盡快淘汰舊系統
如何?此特定整合中介軟體解決方案包含大量邏輯,包括業務核心規則,例如在何種管道上銷售產品,或如何在店面中展示產品以及何時展示。這個現有系統非常難以變更,阻礙業務創新,而且邏輯中的缺陷導致問題,例如產品甚至沒有在銷售期間上架!
原因?降低現有(且持續增加)的授權和支援成本。此外,減輕因在過時的支援中介軟體和資料庫技術上執行關鍵功能而對業務造成的風險。

分解問題:第一個縫合點和重構
在 Inception 期間,團隊與深入了解舊式系統的人員舉辦工作坊,以共同視覺化現有和未來的軟體架構。執行此步驟後,他們發現一個技術接縫,可以利用舊式後端和整合中介軟體之間的訊息整合方式來加以利用。舊式後端(一個老舊的 J2EE 應用程式)會將「發布產品」訊息置於 SwiftMQ 的舊版本所提供的佇列中。事件攔截 模式在此處會很有用,如果實作為 基於內容的路由器,將可以控制舊式後端訊息的路由方式,並建立一個選項,讓訊息可以路由到新系統。
整合中介軟體也會處理來自店面的訊息(例如,產品銷售),使用 JDBC 直接更新舊式後端背後的 Master 資料庫中的狀態。透過 SwiftMQ 的非同步訊息傳遞和 JDBC 資料庫更新,共同形成舊式後端和整合中介軟體之間的介面。

儘管當時並未發現,但團隊能夠在子系統規模上使用Branch by Abstraction模式,作為替換舊版中間件的策略。抽象層為佇列和 JDBC。透過確保新實作遵循該抽象層,便可以在不影響業務運作的情況下將其替換為「有缺陷的供應商」。
團隊執行的第一件事是透過重構新增事件路由器來實作事件攔截。

事件路由器 (1) 的建立考量了三個主要功能
- 從一個 SwiftMQ 佇列取消佇列訊息,並將其加入另一個 SwiftMQ 佇列 (2)。一些設定的簡單變更讓整合中間件能夠從這個新佇列 (2) 使用訊息。
- 事件路由器的願景是透過設定,將訊息路由到替代目的地,讓新實作能夠處理發布訊息。事件攔截
- 事件路由器也會提供從舊版 SwiftMQ 技術到目標架構所選用的新版 ActiveMQ 技術的橋梁。
整體而言,重構並未變更可觀察的系統行為,但事件路由器現在已成為過渡架構的一部分,並已插入訊息處理管線中。
實作事件路由器並非像想像中那麼簡單。由於缺乏可用的驅動程式/函式庫,與 SwiftMQ 整合存在問題,而且此方法也曾多次受到挑戰。團隊了解此方法將解鎖的選項價值,並完成工作並釋出至生產環境。他們在實際環境中監控新元件,並設定使用新的持續傳遞管線逐步提升其功能。
成功交付各部分:建置功能,維護合約

新的店面管理程式 (1) 現在由團隊反覆建置。與此範例相關,該建置包含實作傳統模仿模式的主資料庫轉接器 (2)。這是抽象層的一部分,用於使用從店面收到的銷售資訊更新主資料庫。由於事件路由器未轉換訊息,因此建立了傳統事件轉接器 (3) (訊息轉譯器),用於將訊息轉換為新格式,不讓傳統世界接觸到新世界,並與新架構的原則保持一致。傳統店面 轉接器(4) 也在新的店面管理程式 (1) 和傳統店面之間實作,以將新的實作與店面更換後會發生的未來變更隔離。
在傳統店面 (5) 上引進新的 API,新的店面管理程式將使用它。此外,還新增了一項功能,讓在新的 API 上發布的產品的回呼可以傳送到新的店面管理程式的轉接器 (4)。至關重要的是,這讓傳統實作和新實作可以並行執行。
成功交付各部分(續):轉換成即時服務 - 使用第二個縫合點
在所有部分就定位後,企業便可以測試新的解決方案,但如何以風險管理的方式將它推廣到實際服務中。
為此,他們利用了另一個接縫,這次使用依產品區隔模式。事件路由器已增強,以新增依產品類型以及依唯一產品 ID 的可組態路由 (6)。團隊能夠依 ID 測試個別產品的發布、管理和銷售,然後隨著時間推移,使用愈來愈多的產品類型組態路由器,本質上增加了由新解決方案處理的產品百分比。
當所有產品都由新系統處理時,傳統整合中介軟體已停用,實現了授權、支援和資料中心託管費用的大幅英鎊節省。

改變組織,讓此過程持續進行
我們的團隊已經與客戶合作,在組織的另一部分,並且已經成功取代了不同的傳統系統。
在整個組織的工程層級中,持續傳遞和良好的支援品質實務現在已成為既定常態,而微服務風格架構能夠定期且獨立地將容器化服務部署到雲端平台上。
新計畫的團隊與新的利害關係人合作,需要讓業務的其他部分踏上相同的「敏捷和 CD」旅程,而早期風險管理的版本能夠贏得信任。隨著時間推移,我們得以展示新的工程和品質實務(包括 CD)如何減輕過去導致更高層級官僚主義和治理的風險。因此,較不頻繁、範圍較大的版本發佈也由較小、較頻繁、信心較高的部署所取代,並在業務準備好接受變更時進行切換發佈。
結語
當然,與上述簡化故事所暗示的相比,還有更多複雜性和整合需求。在製作環境中測試新實作後不久,就出現了需要考古學的範例。許多業務關鍵管理資訊報告無法對應 - 產品「遺失」了。
經過一番挖掘,團隊發現整合中介軟體(用於儲存長期商業交易狀態)所使用的資料庫已複製到組織的資料倉儲。透過多個批次作業、儲存程序和檢視,此資料可供商業關鍵績效指標報告內部使用。

需要額外的舊系統模擬,以確保這些報告不會中斷。團隊使用 Wire Tap 擷取來自店面的銷售訊息,並使用 JDBC 將資料注入資料倉儲內的適當表格。這些額外的模擬也成為過渡架構的一部分,並將在可能的情況下移除。
上述以抽象分歧和使用模式與實務的方法,旨在降低風險。
使用事件攔截(技術接縫)、舊系統模擬和過渡架構,讓客戶能夠解決問題。然後,透過產品(商業接縫)分段,在本例中為產品類型,能夠精細控制更廣泛的推出,並進一步管理風險。整體而言,此方法讓企業能夠以他們感到自在的速度進行系統更換。
此方法可以管理風險,但代價不小。因此,需要考慮的問題是「企業對此風險緩解的重視程度為何?」明確說明並量化它,將讓團隊能夠追蹤其投資。事件路由器和舊系統模擬是過渡架構投資的一部分,旨在管理風險。它們的角色是創造選項,使風險能夠被管理。此類工作很容易被視為「拋棄式」的,因此應盡可能避免此類成本。在「風險緩解的價值」與「過渡架構的成本」之間的權衡中,要明確且透明。
致謝
Bill Codding、Chris Ford、James Emmott、Kief Morris、Mark Taylor、Meaghan Waters、Peter Gillard-Moss、Rebecca Parsons 和 Simon Brunning 在我們的內部郵件清單上討論了這些模式的草稿。James Emmott 建議在標題中「置換」。
卡片插圖中使用的曼徹斯特新舊電車照片來自 Picasa,經過裁剪和色彩處理。
重大修訂
2024 年 3 月 5 日:事件攔截
2022 年 7 月 7 日:回復為已發布來源
2022 年 3 月 28 日:過渡架構首次發布
2022 年 1 月 20 日:轉移流程
2022 年 1 月 19 日:關鍵聚合器
2022 年 1 月 12 日:遺留模擬
2021 年 7 月 27 日:功能同等性
2021 年 7 月 21 日:提取產品線
2021 年 7 月 20 日:發布遺留取代模式