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