> 入職第一天,主管指著專案說:「這個訂單模組跑了五年,沒人敢大動。你試用期能加個小功能就行,別動別的。」 我不信邪,花了兩個月,用 AI 把這堆屎山一點一點鏟平了。程式碼行數砍了 40%,圈複雜度從 45 降到 8,上線一個月零 bug。CTO 在技術會上說:「這個模組過去是雷區,現在是示範區。」 他提前兩個月讓我轉正,還加了薪。
每個程式設計師職業生涯中都會遇到一座「屎山」。可能是前任留下的,可能是一群實習生堆的,也可能是三年前的自己寫的(別不承認)。
我遇到的這座山,是一個老牌電商的後台訂單模組。檔案平均 1500 行,函式平均 200 行,縮排有的用空格有的用 Tab,註解全是「// fix」「// todo」「// 別動」。最經典的一個函式叫 doSomething(),裡面 switch-case 寫了 12 層,處理 12 種訂單狀態,每種狀態裡還有巢狀 if-else。
我想加一個新狀態,加了三天,改一處崩三處。第四天我崩潰了:這程式碼不是人寫的,是人挖的坑。
然後我決定:用 AI,把這堆屎山一點一點鏟平。
開始之前,我先給這座山做了「體檢」:
| 指標 | 重構前 | 業界參考 | 嚴重程度 |
|---|---|---|---|
| 平均函式行數 | 187 行 | < 30 行 | 🔴 嚴重 |
| 最大圈複雜度 | 45 | < 10 | 🔴 嚴重 |
| 重複程式碼率 | 23% | < 5% | 🟡 中等 |
| 註解覆蓋率 | 3% | > 20% | 🔴 嚴重 |
| 單元測試覆蓋率 | 0% | > 70% | 🔴 致命 |
沒有人敢動它,因為沒有人完全理解它。一個訂單狀態的修改,可能在 12 個 case 分支裡產生蝴蝶效應。
金句:屎山的可怕不在於它爛,而在於沒人敢承認它爛,更沒人敢碰它。
我沒有一次性推倒重來——那會死得很慘。我用 AI 分三步,每一步都確保功能不變,只改結構。
我選了一個最複雜的檔案 orderHandler.js(2200 行),整個丟給 Cursor 的 Composer,提示詞:
分析這個檔案,為每個函式生成 JSDoc 註解(包括參數、返回值、副作用說明),然後生成一個 README,畫出主要函式的呼叫關係圖。
AI 十幾秒後輸出:
@param、@returns、@throws我拿著這張圖,第一次看懂了這座山的「地圖」。
最長的那個 processOrder 函式,400 行。我用 Cursor 選中它,輸入:
將這個函式按單一職責拆分成多個小函式,每個函式不超過 30 行。保持原有邏輯完全不變,不要改變外部介面。
AI 生成了 8 個小函式:validateOrder、calculateDiscount、checkInventory、createPaymentRecord……每個都帶清楚命名和註解。
我手動跑了回歸測試,全過。這一步,函式平均行數從 187 降到了 42。
AI 發現三處完全一樣的「價格計算」邏輯散落在不同檔案裡。我用重構工具提取成一個共享函式,AI 幫我自動改了所有呼叫處。
重複程式碼率從 23% 降到了 4%。
金句:AI 幫你寫程式不稀奇,AI 幫你刪程式才是真本事。
重構過程中,AI 注意到一段程式碼:
js 体驗AI代碼助手 代碼解讀複製代碼if (order.status === 'paid') {
sendEmail(user);
updateInventory(product);
}
但上面幾行還有一個 if (order.paid === true) 的判斷,兩個條件不完全等價。AI 在註解裡標註:
⚠️ 可疑:
order.status和order.paid似乎表示同一件事,但有兩個不同欄位。建議確認是否資料不一致導致 bug。
我查了歷史紀錄,果然三年前有人加了 paid 欄位,但舊程式碼還在用 status。偶爾因為非同步更新不同步,會出現「已付款但未出貨」的投訴。這個 bug 一直沒定位到,被 AI 一眼看出來了。
| 指標 | 重構前 | 重構後 | 變化 |
|---|---|---|---|
| 總程式碼行數 | 10.2 萬 | 6.1 萬 | ↓ 40% |
| 平均函式行數 | 187 | 32 | ↓ 83% |
| 圈複雜度(最高) | 45 | 8 | ↓ 82% |
| 重複程式碼率 | 23% | 4% | ↓ 83% |
| 單元測試覆蓋率 | 0% | 68% | - |
| 線上故障數(月均) | 4.2 | 0.3 | ↓ 93% |
CTO 看到報告,在技術會上說:「這個模組過去三年是公司的『雷區』,現在變成了『示範區』。」 他提前兩個月幫我轉正,還額外給了專案獎金。
i++ 改成了 i+1,導致無限迴圈。所以每次 AI 生成後,必須人工 review 核心邏輯。重構屎山不是技術活,是心理活。AI 給了我們一把鏟子,但挖哪裡、怎麼挖、挖多深,還是人決定。
如果你也接手過屎山,或者正在屎山裡掙扎,點個讚讓我看到不是一個人。讚多的話,我下一篇寫《AI 重構屎山的完整 Prompt 清單,複製就能用》。