此模式為 "遺留系統取代模式" 的一部分

功能等價

使用新的技術堆疊複製遺留系統現有的功能。

2021 年 7 月 27 日

Ian CartwrightRob HornJames Lewis

在許多場合,當我們與 IT 主管交談時,我們會聽說他們有一套老舊的應用程式,使用即將或已經停產的技術建置。這些系統通常由第三方管理,位於昂貴的資料中心,且合約不靈活。這些應用程式對於業務的成功營運至關重要,同時也是業務和營運風險最大的來源之一。

他們都非常清楚,有機會進行改善、最佳化流程並開啟新的機會。然而,要完全做到這一點會造成中斷,並帶來許多依賴關係。例如,現有「業務照常」工作的承諾、其他變更計畫,以及最終使用者工作的部門現有計畫和預算。

在這種情況下,一種方法是嘗試透過「簡單地」更換技術,同時讓其他一切「維持原狀」,來將更換對更廣泛組織的影響降到最低。這種方法通常被嘗試過的人稱為功能等價,或「功能等價陷阱」。

雖然功能等價通常聽起來像是一個合理的建議,但我們已經深刻體會到,人們大大低估了所需的努力,因此誤判了這項建議與其他替代方案之間的選擇。例如,即使只是定義「維持原狀」的範圍,也可能是一項巨大的努力,尤其是對於已成為業務核心的遺留系統。

隨著時間推移,大多數舊系統都會「膨脹」,許多功能未被使用者使用(根據 2014 年 Standish Group 報告,為 50%),因為新功能已被加入,而舊功能並未移除。過去的錯誤和限制的解決方法已成為當前業務流程的「必要」需求,使用者的工作方式在很大程度上是由舊系統的限制所定義的。重建這些功能不僅浪費,而且也錯失了建立當今實際所需功能的機會。這些系統通常在 10 或 20 年前定義,受到前幾代技術的限制,因此很少有意義地「照樣」複製它們。

如果功能對等性是真正的需求,那麼此模式描述了可能需要做些什麼才能做好。這並非一條容易的路,也不容輕忽。

運作方式

功能對等性是一個簡單的概念。使用更適當的技術堆疊建立一個新系統,其功能和行為與現有系統完全相同。每當有人對新系統應該做什麼提出問題時,我們都會回答「執行現有系統執行的動作」。要了解我們是否具有對等性,我們需要充分了解當前系統執行的動作,並能夠驗證新系統執行相同的動作。

範圍內是什麼 - 舊系統執行什麼動作?

功能對等性的第一部分是建立當前系統執行的動作的規格。可能需要下列組合

系統調查

使用者動作

使用者角色是什麼,他們可以在系統中看到哪些功能(選單項目),他們可以執行哪些動作。對於每個選單項目/動作 - 涉及哪些畫面、哪些資料項目、您可以看到哪些驗證邏輯。使用者執行動作時,會有什麼可觀察的結果?

批次處理

系統中定義了哪些批次作業?它們何時觸發,它們執行什麼處理,有什麼可觀察的結果?

介面和整合

整合了哪些系統?

  • 此系統提供哪些介面給其客戶,合約是什麼(API、CFR、行為預期/副作用)
  • 此系統使用哪些介面?這些合約是什麼?
  • 注意透過資料庫整合的系統或系統部分(請參閱報表/資料和考古學)
核心演算法

需要複製的知名商業規則和計算,由使用者動作、批次處理觸發。

報表/資料

系統建立哪些報表?格式為何?使用哪些資料?何時建立?建立頻率為何?

資料如何在資料庫中變更?是否有觸發器會變更資料?觸發器由什麼觸發?觸發後會執行哪些程序?這條兔子洞有多深?

哪些其他系統可以存取或使用此資料進行整合?它們如何變更資料?這些變更會造成哪些可觀察的行為?

考古學

通常需要考古學才能完全了解系統的功能。透過「考古程序」,您可以了解在畫面 A 中變更資料欄位 Y 會導致在批次作業 N 執行後,在報表 C 中出現值 Z。執行此考古程序可能會花費大量時間,而且需要具有舊系統最多經驗的人員動腦思考。

工具 - 根據資料,使用了什麼工具?

花點時間分析現有報表(例如存取或其他系統記錄),以了解目前系統如何使用,非常值得。如果沒有這些報表,投資一些資源來為現有系統建立工具,可能會帶來不錯的報酬,因為這可以讓您避免根據資料進行不必要的作業。

功能價值 - 我們可以捨棄價值較低的功能嗎?

雖然我們在採用此模式時,試著避免增加企業負擔,但與使用者交談以了解哪些功能價值較低或未使用的,有助於管理您的範圍。不過,這會重新引發我們試圖避免的組織影響/變更。

使用測試確保功能同等 - 新系統執行舊系統執行的功能

了解舊系統的功能是第一個挑戰,但我們也需要確定新系統確實以相同的方式運作。為了有信心地驗證這一點,我們需要執行測試,以證明新系統確實具有功能同等性。以下是需要實作測試的領域清單。

使用者旅程和使用者體驗

使用驗收測試 - 檢查您建立的功能是否符合使用者的預期。請注意,不要依賴這些測試作為主要的驗證方法,因為它們位於測試金字塔的高層。此外,請注意,將系統分解為使用者功能、畫面和流程很容易導致這類測試過多。

測試 UI 行為(包括客戶端驗證)相對簡單:按一下這裡,預期會看到一些狀態,在那裡輸入資料,按一下那裡,預期會看到一些不同的狀態。針對您選擇的技術使用適當的工具,例如 SPA 應用程式的單元測試架構,或針對更傳統的伺服器端呈現應用程式使用類似 Cypress 的工具。

在重要的情況下(例如在「專家使用者最佳化」UI 中),版面(和視覺/感覺)的測試會比較困難,但有一些工具可以提供協助(例如搭配 Selenium 的 Galen)。

對於可用性和版面,您可能會依賴探索性測試。

商業邏輯 - 核心演算法

對於核心演算法和核心商業邏輯,請確保您已針對現有系統的這些部分建置了一組單元測試。這些測試會提供已知在現有系統上成功執行的商業邏輯/演算法的可執行規格。然後可以使用包含將這些測試移植到新技術堆疊的修改式 TDD 方法,對新實作提供高度信心。了解您已正確移植測試存在風險,突變測試可以提供一些額外的保證,類似的突變會導致舊實作和新實作出現類似的失敗。

介面 - 作為服務提供者和服務客戶

作為服務提供者:建立一組測試套件,針對要取代的現有系統執行,也就是可執行的合約。針對新的取代系統執行這些相同的測試,檢查是否遵守合約。小心這些測試的範圍變得過大,就像 UI 的情況一樣。

作為客戶:使用測試模擬驗證您是否以預期的方式與提供的服務互動。就像核心商業邏輯的情況一樣,將這些模擬移轉到新的技術堆疊,以確保新實作繼續以相同的方式與提供的系統互動。此外,使用外部系統的存根為您的新測試提供已知的資料集。

在兩種情況下:代理可以是一個有用的工具,用於確保功能/互動對等性。透過將代理注入通訊路徑,可以記錄與舊系統的互動。您可以使用這些記錄來

  • 重播來自客戶的訊息,並檢查新系統的回應
  • 建立可以重播已知良好回應的存根

資料庫和報告:這真的可能很困難,就像 UI 測試,小心金字塔的頂端。這裡的資料庫/報告是另一種類型的介面。要成功地測試它們需要大量的測試資料,通常很難建立/管理。

實作和追蹤進度

透過完成的系統調查來定義範圍,以及一套全面的測試來提供行為的可執行規格,您的實作可以相對有信心地進行。但如何追蹤進度?

按功能表項目/使用者動作

(或在調查系統時識別的其他部分)這可能是危險的,因為存在著您正在追蹤的事物可能被分層(或架構考量)切片的風險。按架構層切片會嚴重影響價值的傳遞,並降低進度的可見性。(即,在功能從上到下傳遞之前,不會釋放任何價值,也不會取得任何_實際_進度)。

這裡的一個關鍵假設是項目或動作本身可以為最終使用者提供價值。不幸的是,這通常並非如此,我們可能會傳遞 80% 的個別流程步驟,但仍然無法在新系統中完成整個業務流程。這是一個不幸的常見情況,儘管報告了高水準的完整性,但仍然無法測試或釋出可用的軟體。

垂直切片

提供更好的進度透明度,但垂直切片很可能不是系統調查的輸出。因此必須進行對應,這需要更多工作,而且存在需求落入空隙的風險。

端對端流程

根據個別業務流程完全移轉到新解決方案來追蹤進度,因此測試變為:流程是否可以在替換系統中完全完成。這可以與上述的使用者動作追蹤結合,但前提是我們確保傳遞個別流程步驟所做的工作是由「擁有」業務流程優先處理。

作者的偏好是確保任何工作的完成定義包括(在可能的情況下)跨所有層的完整端對端範圍。

何時使用

我們在上面已經說明了要如何妥善應用此模式,並增加成功的機率。如果目標是功能對等,那麼就必須投入大量工作來決定功能方面的需求,以及更多工作來確保透過測試達到功能對等目標。

一般來說,這是我們不推薦的模式。事實上,Thoughtworks 甚至將此模式暫停在我們的技術雷達中。我們認為此模式是一個巨大的錯失機會。舊系統通常會隨著時間而膨脹,許多功能未被使用者使用(根據 2014 年 Standish Group 報告,為 50%),而且業務流程也隨著時間而演進。取代這些功能是一種浪費。相反地,請試著鼓起勇氣退一步,了解使用者目前的需求,並針對業務成果和指標優先處理這些需求。

不過,我們已經看到幾個特別適用此模式的案例。

  • 針對重度使用者的高度最佳化使用者介面很適合一對一重新建立。考慮使用捷徑鍵來高速執行交易的代理人。為了有效執行工作,他們可能需要高度最佳化的使用者介面,讓他們能夠只使用鍵盤操作。可能需要花費大量時間才能熟練,而且無法容忍導致效率降低的變更。
  • 基於眾所周知規格的行為:應用此模式的另一個範例使用案例可能是支援工程或科學模型的系統。例如,對於有限元素分析求解器,給定的輸入應產生給定的輸出,物理定律不會隨著現代化專案而改變。

有人可能會辯稱,在這兩種情況下,功能對等的需求在某種程度上是區域性的,我的意思是受限於系統的特定部分。值得懷疑的是,管理整個系統現代化範圍的方法會受到這些區域性使用案例的限制。

但是,這些案例雖然有效,但仍然是例外。我們已經看到功能對等演練絕大多數都是令人沮喪的。徹底了解現有功能所需的成本和精力會像滾雪球般增加,導致偷工減料,而且雖然其中一些是應該被刪減的未使用功能,但通常一些重要的功能也會被犧牲。如果一切順利,企業會支付一大筆錢,卻無法改善對業務的支援。當企業知道他們的未來取決於更好的技術參與時,這並不是一個好故事。

替代方法

  • 萃取產品線或萃取價值串流都是提供策略來識別現有系統中薄層的模式。其中一個關鍵差異是它們都提供縮短回饋週期的途徑,同時允許停用和關閉舊系統的元件更早。
  • 檢視商業價值並確保在任何架構決策中都有所呈現,通常可以凸顯由功能同質性驅動方法所造成的問題。
  • 更「整體」的方法可以幫助凸顯功能同質性的問題,方法是將技術和業務流程視為同一個問題的一部分。特別是在功能同質性的情況下,這通常可以凸顯目前的業務流程是舊技術所需的權宜之計和妥協的結果。僅更換技術將只解決問題的一半。
  • 使用者研究可以幫助凸顯現有的業務流程不再適合目的。在一個案例中,僅透過幾天觀察現有員工,便清楚功能同質性不適合,因為目前的流程非常破碎,與最終使用者交談總是一件好事。

範例:更換物流系統

一個物流組織參與了一項計畫,要更換用於包裹接收、路線規劃和配送的舊軟體。作為計畫的一部分,他們同意由 IT 主導一項與業務利害關係人參與度相對較低的計畫。技術觀點是他們可以僅進行「功能同質性」,從而解決他們更換過時技術的迫切需求。作為此計畫的一部分,一項主要工作是更換接收客戶包裹的系統。我們在計畫的這部分接近尾聲時參與其中。

我們認為與業務利害關係人的參與度低對計畫構成風險,特別是因為我們透過另一個專案聽說業務對開發工作感到沮喪。作為計畫的一部分,我們與包括財務團隊在內的關鍵利害關係人交談。這時我們得知曾進行過一項檢討,指出只有相對少數的客戶對組織有利可圖。反過來,這表示只有少數的「包裹類型」有利可圖,許多包裹由於特殊處理需求而讓組織虧損。因此,業務有一項計畫要停止處理那些包裹。

結果發現,「功能同質性」專案中投入了大量的精力來處理那些包裹,也就是業務表示他們不再需要的包裹。業務希望在沒有這些困難的邊緣案例的情況下,流程和軟體會變得更簡單。在這個案例中,「功能同質性」導致大量時間和金錢花在處理業務不再需要的需求上,同時進一步損害 IT 在業務眼中的聲譽。

範例:電子商務組織重新建置平台

此組織曾享受一段快速成長的時期,但已數年未優先考量 IT 支出,這造成了立即更換目前解決方案中許多元素的迫切需求。例如,在某些時段,他們必須減緩銷售數量,以避免壓垮核心系統,這從商業觀點來看並非理想。

許多關鍵業務營運是由同一台大型主機處理,這台主機最初是在其電子商務營運的最早期委託製造的。顯然從此系統中萃取元素在技術上將會是一項挑戰。同時,由於企業領導人已見識過數個中斷的失敗專案,因此希望將對其員工的任何進一步中斷降至最低。另一個挑戰是,目前的流程和系統使得在使用較漸進的方法時,極難優先考量要移轉的產品線。簡而言之,要了解他們銷售哪些東西能賺錢,哪些東西不能賺錢非常困難,因此認為唯一選項就是一次性全部移轉。根據這些挑戰,認為複製他們現有的一切是最佳且風險最低的方法。

由於目前的業務流程在表面上都是一起在同一台大型主機中實作的,這表示任何「功能等價」替換的範圍本質上就是整個業務的所有主要活動和流程。他們展開一項工作,為替換系統記錄「範圍內」的現況流程,計畫將此用作供應商選擇流程的輸入。

很快地,有幾件事變得明朗。第一件事是,這真的必須涵蓋業務執行的幾乎每一項活動,每項記錄「現況」功能性的努力都會揭露更多需要納入以提供「功能等價」的事項。其次,由於歷史性的權宜措施、多年來不斷變動的需求以及許多未解決的錯誤,與舊系統合作的實際人員最不想要的就是同樣的東西。這幾乎總是讓他們的工作更困難,而且是錯誤和延遲的主要來源。最後,由於錯誤和權宜措施,很明顯有幾個關鍵流程實際上是在手動建立的試算表中「離線」執行。關鍵業務資料從大型主機中萃取,用於透過試算表執行業務流程,然後稍後將現在已修改的資料上傳回大型主機。

在這個階段,有些人認為「功能平價」變得過於冒險,範圍持續擴大。這是需求收集程序完成之前,而且該工作沒有明確的結束日期。我們的參與在這個階段停止,因為我們認為繼續「功能平價」風險太大,而且無法提供業務所需,更重要的是,由於缺乏關鍵業務指標,使得優先處理任何更多增量方法變得不可能。幾年後,他們仍在進行「現狀」需求程序,遠遠超過原始截止日期。

缺乏正確的指標和從業務角度優先考慮功能元素的能力,通常會迫使組織採用「功能平價」方法。在這種情況下,我們認為最初努力收集各種產品線周圍的關鍵業務指標可能會提出解決問題的方法。這是一個很好的說明,說明您如何在沒有正確的業務背景和參與的情況下做出正確的技術決策。

範例:成功更換財務計算服務

我們的團隊之一正在為一家大型金融組織工作。他們希望現代化執行複雜財務計算的現有服務。財務計算的規格是固定的,服務的介面類似,只需要更新技術,從 J2EE Session EJB 實作更新到最新(當時)版本的 Java 中的 SOAP Web 服務。

團隊在現有實作周圍建立了一個豐富的測試套件,並在設定、執行和斷言責任之間進行明確區分。

圖 1:tests_for_feature_parity

一旦測試就緒,就可以用最小的風險替換執行適配器,並建立一個新的實作,以符合與舊系統相同的可執行規格。

重大修訂

2021 年 7 月 27 日