- 
						您的位置: 
- 網(wǎng)站首頁(yè)
- > 新聞資訊
- > 技術(shù)前沿
您的位置:

本文最初發(fā)布于 Kyle Brown 的個(gè)人博客,經(jīng)原作者授權(quán)由 InfoQ 中文站翻譯并分享。
讓我們面對(duì)現(xiàn)實(shí)吧,2020 年是奇怪的一年。其中有一個(gè)奇怪的小現(xiàn)象,自 2012 年以來(lái),美國(guó)的個(gè)人儲(chǔ)蓄率首次出現(xiàn)增長(zhǎng)(而且是以驚人的速度增長(zhǎng)),而不是保持基本穩(wěn)定 [1]。雖然這其中大部分都與流行病有關(guān),但這也許可以在一定程度上表明,消費(fèi)者已經(jīng)開(kāi)始意識(shí)到,你不能一直借錢而不償還你所欠下的債務(wù)。我希望企業(yè)能夠意識(shí)到,同樣的原則也適用于技術(shù)債務(wù),就像適用于金融債務(wù)一樣。這個(gè)類比可能會(huì)讓一些人覺(jué)得不太舒服,但這實(shí)際上是一個(gè)非常著名的思想,它最早是由 Ward Cunningham 在 15 年前提出 [2],并由 Joshua Kerievsky 在 2005 年進(jìn)一步發(fā)展 [3]。
簡(jiǎn)單地說(shuō),當(dāng)開(kāi)發(fā)團(tuán)隊(duì)為了完成其他活動(dòng)而放棄重要的軟件開(kāi)發(fā)活動(dòng)時(shí),就會(huì)產(chǎn)生技術(shù)債務(wù)。通常,他們的想法是,他們會(huì)“回過(guò)頭去”完成這項(xiàng)活動(dòng),但意圖往往不會(huì)轉(zhuǎn)化為活動(dòng)。這類活動(dòng)可能非常簡(jiǎn)單,如編寫文檔,但也可能是更棘手的活動(dòng),比如修改一段代碼,讓它更容易理解和維護(hù),或者是更新因?yàn)榇a變化而過(guò)時(shí)的設(shè)計(jì)文檔。
我最近在處理幾個(gè)客戶的問(wèn)題,我感覺(jué)自己就像一個(gè)消費(fèi)者債務(wù)顧問(wèn),在和一對(duì)背負(fù)著巨額抵押貸款的夫婦談話,他們的信用卡余額在不斷增加,而且他們的孩子即將出生。在每一種情況下,我們都快要被技術(shù)債務(wù)壓垮了,我們必須找到一些方法來(lái)減少債務(wù),同時(shí)繼續(xù)開(kāi)發(fā)新功能并繼續(xù)前進(jìn)。我提出了一套實(shí)踐方法,步驟和信貸顧問(wèn)給他們客戶的建議類似。讓我們看看這些步驟,看看如何把他們應(yīng)用于許多項(xiàng)目都面臨的技術(shù)債務(wù)狀況。
這一步最關(guān)鍵。一旦團(tuán)隊(duì)決定必須償還他們的技術(shù)債務(wù)(這不是一個(gè)容易的決定——而且必須與業(yè)務(wù)一起做出),他們就必須弄清楚他們實(shí)際上欠了多少債務(wù)。我發(fā)現(xiàn),最好的方法是進(jìn)行自上而下的設(shè)計(jì)和代碼審查。
首先看看你的設(shè)計(jì)文檔。它是最新的嗎?它是否準(zhǔn)確地描述了設(shè)計(jì)中最重要的點(diǎn)?然后,你可能想首先審查下代碼的哪些部分給你帶來(lái)了最大的麻煩——哪些部分最難修改?哪些地方出錯(cuò)率最高?那些部分對(duì)你的業(yè)務(wù)來(lái)說(shuō)最重要?找出這些問(wèn)題的答案,可以幫助你對(duì)你需要做的事情進(jìn)行排序,找出方法改善你的處境。
系統(tǒng)中并不是只有代碼和文檔會(huì)導(dǎo)致技術(shù)債務(wù)。另一個(gè)需要考慮的關(guān)鍵因素是運(yùn)營(yíng)債務(wù)——例如,你是否運(yùn)行在數(shù)據(jù)庫(kù)或應(yīng)用程序服務(wù)器等平臺(tái)軟件構(gòu)成的后臺(tái)上?你的運(yùn)營(yíng)團(tuán)隊(duì)是否在手動(dòng)執(zhí)行應(yīng)該自動(dòng)化完成的任務(wù),既浪費(fèi)時(shí)間又浪費(fèi)錢?你是否有適當(dāng)?shù)谋O(jiān)控,以便在問(wèn)題導(dǎo)致站點(diǎn)宕機(jī)之前發(fā)現(xiàn)問(wèn)題,或者你是否把時(shí)間浪費(fèi)在了事后分析上?
通常,最好是請(qǐng)一個(gè)外部專家來(lái)幫助你評(píng)估項(xiàng)目狀態(tài)。引入一名外部人員讓你可以獲得一份純粹是基于解決方案技術(shù)優(yōu)越性的評(píng)估,而不受辦公室政治或個(gè)人對(duì)某些代碼的情感所影響。
最終的評(píng)估需要描述需要更改的內(nèi)容,按照優(yōu)先級(jí)進(jìn)行排序,并提出代碼更改建議,以及列出的每個(gè)更改的估算成本。一旦你掌握了這些事實(shí),你就可以開(kāi)始與業(yè)務(wù)所有者協(xié)商你要償還哪些債務(wù)以及以什么順序償還。
雖然上一步是整個(gè)計(jì)劃中最重要的一步,但第二步通常會(huì)導(dǎo)致與業(yè)務(wù)最針?shù)h相對(duì)的討論。其中最難的部分是學(xué)會(huì)組織文化變革,這樣你就不會(huì)讓積累的債務(wù)超過(guò)合理的服務(wù)能力。就拿我們的金融債務(wù)來(lái)說(shuō),這也是一件非常困難的事情——改變你的消費(fèi)習(xí)慣,只買你需要的東西,而不是用信用卡購(gòu)買你想要的東西,這是一件非常困難的事情。
為了修復(fù)發(fā)現(xiàn)的問(wèn)題,你必須花時(shí)間來(lái)實(shí)現(xiàn)修復(fù),這意味著你在糾正問(wèn)題時(shí)會(huì)擱置新的開(kāi)發(fā)。關(guān)于這一點(diǎn),沒(méi)有什么完美的方法,無(wú)論你采取什么方法,你都需要與業(yè)務(wù)協(xié)商如何平衡技術(shù)債務(wù)償還和新功能開(kāi)發(fā)。下面是一些我們認(rèn)為有效的策略。
在用戶故事中包含債務(wù)償還活動(dòng)。如果前面的步驟已經(jīng)形成了一組按大小分類并排好序的活動(dòng),那么你可以與業(yè)務(wù)合作,確保在每個(gè)開(kāi)發(fā)周期中都包含其中一部分活動(dòng)。比較難的是平衡債務(wù)償還活動(dòng)和涉及同一代碼區(qū)域的新功能開(kāi)發(fā)。例如,如果你正在開(kāi)發(fā)一個(gè)電子商務(wù)網(wǎng)站,并且你發(fā)現(xiàn)大多數(shù)問(wèn)題都是發(fā)生在結(jié)帳時(shí),你可能想要把涉及這一部分的新功能開(kāi)發(fā)推遲到你償還該部分的技術(shù)債務(wù)時(shí)(例如,重構(gòu)代碼或更新文檔)。在這種情況下,在更改的過(guò)程中添加新的促銷活動(dòng)或更改產(chǎn)品頁(yè)面將是合理的選擇。
采用貝塔測(cè)試。如果你構(gòu)建的基礎(chǔ)設(shè)施可以支撐兩個(gè)網(wǎng)站(一個(gè)是主網(wǎng)站,另一個(gè)是“測(cè)試”網(wǎng)站),那么你可以在重構(gòu)主代碼流的同時(shí)繼續(xù)在測(cè)試網(wǎng)站上開(kāi)發(fā)新功能。這樣做的好處是不會(huì)減慢任何新功能開(kāi)發(fā)的速度,但代價(jià)是,當(dāng)對(duì)測(cè)試站點(diǎn)的更改必須重新集成到主站點(diǎn)時(shí),集成難度會(huì)增加。
在這種情況下,我們可以和信用卡債務(wù)償還策略做個(gè)對(duì)比,考慮兩種不同的確定債務(wù)償還優(yōu)先級(jí)的方法。第一種可能的策略是“最高利率優(yōu)先”。在信貸領(lǐng)域,這種策略是先償還利率最高的信用卡,因?yàn)檫@類信用卡支付的利息最高。在技術(shù)領(lǐng)域,這意味著你可以首先考慮承擔(dān)影響最大的任務(wù)。如果你解決了這些問(wèn)題,通常就可以為其他更改掃清障礙,并且可能在性能、可維護(hù)性等方面獲得最大的回報(bào)。
另一種可能的策略是“最低余額優(yōu)先”策略。用信用卡的術(shù)語(yǔ)來(lái)說(shuō),這意味著先還清余額最低的信用卡——事情很快就完成了,這會(huì)讓你立即獲得一種成就感。對(duì)于技術(shù)債務(wù),一個(gè)類似的策略是首先處理最小的修復(fù),如果你必須說(shuō)服業(yè)務(wù)或管理人員償還技術(shù)債務(wù),或者如果你所在的公司非常注重結(jié)果導(dǎo)向,只有快速取得進(jìn)展才能為更大的工作爭(zhēng)取到資金支持,這會(huì)特別有用。
這里的關(guān)鍵是,讓償還債務(wù)成為你長(zhǎng)期活動(dòng)的一部分。這不是一次性交易;對(duì)于“重構(gòu)”[4] 這類術(shù)語(yǔ),人們不再像幾年前它開(kāi)始流行時(shí)那樣抱有幻想,因?yàn)樗麄兿M詈檬强梢詮拈L(zhǎng)期投資中獲得短期結(jié)果。你總是會(huì)招致新的債務(wù);關(guān)鍵是確保你能在合理的時(shí)間內(nèi)償還,而不是讓它越積越多。
最后,你需要能夠報(bào)告你在債務(wù)償還活動(dòng)中取得的進(jìn)展。采集一些指標(biāo),用于向管理和業(yè)務(wù)證明,花費(fèi)在這些活動(dòng)中的時(shí)間是值得的,這點(diǎn)特別重要。例如,很多時(shí)候你需要重構(gòu)代碼來(lái)提高性能,這時(shí),手上有正確的統(tǒng)計(jì)數(shù)據(jù)來(lái)顯示用戶體驗(yàn)的改進(jìn)是很重要的。同樣,當(dāng)你在改進(jìn)一個(gè)簡(jiǎn)單的代碼庫(kù)時(shí),添加新特性的速度是另一個(gè)向業(yè)務(wù)證明價(jià)值的重要指標(biāo)。
遵循這些步驟并不能解決技術(shù)債務(wù)相關(guān)的所有問(wèn)題,但它們至少可以讓你系統(tǒng)性地確定需要做什么,可以為開(kāi)發(fā)過(guò)程帶來(lái)什么價(jià)值,以及變更在多大程度上解決了問(wèn)題。如果你堅(jiān)持這樣做,那么這應(yīng)該可以使你的開(kāi)發(fā)工件更容易維護(hù),并且應(yīng)該可以減少你的開(kāi)發(fā)壓力。