我用 AI 把公司 10 萬行程式碼屎山重構了,CTO 看完程式碼後說:你提前轉正

> 入職第一天,主管指著專案說:「這個訂單模組跑了五年,沒人敢大動。你試用期能加個小功能就行,別動別的。」 我不信邪,花了兩個月,用 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 重構三步法

我沒有一次性推倒重來——那會死得很慘。我用 AI 分三步,每一步都確保功能不變,只改結構。

第一步:用 AI 補註解 + 生成文件

我選了一個最複雜的檔案 orderHandler.js(2200 行),整個丟給 Cursor 的 Composer,提示詞:

分析這個檔案,為每個函式生成 JSDoc 註解(包括參數、返回值、副作用說明),然後生成一個 README,畫出主要函式的呼叫關係圖。

AI 十幾秒後輸出:

  • 每個函式前加了 @param@returns@throws
  • 辨識出三個沒有被任何地方呼叫的「殭屍函式」
  • 畫了一張 Mermaid 流程圖,清楚顯示了訂單狀態的流轉路徑

我拿著這張圖,第一次看懂了這座山的「地圖」。

第二步:用 AI 拆分長函式

最長的那個 processOrder 函式,400 行。我用 Cursor 選中它,輸入:

將這個函式按單一職責拆分成多個小函式,每個函式不超過 30 行。保持原有邏輯完全不變,不要改變外部介面。

AI 生成了 8 個小函式:validateOrdercalculateDiscountcheckInventorycreatePaymentRecord……每個都帶清楚命名和註解。

我手動跑了回歸測試,全過。這一步,函式平均行數從 187 降到了 42。

第三步:用 AI 消除重複程式碼 + 抽象公共邏輯

AI 發現三處完全一樣的「價格計算」邏輯散落在不同檔案裡。我用重構工具提取成一個共享函式,AI 幫我自動改了所有呼叫處。

重複程式碼率從 23% 降到了 4%。

金句:AI 幫你寫程式不稀奇,AI 幫你刪程式才是真本事。

三、真實案例:一個隱藏了三年的 bug 被 AI 揪出來了

重構過程中,AI 注意到一段程式碼:

js 体驗AI代碼助手 代碼解讀複製代碼if (order.status === 'paid') {
  sendEmail(user);
  updateInventory(product);
}

但上面幾行還有一個 if (order.paid === true) 的判斷,兩個條件不完全等價。AI 在註解裡標註:

⚠️ 可疑:order.statusorder.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 看到報告,在技術會上說:「這個模組過去三年是公司的『雷區』,現在變成了『示範區』。」 他提前兩個月幫我轉正,還額外給了專案獎金。

五、注意事項:AI 重構的坑

  • 一定要有測試覆蓋:沒有測試的重構是自殺。我先補了關鍵路徑的整合測試,才敢讓 AI 動手。
  • 分步驟提交:不要一次性提交 AI 生成的大幾百行改動。按函式拆、按檔案拆,每個 PR 只改一個點。
  • AI 也會翻車:有一次 AI 把 i++ 改成了 i+1,導致無限迴圈。所以每次 AI 生成後,必須人工 review 核心邏輯。
  • 業務敏感程式碼不要全信 AI:涉及金額、庫存、權限的判斷,手動寫測試斷言,再跑一遍。

六、寫在最後

重構屎山不是技術活,是心理活。AI 給了我們一把鏟子,但挖哪裡、怎麼挖、挖多深,還是人決定。

如果你也接手過屎山,或者正在屎山裡掙扎,點個讚讓我看到不是一個人。讚多的話,我下一篇寫《AI 重構屎山的完整 Prompt 清單,複製就能用》。


原文出處:https://juejin.cn/post/7641881709306920960


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝12   💬4   ❤️1
464
🥈
alicec
📝1   ❤️2
87
#4
我愛JS
💬1  
3
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登