l

2016年8月5日 星期五

再談技術債

August 05 08:37~10:27

螢幕截圖 2016-08-05 10.19.35

 

昨天談技術債(technical debt)有點意猶未盡,今天繼續介紹2015年7/8月發表在IEEE Software上的另一篇文章,標題就叫「Technical Debt」。這是一篇訪問文章,兩位受訪對象曾在InfoQ上寫了〈Managing Technical Debt〉文章。

***

軟體品質有兩種

眾所接知技術債會影響軟體品質,文內提到軟體品質有兩種:

  • 外在品質:使用者、客戶可以直接感受到的品質,例如功能正確性、效率、安全性、錯誤處理能力等。外在品質是產品功能及非功能需求的一部分,是使用者可以直接感受到的產品印象,應該交由產品負責人(product owner)來管理。這一點請鄉民們特別注意,很多時候產品負責人只關心「功能需求」(functional requirement)而把非功能需求(non-functional requirement)交由開發團隊來負責決定。如果非功能需求會直接影響使用者、客戶對於產品的感受,它就應該是「產品規格」的一部分,理應交由產品負責人來管理與決定需求的優先順序。換句話說,產品要具備何種外在品質是商業決定,不是技術決定。相同觀點Teddy在〈敏捷式例外處理設計的第一步:決定例外處理等級〉也曾談過。
  • 內在品質:只有開發人員可以感受到,任何讓修改與維護軟體變的更難或更簡單的因素都會影響內在品質,例如程式碼的可讀性、可修改性、可測性、可擴充性、測試案例是否足夠、軟體架構的選擇等。客戶與非技術人員(老闆、專案經理)無法直接感受到軟體的內在品質,所以你可以把一萬行程式全部寫在main()函數裡面,只要「程式可以動就好了」。除非內在品質惡劣到影響外在品質,在此之前程式寫得好或不好,只有「住在巷子裡的人」(內行的開發人員)知道。

***

欠債一定不好嗎?

如果能做出好軟體相信沒人願意做出爛東西給客戶(迷之音:真的嗎?!),但軟體開發就像任何設計問題一樣,是很多作用力(force)彼此拉扯之後所作出的取捨。這些作用力包含需求不確定性、時程(及時上市的壓力)、開發人員素質(復仇者聯盟 VS天線寶寶加海棉寶寶加派大星團隊)、員工薪資福利、技術熟悉度、專案預算(老闆或客戶願意支付的費用)等。有些專案及時上市的壓力特別大但是需求不確定性又特別高,這是許多新創團隊所面臨的情境。在客戶要什麼都不清楚的狀況下,花時間開發出「內在品質」很高的軟體其實意義不大,反而可能因此延誤上市時間而且耗盡公司資源(現金)。

這時候先犧牲一下內在品質(欠技術債)換取快速上市的商業機會,也是很合理的企業經營決策。只要「外在品質」沒有差到一上市就被打槍,等待確定客戶真正的需求、產品真的有市場之後,此時再回頭提高內在品質,投入資源償還技術債也不遲

***

問題到底出在哪裡?

綜合以上所說,感覺技術債是一種可以用來調度開發時程的工具,而非絕對的惡魔。但為什麼實務上經常發生非技術人員(老闆、產品負責人或專案經理)與技術人員之間因為累積技術債而發生不愉快的事件?Teddy認為有以下幾個原因:

  • 非技術人員經常用「驗證使用者需求為名」要求開發團隊先把功能作出來再說。這種恣意累積技術債(債多不愁)的心態久而久之在社會上已經養成「欠錢不還」的習慣,就算已經確認產品有市場,卻還是不願意投資資源償還技術債,硬要在一堆爛程式碼之上加上偉大的功能(迷之音:一種類似「企業賺錢卻不加薪」的概念)。殊不知此時技術債所產生的利息已經大到讓開發團隊光是還利息就已經忙得不可開交,根本沒有時間開發新功能,所以長久會引起開發人員反彈。這種狀況就是Teddy經常說的「軟體變成硬體」。
  • 開發人員有著非常崇高的理想,希望軟體內、外品質隨時都保持著沒有技術債的情況,以便每個開發週期結束都可以產生可以直接交付給客戶的軟體。在這種情況下,內、外在品質變成開發人員不可退讓的底線,對於非技術人員或業務人員提出「欠技術債」以換取快速上市的要求強烈抗拒。這種抗拒並非沒有道理,因為技術人員被「倒債」的經驗太多了,每次都說先欠一下等以後有空的時後再來還債,但實際上「有空的時候」從來都沒發生過,技術債也就一直累積。長期以來「有借無還」的經驗太多,也就導致開發人員與業務人員之間彼此產生不信任感。
  • 技術債所產生的利息有高有低,就算公司願意投入資源還債,但開發人員可能會覺得用來還債的資源不夠,無法清償全部欠債而感到憤憤不平。還債時應該要調整一下心態,從利息最高、最拖慢開發速度的技術債開始還起。有些技術債利息很低甚至幾乎是「無息貸款」,就可以先放一放暫時不處理。

商業目標專案類型與所處的生命週期階段都會影響我們對於技術債的態度,沒有一個絕對應該怎麼做的標準答案。Teddy認識不少人讀了《精實創業》這本書,書中提到在確定產品有市場之前可以先犧牲品質換取快速上市,於是他們就卯起來「犧牲品質」以換取快速上市。殊不知他們犧牲的不但是內部品質,很多時候連外部品質也一起犧牲了。在這種情況下,快速上市所獲得的回饋其可信度就大打折扣。使用者不見得不喜歡這個功能,而是這個功能根本不能用、不好用。

還有一點要再三提醒,驗證產品有市場價值之後,要投入資源償還技術債。勿在浮沙建高塔。

***

友藏內心獨白:信用不好就不容易借到錢。

沒有留言:

張貼留言