前面已經確認全面重構的範圍、既有系統行為、保留資料及遷移方式。接下來要為目標系統選擇程式語言、框架(Framework)、資料保存方式、測試工具與建置工具,讓後續實作有一致基礎。
適合的技術取決於目標系統需要解決的問題。流行度、開發人員的個人偏好或單一效能數字,都不足以支持長期使用的決定。選擇過程需要先排除不符合限制的候選項目,再比較維護成本與風險,最後用實際結果處理仍無法確定的問題。
功能需求(Functional Requirements)說明目標系統要完成哪些工作,非功能需求(Non-functional Requirements)則說明這些工作需要達到的品質。兩者都要轉成能檢查的技術條件,否則「效能良好」、「容易維護」或「安全」仍然無法用來比較候選技術。
可以先從下列內容建立選擇條件:
每個條件還要標示它的用途:
| 條件類型 | 判斷方式 | 處理原則 |
|---|---|---|
| 必要條件 | 不符合就無法完成已確認需求,或無法在目標環境執行 | 直接排除候選技術,不以其他項目的高分補足 |
| 比較條件 | 多個選項都能使用,但開發、維護、成本或風險不同 | 設定權重並比較差異 |
| 待確認事項 | 文件、既有經驗或簡單範例不足以判斷 | 透過概念驗證(Proof of Concept, POC)取得結果 |
這項分類可以避免將偏好誤寫成必要條件,也能防止真正的限制被評分總數掩蓋。例如,目標執行環境無法支援某個語言執行環境的版本時,該選項就不應該因為開發工具方便而保留。
程式語言、框架、資料保存方式與開發工具會互相影響。只挑選其中一項,無法確認整套開發與執行流程是否成立。比較候選方案時,需要把會一起使用的項目組成一個方案,再檢查各項目之間的版本相容性與責任邊界。
程式語言要能表達目標系統的功能,也要有適合的編譯、測試、除錯及分析工具。候選版本需要受到維護,並且能在目標環境執行。現有開發與維護人員的經驗可以降低初期風險,但仍要確認這些經驗是否涵蓋目前版本、測試方法及目標系統需要的功能。
如果候選語言需要新增一套執行環境,還要評估版本管理、更新方式、建置時間、啟動時間與執行資源。選用熟悉的語言也不代表風險必然較低。如果既有經驗只適用於停止維護的版本,升級與重新學習仍然需要列入成本。
框架可以提供固定的程式結構、生命週期及常用功能,但也會限制升級路徑與部分設計方式。評估時需要確認它是否支援目標功能、測試方式及執行環境,並且檢查核心功能是否依賴少數停止維護的擴充項目。
框架功能較多不等於更適合。目標系統只需要少數功能時,額外抽象層次可能增加除錯與升級成本。需求複雜且多項功能需要一致處理時,成熟的框架則可能減少重複實作。判斷重點是實際會使用哪些能力,以及這些能力是否能被測試和維護。
如果目標系統需要保存狀態,就要根據資料關係、查詢方式、一致性、交易範圍、資料量、保存期限及遷移條件選擇資料保存方式。既有系統使用某種資料庫,只能作為相容性條件,不能直接決定沿用相同產品。更換資料保存技術也需要由目標需求支持。
候選方案必須能表達已確認的資料規則,並且支援資料遷移與結果驗證。需要和既有資料來源並行一段時間時,還要確認驅動程式、字元編碼、資料型別及識別方式是否相容。資料模型、遷移程序與正式切換的詳細設計,仍以已確認的資料處理需求為準。
測試工具需要支援目標系統預定採用的測試層次,並且能自動執行、清楚回報失敗原因。建置工具則要能從已保存的原始碼與設定產生可重複驗證的成果。兩者都要確認版本相容性、執行方式及維護狀態,不能等到功能實作完成後才補上。
程式語言、框架與工具鏈也要使用彼此相容的版本。候選方案如果只能依靠大量未記錄的人工步驟才能建置或測試,就會增加環境差異與維護風險。環境固定與套件版本管理的實作方式會在後續章節繼續說明,本章只確認所選技術具備建立這些流程的能力。
目標系統在正式切換後仍需要修正、更新與擴充。技術選擇因此要涵蓋預計使用期間,不能只比較第一次完成開發所需的時間。
每項候選技術至少要確認下列內容:
採用新的技術可能改善型別檢查、測試或開發工具,也會增加學習與初期除錯時間。沿用熟悉技術可以降低轉換成本,但前提是版本仍受支援,並且能滿足目標需求。兩種方向都要使用相同條件比較,不能先決定結論再補理由。
全面重構需要在完成驗收前保留既有系統,因此技術組合還要支援分析、遷移、比對與正式切換。這些工作未必由目標系統本身執行,但相關工具必須能交換可驗證的資料。
可以按照實際情況確認下列問題:
相容性不能只看產品支援清單。清單通常無法回答特定版本、資料型別、錯誤處理或實際處理量是否符合需求。影響切換的項目需要使用代表性資料及目標環境驗證。
概念驗證用來回答技術選擇中的特定未知事項。它不需要完成正式功能,但必須重現足以影響決策的條件。只做出可以操作的展示畫面,無法驗證大量資料處理、外部整合、部署或錯誤復原等風險。
執行概念驗證時,可以採用下列步驟:
概念驗證產生的程式可以捨棄。需要保留的是測試條件、使用版本、執行結果、失敗原因與決策影響。如果驗證環境或輸入資料和目標條件差異太大,結果就只能用來說明該次實驗,不能直接推論正式環境也會相同。
通過必要條件的方案可以使用評估表比較。權重應該反映已確認需求,分數則要附上文件、測試結果或概念驗證紀錄。沒有資料支持的分數要標示為待確認,不能用印象填入。
| 評估項目 | 判斷依據 |
|---|---|
| 功能與品質需求 | 需求、驗收條件與測試結果 |
| 目標環境與版本相容性 | 支援文件與實際執行結果 |
| 資料遷移及互動方式 | 代表性資料與整合測試 |
| 測試、建置與除錯能力 | 概念驗證與開發流程紀錄 |
| 支援週期與升級方式 | 官方支援政策與升級演練 |
| 開發與維護能力 | 現有經驗、學習範圍與人力取得方式 |
| 整體成本與已知風險 | 授權、開發、執行、維護與替換成本 |
分數可以協助整理差異,不能取代必要條件或風險判斷。兩個方案總分接近時,可以比較最高風險項目、驗證結果可信度與失敗後的替換成本,不需要為了產生唯一答案而調整分數。
選定技術後,需要使用架構決策紀錄(Architecture Decision Record, ADR)保存當時的問題、選項與理由。ADR 保存當時的判斷脈絡,讓後續維護人員知道這項決定依據哪些條件,以及何時需要重新評估。
一份技術選擇 ADR 可以包含:
ADR 要和目標系統原始碼及相關文件一起管理。候選技術版本、需求或驗證結果改變時,應該新增後續決策紀錄並保留原本脈絡,不要只修改結論而刪除原因。
技術選擇完成時,應該得到一套能共同運作的技術組合,以及足以支持後續設計與實作的決策紀錄。至少要確認下列結果:
如果關鍵結果仍是「理論上支援」或「之後再確認」,技術選擇就還沒有完成。先縮小未知範圍並取得可重現的結果,可以避免後續功能已大量實作後才發現基礎技術不符合限制。