專案中的隱形殺手:技術債( Technical Debt ) – 艾菲肯專案管理小學堂
技術債( Technical Debt )
技術債( Technical Debt ) 是指我們常常為了某種目的而抄捷徑,或者替軟體帶來災難性的種種壞東西:
- 不良設計:曾經合理但如今卻不再是如此的設計。
- 不足夠的測試覆蓋率:我們知道該多做一點測試,卻一直沒有這麼做的地方。
- 缺失:軟體裡已知的問題,而我們還沒有時間排除它們。
- 過多的人工測試:當我們應該要有自動化測試時,卻還是用人工進行測試
- 不良的整合與版本管理:用極度耗時並且容易產生錯誤的方式來進行這些活動。
- 缺少平台經驗:例如,我們有一些用COBOL語言開發的大型電腦主機軟體,但我們再也沒有足夠的資深COBOL開發人員。
雜亂程式碼的代價
- 我們寫出一些雜亂的程式碼時,會使開發團隊的產能持續下降,逐漸趨近於零。
- 當產能降低,管理團隊只能做一件事,就是想辦法僱用更多的新員工,期待能夠增加產能,新員工對系統的設計概念並不熟稔,所以他們不知道什麼樣的修改才符合設計的原意,什麼樣的修改會破壞設計的原意。
- 新進的員工及團隊裡的其他人,都為了增加產能而面臨巨大的壓力,於是他們製造更多雜亂的程式碼,導致產能更進一步趨近於零。
- 最後開發團隊開始反抗,告訴老闆,無法在這樣的程式基礎上進行開發,他們只得要求重新設計。老闆雖然並不想花資源重新打造一個行之有年的系統,卻也無法否認目前糟糕的處境。
- 最後老闆只好屈服於開發者的要求。
- 這樣的開發可能歷經數年,原本待在團隊上的成員早已離開,新成員又嫌系統太糟,而要求再次重新設計系統,不斷經歷這樣的循環。
技術債的影響
- 降低可預測性:積欠大量的技術債的產品幾乎無法做任何形式的預測。
- 信用破產:公司不再信任開發團隊所說的任何事;客戶也不再信任公司所說的一切
- 產品衰退:我們停止開發或修護雖然可以繼續使用舊產品,但留下的缺失以及無法因應市場變化的趨勢,潛在客戶會愈來愈失去對產品的吸引力。
- 增加交付的時間
- 大量的缺失與錯誤
- 增加開發和技術支援的成本:高技術債的利息隨著時間迅速成長。導致變更需求或更新版本的成本越來越高。
- 績效表現不佳:預期人員的開發績效愈來愈低,因此不再期待,導致士氣低落。
- 降低客戶滿意度
償還技術債
- 為了在技術與商業之間取得平衡,我們需要結合開發人員與業務人員,討論兼顧商業和技術觀點的處理方式。
- 我們可能策略性的累積技術債達到商業上的需求,也可能因為一些無法避免的情況導致技術債的累積。但我們必須停止莽撞行事和製造雜亂所產生的技術債。
- 運用良好的技術實務、簡單設計、測試驅動開發、持續整合、自動化測試、重構。
- 在執行為客戶帶來價值的工作時,同時要償還技術債,其優點為:
- 減少技術債,不只是開發團隊成員的責任,而是專案相關人士的責任,不該延後再交由其他人處理。
- 幫助我們確認高利息的技術債會先被償還,最起碼我們還知道這些我們會接觸到的程式碼仍然是重要的,因此我們還在用它來建立新的功能。
- 重構
- 重構是用來償還債務的重要工具。
- 可降低複雜性。
- 可提高維護性與擴展性。
- 用戶願意花錢買新功能,因此我們可藉由重構解決新功能與舊系統的相容性問題。
最根本的難題
- 開發者都感受過截止期限的壓力,所以只好產生一些爛程式來達到目標。但多數情況,他們並沒有讓開發速度變得更快,只是延遲處理問題的時間,讓利息越滾越大。
- 想讓開發速度變快,最有效的方法就是隨時隨地確保程式碼的整潔。
Reference
- Robert C.Martin,《Clean Code》(無瑕的程式碼)
- Kenneth S.Rubin,《Essential Scrum-A Practical Guide to the Most Popular Agile Process》
- Robert C.Martin,《Agile Software Development:Principles, Patterns, and Practices》(敏捷軟體開發-原則、樣式及實務)
( End )