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