用 Sonar 評估你的技術債務
技術債務是一個很出名的概念,它是在1992年由沃德?坎寧安(Ward Cunningham)(wiki創始人)提出的,他在最近的視頻中談到了這個話題。從那時以來,在博客以及文章上,這個話題被討論和研究了無數次。在這里我不能描述它的很多細節,但我可以推薦你去閱讀那些被認為是在這個主題之下的相關文章,比如:Martin Fowler。這里摘錄了一篇文章,通過比喻給出了一個的觀點:
在這個比喻中,我們通過臨時應急的方式設 置了一個技術債務,它類似于經濟上的債務。就像經濟上的債務,技術上的債務也是要付利息的,它存在于我們將來的開發上,因為選擇了臨時的應急措施,在某個 時候,我們將會付出某種形式的額外代價。我們可以選擇繼續付利息,或者我們可以選擇通過重構過去的臨時處理方案,直接支付本金,獲取更好的設計。雖然它當 場支付掉了本金,卻可以讓我們在未來減少利息上的支出。
這個比喻看起來已經被許多開發者接受了,并且每天還有許多人在推特上討論關于臨時措施帶來的技術債務。但是除了這個概念,是時候回到評估償還上來了,沒有 哪篇文章介紹如何計算債務或者去計算債務的方法。這類似于借錢去買了一個房子,但是2年之后卻沒有辦法知道剩余的債務,以及每個月要還多少利息:-)。
通過Martin Fowler的描述,開發者很明智,并且許多時候會做出深思熟慮的選擇去借取——為了買時間。當 開始一個新的開發,正如你所知道,正好是技術債務......為0的時候。但是,當擴展或者維護一個遺留的程序時,那就是另外一個故事了,沒有人知道它確 切地歷史欠賬。當一個開發者沒有遵循最佳的實踐方法的時候,你可能沒有意識到,你就已經借了錢了。那就是為什么,評估大致的技術債務是非常有用的。
在介紹Sonar插件之前,這里有一些有趣的和相關的概念要介紹:
-
在維護一個應用時,每次你添加或者改動一行代碼,卻沒有任何的單元測試就類似于借錢
-
跳過設計階段就類似于借錢去獲取一個非常“快速”和“可預期”的投資回報
-
重構就類似于償還掉本金
-
當利息上漲時,開發效率降低
-
管理者不重視代碼質量,就問問他們關于償還的債務問題,讓他們重視起來
-
破產是一個在技術債務邏輯上的擴展,指的是在技術債務上失去了控制......我們稱之為系統重寫
當討論源代碼質量的時候,我喜歡談談這里的七宗罪,每一個都代表質量分析上的主要問題:不均勻分布的復雜性,重復代碼,缺乏注釋,違背代碼規范,潛 在的bug,沒有單元測試或者無效的代碼和糟糕的設計。你已經知道,Sonar實際上覆蓋了它們中的6種類型,除此之外的1/7(糟糕的設計)可能也開始 搖晃了:-)它被覆蓋那只是時間的問題。
從這個觀察來看,為了得到在各方面都完美分數,我們決定建立新的量化指標反映到底有多少的工作量是需要的。換言之,就是在一個項目中每一筆債務償還 的成本。通過匯總結果,我們獲得了一項全面的指標,在我們的報告中使用了$符號來保持它的趣味性!連同這個指標在內,每個指標都被重新分配,也就是說,每 個指標有多少(份額)被分配進技術債務中。
當前插件的版本是0.2,并且可以使用下面的表達式去計算債務 :
Debt(in man days) = | cost_to_fix_duplications + cost_to_fix_violations + |
cost_to_comment_public_API + cost_to_fix_uncovered_complexity + | |
cost_to_bring_complexity_below_threshold |
條件:
Duplications | = | cost_to_fix_one_block * duplicated_blocks |
Violations | = | cost_to fix_one_violation * mandatory_violations |
Comments | = | cost_to_comment_one_API * public_undocumented_api |
Coverage | = | cost_to_cover_one_of_complexity * uncovered_complexity_by_tests (80% of coverage is the objective) |
Complexity | = | cost_to_split_a_method * (function_complexity_distribution >= 8) + cost_to_split_a_class * (class_complexity_distribution >= 60) |
通過計算這種方式, 它可以接近實際中的情況,技術債務的量化(測定)是寶貴的:
-
在項目,模塊(等等)上,它是一項綜合的指標
-
它可以在時間上被跟蹤(歷史數據,趨勢)
-
它可以讓眾多項目進行比較
-
他可以被深度探討,甚至可以......
作為第一個版本,你可能要被提示選擇一些選項,為了插件的配置可以更靈活地被調整,付出一些是值得的。
The plugin has been installed on Nemo, the public instance of Sonar, that now calculates the debt of more than 80 Open Source projects. The plugin relies only on the available Sonar extension points and is good example of advanced metrics that can be computed with Sonar.
I am going to stop here on the technical debt for today, but would like to simply mention what we plan to add to it next : interests, debt ratio and project risk profile. I let you now go back to Sonar to install this new plugin as I am sure you want to know what is the technical debt of your project…