Agentic Research
首頁/模板/技術債追蹤與重構優先級排序:從主觀感受到數據驅動的決策

技術債追蹤與重構優先級排序:從主觀感受到數據驅動的決策

2026/10/0115 分鐘Bryan Chan最後更新 2026/10/01
這篇屬於模板主題應用場景AI AgentDevOps

專案上線半年,新功能開發越來越慢,每次改動都要花半天除錯;新人接手舊模組,看不懂為什麼這裡要這樣寫,問了一圈沒人記得當初的設計決策。這類「技術債累積」是工程團隊最常見的隱形成本:慢、難以量化、而且決策取決於誰的聲音最大。這篇是操作配方:用 SonarQube、CodeClimate、LLM 節點與自訂儀表板串出一條技術債量化流水線,讓機器從程式碼提取指標、評估業務影響、計算重構 ROI,人只處理需要業務語境判斷的部分。全文最重要的一節是第五節——哪些環節可以從程式碼自動量化,哪些環節必須由人評估業務影響,這條邊界畫錯了,自動化會比人工更危險。

這個場景解決什麼

適合這個配方的流程有四種特徵:高頻率(每天都有新程式碼)、跨模組(技術債影響多個服務)、規則說得清楚(代碼異味、重複率、複雜度有明確指標)、繁瑣但必須做。四者俱備的人工評估,通常有三種損耗:主觀(不同人對技術債嚴重程度看法不同)、延遲(等到出事才想重構)、不完整(只看程式碼不看業務影響)。

做完這個配方之後的目標狀態:技術債被量化為可比較的數字,重構優先級基於業務影響與 ROI 自動排序,Tech Lead 能用數據說服產品經理撥出重構時間。人的角色從「憑感覺說這很爛」變成「根據數據決定先修哪個」。

同時畫清邊界:這篇處理的是技術債的量化與優先級排序,不是要你用 AI 取代架構決策;需要長期演進方向判斷與權衡取捨的環節(例如「這個模組是否值得重構還是直接重寫」)也不在自動化範圍內。判斷一個場景值不值得自動化,先讀什麼時候不該用 AI。

工具組合與前置準備

  • SonarQube:開源代碼品質平台,支援 30+ 語言的靜態分析,涵蓋 bug、漏洞、代碼異味、重複率、圈複雜度等維度。可自架或採用雲端版 SonarCloud。自建與採購的系統性取捨見自建還是採購。
  • CodeClimate:商業代碼品質平台,提供維護性指數(Maintainability Index)、技術債比率、測試覆蓋率等綜合指標。優點是指標全面、易於理解;缺點是需要訂閱。方案與定價以官網為準。
  • LLM API(本文以 DeepSeek 為例,任何供應商皆可):負責流程中「業務影響評估」與「自然語言生成」的判斷。單價以供應商官網為準;接通後第一件事是在供應商控制台設定花費上限與用量告警。
  • 自訂儀表板(Grafana、Metabase 或簡易 HTML Dashboard):將技術債指標可視化,支援按模組、時間、嚴重程度篩選。優點是客製化自由度高;缺點是需要額外開發。

前置檢查表——每一項都有明確答案才動工:

檢查項要確認什麼沒確認就做的後果
程式碼倉庫權限CI/CD 帳號是否有讀取所有相關倉庫的權限部分模組無法分析,技術債評估不完整
歷史數據是否有過去半年的 git log、issue tracker 數據無法計算技術債增長趨勢
業務映射是否能將程式碼模組映射到業務功能(如「訂單模組」、「用戶認證」)無法評估業務影響,優先級排序失去依據
維運責任上線後誰看儀表板、誰調整評估模型數據產出但無人使用,比沒有更糟

資料分級的判斷方法見企業資料安全基本盤。

憑證紀律(先講,因為最常被忽略):所有 API Key、OAuth Token 放進 CI/CD 平台的 secrets 機制;不要寫死在 workflow 檔案、註解或說明文件裡;不要把含憑證的配置檔提交到公開倉庫。

一、盤點人工評估痛點

花兩週,把所有技術債評估中的常見問題列成一張表:

問題類型發生頻率平均發現時間修復成本現在誰發現
重複程式碼導致修改遺漏每月 2-3 次測試階段或上線後高(需多處修改)QA 工程師
高複雜度函式難以維護每週 1-2 次新人接手時中(學習曲線陡峭)新入職工程師
缺少測試覆蓋的關鍵路徑每月 1-2 次生產環境報錯極高(需緊急修復)值班工程師
過時依賴庫的安全漏洞每季度 1-2 次安全掃描或滲透測試高(需升級並回歸測試)安全團隊

兩個填寫紀律:頻率與成本是從實際 issue tracker 與 git log 統計出來的,不靠印象——口頭回憶幾乎總是低估;修復成本要寫具體事件(哪次 hotfix、花了多少人天),寫不出成本的問題,說明它可能根本不值得優先自動化。

這張表有兩個用途:下一步的選型依據,以及上線後計算效益的基線。「自動化前平均每筆技術債評估多久、自動化後例外處理要多久」都從這張表與後面的執行紀錄算出來——自己測的數字,比任何文章裡的參考值可靠。

二、選一條最痛的模組

四個條件同時成立才動手:頻率高(經常變更)、規則寫得出來(有明確的代碼指標)、出錯有代價(影響業務穩定性)、工具鏈有介面。

兩類流程先避開:即將廢棄的 legacy 模組(不值得投入重構);業務邏輯極度複雜且無文檔的模組(LLM 無法理解上下文,誤報率過高)。

第一版切小:只做「程式碼掃描 → 指標提取 → 業務影響評估 → ROI 計算 → 優先級排序 → 儀表板展示」這一條主幹。自動化重構建議、歷史趨勢預測全留到第二版。一條穩定跑通的主幹,勝過一張完整但沒上線的設計圖。

三、自架還是雲端

考量點自架官方雲端
資料位置程式碼與分析結果在自己環境,適合分級要求高的專案程式碼經供應商環境,須先過資料分級這一關
維護責任升級、擴展、停機處置都是你的供應商負責
起步速度需要伺服器資源與基本 DevOps 能力註冊即用,幾分鐘內完成整合
預算形態伺服器費用加維運人力訂閱制,金額以官網為準

決策方法:資料分級結果說「不能出網」時,自架 SonarQube 幾乎是唯一選項;否則先用 CodeClimate Cloud 把第一條流程跑通,累積了真實用量與失敗紀錄,再評估要不要遷移。不論哪種,都先用測試倉庫跑通示範流程,第一天不碰生產倉庫。

四、串出最小可跑版本

節點組裝順序:

  1. 觸發節點:定時觸發(每週一次)或 push 事件觸發(監聽特定路徑)。優先定時觸發,避免每次 commit 都掃描造成資源浪費。
  2. 掃描節點:執行 SonarQube Scanner 或 CodeClimate CLI,輸出結構化的代碼指標 JSON(圈複雜度、重複率、代碼異味數、測試覆蓋率等)。
  3. 業務映射節點:將程式碼路徑映射到業務模組(如 src/orders/** → 「訂單模組」),可透過配置檔或 LLM 自動推斷。
  4. LLM 評估節點:將代碼指標、近期 issue 數據、業務模組重要性送入 LLM,要求輸出業務影響評分與重構建議。
  5. ROI 計算節點:根據重構預估工時、預期減少的 bug 數、節省的開發時間,計算重構投資回報率。
  6. 優先級排序節點:綜合代碼指標評分、業務影響評分、ROI,計算綜合優先級分數,生成排序清單。
  7. 儀表板更新節點:將結果寫入資料庫或儀表板 API,更新可視化界面。

試跑期三條紀律:

  • 用測試倉庫:建立 test-tech-debt 倉庫,故意放入已知問題(高複雜度函式、重複程式碼、缺少測試),驗證工具能否正確檢測並評分。
  • 留執行紀錄:除平台內建的執行歷史外,為重要流程加一個「台帳」分支——每次執行把時間、模組名稱、各項指標、優先級分數寫進一張專用表格或資料庫。這是第八節監控的原料。
  • 影子模式上線:自動化先生成優先級清單但不強制執行,人照樣憑經驗決定重構順序,逐週比對兩邊結果。連續一致之後才讓自動化接管低風險模組的重構決策,人轉為審核高風險模組。

五、哪些環節交給自動量化、哪些必須用人評估

這是全文最重要的一節。原則一句話:確定性的代碼指標給自動化工具,LLM 只做「業務影響評估」這一類需要語境理解的事。

環節用什麼為什麼
圈複雜度、重複率、代碼異味數SonarQube / CodeClimate同樣輸入必須同樣輸出;這些是確定性指標,LLM 做不到這個保證
測試覆蓋率、未覆蓋路徑Jest / pytest / coverage.py基於執行軌跡的精確計算,準確率 100%
模組業務重要性評分LLM 節點+人工校準需要理解業務價值、用戶量、營收貢獻,純程式碼分析無法得出
重構預估工時LLM 節點+歷史數據需要參考類似重構任務的實際耗時,LLM 能結合上下文給出合理估算
重構風險評估LLM 節點+依賴圖分析需要理解模組間耦合關係與潛在影響範圍
優先級排序的自然語言解釋LLM 節點但排序背後的數字由確定性節點原樣注入,LLM 不得改寫任何指標

兩條鐵律:

  1. 代碼指標永遠不經過 LLM 的嘴。 圈複雜度、重複率、測試覆蓋率由自動化工具原樣計算;LLM 只產評估與建議,不產事實。自動化評估裡代價最高的事故,形態幾乎都是「模型改寫了一個指標,而且改得很像真的」。
  2. LLM 輸出永遠當作不可信輸入。 LLM 節點要求輸出固定結構的 JSON(欄位在提示詞裡逐一列舉);下游第一個節點做格式校驗,校驗不過直接進例外分支,不允許「盡量解析」。

LLM 節點的提示詞寫法:給業務影響評估維度(用戶量、營收貢獻、戰略重要性)、給輸出 JSON 的欄位定義、給邊界規則(「只根據提供的指標與業務描述評估,不補充推測」),溫度調低以減少隨機性。提示詞不神奇,神奇的是它後面接了校驗節點。

以下是一個典型的 LLM 業務影響評估提示詞範例:

你是一位資深技術負責人,負責評估以下模組的技術債業務影響。

【模組資訊】
- 模組名稱:{{module_name}}
- 業務描述:{{business_description}}
- 日均活躍用戶:{{daily_active_users}}
- 月營收貢獻:{{monthly_revenue}}

【代碼指標】
- 圈複雜度平均值:{{avg_cyclomatic_complexity}}
- 重複率:{{duplication_rate}}%
- 代碼異味數:{{code_smell_count}}
- 測試覆蓋率:{{test_coverage}}%
- 近三月 bug 數:{{bug_count_last_3_months}}

【評估維度】
請從以下三個維度評估業務影響,每個維度給出 1-5 分(5 為最高影響):
1. 用戶影響:技術債導致的問題會影響多少用戶
2. 營收影響:技術債導致的問題會損失多少營收
3. 開發效率:技術債會拖慢多少新功能開發速度

【輸出格式】
請嚴格按照以下 JSON 格式輸出,不要添加任何其他文字:
{
  "business_impact": {
    "user_impact": number,
    "revenue_impact": number,
    "efficiency_impact": number,
    "overall_score": number
  },
  "refactoring_estimate": {
    "estimated_hours": number,
    "risk_level": "low" | "medium" | "high",
    "expected_bug_reduction_percent": number,
    "expected_efficiency_gain_percent": number
  },
  "roi_calculation": {
    "cost_hours": number,
    "benefit_hours_per_month": number,
    "payback_months": number,
    "recommendation": "immediate" | "next_quarter" | "backlog"
  },
  "justification": string
}

【邊界規則】
- 只根據提供的指標與業務描述評估,不補充推測
- 如果某些資訊缺失,在輸出中标記 "data_missing"
- 不要改寫任何代碼指標數值

六、錯誤處理、重試與冪等

先把失敗分成三類,因為三類的處置完全不同:

失敗類型例子處置
暫時性API 限流、網路逾時節點自動重試(設次數與間隔);重試耗盡仍失敗進例外分支
資料性倉庫無法訪問、指標計算失敗、LLM 輸出格式錯誤不重試(重試還是錯);直接進例外分支,人修配置後重跑
設定性API Key 過期、SonarQube 服務停機、資料庫連接失敗立即停止流程並告警,等人介入

冪等是重試的前提:流程要保證「同一個模組跑兩次不會重複寫入數據」。做法是在寫入前先查詢該模組該時間點的數據是否已存在——存在就跳過或更新,絕不無腦新增。沒有冪等設計就開重試,等於裝了一台數據製造機:重複的指標記錄,比人工記錄還難收拾。

七、失敗告警

  • 告警發到「有人在值班」的渠道:即時通訊群組或 email,且群組裡有明確的值班表。告警沒人看,等於沒有告警。
  • 告警內容模板:流程名稱、模組名稱、失敗節點、錯誤摘要、發生時間、重跑方式。讓收到的人在半分鐘內能決定「現在處理還是稍後處理」。
  • 分級防洗版:單筆模組掃描例外進每週匯總;API Key 過期、服務停機這類「流程已停」的事件才即時推送。每筆例外都彈一次通知,值班的人很快會把渠道靜音——告警系統就死在靜音那一刻。

八、上線後的監控

  • 前兩週是觀察期:每天看執行歷史與台帳,記錄執行總數、失敗次數、誤報率(人工標記為不合理的優先級比例)。兩週之後自己算誤報率與主因分佈——這是你的流程自己的數據,判斷門檻(誤報率高到多少要調整評估模型)由你的團隊容忍度決定,定了就寫進值班說明,不要引用任何文章裡的現成數字。
  • 每週抽樣複核:固定抽 3-5 個已自動評估的模組,人工複查優先級是否合理、ROI 計算是否準確。抽樣筆數依模組量自定,關鍵是固定頻率、留下紀錄、發現問題就調整規則或提示詞。抽樣抓的是「流程沒報錯但優先級排序不合理」這類最安靜的事故。
  • 變更紀律:團隊評估標準更新、LLM 供應商更新模型版本、你改提示詞,都算變更。改動前先用最近的例外樣本與幾筆正常樣本重跑一遍,確認沒有變差再上;改動寫進台帳。
  • 成本:LLM 節點的用量乘上供應官網單價,加上 SonarQube/CodeClimate 授權費與你的維運時間,就是這條流程的真實成本;估算方法見AI 成本怎麼算。

成果與驗收標準

檢查點通過標準沒通過怎麼辦
盤點基線有技術債痛點表,頻率與成本是從 issue tracker 統計的紀錄回到第一節;先別急著搭流程
主幹跑通測試倉庫端到端跑完,檢測到故意放入的問題檢查工具配置與權限
確定性邊界代碼指標沒有任何一個由 LLM 改寫改成自動化工具直接計算
LLM 輸出校驗LLM 輸出有格式校驗節點,不合法進例外分支在 LLM 節點後補校驗
冪等手動觸發同一個模組兩次,沒有重複數據記錄加數據存在性檢查
影子期與人工並行連續數週結果一致才交接延長影子期,逐項找不一致的原因
告警有效故意製造一次失敗(暫撤測試 API Key),告警在承諾時間內到達值班渠道且內容完整修告警路由與值班安排
監控習慣台帳連續兩週每週有紀錄,抽樣複核有留痕把監控指派到具體的人,放進行事曆

常見踩坑

  • 讓 LLM 做確定性工作:「讓 AI 順便算一下圈複雜度」一時方便,代價是同樣輸入可能不同輸出,出了錯無法重現、無從追查。
  • 用個人帳號的憑證:當事人離職、改密碼的那天,流程集體猝死。用服務帳號,並納入組織的憑證管理。
  • 直接在生產倉庫上實驗:正確順序是測試倉庫、非敏感模組小範圍、全量。跳級的人通常在第二步就出事。
  • 沒做冪等就開重試:重試機制會把偶發錯誤放大成重複數據事故。
  • LLM 節點不設花費上限:一個迴圈觸發的臭蟲能讓流程整夜持續呼叫 API。上限與告警在供應商控制台設定,五分鐘的事。
  • 告警發到沒人看的渠道:沒有值班表的告警是自我安慰。
  • 忽略業務語境:純技術指標無法反映業務影響,必須結合用戶量、營收貢獻等業務數據,否則優先級排序會偏離實際需求。
  • 一次性評估所有模組:一週把上百個模組全部自動化,第二週就沒有人力調整誤報。先讓核心模組(最高頻使用的 10-20 個)穩定跑滿一個月,把模式沉澱成範本,再複製到其他模組。
  • 缺乏管理層支持:技術債重構需要產品經理與管理層的認可,如果沒有提前溝通與教育,自動化產生的優先級清單會被忽視。第一個月重點不是降低誤報,而是建立「數據驅動決策」的文化共識,邀請產品經理參與評估模型的校準。

下一步