- Published on
AI 程式碼會製造大量技術債嗎? Modern Software Engineering 深度分析
隨著 AI 程式碼生成工具如 GitHub Copilot、Cursor、Windsurf 等越來越普及,開發者們開始思考一個關鍵問題:這些看似神奇的工具會不會在提升開發效率的同時,也為我們的程式碼埋下大量的技術債?在 Modern Software Engineering 頻道的深度討論中,兩位業界專家 Trisha Gee 和 Steve Smith 提出了令人深思的觀點。
AI 會製造技術債嗎?答案是肯定的
在「Modern Software Engineering」頻道的「一大問題 (One Big Question)」系列中,主持人 Trisha Gee 與 Equal Experts 的全球現代化與平台主管 Steve Smith 針對「AI 是否會製造大量的技術債?」這個問題進行了深入探討。兩位專家一致認為答案是肯定的,但同時也強調這個問題是可以透過適當的方法來減輕的。
為什麼 AI 會製造技術債?
Steve Smith 開宗明義地表示,AI 程式碼製造技術債是「不可避免的」現象。Trisha Gee 也強烈認同這個觀點,並提出了兩個核心原因:
1. 程式碼產出速度與數量
AI 工具能夠以前所未有的速度生成大量程式碼。從統計學的角度來看,當程式碼量大幅增加時,產生技術債的可能性自然也會隨之提高。這就像是在高速公路上行駛,速度越快,出現意外的風險就越高。
2. 生成程式碼的品質問題
目前生成式 AI 所產出的程式碼品質,在預設情況下往往未能達到理想的業界標準。這並非 AI 技術本身的問題,而是與其訓練資料和應用方式有關。
AI 作為「火箭燃料」的雙面性
Steve Smith 用了一個非常生動的比喻:他將生成式 AI 比作「火箭燃料」。如果一個團隊或專案的現狀良好,AI 將能使其表現更上一層樓;但如果現狀本來就有問題,AI 只會加速問題的惡化,讓情況變得更糟。
這個比喻點出了一個重要事實:AI 工具本身並非問題的根源,而是會將團隊現有的工程文化和實踐水準「放大十倍」。許多 AI 工具(例如 Cursor 和 Windsurf)雖然還在持續發展中,但其潛力確實令人興奮。然而,在帶來奇蹟般效率提升的同時,如果使用不當,也可能讓團隊陷入更深的困境。
訓練資料品質決定輸出品質
公開程式碼庫的挑戰
AI 程式碼品質與其訓練資料有著密不可分的關聯。目前大多數 AI 工具的訓練資料主要來自於公開的程式碼庫,但這些資料庫中包含了大量過時、不合時宜,甚至錯誤的程式碼。
一個典型的例子是 Gradle 建構腳本。AI 在生成 Gradle 腳本時表現往往不佳,主要原因是公開的 Gradle 腳本多為實驗性或個人專案,缺乏工業級別的高品質範例。這導致 AI 容易生成不符合最佳實踐的程式碼。
企業級 AI 應用的需求
為了讓 AI 生成高品質的程式碼,企業需要投入更多時間和精力進行以下工作:
- 客製化 AI 訓練:使用企業內部的高品質程式碼作為訓練資料
- 建立明確的工程準則:定義清楚的「良好工程實踐」標準
- 程式碼風格標準化:例如在公司內部統一使用 Checkstyle 等工具
重新定義技術債
避免模糊的術語
Steve Smith 建議我們避免使用「技術債」這個相對模糊的術語,而改用更具體的描述:「難以修改、修改緩慢或修改有風險的程式碼」。這種描述方式更能幫助團隊理解問題的本質,並採取相應的行動。
何時該償還技術債?
Trisha Gee 引用了 Kent Beck 在《Tidy First》一書中的觀點:並非所有的技術債都需要立即償還。如果某段程式碼被視為「黑箱」,未來不太需要修改,那麼即使其內部結構混亂,也可能不會造成實際問題。畢竟,「如果你沒有為此付出代價,那就不算是債務」。
戰略性軟體 vs 實用性軟體
兩位專家以 LMAX 交易平台為例,說明了不同類型程式碼對技術債的容忍度:
業務關鍵 (Business-Critical) 程式碼
- 例如:高性能的訂單匹配引擎
- 特點:每一行程式碼都至關重要
- 處理方式:必須手工精雕細琢,確保效率和穩定性
輔助性 (Utility) 程式碼
- 例如:交易報告閘道
- 特點:負責資料轉換和傳輸
- 處理方式:可以考慮由 AI 生成
這引出了 Martin Fowler 關於「戰略性軟體 (Strategic Software)」與「實用性軟體 (Utility Software)」的劃分:
戰略性軟體:這是公司的核心競爭力所在,應由人類工程師在 AI 輔助下精心打造。
實用性軟體:扮演「黏合劑」的角色,不直接產生核心商業價值,可由 AI 生成或直接購買 SaaS 解決方案。
Steve Smith 建議,在採用 AI 生成服務時,應首先從這些「黏合劑」類型的功能開始,然後再逐步應用到更關鍵的業務領域。
AI 對開發流程的衝擊
大型提交與故障診斷的挑戰
AI 大量生成程式碼可能導致一個嚴重問題:大型、難以追溯的程式碼提交。這與持續交付中提倡的「小批量提交」原則背道而馳,將使問題診斷和回溯變得極其困難。
想像一下,當你面對一個包含數百行 AI 生成程式碼的提交時,要找出其中的問題所在會有多麼困難。這就像是在一堆雜亂的文件中尋找一張重要的發票,效率極低且容易出錯。
故障排除的複雜性
當 AI 生成的程式碼在生產環境中出現問題時,故障診斷將會變得異常複雜:
- 程式碼理解困難:由於程式碼非人類編寫,可能包含不符合團隊慣例的邏輯
- 學習成本高:工程師需要在極端壓力下快速理解這些「陌生」程式碼
- 修復風險:在嘗試修復時可能進一步惡化問題
AI 的「自信」問題
AI 在與人類協作時,有時表現得像一個「極其博學但又過於自信的初級程式設計師」。它缺乏應有的懷疑態度或主動尋求幫助的特質,這可能導致不必要的風險。就像是一個剛畢業的新人,明明不確定答案卻不敢承認,反而可能造成更大的問題。
減輕技術債的實務策略
堅持良好的工程實踐
面對 AI 帶來的挑戰,兩位專家強調了良好軟體工程實踐的重要性:
1. 小型程式碼提交
- 保持每次提交的變更範圍可控
- 便於問題追蹤和回溯
- 降低故障診斷的複雜度
2. 主幹開發 (Trunk-based Development)
- 減少分支合併的複雜性
- 提高程式碼整合的頻率
- 及早發現整合問題
3. 明確的命名標準和設計原則
- 統一的程式碼風格
- 清楚的命名規範
- 一致的架構設計
4. 大量且快速運行的自動化測試
- 在 AI 大量生成程式碼的環境中,測試尤為重要
- 這是確保程式碼行為正確的唯一可靠途徑
- 能夠及早發現 AI 生成程式碼中的問題
AI 增強而非取代
工程師應將 AI 視為結對編程的夥伴,利用其能力來「增強」自身的開發效率,而非完全「取代」人工判斷。這就像是使用計算機來幫助計算,但最終的決策和驗證仍需要人類的智慧。
未來工具的發展方向
預計將出現更多 AI 驅動的分析工具來處理技術債問題:
- 進階的程式碼分析工具:能夠自動識別程式碼品質問題
- 可觀察性工具:如 Gradle 的 Develocity 中即將推出的故障分組功能
- 機器學習輔助診斷:利用 AI 來簡化測試失敗的診斷過程
個人觀點:AI 的雙面性
就像影片中兩位專家所說的,AI 確實可以幫助我們更快速地完成任務,但最終還是需要人類的智慧來進行 review 和決策。
如果原本團隊的工程實踐就還不錯,使用 AI 會加速產品成長,而比較不會有技術債的問題。相反地,如果原本團隊一開始就沒有很好的工程實踐,那 AI 就會帶來更多的技術債。這種負面影響的成長速率可能是沒有 AI 的好幾倍。
這個觀點完美呼應了 Steve Smith 的「火箭燃料」比喻。AI 就像是一個放大器,它會將團隊現有的優缺點都放大。對於已經具備良好工程文化的團隊來說,AI 是一個強大的助手;但對於工程實踐不佳的團隊而言,AI 可能會讓問題雪上加霜。
這也提醒我們,在導入 AI 工具之前,團隊應該先檢視和改善自己的基礎工程實踐。沒有扎實的基礎,再先進的工具也無法發揮真正的價值。
實務建議與行動方案
立即可執行的策略
1. 評估團隊現狀
- 檢視現有的程式碼品質標準
- 評估測試覆蓋率和自動化程度
- 了解團隊的工程文化成熟度
2. 建立防護機制
- 制定明確的程式碼審查標準
- 建立自動化的程式碼品質檢查
- 設定 AI 生成程式碼的使用準則
3. 分階段導入 AI
- 從非核心的「黏合劑」功能開始
- 逐步擴展到更重要的業務邏輯
- 持續監控和調整使用策略
長期發展方向
1. 投資於工程文化
- 提升團隊對良好工程實踐的認知
- 建立持續學習和改進的文化
- 培養批判性思考的能力
2. 建立企業級 AI 應用框架
- 客製化 AI 訓練資料
- 建立內部程式碼品質標準
- 開發專屬的 AI 輔助工具
3. 持續監控和調整
- 追蹤技術債的變化趨勢
- 定期評估 AI 工具的效果
- 調整使用策略和防護措施
結論
AI 確實會製造大量的技術債,這是一個不可否認的現實。但這並不意味著我們應該因噎廢食,完全拒絕使用 AI 工具。關鍵在於如何智慧地應用這些工具,並建立適當的防護機制。
正如 Trisha Gee 和 Steve Smith 所總結的,AI 的導入將把團隊現有的工程文化(無論好壞)「放大十倍」。因此,現在比以往任何時候都更需要專注於提升工程品質、採取更小的交付批次,並明智地將 AI 應用於業務的不同層面。
特別是對於非核心或「膠水」性質的應用程式,AI 有其巨大的價值;但對於業務關鍵的戰略性軟體,人類的監督和精雕細琢仍然不可或缺。
最重要的是,我們需要記住:工具只是工具,真正決定成功與否的,是使用工具的人和團隊的智慧與實踐。在 AI 時代,良好的軟體工程實踐不僅沒有過時,反而變得更加重要。
支持創作
如果這篇文章對您有幫助,歡迎透過 贊助連結 支持我持續創作優質內容。您的支持是我前進的動力!
圖片來源:AI 產生