Categories
程式開發

技術債務牆:讓技術債務無所遁形


“技術債務”是對低效、無效或完全錯誤的軟件設計決策的一種隱喻,它們將會在未來給開髮帶來額外的成本。今天走的捷徑以後會讓你慢下來,直到你通過解決問題來“償還”債務。它們不僅指的是代碼:架構、文檔、測試和領域模型都可能受到技術債務的影響。

技術債務會嚴重拖累開發進度,而通過重構來償還技術債務通常也不是可行的方案。但是,與金融債務一樣,技術債務並不總是壞事。債務讓我們在賺到錢之前有投資的資本。在將產品推向市場時走走捷徑,可以讓我們以較低的成本測試業務模型,並在發現代碼不好時直接丟棄代碼。通常,之所以會存在債務,是因為隨著業務的增長和演化,早期有效的設計決策變得不再有效。

問題不在於技術債務本身,而是我們無法管理這些技術債務。在任何一家公司,首席財務官都知道公司有多少財務債務。他們可以看電子表格、季度報告、付款計劃,可以選擇再融資或出售債務。但如果你問首席技術官,公司有多少技術債務,你會得到一個尷尬的回答:“有很多吧?”

你辦公室裡有一面牆(或板子),我們把它叫作技術債務牆,可以將寫滿問題的便利貼貼在這面牆上。這樣做很容易,我們可以選擇增加、減少、償還或忽略技術債務。當然,這絕不是一個規模化管理技術債務的完整解決方案。它之所以有效,是因為它做起來很容易。

如何做

很簡單:讓債務技術可見,養成習慣,定期溝通協商,放棄控制權。

技術債務牆:讓技術債務無所遁形 1

讓技術債務可見

在團隊工作的地方選一面牆,確保它是公開可見的,給它貼上“技術債務牆”的標籤。畫一個漂亮生動的 logo,確保周圍有便利貼和記號筆。

養成習慣

在開發代碼時你要想想:

  • 是什麼讓你的速度變慢了?是什麼讓代碼變得難以理解?是什麼原因導致 bug 難以跟踪?什麼東西應該被更好地記錄下來或測試?在便利貼上記下你碰到的任何一個技術債務。保持簡短,但要確保你以後仍然看得懂。
  • 估計機會成本:如果不存在這個問題,你原本有多少時間可以用在其他事情上?把它寫在便利貼上。確定好時間標記,例如用點號表示半天。視覺化比是否精確更重要。
  • 估計解決這個技術債務需要多長時間,把它記下來。
  • 或者記下如何解決技術債務。你可能會把它記在問題跟踪系統中,那麼就把問題編號寫在便利貼上。
  • 把便利貼貼在技術債務牆上。
  • 如果有人遇到同樣的問題,添加更多的標記,用來表示他們付出的時間成本。

在引入新的技術債務時,都要添加便利貼。誠實一點,這並不可恥,因為代碼不能代表你。記住,技術債務是一種投資,而不是犯罪——除非你隱瞞債務,如果那樣的話你就是在做假賬!

協商

隨著技術債務牆上的東西越來越多,公司裡的人可能會有點緊張。沒關係,債務總是存在的,你只是把它們顯現出來罷了。

不管是什麼時候,只要有人在已有的便利貼上添加時間點,都要先與團隊討論。將技術債務可能浪費的時間成本與償還技術債務需要花費的時間成本進行比較。償還一個技術債務可能需要一天的時間,但如果每週都會因為這個債務浪費兩個小時,那麼很快就會回本。或者你認為償還某個技術債務不值得?但這已經不是美學或觀點的問題了,這是一個指標收集問題。此時,你們是作為一個團隊在協商權衡。

當有人要為已發現的技術債務添加便利貼時,請先想一下團隊現在是否可以解決這個問題,或者直接把它貼到牆上也可以。沒有證據表明這個問題會讓你繼續付出代價?那麼就讓它繼續收集更多的時間點數。

但是,如果我們是引入新的技術債務,情況就不一樣了。請想一下團隊是否可以選擇不走捷徑,在成本相對較低的時候把問題修復。現在的問題不是“我們現在有時間嗎”,而是“以後再為它支付利息值得嗎?需要支付多少?”。這個問題的答案可以是“沒關係,只管去做吧”,也可以是“其他很多事情都依賴它,我們先把它做好再繼續。”

關鍵在於不要企圖解決所有的技術債務問題,而是要學會協商什麼時候該把它們添加到牆上,什麼時候該修復它們,什麼時候該避免它們。在以前,這些情況幾乎是在不知不覺中發生的。團隊成員在不了解所有事實的情況下添加或償還了技術債務。而現在要開始運用團隊的集體腦力,使用真實數據作為參考。

放棄控制權

現在,我們來看看真正的魔法。由於技術債務牆上的東西是可見的,經理們應該開始注意到它們了。 (如果他們仍然沒有註意到,可以在牆上加一些標有“€”或“$”的大紅色標記,因為錢是全世界通用的語言。)

當團隊要求花時間解決技術債務,這樣做並不會給用戶或業務帶來直接的實際利益。經理們並不知道償還這些技術債務是否重要,可能開發人員只是想要嘗試使用新技術,或者讓代碼更優雅?即使是具有深厚技術背景的經理,如果他們沒有直接參與編碼,也不可能做出很好的判斷。

但有了技術債務牆之後,情況就不一樣了。現在不是意見不意見的問題,也不是要成為一個能夠寫出優雅代碼的工匠程序員的問題,更不是為了要解決具有挑戰性的難題。現在事關事實、數字、債務和要支付的利息以及投資回報。好的代碼就是資產,不好的代碼就是負債。經理們最擅長的就是根據數字做決策。他們有很多方法:CBA、OODA、PCDA、SWOT……

放棄控制權。經理們更了解公司的戰略、預算和風險。讓他們來決定哪些技術債務要償還,並規劃時間表。那些數字可以作為參考。

技巧和陷阱

  • 不要一開始就對所有的技術債務進行全面的審計。當然,你可以花幾天時間來確認所有的技術債務。但之後你需要安排時間,要把它當成一件大事。 “我們會在夏天來償還這些技術債務”,或者“在完成那個大項目之後”,或者乾脆委婉地說“永不”償還。在牆上貼的每一張便利貼都能帶來價值。你可以在以後回過頭來做審計,但不要讓它成為瓶頸。
  • 對於沒有時間點標記的便利貼,我們需要展開討論。有些困擾你的事情實際上可能並不會影響未來的開發。在遇到問題時,只是簡單地加入問題,技術債務牆就會體現出時間成本。你要養成協商技術債務的習慣,而不是做出一次性的努力,回到老路上去。
  • 反過來也是一樣。如果你看到了一些寫得很奇怪的代碼,但它們並沒有浪費你的時間,那就忽略它們。我們並不關心你是否喜歡它們,我們關心的是它們是否會佔用額外的時間。
  • 不要忽略了實體的技術債務牆。不要把所有東西都放在數字工具裡,比如 bug 跟踪器。日誌和指標只有在人們查看它們時才有用,而數字工具很容易把這些信息隱藏起來。牆是可見的,會讓那些信息無所遁形。

結論

在閱讀了我寫的博文後,一家初創公司引入了“技術債務牆”。他們是一家非常小的公司,辦公室所有的牆壁都已經被商業計劃和應用程序模型占滿了,於是他們把便利貼貼在辦公室的一扇窗戶上。有趣的是,當房間開始變暗,他們就知道是時候進行重構了。更重要的是,他們總是在完美主義和快速打入市場這二者之間徘徊,而技術債務牆幫他們突破了這一困境,他們很快就開始行動了。據我們所知,各種公司的團隊都成功地應用了技術債務牆,或許你也可以。

英文原文

Wall of Technical Debt