iT邦幫忙

2026 iThome 鐵人賽

DAY 19
0
IT Operation

AI 時代下,如何建立真正可持續的軟體交付能力系列 第 19

Day 19. 技術債與 AI 債:當快速產出開始侵蝕系統修改能力

  • 分享至 

  • xImage
  •  

技術債真正影響的是什麼

技術債與 AI 債如何影響決策速度

技術債(Technical Debt)表面看起來像是程式寫得不夠乾淨、架構設計留下缺口、測試沒有補齊、文件沒有更新。

這些問題一開始不一定會讓系統立刻故障,功能仍然可以上線,需求也能繼續完成。團隊容易把它視為品質問題,認為等之後有時間再整理即可。

影響開始出現時,常發生在每一次需要做決策的時候。團隊需要花更多時間確認:「這裡能不能改」、「改了會不會影響別的地方」、「有沒有人知道當初為什麼這樣設計」。當這些問題無法快速回答,決策速度就會下降。

例如產品想調整一段折扣規則,開發者打開程式後發現折扣邏輯散在多個服務、命名不一致,測試也只覆蓋少數案例。

這時候團隊討論的焦點會從「這個需求要怎麼設計」,轉向「我們敢不敢動這段程式」。需求也許很小,背後需要確認的範圍卻變得很大。

AI 加速開發後,這個問題會更加清楚。AI 可以快速補出一段看起來合理的實作,系統裡原本累積的設計限制、歷史取捨與特殊例外,仍然需要人理解。

當技術債讓團隊看不清楚系統現況,AI 的速度會把決策壓力往後推,讓後面的審查、測試與上線判斷承受更多負擔。

技術債多半來自開發者在時間壓力下做出的設計折衷,是主動且有意識的選擇。AI 債(AI Debt)則常在開發者沒有察覺的情況下產生。AI 會依據統計機率補全程式碼,可能把幻覺(Hallucination)、過時語法、上下文限制(Context Limitation)與重複程式碼一起帶進系統。

技術債與 AI 債會先拖慢團隊判斷事情的速度。原本可以由開發者直接處理的小修改,會變成需要找資深同事確認、拉架構師討論、補開會議,再追加測試時間。

這些額外確認有其必要性,因為系統缺乏清楚結構,團隊只能透過更多確認來降低風險。

修改風險如何讓團隊失去信心

技術債累積過多後,團隊會開始對修改失去信心。

這種信心流失多半來自一次又一次的小型失誤。改一個欄位,另一個報表壞掉。調整一個 API 回傳格式,下游批次作業出錯。修掉一個錯誤,兩週後又在相鄰功能出現新的副作用。

這些經驗會改變團隊對系統的感受。開發者打開某些模組時,會先預期裡面藏著未知風險。產品提出需求時,開發團隊會先保守估時。測試人員會要求拉長回歸測試。主管會要求更多簽核與上線前確認。

流程變重,部分原因是團隊已經失去對系統可安全修改的信心。

AI 生成程式也會放大這種心理負擔。當開發者看到大量 AI 產出的變更,若無法快速理解它的意圖與影響範圍,就很難放心批准。

程式看起來能跑,仍不代表團隊理解它如何和既有系統互動。對新手團隊來說,這種壓力會更高,因為他們既要理解原有技術債,也要判斷 AI 新增內容是否帶入新的債務。

修改風險提高後,團隊會出現幾種反應。有人會傾向複製既有寫法,因為舊寫法至少曾經能跑。有人會避免整理結構,因為重構看起來容易引發額外問題。有人會把新需求包在外層,用新的條件判斷繞過舊邏輯。

這些做法短期能降低修改壓力,長期會讓系統結構變得更難理解。

信心下降後,技術債會改變團隊行為。團隊開始用保守方式工作,用更多流程保護自己,也用更多局部補丁避開困難的修改。表面上每個決定都合理,整體工作卻變得笨重。

技術債如何從局部問題擴散成系統問題

技術債一開始多半出現在局部。某個模組為了趕上線,先留下重複邏輯。某支 API 為了支援特殊客戶,加入臨時判斷。某段資料轉換缺少測試,只有熟悉的人知道限制。這些問題單獨看起來都不大,也都能找到合理原因。

擴散會發生在後續變更開始依賴這些局部問題時。新的功能沿用舊的重複邏輯,新的報表依賴臨時欄位,新的服務呼叫含糊的 API 契約。

當後面的設計建立在不穩定的基礎上,原本局部的債務就會變成更多功能的共同依賴。這時候要處理它,已經牽涉整串關聯。

當局部債務進入系統層級,影響會從程式碼擴散到測試、文件、部署與協作。

測試需要覆蓋更多例外情境,文件需要解釋更多特殊規則,部署時需要注意更多相依條件,跨團隊溝通也需要補充更多背景。系統修改能力被侵蝕,就是從這些小地方開始展開。

技術債真正影響的是團隊對系統的掌控能力。程式碼可以繼續增加,功能也可以繼續交付,每次修改都要多查幾段歷史、多問幾個人、多跑幾輪驗證。

到了這個階段,AI 帶來的產出速度不一定能轉成真正交付速度,因為團隊仍然需要為過去留下的債務付出判斷、驗證與修正成本。

AI 如何讓技術債累積得更快

重複模式會快速擴散

AI 生成程式時,會依照它看到的既有程式風格延伸。這個特性在乾淨的系統裡很有幫助,因為它可以快速產出接近團隊慣例的程式碼。可是在已經累積技術債的系統裡,AI 也會把原本有問題的寫法一起放大。

例如系統裡已經存在多段重複的權限判斷,AI 在新增功能時,容易再複製一段類似邏輯。它不太會主動判斷這段邏輯是否應該被抽出來,也不容易知道這些重複程式背後是否來自過去趕工留下的折衷。結果新功能看起來完成得很快,系統裡卻又多了一個需要同步修改的地方。

重複模式擴散後,修改成本會跟著提高。原本改一個規則只需要處理一個位置,後來要同時確認三個、五個,甚至更多地方。只要其中一處漏改,系統行為就會開始不一致。

這種問題在測試不足時很難早期發現,常要等到使用者回報或正式環境出現異常,團隊才知道某個分支邏輯沒有一起更新。

AI 帶來的速度,會讓這種擴散更難察覺。人工寫程式時,重複貼上幾次後,開發者還有機會感覺到怪異。AI 一次產出完整變更時,重複內容常被包在大量程式碼裡,審查時不容易一眼看見。

若團隊只確認功能能不能跑,沒有檢查結構是否變差,技術債就會在每次快速產出中被帶進下一輪工作。

命名與結構可能不一致

命名和結構看起來像小事,卻會直接影響團隊理解系統的速度。

好的命名能讓人看懂一段程式想表達什麼,穩定的結構能讓人知道某類邏輯應該放在哪裡。當命名混亂、分層模糊、資料流向不清楚,開發者就需要花更多時間從程式細節回推設計意圖。

AI 生成內容時,會根據局部上下文決定命名與放置位置。它看見某個檔案裡有 handler,就跟著產生新的 handler。看見某個服務裡有 manager,就延伸出新的 manager。這些名稱單獨看都合理,放進整個系統後,可能會和團隊原本的語意規則不一致。

例如同樣是訂單狀態,有些地方叫 status,有些地方叫 state,有些地方又叫 orderPhase。每個名稱都能描述某種狀態,團隊在閱讀時卻會開始懷疑它們是否代表不同概念。這種懷疑會讓理解成本上升,也會讓修改前的確認時間變長。

結構不一致也會帶來類似問題。某些驗證邏輯放在控制器(Controller),某些放在服務層(Service),某些又散在資料存取邏輯裡。

AI 若沒有清楚的架構規則,容易依照最近看到的範例補上程式。功能可以完成,系統邊界也會因此變得更模糊。

這類技術債的麻煩在於,它不一定會造成測試失敗。程式可以正常執行,需求也能通過驗收。下一位開發者接手時,需要先判斷名稱差異是否代表不同概念,也要確認相同規則為什麼散在不同層。

當這種不一致被 AI 快速複製,閱讀程式就會變成一段段語意考古。

未驗證設計會被快速採用

AI 很適合協助產生候選方案,例如 API 設計、資料模型、錯誤處理方式與服務切分方式。

問題在於,AI 產出的設計常看起來很完整,容易讓團隊低估驗證的重要性。當一個設計還沒有經過需求、架構、資料、效能與維運角度檢查,就直接進入實作,後續技術債也會跟著形成。

未驗證設計的風險,不一定會在第一個功能立刻爆發。它常在第二個、第三個需求出現時才變得清楚。

例如一開始設計的資料模型只支援單一付款方式,後來產品要加入部分付款、退款、折抵與跨幣別情境,團隊才發現原本欄位無法表達真實業務。這時候系統已經有資料、有 API,也有前端依賴,修改範圍就會變大。

AI 讓這件事發生得更快,因為它能迅速把一個尚未被檢查的想法變成大量程式碼。當程式碼已經出現,團隊心理上會傾向沿用現有成果。

即使有人覺得設計不夠穩,面對已經完成的實作,也常會選擇先補條件、加例外、包一層轉換。這些補法短期能保住進度,長期會讓系統的概念模型變得更難整理。

設計需要被驗證,特別是在高風險區域。牽涉金流、權限、資料一致性、跨系統契約與法遵規則的功能,都需要先確認假設是否站得住腳。

AI 可以協助整理選項、列出風險、產生原型,採用哪個設計仍需要團隊根據系統現況做判斷。

當未驗證設計被快速採用,技術債會進入資料結構、流程規則與服務邊界。後續每個新功能都要配合早期錯誤假設,像是在不適合的資料模型上繼續補欄位,在模糊的服務邊界上繼續加例外條件。

上下文限制會造成局部最佳化

上下文限制債(Context Limitation Debt)來自 AI 對系統脈絡掌握不足。即使現在許多 AI 工具可以讀取整個儲存庫(Repository),實際處理任務時,AI 仍會受到當下上下文影響。

被選進上下文的檔案、測試、錯誤訊息與提示詞(Prompt),會決定它如何理解這次修改。若輸入脈絡只涵蓋單一檔案或局部流程,AI 就容易做出部分最佳化。

部分最佳化的麻煩,是局部看起來變乾淨,放回整個系統後卻破壞架構一致性。

例如 AI 把某個服務中的判斷抽成新的工具類別,看起來減少了重複,實際上卻繞過原本的領域服務邊界。它也可能把資料轉換寫進呼叫端,讓單一功能很快完成,後續流程卻開始重複處理同一組規則。

這類債務很難在單次測試中暴露。風險會在後續功能延伸時浮出來。更麻煩的是,這些架構偏移一開始常被包裝成「順手整理」,等到團隊發現問題時,系統邊界已經被推歪。

要降低上下文限制債,團隊需要讓 AI 在修改前先讀取架構決策紀錄(Architecture Decision Record, ADR)、模組邊界說明、關鍵測試與相關呼叫端。

提示詞也要明確要求 AI 先說明變更影響範圍,再提出修改方案。這樣做無法完全避免局部誤判,至少能讓團隊提早看見 AI 的設計假設。

幻覺與過時依賴債會增加維護成本

幻覺與過時依賴債(Hallucinated / Deprecated Dependency Debt)指的是 AI 生成程式時,引用不存在、已廢棄,或不適合目前系統的 API、套件與使用方式。

這類問題有些會被編譯器直接抓出來,有些會用更隱性的方式進入系統,例如引入不必要的第三方套件,或採用已不建議使用的函式。

AI 會產生這類問題,常見原因是它從訓練資料中的舊範例補出寫法。某個框架的 API 已經改版,某個套件已經停止維護,某種安全設定已經被新版文件建議替換,AI 仍可能產生舊版本的用法。團隊若只看到程式能跑,就可能把過時依賴帶進正式系統。

第三方套件的引入也要特別小心。AI 有時會為了簡化某段實作,加入新的函式庫(Library)。這個套件可能只解決很小的問題,卻讓系統多出授權檢查、安全漏洞掃描、版本升級與相依衝突成本。對長期維護來說,每一個外部依賴都需要有人負責追蹤。

控制這類債務,需要把檢查放進開發流程。團隊可以要求 AI 產出時說明新增依賴的理由、替代方案與維護風險。拉取請求(Pull Request, PR)中若出現新套件,應檢查授權、維護狀態、下載來源、安全掃描結果,以及專案內是否已有內建能力可替代。框架 API 的使用也要以目前專案版本與官方文件為準,避免讓舊範例變成新債務。

提示詞依賴會形成隱性知識

提示詞依賴與隱性知識(Prompt Lock-in / Implicit Context)是 AI 時代容易被忽略的債務。

某段程式能夠運作,可能是因為當初提示詞裡寫了許多限制,例如特定業務規則、資料格式、例外條件、歷史相容需求與不可修改範圍。

程式碼合併後,提示詞卻留在個人對話紀錄裡,其他人只看得到最後的程式結果。

這會讓後續重構變得困難。工程師看到一段條件判斷時,可能不知道它是業務規則、歷史包袱、臨時解法,還是 AI 自行補出的推論。

當初生成這段邏輯的提示詞若沒有被記錄,團隊就很難還原設計意圖。重構時刪掉一個看似多餘的條件分支,可能剛好破壞某個沒有寫進文件的例外情境。

提示詞依賴債也會讓知識集中到個人身上。提交者知道自己和 AI 討論過什麼,審查者只看到程式差異。當提交者離開團隊,或幾個月後大家忘了當初的對話內容,這段程式就會變成新的黑盒。系統表面上留下了程式碼,生成脈絡卻消失了。

團隊不需要保存所有一次性對話,留下重要的提示詞即可。

凡是會影響需求規則、架構限制、測試案例、資料模型或正式程式碼的提示詞,都適合整理到拉取請求說明、工單、架構決策紀錄或團隊提示詞模板中。

後續工程師重構時,才有機會知道當初為什麼這樣生成,也能判斷哪些條件仍需要保留。

為什麼修改速度超過理解速度會造成失控

團隊來不及理解生成內容

AI 讓修改速度提高。開發者可以在短時間內產生一個新 API、一組測試、一段資料轉換邏輯,甚至是一整個功能流程。

這種速度在任務清楚、系統邊界穩定、驗證機制完整時很有幫助。當團隊產出速度已經提高,理解這些產出的速度卻沒有跟上,後面的審查與維護就會開始吃力。

理解一段程式,需要知道它解決什麼問題、依賴哪些資料、會影響哪些流程、錯誤時會怎麼處理,也要知道它和原本架構方向是否一致。

AI 生成的內容越多,團隊需要閱讀、確認與驗證的內容也越多。當審查只剩下看過,測試只剩下跑過,團隊就容易把沒有真正理解的程式放進系統。

這種情況常發生在大量小改動裡。每一個變更單獨看都不大,合在一起卻會改變系統行為。

新的條件判斷、新的資料欄位、新的例外處理、新的工具函式,會一點一點改變原本流程。若團隊沒有時間整理這些變更背後的意圖,系統就會多出很多「看得懂語法,說不清原因」的程式碼。

理解速度跟不上時,接手成本會上升。今天的開發者知道自己為什麼這樣改,兩週後換另一個人處理相鄰需求時,就需要重新推理。

若當初的提示詞、設計取捨與驗證結果都沒有留下來,後續開發者只能從最後的程式碼反推思路。反推越多,誤判機率越高,修改也會變得更慢。

AI 帶來的風險,包含錯誤答案和生成速度讓團隊跳過理解。當團隊習慣先接受產出,再把理解留到未來,技術債就會轉成知識債。

錯誤假設會成為後續基礎

每一段程式背後都有假設。資料一定存在、欄位一定不會為空、使用者一定有某種權限、某個外部服務一定會回傳固定格式,這些都是假設。

有些假設寫在規格裡,有些藏在程式裡,有些只存在開發者腦中。

AI 在生成程式時,也會建立假設。當需求沒有講清楚,AI 會根據常見模式補完細節。它可能假設錯誤處理可以直接回傳內部伺服器錯誤的狀態碼,可能假設金額都用整數,可能假設時間都用系統時區,也可能假設某個狀態只有成功與失敗兩種。這些假設如果沒有被團隊檢查,就會被包進程式碼裡。

更麻煩的是,錯誤假設一旦進入系統,後續功能容易把它當成既有事實。

下一次 AI 看到這段程式時,也會沿用同樣的資料結構、命名方式與流程判斷。下一位開發者看到既有寫法,也可能以為這是團隊刻意選擇的設計。於是錯誤假設會從一次生成結果,變成後續功能的基礎。

錯誤假設造成的債務,常比程式重複更難處理。重複程式可以透過重構整理,錯誤假設需要重新確認業務規則、資料模型與系統邊界。當錯誤假設被更多功能依賴,修正工作就會延伸到需求釐清、資料轉換與跨團隊協調。

維護責任仍會回到團隊身上

AI 可以協助產出程式,維護責任最後仍會回到團隊。

正式環境出問題時,使用者不會找 AI 說明原因。資料異常時,客服、維運、產品與主管會找團隊確認影響範圍。安全漏洞、效能問題、法規爭議、權限錯誤,也都需要團隊承擔判斷與修正工作。

這表示團隊不能只看 AI 幫忙完成了多少工作,還要看自己是否有能力接住這些工作。

接住的意思,是團隊能讀懂產出、能說明設計、能驗證行為、能追查問題,也能在未來需求改變時安全修改。若這些能力沒有建立,AI 產出越多,團隊未來要承擔的維護壓力就越高。

用 AI 先讓功能快速完成,後面再視情況整理,累積的理解缺口會漸漸變成沉重負擔。系統不會因為程式由 AI 產生,就降低除錯、測試、上線與維護要求。

維護責任回到團隊時,最直接的壓力會落在審查和測試上。開發者要確認 AI 產出是否符合架構規則,測試人員要找出需求與實作的落差,維運要知道系統出事時該看哪裡。若前面生成時沒有留下足夠脈絡,後面每個角色都要花更多力氣補理解。

修改速度超過理解速度時,失控會先出現在幾個小徵兆裡。團隊講不清楚某段程式為什麼存在,測試只覆蓋表面成功路徑,文件追不上實作,審查變成形式檢查,上線後問題需要靠少數人猜測。

這些徵兆都在提醒團隊:產出已經超過目前能安全吸收的範圍。

控制 AI 債時,團隊需要保留說明、檢查與整理的時間。少了這些時間,快速產出會把未理解的假設、結構與風險一起送進系統。

如何控制技術債與 AI 債

把品質改善拆成可追蹤任務

控制技術債的第一步,是讓債務從模糊感受變成可追蹤工作。團隊常會說某段程式很亂、這個模組很難改、測試不夠完整。這些說法只停留在口頭描述時,問題很難進入排程,也很難和新功能一起被討論。

團隊應把品質問題拆成具體任務,例如補上付款流程的失敗情境測試、整理訂單狀態命名、移除重複的權限判斷、把散落在各地裡的驗證邏輯搬回服務層。這些任務需要有明確範圍,也需要能被驗收。只要能被追蹤,團隊就有機會在日常開發中安排處理。

AI 債也需要用同樣方式管理。若某次 AI 生成內容留下不一致命名、過度抽象、缺少錯誤處理,或測試只覆蓋成功路徑,團隊可以在審查時直接記錄成後續改善項目。

這樣做的重點,是避免把「之後再整理」變成沒有期限的承諾。

品質改善不需要獨立成大型重構專案。大型重構常卡在排程裡,也會和新功能搶資源。團隊可以把改善拆進每次需求開發,在相鄰範圍內處理小型債務。改到某段邏輯時補上一組測試,新增功能時統一相關命名,調整流程時更新舊註解。這些工作規模不大,卻能讓下次修改少踩一個坑。

先用行為驅動開發與測試定義生成邊界

在讓 AI 產生功能代碼之前,團隊可以先用行為驅動開發(Behavior-Driven Development, BDD)把規格說清楚。

這裡的重點,是先確認系統應該表現出什麼行為,再讓 AI 依照這些行為產生程式。若需求還停留在一句功能描述,AI 就會用常見模式補完細節,錯誤假設也比較容易進入系統。

行為驅動開發可以把需求轉成具體範例,說明在什麼條件下,使用者或系統觸發什麼行為,最後應該得到什麼結果。

這些範例可以轉成單元測試與整合測試,成為 AI 產出的驗證基準。AI 寫出來的程式必須通過這些測試,才有資格進入後續審查。

這種做法能降低「團隊來不及理解生成內容」的風險。團隊先把規格與測試放在前面,審查時就不用收到一大包程式碼後,再從裡面反推 AI 做了什麼。

審查者看到 AI 產出時,可以回到測試與範例確認它是否符合原本行為。

它也能降低「錯誤假設成為後續基礎」的風險。若 AI 自行新增沒有寫在規格裡的流程、狀態或例外規則,測試與審查就能較容易擋下來。對牽涉金流、權限、資料一致性與跨系統契約的功能,這個順序特別重要。

先定義規格與測試,再生成程式,能讓 AI 的速度受到清楚邊界約束。

用規則即程式碼提供 AI 上下文

規則即程式碼(Architecture Rules as Code / Context Files)是把團隊規範放進 AI 能讀取的位置。

這些規範可以寫在 AGENTS.mdCLAUDE.md,或其他專案層級的上下文規則檔案(Context Files)中,讓 AI 在生成前就知道架構邊界、命名規則、資料流向與測試要求。

這類檔案可以包含幾種資訊。第一是架構規則,例如控制器只能處理請求轉換,業務規則要放在服務層,資料存取要經過 Repository。第二是命名規範,例如訂單狀態統一使用 OrderStatus,不要混用 statephase 或其他近似名稱。第三是測試要求,例如新增業務規則時,要補上成功情境、失敗情境與邊界條件。

把這些規則交給 AI,可以從源頭降低不良程式碼出現的機率。AI 仍可能誤判,可是它至少有一份明確的團隊規範可以參考。若每次都只靠開發者在提示詞中臨時補充規則,品質會跟個人經驗高度綁定,也容易因為遺漏上下文而產生結構偏移。

這些規則也需要定期整理。當團隊發現 AI 常把驗證邏輯放錯位置、常產生不一致命名、常忽略某種錯誤情境,就可以把對應規則補進上下文規則檔案。

這樣審查發現的問題就能回到生成入口,讓下一次 AI 產出有較好的起點。

建立 AI 產出審查清單

AI 產出需要審查,不過審查不能只看語法和功能結果。AI 生成的程式常看起來完整,格式也很整齊,這會讓審查者放鬆警覺。

團隊需要一份簡單的審查清單,幫助大家固定檢查容易被忽略的地方。

這份清單不需要很長,初期可以先聚焦幾個高風險面向:需求是否被正確理解、是否引入新的重複邏輯、命名是否符合團隊慣例、錯誤處理是否完整、測試是否覆蓋關鍵情境,以及是否違反既有架構邊界。

只要這些問題能在拉取請求中被逐一確認,就能降低 AI 債進入主幹的機率。

審查清單也能降低個人判斷差異。資深開發者能憑經驗看出風險,新手開發者則需要明確提示。當團隊把常見風險寫成清單,審查就能減少對少數人直覺的依賴。

這份清單還可以回饋到提示詞裡。若團隊常發現 AI 生成的錯誤處理不足,就在生成指令中要求列出錯誤情境。若常發現命名不一致,就把命名規則放進提示詞模板或專案設定檔(如 AGENTS.md 或 CLAUDE.md)。審查發現的問題若能回到生成流程,AI 產出品質才有機會改善。

團隊可以先用一份簡短清單放在拉取請求模板中,讓提交者在送出審查前先自我檢查,審查者也能用相同基準確認風險。清單的內容不需要一次涵蓋所有品質要求,先抓住最容易形成 AI 債務的幾個面向即可。

- [ ] 這次變更解決的需求或問題已經在 PR 說明中寫清楚。  
- [ ] AI 生成內容沒有自行新增需求外的流程、欄位、狀態或例外規則。  
- [ ] 主要命名符合團隊慣例,沒有同一個業務概念使用多種名稱。
- [ ] 新增邏輯沒有複製既有重複程式,必要時已改用共用方法或明確留下後續整理任務。
- [ ] 業務規則放在合適的模組或服務中,沒有把驗證、資料存取與流程控制混在同一層。
- [ ] 錯誤處理涵蓋關鍵失敗情境,例如資料不存在、權限不足、外部服務失敗與輸入格式錯誤。
- [ ] 測試涵蓋主要成功情境、重要失敗情境與至少一個邊界條件。
- [ ] 變更沒有違反既有架構決策紀錄或團隊規範。
- [ ] 若 AI 產出牽涉金流、權限、個資、資料一致性或跨系統契約,已標示需要額外審查。
- [ ] 生成後曾重新閱讀並整理程式,沒有直接把原始生成結果送進主幹。

將 AI 靜態審查放進 CI/CD

自動化 AI 靜態審查(Automated AI Code Review)可以放在持續整合/持續交付(Continuous Integration / Continuous Delivery, CI/CD)流程中,作為人工審查之前的第一層檢查。

它的角色是先抓出常見、重複、低判斷價值的問題,讓人類審查者把注意力放在需求意圖、架構取捨與高風險邏輯。

這個流程可以結合程式碼檢查工具(Linter)、靜態分析、測試覆蓋率檢查與程式碼審查機器人(Code Review Bots)。

傳統工具可以檢查格式、型別、安全漏洞、未使用變數與基本複雜度。AI 程式碼審查機器人則可以補上較語意化的檢查,例如某段程式是否過度複雜化、是否缺少邊界條件、是否在不合適的層次處理業務規則、是否引入與專案慣例不一致的命名,幫助找出可能是技術債的壞味道。

這類機制需要控制噪音。若機器人留下太多泛泛而談的意見,團隊很快就會忽略它。先挑選少數高價值檢查項目,讓每一則意見都能對應具體風險與修正建議才會是比較好的作法。

當自動化審查能穩定抓出問題,人工審查的負擔就會下降,AI 債務也比較不容易混進主幹。

把重構放在生成之後

AI 很適合快速產生初稿,而初稿需要經過整理。這個觀念對控制 AI 債很重要。團隊如果把生成結果直接視為完成品,容易把冗餘邏輯、不穩定命名、過度設計與未確認假設一起送進系統。

生成之後的重構,可以先從可讀性開始。開發者需要確認方法名稱是否能表達意圖、條件判斷是否清楚、重複邏輯是否可以收斂、資料轉換是否放在適合的位置。這些整理未必會改變功能行為,卻會影響後續接手速度。

接著要檢查結構。AI 會為了完成眼前需求,把邏輯放在最容易修改的位置。這種做法短時間內有效。當驗證規則、業務流程、資料存取與外部呼叫混在一起,後續修改就會變得困難。生成後的重構,就是把這些內容放回清楚的邊界中。

重構需要測試保護。缺少測試時,團隊很難確認整理後的行為是否維持一致。

對 AI 生成內容來說,較好的順序是先確認需求行為,再補上必要測試,接著整理結構,最後重新跑測試與審查。這樣做可以避免把初稿的粗糙邊角直接留在主幹裡。

保留人工架構判斷

AI 可以提供方案,也可以協助比較設計選項,可是架構判斷仍需要由人負責。

架構牽涉的內容會超過單一程式片段,包含團隊能力、系統歷史、資料限制、部署方式、維運成本與未來變更方向。這些因素不一定完整寫在程式碼裡,AI 很難只靠局部上下文做出穩定判斷。

人工架構判斷的價值,在於團隊能把當下修改放進更大的系統脈絡裡。

新增一個服務是否合理,需要一起看既有邊界、資料流向與部署責任。調整資料模型是否可行,也要看後續資料遷移、測試與報表使用方式。

團隊需要確認這個設計未來是否會造成更多相依、是否會讓資料遷移更困難、是否會讓測試與部署成本上升。

對高風險區域,人工判斷要更早介入。金流、權限、個資、跨系統契約、資料一致性、核心業務規則,都不適合只靠 AI 生成後再補救。這些地方需要先把規格、限制與風險講清楚,再讓 AI 協助產生候選實作。

人先定邊界,AI 再加速局部工作,才能控制住整體風險。

控制技術債與 AI 債,需要把理解、驗證與整理留在工作流程裡。速度可以提高,品質責任不會因此消失。

當團隊能把債務拆成任務、用清單審查 AI 產出、在生成後安排重構,並保留重要架構判斷,AI 產出才不會變成下一輪修改的負擔。

重點摘要

  • 技術債會影響程式品質,也會拖慢團隊判斷系統能不能被安全修改的速度。
  • AI 債常在開發者沒有察覺時形成,包含幻覺、過時依賴、上下文限制、重複模式與提示詞脈絡遺失。
  • 當 AI 把既有問題快速複製到更多地方,命名、結構、資料模型與服務邊界都可能變得更難理解。
  • 修改速度超過理解速度時,團隊會開始接受看得懂語法,卻說不清設計原因的程式碼。
  • 錯誤假設一旦進入系統,後續功能容易把它當成既有事實,修正時就會牽涉需求、資料與跨團隊協調。
  • 控制 AI 債需要先用規格與測試定義生成邊界,再讓 AI 協助產生實作。
  • 架構決策紀錄與上下文規則檔案,可以讓 AI 在生成前知道團隊的架構邊界與命名規範。
  • AI 產出需要經過審查清單、自動化檢查、測試保護與生成後重構,不能直接把初稿當成完成品。
  • 高風險區域仍需要人工架構判斷,特別是金流、權限、個資、資料一致性與跨系統契約。
  • AI 能加快產出,團隊仍要保留理解、驗證與整理的時間,才不會讓快速生成消耗系統的修改能力。

上一篇
Day 18. 為什麼系統會越改越慢:耦合與理解成本的連鎖反應
系列文
AI 時代下,如何建立真正可持續的軟體交付能力19
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言