技術債是什麼:白話解釋、業務影響與重構預算

技術債是什麼:白話解釋、業務影響與重構預算|NETVANA 軟體開發知識文章封面

「這個按鈕改一下顏色,為什麼要三天?」

如果你問過類似的問題,而得到的答案聽起來像在推託,那問題很可能不在對方偷懶,而在一個平常看不見、但一直在收利息的東西——技術債。

用白話說,技術債是什麼

技術債(Technical Debt)指的是:為了快點把東西做出來,在程式結構上採用了比較省事、但長期不理想的做法,這些做法會讓「以後每一次修改」都變得更費力。

最貼近的比喻是房子裝潢。為了趕在開幕前完工,水電管線沒有照規劃走、直接從最近的地方拉過去。當下能用,但日後任何一次小修都要先拆牆找線。你沒有立刻付出代價,卻在往後每一次維修時分期償還。

重點在於:技術債本身不是罪。為了趕上市而刻意簡化,是合理的商業決定;真正危險的是借了卻不記帳——沒有人知道欠在哪裡、欠了多少,直到某天發現每個小需求的報價都莫名變高。


技術債從哪裡來

一、趕工下的臨時解 最常見的一種。時程壓縮時,先用複製貼上、先寫死參數、先跳過整理。這些決定當下正確,但如果沒有回頭處理,就會留在系統裡。

二、缺乏自動化測試 沒有測試的系統,每次改動都像在黑暗中移動。工程師不敢動既有程式,只好在旁邊另外寫一份類似的邏輯,於是同一件事在系統裡有好幾個版本,改的時候要全部找出來。這是修改成本快速上升的主要原因之一。

三、需求持續變動、結構卻沒跟著調整 系統原本只為一種情境設計,後來陸續加上例外、加上新角色、加上特殊規則。每次都用條件判斷「補」上去,久了就變成沒有人能完整說明的邏輯迷宮。這也是專案時程越做越不準的常見原因。

四、過時的依賴與環境 系統用到的框架、套件、程式語言版本會持續更新,舊版本終究會停止安全性支援。放著不升級,等到必須升級時(例如爆出安全性問題、或第三方服務停止支援舊版),跨越多個版本的升級難度會遠高於一路小步跟上。

五、沒有文件與知識集中在少數人身上 這不是程式碼問題,卻是最貴的一種債。只有一個人知道某段邏輯為什麼這樣寫,一旦這個人離開或換廠商,接手者只能從頭摸索。


對業務造成什麼影響

技術債的困擾在於它不會直接出現在財報上,而是變形成其他症狀:

你觀察到的現象底下可能的原因
小需求的報價與時程變高改動牽連範圍大,或必須大量人工回歸測試
每次改完就冒出別的問題缺乏測試,改動的副作用沒被攔住
系統在尖峰時段變慢或出錯早期為求快而採用的結構撐不住現在的量
要串接新工具時處處卡關資料與邏輯糾纏,無法乾淨地開放介接
廠商說某功能做不到實際上是成本高到不合理,而非真的不可能
資安或個資風險上升過時依賴未更新、權限邏輯散落各處

其中最值得警惕的是最後一項。功能面的債可以慢慢還,但與資安、個資相關的部分屬於例外,應該優先處理,基本要求可看企業網站資安基本功。


什麼時候該還、還多少

不需要把技術債還清,那既不可能也不划算。合理的目標是「控制在不影響業務的程度」。判斷優先順序,可以用兩個問題交叉來看:

問題一:這塊程式還會不會常改? 常改的地方,債的利息最高,最值得處理。很少動的舊模組,即使寫得不好,放著的成本也有限。

問題二:出問題的後果有多嚴重? 牽涉金流、帳務、個資、權限的部分,即使不常改,也應該優先確認。

把兩個問題組合起來,就得到一份務實的順序:常改又高風險的先處理,少改又低風險的維持現狀。

有幾個時機特別適合處理技術債:準備做重大新功能之前(否則新功能會蓋在歪掉的地基上)、準備接軌新的外部系統之前、流量或資料量即將明顯成長之前,以及更換維護廠商的交接期。至於系統已經老舊到必須決定「修、換,還是重寫」的情況,判斷方式可看舊系統現代化指南。


怎麼跟廠商談重構預算

重構(Refactoring,指在不改變外部功能的前提下整理內部結構)最難談的地方在於:做完之後,使用者看不出任何差別。所以談的方式不能是「請給我一筆錢整理程式」,而要連到業務結果。

把債攤開、列成清單。請開發團隊列出目前已知的技術債,每一項標明位置、成因、不處理的後果、以及預估工作量。這份清單本身就是最好的溝通工具——看不見的東西沒辦法被決策。

用影響說明,而不是用技術名詞說明。有效的說法是:因為某個模組結構糾纏,每次改動都要連帶調整多處、也容易改壞,所以同類需求的時程一直拉長;整理之後,這類需求的處理會回到合理範圍。

優先分階段,而不是整套重寫。整套重寫的風險極高:期間無法交付新功能、舊系統的隱藏規則容易漏掉。比較安全的是分批處理,每一批都能獨立驗收。

在日常開發中預留固定比例的整理時間。與其累積到某天要求一筆大預算,不如在每個開發週期中固定撥出一部分工時處理債務。這需要雙方在合作開始時就講好,也應該反映在維護合約裡,型態可參考網站維護費用包含什麼。

新專案就開始記帳。從第一版起就要求交付原始碼與文件、要求對刻意簡化的地方留下紀錄。做第一版時該保留什麼、可以先簡化什麼,可看MVP 最小可行產品開發指南。


換個角度:怎麼避免欠太多

  • 需求變動時同步評估結構影響,而不是只加一個條件判斷
  • 把測試列入驗收標準,而不是當成可有可無的加值項
  • 定期檢視依賴套件與環境版本,小步跟上而不是拖到被迫升級
  • 要求文件與交接資料,避免知識集中在單一個人身上
  • 每次結案都確認原始碼與文件完整移交(NETVANA 的作法是專案費用結清後完整移交原始碼、設計檔與文件)

沒有技術背景,怎麼判斷債的嚴重程度

你不需要看懂程式,也能從幾個外部訊號大致判斷狀況:

問「改這個要動到哪些地方」。如果每個小需求的答案都是「要連帶調整很多處」,代表結構耦合度偏高。

問「改完怎麼確認沒有弄壞別的東西」。如果答案是「靠人工一頁一頁點過」,代表缺乏自動化測試,而這會讓修改成本隨系統長大而持續上升。

問「上次更新套件與環境版本是什麼時候」。如果答案是「從上線到現在沒動過」,那安全性與相容性風險都在累積。

看缺陷的重複率。同一類問題反覆出現,通常代表根因沒有被處理,只是每次都在症狀上貼藥布。

看交接難度。如果只有特定一個人能處理某個部分,這本身就是高風險的債。

這幾個問題的共同點是:都問「結果」而不是問「技術」,所以非工程背景的決策者也問得出來、也聽得懂答案。


一份可以直接用的盤點表

要開始處理技術債,先讓它變成看得見的清單。請開發團隊針對每一項填寫以下欄位:

欄位說明
位置是哪個功能或模組
成因當初為什麼這樣做(趕時程、需求改了、外部限制)
目前影響造成什麼具體困擾(改動慢、容易出錯、無法擴充)
不處理的後果放著會怎樣、多久後會變嚴重
改善方式可以怎麼做、能不能分批
預估工作量大概需要多少工
風險等級是否牽涉金流、個資、權限

有了這份表,決策就從「要不要花錢整理程式」變成「這幾項裡,哪些現在處理最划算」。這是完全不同的對話。


技術債不是道德問題,是財務問題:你隨時可以選擇借,但要知道自己借了多少、利息多高、什麼時候該還一部分。

如果你正在懷疑系統的修改成本為什麼越來越高,NETVANA 的軟體顧問服務包含架構審查與技術盡職調查,可以協助盤點現況並排出優先順序,服務內容見軟體服務介紹,或直接與我們聊聊目前的狀況。

延伸閱讀:舊系統該修還是該換,看舊系統現代化指南;想知道專案為什麼越做越慢,看軟體專案為什麼總是延誤;把品質寫進驗收,看軟體驗收怎麼做;發包之前,先問廠商怎麼處理既有技術債,可以看如何挑選軟體開發公司;沒有內部技術主管時,誰來判斷該還多少債,可以看兼任技術長服務指南;沒有測試保護的系統,改一行都可能踩雷,可以看自動化測試白話解釋與驗收;重構預算要放進版本規劃才排得進去,可以看產品上線之後怎麼走。

軟體開發

覺得有幫助?分享給更多人