全面重構遺留系統涵蓋從既有系統移轉至目標系統的所有必要工作。建立新專案、遷移既有程式碼與替換正式環境只完成其中一部分,重構工作還可能需要處理既有功能、歷史資料、相依項目、執行環境、部署流程,以及只有實際操作或維護人員才知道的操作規則。
因此,本系列所稱的「全面重構」,可以視為一段從既有系統移動至目標系統的遷移過程。這段過程大致會經歷以下階段:
這些階段雖然有先後關係,卻不一定只執行一次。例如,分析既有系統時可能發現原本沒有記錄的功能、測試時可能發現目前的資料表達方式無法呈現某項系統規則、部署與切換演練也可能要求重新調整遷移方式。專案可以反覆修正,但每一次調整都要有依據與記錄,並且確認風險仍在可接受的範圍內。
重構前必須先回答「這次專案要完成哪些成果」。如果沒有明確目標,重構工作很容易同時納入既有功能重作與新需求,最後無法判斷時程延誤是來自技術問題,還是專案範圍持續擴大。需求確認需要釐清:
這個階段應該將「維持既有行為的重構」與「改變外部行為的需求變更」分開管理。兩者可以在同一個專案中進行,但必須有不同的驗收依據。否則,當既有系統與目標系統出現差異時,將無法判斷那是預期變更,還是重構造成的錯誤。
需求說明目標系統應該提供哪些功能,既有系統分析則用來找出相關功能目前如何運作。這項工作視情況可能需要閱讀程式碼,也可以使用可取得的文件、執行紀錄、既有測試或實際操作結果交叉確認。缺少相關資料時,應該記錄限制,並且在可行範圍內透過實際操作或建立測試取得分析所需資訊。分析的目標是取得足以設計、實作、驗證與切換系統的資訊。
每套系統的構成不同,分析工作應該依照實際情況處理下列事項:
分析結果應該區分為「已確認的事實」、「根據現有資料推斷的規則」與「仍待確認的問題」。無法確認的內容不能直接成為目標系統規格,應該記錄疑問及影響,並且依照可取得的資訊繼續驗證。
這個階段可以先建立功能清單、資料流向、相依關係圖、已知風險與待確認問題。這些成果會隨著理解增加而更新,並且作為後續設計與驗收的依據。
理解需求與既有系統後,才能設計目標系統。設計內容可能包含程式結構、資料表達方式、組成項目的責任、輸入輸出邊界、安全限制、記錄方式、建置與部署流程,以及執行環境。目標系統的架構應該依照需求與已確認的問題設計,不應加入沒有明確用途的分層或組成項目。
設計目標系統時,也要規劃如何完成遷移。專案可以在指定時間完成整體切換,也可以按照功能、資料或使用範圍分階段切換。採用哪一種方式,會影響實作順序、資料或狀態同步方式、測試範圍與還原難度。
遷移策略至少要回答下列問題:
目標設計除了要能解決既有問題,也要能被實作、測試、部署、操作與維護。遷移策略則應該證明專案能安全抵達這個目標。
全面重構的範圍通常較大。如果等到所有功能完成後才第一次整合,許多問題會集中在專案後期才出現。實作目標系統時,可以先選擇範圍明確且能走完輸入、處理、輸出與驗證流程的功能,再按照相依關係擴大實作範圍。
功能實作應該以已確認的需求與既有系統行為為依據。既有程式碼要保留、局部調整、重新實作或逐行改寫,應該視實際情況決定。如果存在責任混合、限制不再適用或無法支援目標設計的部分,可能需要重新設計。採用逐行改寫時,仍要避免將不再需要的限制與已知問題一併帶入目標系統。無論採用哪一種方式,都應該保留經過確認的行為與系統規則,並且將既有實作方式作為分析參考。
如果資料或保存狀態需要遷移,相關工具應該能在測試環境中重複執行,並且記錄每次執行的來源、轉換結果、失敗原因與完成時間。驗證方式應該依照資料特性比較遷移前後的數量、關聯、內容摘要或其他關鍵值,避免內容雖然完成寫入,實際意義卻已改變。
每完成一段功能或一批遷移工作,就應該執行對應測試。這能在變更範圍仍然明確時找出問題,也能使用實際結果調整後續工作。
目標系統可以採用不同的技術與程式結構,但必須保留的功能仍要符合既有規格。測試需要隨著實作持續進行,確認相同的有效輸入會產生符合規格的結果,已核准的差異則符合新的驗收條件。
測試依據可以來自需求、操作情境、既有系統的執行結果、歷史資料與已知錯誤案例。除了正常流程,也要依照系統特性涵蓋無效輸入、邊界值、相依項目失效、特殊資料與大量資料等情境。
重構過程可能需要下列層次的測試:
既有系統與目標系統的結果不同時,應該確認差異屬於已核准的需求變更、既有系統的已知錯誤,或目標系統的實作缺陷,再依照結論修正規格、程式或測試,並且留下決策紀錄。
功能、資料與非功能需求通過測試後,還要確認目標系統能在正式環境中完成部署與切換。依照系統實際情況,切換可能涉及停止既有系統接收新輸入、保留可復原的系統版本、轉換最後一批資料或狀態、部署目標系統、調整系統進入方式,以及驗證關鍵功能。
這些工作應該整理成按照順序執行的切換計畫,並且在接近正式環境的條件下演練。演練除了確認每個步驟可以執行,也要記錄所需時間與結果,判斷是否符合允許的中斷範圍。
還原(Rollback)計畫應該明確定義:
只準備前一版程式,無法處理切換後新增或變更的資料。還原計畫需要同時考慮程式、設定、資料與外部相依,才能維持系統的一致性與完整性。
目標系統開始實際運作後,需要進入穩定觀察期。觀察內容應該依照系統特性涵蓋執行狀態、錯誤情形、處理時間、輸出差異、自動執行結果與實際操作回報。
觀察項目、可接受範圍與處理方式應該在正式切換前決定。如果結果超出範圍,負責人需要按照事前定義的條件判斷要修正目標系統、限制部分功能,或切換回既有系統。
既有系統退場前,應該確認:
完成這些確認後,才能按照退場清單停用既有系統與不再需要的相依項目,並且保留必要的資料、文件及復原依據。
全面重構期間,既有系統可能持續運作,目標系統則逐步完成實作與驗證。如果資料或保存狀態需要移轉,還可能需要獨立的遷移工具。三者的責任與可修改範圍應該清楚區分。
| 對象 | 主要責任 | 需要避免的情況 |
|---|---|---|
| 既有系統 | 維持切換前的必要運作,並且提供行為與資料的比較依據 | 在缺少紀錄與評估時持續加入變更 |
| 目標系統 | 實作已確認的功能,並且逐步完成替換既有系統所需的能力 | 直接複製既有結構,連同已知問題一併移轉 |
| 遷移工具(如需要) | 擷取、轉換、寫入並且驗證資料或狀態,留下可追蹤的執行紀錄 | 只在正式切換時首次執行,或將一次性轉換混入正常功能 |
不同階段也要指定主要資料或系統狀態的來源。例如,開發期間通常仍以既有系統為準,切換演練可以使用既有資料或系統狀態的受控副本,正式切換後則由目標系統接手。這項關係如果沒有定義,兩套系統可能同時接受修改,卻缺少可靠的合併方式。
遺留系統的知識可能分散在操作、需求、開發、測試與維護等工作中。專案應該依照實際規模分配下列責任。同一人可以承擔多個角色,一項責任也可以由多人共同處理。
| 角色 | 主要責任 |
|---|---|
| 操作代表 | 說明實際操作流程、例外情境與目前遇到的問題,協助確認功能是否可用。 |
| 需求決策者 | 決定功能的保留、調整、捨棄與優先順序,核准需求差異及驗收條件。 |
| 開發人員 | 分析既有系統,設計與實作目標系統,並且視需要建立遷移工具。 |
| 測試人員 | 將需求與既有行為轉換成測試案例,驗證功能、資料與非功能需求。 |
| 維護人員 | 提供執行環境資訊,準備監控、備份、部署、切換、還原與退場程序。 |
責任非分重點是每項工作與決策都有明確負責人。需求取捨、風險接受與最終驗收也要由適當角色決定,不能在實作過程中自行假設。
每個階段都需要留下足以說明決策與結果的成果,讓後續工作可以確認依據。成果可以集中在同一份文件或管理工具中,不必為每一項內容建立獨立檔案。
| 階段 | 主要成果 |
|---|---|
| 需求確認 | 功能範圍、非功能需求、驗收條件、需求決策與變更紀錄。 |
| 既有系統分析 | 功能清單、資料清單、相依關係圖、已知風險與待確認問題。 |
| 目標系統設計 | 目標結構、資料表達方式、輸入輸出邊界、部署方式與遷移策略。 |
| 功能實作 | 可執行的目標系統、建置結果、檢查紀錄與技術決策。 |
| 資料或狀態遷移(如需要) | 內容對應、遷移工具、執行紀錄、錯誤清單與驗證結果。 |
| 測試驗證 | 測試案例、測試結果、差異說明、缺陷與修正紀錄。 |
| 部署切換 | 部署說明、切換步驟、還原計畫、演練結果與核准紀錄。 |
| 穩定觀察與退場 | 觀察結果、問題處理紀錄、退場清單與必要備份。 |
成果形式可以依照專案規模調整,但重要決策、負責人、驗證結果與尚未解除的風險都要保留。這些內容也需要隨需求、設計與實作變更同步更新。
里程碑(Milestone)代表一項可驗證成果已經完成;決策關卡(Decision Gate)則是用於確認各項關卡要求的成果與驗證紀錄是否完整,並且確認尚未解決的風險是否在可接受範圍內。
全面重構可以依照實際情況設定下列關卡:
如果關卡未通過,應該補齊該關卡尚未完成的成果與驗證紀錄、降低風險或調整範圍後,再重新判斷。預先定義停止條件與決策責任,可以避免在時程壓力下忽略尚未處理的問題。