權威解讀什麼是技術負債? - martinfowler.com
軟體系統是容易的積聚一些累贅cruft : 內部質量不高,導致其比預想更難進行修改和進一步擴充套件系統。技術債務是沃德坎寧安(Ward Cunningham)創造的一個比喻,它描述瞭如何考慮處理這種問題,將其視為金融債務,增加新功能所需的額外成本是債務利息。
想象一下,我的程式碼庫中有一個令人困惑的模組結構。我需要新增一個新功能。如果模組結構清晰,那麼我需要四天時間才能新增這個功能,但是這需要六天時間。兩天的差額就是你要付出的債務利息。
關於債務比喻最吸引我的是它如何促使我如何處理這個問題。我可能需要五天時間來清理模組化結構,移除那個殘骸,暗地了其實支付了利息。如果我只為這一個功能就進行重構,那就沒有多大收穫,因為我需要9天而不是6天。但是,如果我有兩個更相似的功能出現,那麼我將通過首先刪除累贅cruft來加快速度。
這樣說,這聽起來像是處理數字的簡單問題,任何有電子表格的經理都應該找出選擇。遺憾的是,由於我們保持了生產力,因此這些成本都不是客觀可衡量的。我們可以估計完成一個功能需要多長時間,估計如果移除這個功能可能會是什麼樣的,並 估計移除這個功能的成本。但這種估計的準確性非常低。
鑑於此,通常最好的方法是做我們通常做的金融債務,逐步還債。碰到第一個功能時,我將花費額外的幾天來刪除一些殘餘累贅。這可能足以將未來重構時間降低一天,重構仍然需要花費額外的時間,但是通過刪除這個問題我將使這個程式碼的未來更改變得更便宜。
像這樣逐步改進的巨大好處是,它自然意味著我們花費更多的時間來消除我們經常修改的那些區域中的累贅,這正是程式碼庫中我們最需要刪除的累贅部分。
將此視為支付利息與支付本金可以幫助決定解決哪個問題:如果我有一個可怕的程式碼庫區域,這是一個改變的噩夢,如果我不必修改它就不是問題。當我必須使用軟體的那一部分時,我才會觸發利息支付(這是一個比喻崩潰的地方,因為經濟利息支付是由時間推移引發的),這樣苛刻但穩定的程式碼區域可以獨自存在。相比之下,程式碼中高活躍區域需要對累贅態度必須採取零容忍態度,因為支付的利息非常高。這一點尤為重要,因為在開發人員進行更改而不關注內部質量的情況下,不可避免地會積累起來 - 更多的變化,更大的風險。
債務的隱喻有時被用來證明忽視內部質量反而是正當的。爭論的焦點是,需要時間和精力才能阻止累贅的累積,如果迫切需要新的功能,那麼也許最好承擔債務,接受支付利息以便將來必須管理這筆債務。
這裡的危險是大多數時候這種分析做得不好!累贅Cruft具有快速影響,會快速降低所需的新功能的開發效率。
如果團隊為了加快交付時間,而忽略首先將內部質量提高到更高的水平,這樣做的團隊最終會把他們所有的信用卡都用掉(爆卡,債務危機),
在這裡,債務比喻往往會讓人誤入歧途,因為軟體質量的動態與金融貸款的動態並不完全相符。承擔債務以加速交付只有在您停留在DesignStaminaHypothesis的設計支付線以下時才有效,並且團隊達到這條紅線只是幾周時間而不是幾個月。
進一步閱讀
- 據我所知,沃德首先在1992年OOPSLA的經驗報告中介紹了這個概念。它也在維基上討論過。
- 沃德坎寧安有一個視訊談話,他討論了他創造的這個比喻。
- Dave Nicolette通過對我稱之為 謹慎故意債務的精細案例研究擴充套件了Ward對技術債務的看法
- 一些讀者發來了一些同樣好的名字。David Panariti將醜陋的程式設計稱為赤字程式設計。顯然,他最初在幾年前開始使用它符合政府政策; 我想現在再次自然了。
- 斯科特伍德建議“ 當技術水平超過產品基礎時,技術通脹可能會被視為失去的基礎,以至於它開始失去與行業的相容性。這種情況的例子將落後於版本的語言到你的程式碼不再與主流編譯器相容的程度。“
- 史蒂夫麥康奈爾在這個比喻中提出了幾個好點,特別是如果保持你的意外債務,你會有更多的空間在有意義的情況下有意承擔債務。我也喜歡他的最低支付概念(這對於修復嵌入式系統而不是網站的問題非常高)。
- Aaron Erickson談到安然融資。
- Henrik Kniberg認為,較舊的技術債務導致了最大的問題,而且定性債務上限有助於管理它。
- Erik Dietrich討論了技術債務的人力成本:團隊內inf,萎縮技能和自然減員。
相關:
相關文章
- 什麼是技術債,為什麼要還技術債?
- 解讀什麼是遠端訪問技術
- Jazz 你瞭解是什麼技術
- vr全景技術是指什麼?什麼是vr全景技術?VR
- 什麼是cdn技術
- 什麼是機器學習:一次權威定義之旅機器學習
- 什麼是CDN?CDN的技術原理是什麼?
- 什麼是CDN加速技術
- 隧道代理技術是什麼?
- 為什麼不斷做遷移,那是在還技術債
- 遞迴解析和權威解析的區別是什麼?遞迴
- 技術債是什麼、怎麼還?你想知道的都在這一篇文章裡了!
- httpdns是個什麼技術,有什麼用httpdDNS
- 美顏sdk是什麼?美顏技術詳解
- 什麼是好的技術文件?
- 什麼是Code-Behind技術
- 技術美術師是做什麼的?
- 產品經理也能讀懂的技術:什麼是WSGI
- 什麼是虛擬化技術,為什麼要虛擬化技術?薦
- 【資產負債表】用友U8資產負債表不平的解決方案
- 讀《Cassandra權威指南》
- 通用爬蟲技術框架是什麼?爬蟲框架
- 前端開發技術-promise是什麼?前端Promise
- 漫畫:容器技術docker是什麼?Docker
- 德爾菲技術是什麼意思?如何使用?
- 影片CDN的技術原理是什麼?
- 什麼是人機互動技術?
- 遠端訪問技術是什麼
- 什麼是SWOT商業分析技術?
- 什麼是PESTLE商業分析技術?
- 技術長:CTO是做什麼的
- soa是什麼?主要是那些技術
- 什麼是超執行緒技術?執行緒
- 資料網格技術是什麼
- Web前端技術分享:什麼是塊元素?什麼是行內元素?Web前端
- 什麼是負載均衡–SLB負載
- 技術債務之輪
- 天美J1技術美術負責人:開發工具的真正價值是什麼?