軟件開發(fā)工程師技術(shù)債務(wù)的完整指南
譯文【51CTO.com快譯】債務(wù)是一個(gè)復(fù)雜的話題。而軟件開發(fā)工程師需要了解什么是技術(shù)債務(wù)以及如何有效管理技術(shù)債務(wù)以加速軟件開發(fā)過(guò)程。
債務(wù)這個(gè)術(shù)語(yǔ)經(jīng)常帶有負(fù)面含義,而一提到債務(wù),在人們腦海中經(jīng)常會(huì)浮現(xiàn)貸款、醫(yī)療賬單以及抵押貸款這樣的景象。但實(shí)際上,一些金融債務(wù)實(shí)際上可以為人們提供幫助。
技術(shù)債務(wù)也是如此。技術(shù)債務(wù)(也稱之為代碼債務(wù))是指開發(fā)團(tuán)隊(duì)加快交付今后可能需要重構(gòu)的項(xiàng)目或功能時(shí)會(huì)發(fā)生的情況。對(duì)于開發(fā)團(tuán)隊(duì)來(lái)說(shuō),加快開發(fā)過(guò)程成為優(yōu)先事項(xiàng),而不是高質(zhì)量的代碼。
與金融債務(wù)一樣,技術(shù)債務(wù)可能會(huì)為組織帶來(lái)?yè)p害或可能提供幫助。為了明智地使用,軟件工程師和團(tuán)隊(duì)領(lǐng)導(dǎo)者必須了解有多少技術(shù)債務(wù)并學(xué)會(huì)妥善管理。對(duì)于組織來(lái)說(shuō),這可能成為一項(xiàng)艱巨的任務(wù),尤其是當(dāng)他們對(duì)技術(shù)債務(wù)的利弊沒(méi)有明確了解的時(shí)候。
技術(shù)債務(wù)是一個(gè)隱喻性框架,可以用于思考在開發(fā)團(tuán)隊(duì)加快軟件生產(chǎn)之后需要重構(gòu)的細(xì)節(jié)。
技術(shù)債務(wù)有哪些同義詞?
像大多數(shù)創(chuàng)造出來(lái)的術(shù)語(yǔ)一樣,技術(shù)債務(wù)還有很多其他名稱,它們基本上都意味著同一件事情。在談?wù)摷夹g(shù)債務(wù)時(shí),人們可能還會(huì)看到諸如……
- 技術(shù)債務(wù)(Tech debt):技術(shù)債務(wù)的簡(jiǎn)寫或昵稱。
- 設(shè)計(jì)債務(wù):與軟件的設(shè)計(jì)元素有關(guān)的技術(shù)債務(wù)。
- 代碼債務(wù):與程序員必須重構(gòu)的軟件系統(tǒng)中的不良代碼相關(guān)的技術(shù)債務(wù)。
這些術(shù)語(yǔ)都有細(xì)微的差別,但都屬于更大的技術(shù)債務(wù)類別。
如何在Scrum框架中使用技術(shù)債務(wù)以及如何處理它
Scrum如今已經(jīng)成為軟件開發(fā)人員在尋求以更有效的方式交付產(chǎn)品時(shí)使用的流行框架。Scrum的一個(gè)關(guān)鍵原則是事情是不可預(yù)測(cè)的:客戶改變主意或經(jīng)常出現(xiàn)新需求。這種對(duì)變化的開放,意味著組織在使用Scrum框架時(shí)可能會(huì)出現(xiàn)技術(shù)債務(wù)。
Scrum培訓(xùn)師Stefan Wolpers對(duì)Scrum中兩種不同類型的技術(shù)債務(wù)進(jìn)行了分析與闡述。
- 首先是主動(dòng)選擇創(chuàng)建由不完美代碼組成的短期解決方案,以便可以更快地交付產(chǎn)品。期望開發(fā)團(tuán)隊(duì)會(huì)在初始發(fā)布之后并不斷來(lái)改進(jìn)代碼質(zhì)量。
- 當(dāng)開發(fā)團(tuán)隊(duì)發(fā)現(xiàn)有關(guān)他們?cè)噲D解決的問(wèn)題的更多信息時(shí),另一種類型的技術(shù)債務(wù)可能會(huì)出現(xiàn)。隨著新需求的出現(xiàn),以往有效的解決方案如今可能無(wú)法奏效。其代碼需要調(diào)整和重構(gòu),這樣就產(chǎn)生了一些技術(shù)債務(wù)。
Wolpers指出,Scrum指南并沒(méi)有給出任何關(guān)于如何減少技術(shù)債務(wù)的具體指導(dǎo)。正如他所說(shuō),Scrum指南并沒(méi)有提供萬(wàn)能的解決方案。盡管如此,他也認(rèn)識(shí)到技術(shù)債務(wù)的積累是組織在開展業(yè)務(wù)時(shí)不可避免的一部分,并為Scrum團(tuán)隊(duì)來(lái)更好地處理他們基于代碼的技術(shù)債務(wù)提供了六種方法。
他說(shuō),Scrum團(tuán)隊(duì)?wèi)?yīng)該:
(1)優(yōu)先考慮技術(shù)債務(wù)的透明度。Wolpers表示,透明度使管理技術(shù)債務(wù)變得更加簡(jiǎn)單。他建議開發(fā)團(tuán)隊(duì)突出展示他們的技術(shù)債務(wù)的可視化,將其作為首要任務(wù),并在每次召開的Sprint會(huì)議期間審查他們的技術(shù)債務(wù)需求。
(2)跟蹤技術(shù)債務(wù)。Wolpers建議對(duì)錯(cuò)誤進(jìn)行計(jì)數(shù),并盡可能使用更深入的代碼指標(biāo),如圈復(fù)雜度、代碼覆蓋率、SQALE評(píng)級(jí)以及規(guī)則。
(3)快速、定期地償還債務(wù)。與金融債務(wù)一樣,當(dāng)團(tuán)隊(duì)定期償還時(shí),技術(shù)債務(wù)就會(huì)得到更好的管理。Wolpers表示,Scrum團(tuán)隊(duì)?wèi)?yīng)該考慮將15%~20%的資源分配給每個(gè)Sprint周期的重構(gòu)代碼和修復(fù)錯(cuò)誤。
(4)減少產(chǎn)品積壓。組織的產(chǎn)品積壓應(yīng)該包括與償還技術(shù)債務(wù)相關(guān)的任務(wù)。而組織將這些債務(wù)列入想要解決的問(wèn)題,將有助于防止債務(wù)被忽視或遺忘。
(5)調(diào)整對(duì)“完成”的定義。在達(dá)到可管理的技術(shù)債務(wù)的既定標(biāo)準(zhǔn)之前,不要將某事視為已經(jīng)完成。
(6)規(guī)范程序。為組織的團(tuán)隊(duì)如何處理添加實(shí)驗(yàn)或新功能(包括引入技術(shù)債務(wù))制定一個(gè)可重復(fù)的公式。
技術(shù)債務(wù)有哪些不同類型?
技術(shù)債務(wù)可以采取許多不同的形式,但還有很多人對(duì)于這些差異進(jìn)行討論。
而大多數(shù)專家都認(rèn)同具有兩種不同類型的技術(shù)債務(wù):有意的和無(wú)意的。而這與Wolper將Scrum用戶的主動(dòng)和被動(dòng)技術(shù)債務(wù)進(jìn)行分離有些類似。
當(dāng)組織為了縮短上市時(shí)間而選擇在其代碼中留出改進(jìn)空間時(shí),就會(huì)發(fā)生有意的技術(shù)債務(wù)(也稱為故意或主動(dòng))。
當(dāng)代碼質(zhì)量在一段時(shí)間后需要改進(jìn)時(shí),就會(huì)發(fā)生無(wú)意的技術(shù)債務(wù)(也稱為偶然的、過(guò)時(shí)的、被動(dòng)的或無(wú)意的)。這可能是第一次生產(chǎn)不佳的結(jié)果,或者只是隨著代碼過(guò)時(shí)而自然需要更新。
2014年發(fā)表的一篇名為《走向技術(shù)債務(wù)本體論》的學(xué)術(shù)論文對(duì)于只有兩種類型的技術(shù)債務(wù)的觀點(diǎn)進(jìn)行了反駁。該論文指出,如果技術(shù)債務(wù)有更具體的類別,組織將會(huì)得到更好的服務(wù),因此論文提出了13種不同類型的技術(shù)債務(wù),每種類型都包括這篇論文指出的具體問(wèn)題:
- 架構(gòu)債務(wù)
- 積累債務(wù)
- 代碼債務(wù)
- 缺陷債務(wù)
- 設(shè)計(jì)債務(wù)
- 文件債務(wù)
- 基礎(chǔ)設(shè)施債務(wù)
- 人員債務(wù)
- 處理債務(wù)
- 要求債務(wù)
- 服務(wù)債務(wù)
- 測(cè)試自動(dòng)化債務(wù)
- 測(cè)試債務(wù)
雖然這些債務(wù)分類方法還有其他細(xì)節(jié),但最流行的債務(wù)分類方法來(lái)自Martin Fowler的技術(shù)債務(wù)象限。與Ward Cunningham一樣,Martin Fowler是敏捷軟件開發(fā)宣言的17位作者之一。然而當(dāng)談到技術(shù)債務(wù)時(shí),F(xiàn)owler獨(dú)自開發(fā)了他所謂的“技術(shù)債務(wù)象限”。
Martin Fowler的技術(shù)債務(wù)象限是什么?
2009年,F(xiàn)owler對(duì)由Steve McConnel推廣的有意和無(wú)意的技術(shù)債務(wù)的雙重分離進(jìn)行了細(xì)微的修改。他認(rèn)為人們用債務(wù)進(jìn)行比喻就像是問(wèn)錯(cuò)了問(wèn)題。
Fowler并沒(méi)有試圖找出有關(guān)設(shè)計(jì)缺陷的技術(shù)問(wèn)題的答案,例如“這是否被視為技術(shù)債務(wù)?”,而是想知道這些軟件系統(tǒng)產(chǎn)生的債務(wù)是魯莽的還是謹(jǐn)慎的。這種區(qū)別,再加上“有意”或“無(wú)意”債務(wù)的概念,形成了Fowler所稱的技術(shù)債務(wù)象限。
這個(gè)象限產(chǎn)生四種不同類型的技術(shù)債務(wù):
- 魯莽和有意。
- 魯莽和無(wú)意。
- 謹(jǐn)慎和有意。
- 謹(jǐn)慎和無(wú)意。
有意債務(wù)發(fā)生在創(chuàng)造的選擇中,無(wú)意債務(wù)發(fā)生在團(tuán)隊(duì)需要做出調(diào)整之后。然而,謹(jǐn)慎債務(wù)和魯莽債務(wù)的區(qū)別更加獨(dú)特,這種分類賦予了技術(shù)債務(wù)象限的價(jià)值。謹(jǐn)慎的技術(shù)債務(wù)來(lái)自一個(gè)知道自己在做什么的團(tuán)隊(duì),而當(dāng)他們做事過(guò)于草率時(shí),就會(huì)產(chǎn)生魯莽的債務(wù)。
能看出謹(jǐn)慎和魯莽的區(qū)別嗎?
謹(jǐn)慎的團(tuán)隊(duì)了解他們的舉動(dòng),并且他們有意使用他們的技術(shù)債務(wù)。
魯莽的團(tuán)隊(duì)只是將他們的軟件系統(tǒng)視為瘋狂購(gòu)物的美國(guó)運(yùn)通銀行持卡人,將導(dǎo)致技術(shù)債務(wù)不斷地積累。
Fowler指出,用債務(wù)比喻來(lái)解釋象限中最復(fù)雜的部分是謹(jǐn)慎和無(wú)意部分。而當(dāng)一個(gè)團(tuán)隊(duì)知道他們?cè)谧鍪裁床⑶以陧?xiàng)目上做得很好但最終仍然需要一些返工時(shí),就會(huì)出現(xiàn)這種情況。
Fowler表示,無(wú)論團(tuán)隊(duì)的專業(yè)知識(shí)或經(jīng)驗(yàn)如何,軟件工程團(tuán)隊(duì)都應(yīng)該承擔(dān)一定程度的債務(wù)。在謹(jǐn)慎的情況下出現(xiàn)少量債務(wù)是可以預(yù)料的,但這只會(huì)使減少魯莽債務(wù)并盡可能減少不良代碼而變得更加有價(jià)值。
應(yīng)該始終避免哪種類型的技術(shù)債務(wù)?
謹(jǐn)慎的技術(shù)債務(wù)可以為軟件開發(fā)組織帶來(lái)很多好處,但這些組織應(yīng)該密切關(guān)注他們積累了多少技術(shù)債務(wù)。魯莽從來(lái)都不是好事,但存在另一種可能對(duì)組織造成更大傷害的技術(shù)債務(wù):位衰減(bit rot)。
位衰減(也稱為“數(shù)據(jù)腐化”)發(fā)生在軟件隨著時(shí)間的推移而退化到產(chǎn)生錯(cuò)誤甚至改變其功能和可用性的程度時(shí)。位衰減需要一些時(shí)間來(lái)開發(fā),但它將讓開發(fā)團(tuán)隊(duì)更加謹(jǐn)慎。
當(dāng)開發(fā)人員對(duì)他們不完全理解的遺留代碼進(jìn)行增量的微小更改時(shí),通常會(huì)發(fā)生這種情況。這些微小的更改最終會(huì)造成足夠的復(fù)雜性和問(wèn)題,從而影響整個(gè)軟件的。一些軟件開發(fā)工程師甚至可能違反非功能性要求(NFR)或完全破壞代碼。解決這種技術(shù)債務(wù)的唯一方法是重構(gòu)整個(gè)系統(tǒng)。
而技術(shù)債務(wù)面臨最大的問(wèn)題是,微小的變化實(shí)際上會(huì)增加債務(wù)總額,而且開發(fā)團(tuán)隊(duì)在大多數(shù)時(shí)候甚至不知道這一點(diǎn)。使用Wolper的透明度概念可以幫助組織避免這樣的災(zāi)難。
同樣,開發(fā)團(tuán)隊(duì)將從完全理解他們工作的每個(gè)軟件中受益,這樣他們就不會(huì)無(wú)意中添加可能阻礙系統(tǒng)運(yùn)行的代碼。項(xiàng)目管理團(tuán)隊(duì)可以通過(guò)確保他們的開發(fā)過(guò)程不會(huì)留下發(fā)生位衰減的空間來(lái)讓他們的開發(fā)人員負(fù)責(zé)。
什么是技術(shù)債務(wù)指標(biāo)?
除非能夠衡量它,否則了解很多關(guān)于技術(shù)債務(wù)的知識(shí)并不重要。
但是應(yīng)該衡量什么? 與任何良好的管理計(jì)劃一樣,組織需要了解最佳指標(biāo)才能控制其技術(shù)債務(wù)。
以下是一些值得關(guān)注的最佳指標(biāo):
(1)錯(cuò)誤(Bug)
至少,軟件開發(fā)人員應(yīng)該計(jì)算并跟蹤他們的錯(cuò)誤。這包括已修復(fù)和未修復(fù)的錯(cuò)誤。而關(guān)注未修復(fù)的錯(cuò)誤可以讓開發(fā)團(tuán)隊(duì)在敏捷迭代期間專注于并修復(fù)它們。關(guān)注已修復(fù)的錯(cuò)誤有助于團(tuán)隊(duì)衡量他們的技術(shù)債務(wù)管理流程的有效性。
(2)代碼質(zhì)量
雖然錯(cuò)誤對(duì)軟件的最終用戶有更直接的影響,但代碼復(fù)雜性確實(shí)會(huì)損害開發(fā)團(tuán)隊(duì)和整個(gè)組織。
尋找代碼復(fù)雜性指標(biāo),例如:
- 圈復(fù)雜度。
- 類耦合。
- 代碼行。
- 繼承深度。
這些指標(biāo)越低越好。
密切關(guān)注這些指標(biāo)還有助于組織準(zhǔn)確地知道要返工或重構(gòu)哪些代碼,以降低復(fù)雜性并改進(jìn)軟件的后端。
(3)代碼內(nèi)聚
與代碼質(zhì)量一樣,專門關(guān)注代碼內(nèi)聚性將有助于避免代碼變得過(guò)于復(fù)雜。高代碼內(nèi)聚通常意味著代碼更易于維護(hù)、可重用和健壯。它還最大限度地減少了需要參與代碼開發(fā)的人數(shù),這可以顯著降低復(fù)雜性,并減少位衰減的機(jī)會(huì)。
高內(nèi)聚性是指有一個(gè)類執(zhí)行定義良好的任務(wù)。
(4)代碼所有權(quán)
更多的開發(fā)工程師通常意味著更多的麻煩,而更多的麻煩通常會(huì)導(dǎo)致更大的問(wèn)題和更高水平的無(wú)意技術(shù)債務(wù)。這就是為什么代碼所有權(quán)是一個(gè)如此有價(jià)值的指標(biāo):它回答了“誰(shuí)專注于什么代碼?”的問(wèn)題。
該指標(biāo)將使組織的項(xiàng)目管理人員關(guān)注處理各種代碼的人數(shù)。了解這些信息將使這些團(tuán)隊(duì)能夠減少用于這些工作的開發(fā)人員的人數(shù)和時(shí)間。但并不希望某個(gè)人擁有完整的代碼段,以防萬(wàn)一離職或者出現(xiàn)意外。通常情況下,是讓開發(fā)工程師團(tuán)隊(duì)擁有代碼庫(kù)中的域。
(5)Churn
代碼在被重寫/替換時(shí)被稱之為Churn。Churn是對(duì)給定代碼段看到的活動(dòng)的度量。組織要關(guān)注到大量活動(dòng)的代碼,因?yàn)槠渲械娜魏螁?wèn)題都會(huì)加劇。然后,度量流失可以幫助團(tuán)隊(duì)識(shí)別代碼的哪些部分需要重構(gòu)并確定其優(yōu)先級(jí)。如果開發(fā)工程師必須不斷解決代碼同一部分的錯(cuò)誤,那就意味著那里出了問(wèn)題。關(guān)注這種流失將幫助組織更快地查明這些問(wèn)題,使他們能夠通過(guò)永久性解決方案來(lái)解決問(wèn)題,從而降低技術(shù)債務(wù)。
跟蹤這些技術(shù)債務(wù)指標(biāo)不會(huì)消除組織的所有債務(wù),但會(huì)幫助更有效地管理。
什么是技術(shù)債務(wù)統(tǒng)計(jì)?
一些研究機(jī)構(gòu)已經(jīng)進(jìn)行了學(xué)術(shù)研究和調(diào)查,闡明了軟件行業(yè)對(duì)技術(shù)債務(wù)比喻的看法。
卡內(nèi)基梅隆大學(xué)軟件工程研究所的一項(xiàng)行業(yè)調(diào)查發(fā)現(xiàn),大多數(shù)參與者在這個(gè)比喻中發(fā)現(xiàn)了一些價(jià)值,盡管他們對(duì)具體定義略有不同。然而更有趣的是,他們關(guān)于技術(shù)債務(wù)成因的研究結(jié)果。
受訪者表示,第一,糟糕的架構(gòu)選擇是他們技術(shù)債務(wù)的主要來(lái)源。第二是代碼過(guò)于復(fù)雜,第三是缺乏文檔和測(cè)試不充分。
這些結(jié)果表明,大多數(shù)受訪者表示無(wú)意中積累了技術(shù)債務(wù)。更糟糕的是,65%的參與者表示他們沒(méi)有管理技術(shù)債務(wù)的流程。這意味著他們因?yàn)槿狈?zhàn)略而積累了技術(shù)債務(wù),并且選擇沒(méi)有解決這些問(wèn)題的戰(zhàn)略。
一位擁有20多年與各種公司合作經(jīng)驗(yàn)的軟件開發(fā)人員建議,組織應(yīng)該像還清信用卡一樣償還他們的技術(shù)債務(wù)。組織應(yīng)該將投資重點(diǎn)集中在兩個(gè)地方:企業(yè)文化和代碼庫(kù)。
投資于企業(yè)文化似乎讓每個(gè)人都站在同一個(gè)立場(chǎng)上。這意味著要建立起讓人們共同負(fù)責(zé)的制度,意味著人們知道在做什么。
而投資于代碼庫(kù)可能意味著執(zhí)行更深入和更頻繁的質(zhì)量保證測(cè)試。這些測(cè)試甚至可能是自動(dòng)化的。這也可能意味著更頻繁的重構(gòu),特別是如果組織已經(jīng)積累了大量技術(shù)債務(wù)的話。投資于代碼庫(kù)應(yīng)該包括某種形式的代碼審查,以確保在問(wèn)題變得失控之前得到解決。
在這些地方投資是很好的起點(diǎn),但任何組織可以做的最有價(jià)值的事情就是管理他們的技術(shù)債務(wù)。如果沒(méi)有明確的戰(zhàn)略,技術(shù)債務(wù)將會(huì)繼續(xù)增長(zhǎng),并在未來(lái)帶來(lái)更多問(wèn)題。
如何開始管理技術(shù)債務(wù)?
與金融債務(wù)一樣,只有制定計(jì)劃加以管理,技術(shù)債務(wù)才會(huì)減少。但管理技術(shù)債務(wù)并非易事。它需要頻繁的監(jiān)控和努力,并且已經(jīng)成為軟件公司必不可少的一部分。技術(shù)債務(wù)很容易使組織偏離業(yè)務(wù)目標(biāo),因此管理它有助于與組織的其他部分保持一致。
盡管如此,管理技術(shù)債務(wù)對(duì)于組織來(lái)說(shuō)仍然感覺(jué)是一種負(fù)擔(dān)。項(xiàng)目經(jīng)理、產(chǎn)品團(tuán)隊(duì)和工程師已經(jīng)不堪重負(fù)。這不是他們首先累積債務(wù)的原因嗎?而添加其他東西會(huì)增加他們的壓力水平嗎?也許是這樣,但想要將技術(shù)債務(wù)保持在較低水平的組織必須將其作為優(yōu)先事項(xiàng)。這只是一個(gè)很大的需求,尤其是當(dāng)查看統(tǒng)計(jì)數(shù)據(jù)時(shí)。
根據(jù)調(diào)研機(jī)構(gòu)的預(yù)測(cè),到2024年,尚未解決的技術(shù)債務(wù)將使全球各地的公司損失4萬(wàn)億美元,而那些償還技術(shù)債務(wù)的企業(yè)向客戶的交貨時(shí)間將縮短50%。
在過(guò)去的幾年中,新技術(shù)應(yīng)用程序已經(jīng)讓軟件公司認(rèn)識(shí)到這種需求,并尋求方法來(lái)滿足它。
現(xiàn)在,有了Stepsize之類的軟件,開發(fā)團(tuán)隊(duì)可以輕松地報(bào)告?zhèn)鶆?wù)、對(duì)債務(wù)報(bào)告進(jìn)行分類,并確定需要解決的最重要的債務(wù)部分,從而幫助組織管理其技術(shù)債務(wù)。所有這些都有助于軟件工程團(tuán)隊(duì)管理他們的技術(shù)債務(wù),而不會(huì)徹底改變他們的常規(guī)工作流程。更重要的是,它使他們能夠快速開發(fā)出優(yōu)秀的軟件,同時(shí)監(jiān)控他們積累的技術(shù)債務(wù)。
原文作者:The Engineer’s Complete Guide to Technical Debt,作者:Alex Omeyer
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】