常見的技術債務
Technical debt in Scrum projects
Wednesday, July 8, 2009
http://scrumftw.blogspot.com/2009/07/technical-debt-in-scrum-projects.html
程式碼隨著時間演進, 越舊的系統, 越難維護, 這是為什麼呢?
可能是系統不斷的修改, 新增功能, 移掉舊功能, 或修改原先功能. 人進進出出. 導致系統越來越難維護. 以下是作者整理出來的原因, 以及它所帶來的影響
1. 重新發明輪子
一個系統中常有相同功能的模組或函式, 在不同時間, 被不同所實作, 彼此之間可能只有微小差異. 或者相同的solution, 在系統不同地方, 以不同方法, 被設計.
這導致系統很難被維護, 因為開發人員不知道這些功能是來自哪個版本或是被哪個人設計的
這是一個惡性循環, 並且越複雜的系統越難了解, 越有這種現象. 你會不知道你所謂的解答, 是否已經出現在系統別的地方.
Maintainability事再你一開始撰寫程式碼的時候就要考慮的問題, 並且一但開始這件事就沒有停止的時候.
2. 害怕去修改已經可以work的legacy code
系統中常有些關鍵和重要的模組, 已經運作了很長久一段時間. 這意味著他已經經過很多次修改, patched; 以及這段程式也意味著很複雜, 很難懂. 沒有開發人員敢去動他. 導致它只能以現在的功能來運作.
在作者來看, 這主要原因是因為這模組缺乏regression testing的能力. 如果有持續和包含整體功能的regression testing, 你就可以知道這功能在修改後, 是否仍然運作正確.
3. 缺乏(有效的)回歸測試的能力
回歸測試是指在你修改程式後, 用來驗證你系統原先功能是否仍然運作正確. 它可能涵蓋所有功能, 或者至少比較重要或明顯的部份. 因為你經常修改, 所以regression testing需要被執行很多次. 如果你的regression testing是手動執行, 那會造成你的regression testing 沒有效率或是不存在.
所以你要做的是去自動化你的測試, 並且讓他持續執行. 這裡你會面對兩個挑戰:
A. 找到一個切實可行的辦法-a tool
B. 找出哪裡開始。
A 你要自己尋找. 至於B, 作者建議從某些部份開始, 而不是全部的系統開始. 只需要選擇一個簡單的出發點, 例如最近的和新增加的功能/模組/sub-component等等.忘掉舊的東西, 現在只需要從新的東西開始. 這樣會聊勝於無.
4. 人們加入和離開
人們進進出出是一件無可避免的事情. 人們離開會造成知識的的流失, 人的加入也會有新的火花的產生(當然也包括對現有東西的誤解). "Feature team"可以幫助減緩這個現象, 因為knowledge可以保持在一些人身上, 若有人加入時也可以一起教導.
文件是一般最典型拿來保存knowledge的方式. 但是作者認為它其實很沒有效率, 並且會花很多資源去維持up-to-date. 一但文件不正確, 人們都會失去對它們的信心, 之後就會造成沒人要看這份文件.
所以作者建議是不是不要文件, 而是只要足夠的文件. 其它的可以用code comments來弭補. 基本上, code comments應該對大部分的狀況來說應該是足夠的, 而且更新及正確程度會比文件還好, 所花的維護effort也不會太大.
5. 抄短路 - 用便利解所造成的影響是長遠的可是大家卻遺忘的很快
我想你一定常聽到: "好的我們現在先用這個workaround的方法(快速解), 之後我們再修改它(正解)....".
快速解通常可以立即收效, 並且很容易讓你滿足deadline. 但是之後卻從不或很少去採用正解, 因為你總是有下一個deadline要去滿足. 最可悲的這通常還是有意識下的決定, 你內心很早就決定不要去處理它.
6. Bug Fixes
在軟體發行後客戶遇到問題時, 你會交付一些patch, hot fix去解決它. 通常這都是有時間限制, 因此會很容易導致你, 採用快速解, 把程式改的一團糟. 尤其是若是有人離開這個團隊時, 會讓你修改程式上遇到更多問題, 並且也沒有時間對這些hot fix 或是patch, 作完整的回歸測試.
技術債務(Technical Debt)是長期貸款, 我們出於某種原因選擇必須採取它, 以實現一些短期利益. 但是因為程式碼品質的惡化, 我們必須支付“利息”形狀的東西, 也就是之後的系統, 需要更長的時間才能完成.
作者建議你處理技術的債務分為兩個步驟:
1. 停止增加債務 (增加較多的時間以確認真的完成)
2. 償還債務, 也就是開始解決它 (將回歸測試自動化)
觀念很簡單, 但是對大多數的人來說還真不容易做到.......
留言列表