用 AI 接手 Legacy Code——4000 行 function 怎麼辦

🌏 Read English Version


真實的恐懼

打開 IDE。

檔案名稱:OrderProcessor.java

滾動條拉到底,要 5 秒。

游標停在第 1 行,右下角顯示:4,127 lines

搜尋 if,847 個結果。

這個 function 處理所有訂單邏輯。每天跑 10 萬次。改錯一行,整個訂單系統會爆。

沒有註解。 沒有文件。 原作者三年前離職了。

你的任務:「改一下訂單折扣的邏輯。」

看起來很簡單。

但你連折扣邏輯在哪都找不到。

這個場景,你經歷過幾次?


為什麼 Legacy Code 這麼難

表面問題 vs 真正問題

你以為的問題 真正的問題
Code 太長 不知道哪段重要、哪段是歷史垃圾
沒有註解 不知道「為什麼」這樣寫
原作者離職 沒人能回答「這樣改會不會爆」
看不懂 沒有安全感,不敢動

Legacy Code 的三層恐懼

第一層:認知負荷

4000 行 code,你要同時記住: – 這段在做什麼 – 變數從哪裡來 – 會影響什麼 – 有什麼邊界條件

人腦的工作記憶大約 7 個項目。4000 行遠遠超過負荷。

第二層:不確定性

你改了第 2847 行。

會影響什麼?不知道。 有沒有其他地方依賴這裡?不知道。 有測試可以驗證嗎?沒有。

不確定性會放大恐懼。

第三層:責任壓力

改壞了是你的鍋。

即使這 code 不是你寫的, 即使這 code 本來就是地雷, 出事的時候,大家會問:「誰改的?」

這三層恐懼疊在一起,導致一個結果:

不敢動。

能不改就不改。 能繞過就繞過。 能拖延就拖延。

然後 code 越來越爛,下一個人更不敢動。

惡性循環。


AI 能幫什麼:判斷框架

不是所有事情都要交給 AI。 也不是所有事情都要自己來。

✅ AI 完全接手

解釋 code 在做什麼 – 翻譯機:把 4000 行變成 20 段摘要 – 你不用逐行讀,看摘要就能掌握全貌

找出相依性 – 這個 function 讀了哪些 DB table – 呼叫了哪些外部 API – 改了會影響什麼

找出潛在問題 – null pointer 風險 – 效能瓶頸 – 安全漏洞

產生測試案例 – Happy path – 邊界條件 – 錯誤處理

建議拆分方式 – 可以拆成哪幾個 function – 先拆哪個最安全

這些是「有標準答案」的事情。AI 比人快、比人全面。

🤝 人機協作

確認 AI 的理解是否正確

AI 會猜錯業務邏輯。

它不知道「為什麼這裡要乘以 1.05」。 它不知道「這個 workaround 是為了處理某個大客戶的特殊需求」。

你需要驗證 AI 的說法,補充它不知道的 context。

決定拆分的優先順序

AI 說可以拆成 7 個 function。 先拆哪個?後拆哪個?有哪個不能動?

這需要你判斷業務優先級和風險。

審核測試案例

AI 產生的測試可能漏掉關鍵場景。 你要審核、補充、確認涵蓋率。

❌ 人來決定

這段邏輯該保留還是刪除

看起來沒用的 code,可能是某個 edge case 的處理。 刪不刪,是業務決策,不是技術決策。

重構的時機

現在改還是等下個 sprint? 這個風險值不值得承擔? 團隊有沒有 bandwidth?

跟 PM/主管溝通

為什麼要花時間重構? 對用戶有什麼好處? 不做會怎樣?

這些 AI 沒辦法幫你。


第一步:建立認知地圖

在改任何東西之前,先搞清楚這坨 code 的全貌。

讓 AI 當翻譯

不要一次丟 4000 行給 AI。它會崩潰,你會得到一堆廢話。

分段餵。

第一輪,給全貌:

這是一個電商系統的 processOrder function,
總共 4000 行,我會分段給你。

先告訴你整體結構:
- 第 1-400 行:訂單驗證
- 第 401-800 行:庫存檢查
- 第 801-1200 行:運費計算
- 第 1201-1800 行:折扣處理
- 第 1801-2500 行:付款處理
- 第 2501-3200 行:建立出貨單
- 第 3201-4000 行:發送通知

你先理解這個結構。

第二輪,深入單一段落:

現在我給你第 1-400 行(訂單驗證)。

請告訴我:
1. 這段的主要邏輯,用一句話說明
2. 列出 3-5 個主要步驟
3. 有什麼潛在問題
4. 這段跟後面的庫存檢查怎麼銜接

AI 會回答:

這段在做訂單驗證,確保訂單可以進入處理流程。

主要步驟:
1. 檢查用戶登入狀態
2. 驗證購物車不為空
3. 檢查商品是否還在架上
4. 驗證收件地址格式
5. 檢查是否有未完成的訂單

潛在問題:
- 第 45 行:user.getCart() 沒有 null check
- 第 120 行:地址驗證是寫死的 regex,可能跟不上格式變化
- 第 380 行:有個 magic number 1.05,不知道是什麼

銜接方式:
驗證通過後,會把 validatedOrder 物件傳給庫存檢查。

重複這個過程,你會得到 20 個段落的摘要。

現在你有了「目錄」。

讓 AI 畫相依圖

分析這個 function,列出它:

1. 讀取了哪些資料庫表
2. 呼叫了哪些外部 API
3. 使用了哪些全域變數或設定
4. 會修改哪些狀態(DB、快取、檔案)

為什麼這很重要?

知道碰了什麼,才知道改了會影響什麼。

這是你的「爆炸半徑評估」。

讓 AI 找地雷

檢查這段 code,找出:

1. 潛在的 bug(null pointer、邊界條件、race condition)
2. 效能問題(N+1 query、重複計算、大量迴圈)
3. 安全風險(SQL injection、權限檢查缺失)
4. 可維護性問題(magic number、重複邏輯、過深巢狀)

這不是要你現在修,是要你知道地雷在哪。

踩到地雷之前,先知道地雷的位置。


第二步:先有測試,再動手改

核心原則:沒有測試的重構是自殺

你改了 4000 行中的第 2847 行。

怎麼知道沒改壞?

跑一次看看? 手動測幾個場景? 祈禱?

這不是工程,這是賭博。

三種測試策略

策略 A:Golden Master Testing(最保守)

概念:先錄下現有行為,重構後比對結果是否一致。

步驟:
1. 準備 50 組真實的輸入資料(從 production log 撈)
2. 跑一次現有 code,記錄所有輸出
3. 這就是你的「黃金標準」
4. 重構後,再跑一次,比對輸出是否完全一樣
5. 有任何不一樣,就是改壞了

讓 AI 幫你產生測試資料:

根據這個 function 的參數,
產生 20 組涵蓋不同情境的測試輸入:

- 5 組正常情況(一般訂單)
- 5 組邊界條件(空購物車、單一商品、大量商品)
- 5 組特殊情況(有折扣碼、跨境訂單、預購商品)
- 5 組錯誤情況(無效地址、庫存不足、付款失敗)

策略 B:Characterization Testing(描述現狀)

概念:不管 code 對不對,先把「現在的行為」變成測試。

這個 function 目前的行為:

- 輸入 X 會回傳 Y
- 輸入 A 會拋出 B 例外
- 輸入 null 會回傳空陣列

把這些行為寫成測試。
不管它是不是 bug,先鎖定現狀。

為什麼?

重構的目標是「行為不變」。 先鎖定現狀,之後再討論要不要改行為。

策略 C:針對關鍵路徑測試(務實)

如果沒時間寫完整測試:

這個 function 最重要的 5 個使用情境是什麼?
只針對這 5 個情境寫測試。

80/20 法則:20% 的測試涵蓋 80% 的風險。

有總比沒有好。

AI 產生測試的陷阱

AI 產生的測試有常見問題:

問題 1:只測 happy path

AI 會產生「正常流程」的測試,但漏掉邊界條件。

問題 2:Mock 太多

AI 會把所有外部相依都 mock 掉,結果測試只測了「mock 的行為」,沒測到真實整合。

問題 3:斷言太弱

// AI 產生的測試
assertNotNull(result);  // 只確認不是 null,沒驗證內容

你要做的:審核 AI 的測試

問 AI:

你剛才產生的測試,有沒有漏掉什麼重要情境?

特別是:
- 資料為空的情況
- 資料量很大的情況
- 併發執行的情況
- 權限不足的情況
- 外部服務超時的情況

讓 AI 自己檢查自己。


第三步:拆分策略

為什麼會變成 4000 行

4000 行的 function 不是一天變成的。

成因 1:功能堆疊

每次加需求,就往裡面塞一段。

「這裡順便加一下 A 功能。」 「那裡也加一下 B 檢查。」

三年後,變成 4000 行。

成因 2:Copy-paste

類似的邏輯,複製 10 次。

「這個跟那個差不多,複製過來改一下。」

每次複製,行數翻倍。

成因 3:恐懼驅動

不敢新開 function,怕改壞現有的呼叫。

「就塞在這裡好了,反正能跑。」

成因 4:沒有 Code Review

沒人說「這太長了」。 沒人說「應該拆開」。 沒人關心 code quality。

理解成因,才知道怎麼拆。

讓 AI 建議拆分方式

這個 4000 行的 function,請建議如何拆分。

考量:
1. 單一職責原則(一個 function 做一件事)
2. 可測試性(拆完要能單獨測試)
3. 最小化改動範圍(盡量不影響呼叫端)

請告訴我:
1. 可以拆成哪幾個獨立的 function
2. 每個 function 的職責是什麼
3. 它們之間怎麼呼叫
4. 哪個最獨立、最適合先抽出來

AI 會給你類似這樣的建議:

建議拆成 7 個 function:

1. validateOrder() - 訂單驗證(第 1-400 行)
   職責:確保訂單資料完整、用戶有權限
   相依:最低,只需要 Order 物件
   建議順序:第一個抽

2. checkInventory() - 庫存檢查(第 401-800 行)
   職責:確認所有商品有足夠庫存
   相依:需要 validateOrder 的結果

3. calculateShipping() - 運費計算(第 801-1200 行)
   職責:根據地址和商品計算運費
   相依:需要驗證後的地址資料

...

拆分的三個原則

原則 1:先抽最獨立的

哪段跟其他段落最沒有相依?先抽那段。

問 AI:

這 7 個建議的 function 中,
哪一個跟其他部分相依性最低?
我想從最安全的開始拆。

通常是: – 純計算的邏輯(不讀 DB、不呼叫 API) – 驗證類的邏輯(只檢查不修改) – 通知類的邏輯(最後一步,不影響主流程)

原則 2:漸進式替換(Strangler Fig Pattern)

不要一次全改。

步驟:
1. 新建一個 validateOrder() function
2. 把原本第 1-400 行的邏輯複製過去
3. 在原本的位置,改成呼叫 validateOrder()
4. 跑測試,確認行為一致
5. Commit
6. 下一個 sprint 再抽下一段

每次只動一小塊。 每次都可以 rollback。 每次都有測試保護。

原則 3:保持 function signature 不變

重構第一階段:只改內部結構,不改輸入輸出。

為什麼? – 呼叫端不用改 – 測試不用改 – 風險最小

等內部結構穩定了,再考慮要不要調整介面。


第四步:處理「只有離職的人知道」的邏輯

AI 也會遇到的黑洞

有些 code,AI 也看不懂:

// 不知道為什麼要這樣,但拿掉會出事
price = price * 1.05 * 0.97 * 1.02;

你問 AI,它會說:

「這看起來是在調整價格,但我不知道為什麼是這些數字。可能是稅率、折扣、或其他業務規則。」

這就是業務邏輯黑洞。

AI 能幫你分析 code 結構,但它不知道: – 這是哪個客戶的特殊需求 – 這是為了繞過哪個歷史 bug – 這是誰在三年前的某個凌晨三點加的 workaround

考古策略

策略 1:Git Blame

git blame -L 2847,2847 OrderProcessor.java

找到是誰、什麼時候加的這行。

git show abc123  # 看那個 commit 的完整內容
git log --grep="price adjustment"  # 搜尋相關的 commit message

運氣好的話,commit message 會寫原因。 運氣更好的話,會有 issue 或 ticket 編號。

策略 2:找相關文件

問 AI:

這段 code 提到了 'specialDiscountRate'。

幫我在專案中搜尋相關的:
1. 設定檔(application.yml、config.json)
2. 文件(README、wiki、confluence)
3. 測試案例(可能有註解說明用途)
4. 其他 code 的註解

策略 3:找老員工

不是找他解釋 code,是找他講歷史。

「2021 年那個大客戶的專案,有沒有什麼特殊的定價邏輯?」

「這個 1.05 的數字,你有印象是什麼嗎?」

他可能不記得 code,但可能記得業務背景。

策略 4:標記並隔離

如果真的找不到答案:

/**
 * WARNING: 不明的定價調整邏輯
 *
 * 可能與 2021 年某客戶專案相關(待確認)
 * 原作者 John 已離職,無法詢問
 *
 * 在確認前請勿修改
 * 如需修改,請先跟 PM 確認業務規則
 *
 * 發現日期:2025-12-08
 * 發現人:Tim
 * 相關 ticket:找不到
 */
price = price * 1.05 * 0.97 * 1.02;

至少下一個人知道: – 這是「已知的未知」 – 不是你的疏忽 – 動之前要小心


心態篇:這不是你的問題

Legacy Code 是歷史共業

這 4000 行不是你寫的。

當初會這樣寫,有當初的原因: – 時程很趕 – 需求一直變 – 沒有人 review – 沒有時間重構

你的責任是「讓它變好一點」,不是「讓它完美」。

重構的三個陷阱

陷阱 1:想一次重構完

「我要花兩週把這整個重寫!」

結果: – 兩週後沒寫完 – 新需求進來,要在舊 code 上改 – 你的重構 branch 跟 main 差了 500 個 commit – 永遠 merge 不回去

正確做法:每次進去,改一小塊,馬上 merge。

陷阱 2:追求「乾淨」

你花了三天把 code 變漂亮。

PM 問:「使用者感受到什麼改變?」

你:「呃…沒有,但 code 變乾淨了。」

PM:「…」

正確做法:重構要跟著需求走。

要改那塊功能時,順便整理那塊 code。 這樣重構就是「做需求的一部分」,不是「額外的工作」。

陷阱 3:重構變重寫

「這 code 太爛了,重寫比較快。」

90% 的情況,這是錯的。

重寫意味著: – 丟掉所有 edge case 處理(你不知道有哪些) – 丟掉所有 bug fix(你不知道修過什麼) – 重新踩一次所有的坑(前人踩過你還要再踩)

重寫的誘惑很大,但代價更大。

Boy Scout Rule

童軍規則:

「離開營地時,讓它比你來的時候乾淨一點。」

每次改 code: – 順手改一個變數名稱,讓它更清楚 – 順手抽一個小 function,讓邏輯更明確 – 順手加一行註解,讓下一個人少猜一點

不是大重構。 就是順手。

一年後,4000 行變成 3000 行。 不是某次重構的功勞,是每天一點點的累積。


實戰操作:Claude Code 完整對話流程

起手式:給 AI 足夠的 Context

錯誤做法:直接貼 4000 行

你:幫我解釋這段 code
[貼 4000 行]

AI 會崩潰或給你一堆廢話。

正確做法:分層餵食

你:我要接手一個 legacy 專案。
    有個 processOrder function,4000 行。
    我會分段給你。

    先告訴你背景:
    - 這是電商系統的訂單處理核心
    - 每天跑 10 萬次
    - 原作者已離職
    - 沒有測試、沒有文件

    我的目標是:
    1. 先理解它在做什麼
    2. 找出風險點
    3. 規劃怎麼拆分重構

    你準備好了嗎?

五個最實用的 Prompt 模板

模板 1:程式碼翻譯

用一句話說明這段 code 在做什麼。
然後用 bullet points 列出 3-5 個主要步驟。
不要解釋語法,專注在業務邏輯。

模板 2:相依性分析

分析這個 function:

1. 輸入:需要什麼參數、從哪裡來
2. 輸出:回傳什麼、會改變什麼狀態
3. 相依:讀寫哪些 DB table、呼叫哪些外部服務
4. 副作用:會發 email?寫 log?改全域變數?

模板 3:風險評估

如果我要修改第 2847 行的這個邏輯:

1. 可能影響哪些其他地方?
2. 需要注意什麼邊界條件?
3. 你建議我先寫哪些測試來保護這次修改?

模板 4:測試案例生成

針對這個 function,設計測試案例:

1. Happy path:3 個正常流程
2. Edge cases:3 個邊界條件
3. Error cases:3 個錯誤處理

每個案例說明:輸入、預期輸出、測試目的

模板 5:重構建議

這個 function 太長了,請建議拆分方式:

1. 可以拆成哪幾個獨立的 function?
2. 每個 function 的職責是什麼?
3. 它們之間怎麼呼叫?
4. 哪個最獨立、最適合先抽出來?

完整對話範例

你:我要接手一個 legacy 專案,有個 processOrder function 4000 行。
    我先給你前 200 行,請幫我理解。
    [貼 code]

AI:這段是訂單驗證邏輯,主要做五件事:
    1. 檢查用戶登入狀態
    2. 驗證購物車不為空
    3. 檢查商品是否還在架上
    4. 驗證收件地址格式
    5. 檢查是否有未完成的訂單

    潛在問題:
    - 第 45 行的 null check 可能漏了 edge case
    - 第 120 行的地址驗證是寫死的 regex

你:第 45 行那個 null check 具體是什麼問題?

AI:第 45 行是 user.getCart().getItems()。
    如果 getCart() 回傳 null,會拋出 NullPointerException。
    建議加上 null check 或使用 Optional。

你:好,我想先處理這段。幫我寫測試案例。

AI:[產生 5 個測試案例]

你:這些測試有涵蓋到你說的第 45 行的問題嗎?

AI:沒有,讓我補充一個測試 cart 為 null 的案例...

你:現在給你第 201-400 行...

重點:對話是迭代的,不是一次問完。

AI 答錯的時候怎麼辦

AI 會猜錯,特別是:

  • 業務邏輯:它不知道你公司的規則
  • 命名誤導:function 叫 validate 但其實在做 transform
  • 歷史 workaround:看起來是 bug,其實是故意的

怎麼處理:

你:你說這段在做 X,但我實際跑起來發現是做 Y。
    可能的原因是什麼?
    請重新分析,考慮到 [你的觀察]。

讓 AI 修正自己,而不是換一個問題問。


團隊協作:怎麼帶 Junior 一起處理 Legacy Code

Junior 面對 Legacy Code 的困境

他們卡住,不是因為懶或笨。

是因為: – 沒有足夠的 context:不知道系統全貌,不知道為什麼這樣設計 – 沒有安全感:怕改壞、怕被罵、怕問蠢問題 – 沒有方法論:不知道從哪開始、不知道怎麼拆解問題

Pair Programming with AI

新的 pair programming 模式:

Senior + Junior + AI(三人組)

流程:
1. Senior 給 context:「這個 function 是訂單核心,碰了會影響營收」
2. Junior 跟 AI 對話,Senior 旁聽
3. AI 解釋 code,Junior 發問
4. Senior 在關鍵時刻介入:「AI 這邊說的不對,實際上是...」
5. Junior 學到的不只是 code,還有 Senior 的判斷邏輯

好處:

  • Senior 不用一直解釋基礎概念(AI 處理)
  • Senior 可以專注在「AI 不知道的事」(業務邏輯、歷史脈絡)
  • Junior 有 AI 當安全網,敢問問題
  • Junior 看到 Senior 怎麼跟 AI 協作,學到方法論

建立 Legacy Code 知識庫

每次處理 legacy code 後,留下紀錄:

## OrderProcessor.java 探索紀錄

### 2025-12-08 by Tim
- 理解了第 1-400 行(訂單驗證)
- 發現第 45 行有潛在 null pointer
- 已補上測試案例 3 個
- 未解之謎:第 380 行的 magic number 1.05 是什麼

### 2025-12-15 by Amy
- 問了前輩 John,1.05 是 2021 年某客戶的特殊稅率
- 已加上註解說明
- 抽出 validateOrder() function,行數 400 → 80

### 2025-12-22 by Tim
- 處理了第 401-800 行(庫存檢查)
- 發現有 N+1 query 問題,但這次不修,先記錄

這樣知識就不再只在一個人腦袋裡。

下一個人進來,先看這份紀錄,就知道前人做了什麼、發現了什麼。

Code Review 的新標準

以前的 review 標準:「這段 code 寫得對不對?」

現在的 review 標準:「這段 code 讓系統更容易維護了嗎?」

新的 review checklist:


  • 有寫測試嗎?(至少 happy path)

  • 有改善可讀性嗎?(變數命名、抽 function)

  • 有留下註解嗎?(特別是非直覺的邏輯)

  • 改動範圍是否最小化?(不要順便大重構)

  • 如果是 legacy code,有更新知識庫嗎?

向上管理:怎麼說服主管給你時間處理 Legacy Code

主管不關心「Code 很髒」

你說:「這個 function 4000 行,維護性很差,需要重構。」

主管聽到:「你想花時間在不會產生新功能的事情上。」

你需要翻譯成主管的語言。

三種說服框架

框架 1:風險語言

這個 function 處理所有訂單,每天跑 10 萬次。
目前沒有測試、沒有文件、原作者離職了。

上次出問題,花了 12 小時才定位到 bug。
如果週末出事,沒人能快速處理。

建議投資 3 天做基礎整理:
- 加上關鍵路徑的測試
- 寫一份結構說明文件
- 標記已知的風險點

這樣下次出問題,處理時間可以從 12 小時降到 2 小時。

框架 2:效率語言

上次改訂單折扣邏輯,預估 2 天,實際花了 5 天。

其中 3 天是在:
- 讀懂 4000 行 code(1.5 天)
- 手動測試確保沒改壞(1 天)
- 修改過程中踩到的坑(0.5 天)

接下來三個月有 5 個需求會動到這塊。

如果我們花 3 天整理:
- 每個需求可以省 2 天
- 三個月省 10 天
- ROI:3 天投資,10 天回報

框架 3:人才語言

新人 Amy 加入團隊 1 個月了。
訂單模組她還不敢碰,因為 code 太複雜、沒有文件。

對比之下,用戶模組有測試有文件,她第二週就能獨立改了。

如果我們不整理訂單模組:
- 永遠只有我能改這塊
- Amy 成長速度受限
- 我沒辦法休假(因為沒人能 backup)

不要一次要太多時間

錯誤:「我需要兩週專心重構這塊。」

主管會說:「等有空再說。」

然後永遠不會有空。

正確:「每個 sprint 我花半天整理一小塊,跟著需求走。」

主管容易同意,而且你真的會做。

展示進度

每次整理完,發一個簡短的更新:

本週整理了 processOrder 的訂單驗證段落:

- 抽出 validateOrder(),350 行 → 80 行
- 補上 5 個測試案例
- 下次改這塊預估可省 2 小時

累積進度:4000 行已整理 400 行(10%)

讓主管看到: – 你在做什麼 – 有什麼具體成果 – 對團隊有什麼好處


技術債量化:怎麼跟非技術人員解釋

類比:房子的隱藏成本

想像你買了一間 30 年的老房子。

看起來能住,但是:
- 電線老舊,偶爾跳電
- 水管鏽蝕,水壓不穩
- 沒有圖紙,每次裝修都要猜管線在哪

你可以繼續住,但:
- 每次出問題,修理費越來越高
- 師傅不敢動,怕牽一髮動全身
- 有一天可能整個系統崩潰

技術債就是這樣。

系統能跑,但維護成本越來越高。
每次改東西,風險越來越大。

三個量化指標

指標 1:修復時間(Time to Fix)

上次訂單系統出 bug:

- 定位問題:8 小時(在 4000 行裡面找)
- 修復問題:2 小時
- 測試驗證:2 小時(手動,因為沒有自動測試)

總計:12 小時

如果有測試和文件,預估只需要 4 小時。

指標 2:變更成本(Cost of Change)

上次改訂單折扣邏輯:

- 需求本身:改 10 行 code
- 實際花費:5 天

時間去哪了:
- 讀懂 code:2 天
- 手動測試:1 天
- 踩坑修復:1 天
- 實際修改:0.5 天
- Code review + 部署:0.5 天

有測試的模組,同樣的需求只要 1 天。

指標 3:新人上手時間(Onboarding Time)

Amy 加入團隊 1 個月:

- 用戶模組:第 2 週能獨立開發(有測試、有文件)
- 支付模組:第 3 週能獨立開發(有測試、缺文件)
- 訂單模組:1 個月了還不敢碰(無測試、無文件、太複雜)

每個新人都要重新踩坑。

視覺化呈現

畫一張簡單的圖給主管看:

模組健康度儀表板

用戶模組     ████████░░ 80%  ✓ 有測試、有文件
支付模組     ██████░░░░ 60%  △ 有測試、缺文件
訂單模組     ██░░░░░░░░ 20%  ✗ 無測試、無文件 ← 風險最高

主管一眼就知道問題在哪。

建立技術債清單

不要只抱怨「code 很爛」。建立一個具體清單:

項目 風險等級 預估整理時間 整理後效益
processOrder 無測試 3 天 修復時間 -8 小時/次
用戶模組無文件 1 天 新人上手 -1 週
支付 API 無錯誤處理 2 天 減少客訴、降低退款率
報表模組效能差 5 天 查詢時間 30 秒 → 3 秒

有清單,才能討論優先級、排進 roadmap。


完整流程總結

Week 1:建立認知

目標:知道這坨 code 在幹嘛、有什麼風險

  1. 讓 AI 解釋每一段在做什麼 → 產出:段落摘要
  2. 讓 AI 畫出相依圖 → 產出:dependency map
  3. 讓 AI 找出地雷 → 產出:風險清單

產出物:一份「系統地圖」文件

Week 2:建立安全網

目標:有足夠的測試保護,才敢動手改

  1. 產生 Golden Master 測試資料
  2. 讓 AI 產生測試,你審核補充
  3. 確保關鍵路徑有測試覆蓋

產出物:測試覆蓋率從 0% → 30%+(關鍵路徑)

Week 3+:漸進式改善

目標:每次進去,讓它比之前好一點

  1. 從最獨立的段落開始抽
  2. 每次只改一小塊,馬上 merge
  3. 標記無法理解的邏輯,不要硬改
  4. 更新知識庫,留給下一個人

產出物:每個 sprint 減少 5-10% 的 code 行數


從恐懼到掌控

以前打開 4000 行:

  • 腦袋當機
  • 不知道從哪開始
  • 改了怕爆
  • 想離職

現在:

  • AI 當翻譯,你看摘要
  • AI 畫地圖,你知道邊界
  • AI 寫測試,你有安全網
  • AI 建議拆法,你決定順序

那 4000 行還是 4000 行。

但你不再害怕了。

因為你有方法。 因為你有工具。 因為你知道,這不是你的問題,是歷史共業。

你的工作,是讓它一點一點變好。

不是英雄式的大重構。 是每天一點點的 Boy Scout Rule。

一年後回頭看,4000 行變成 2000 行。 有測試、有文件、有人敢改。

那就是你的功勞。

Leave a Comment