閒談軟體設計:技術債是選擇來的

更新於 2024/03/23閱讀時間約 5 分鐘
raw-image


這一篇的契機,其實是很久之前曾在社群媒體看到一張佛系技術債的圖,當時就在代辦事項裡留個紀錄,不過一直都被其他題目插隊 (代表我很 agile,更重要的先寫,精簡 ── 或最大化未完成工作量之技藝 ── 是不可或缺的),但年代久遠,我已經忘記那張圖上有那些文字了,印象中是不看、不找、不改,程式自然會變好的樣子,稱為佛系技術債。

事隔多日,會把這題目再拿出來,是前陣子回母校聽了一場有趣的演講,主講人是《Software Architecture in Practice》、《Designing Software Architectures: A Practical Approach》等知名著作的作者 Rick Kazman,題目是《Finding and fixing Design Debt》,內容主要介紹如何自動化偵測六種設計上的壞味道 (個人覺得還是比較偏 code level 的設計壞味道,無法找出 high level 的 conceptual design 問題)。

演講提到一個重要的觀念,設計債或技術債要能自動化被偵測出來,時時做才會願意修,就好像很多專案會在 CI 上跑 CPD/PMDSonarQube 等靜態分析檢測,提醒團隊整體 code base 的品質如何。這是偏知難行易的情況,知道債在哪就容易改。

提問時間,有一位應該是有在業界待過的男生問道:「我有能力說服我的主管給資源修技術債,但我要如何說服同儕修技術債?特別是他不覺得這段程式有問題?」,業界情況百百種,也會有另一種是團隊知道有技術債,但無奈沒有資源 (或是工程師自己拿下班後的時間)。這是知易行難的情況,其實有點 sense 的開發人員,大概都知道哪裡有技術債...

先不管是知難行易或是知易行難,是否有想過為什麼借用「債」這個詞?一般的生活中,錢不夠,但需要車,於是跟銀行貸款買車 (租車其實也是一種方式,但不夠酷),然後每個月還利息跟本金。車能幫助產生新的價值,所以即便要還利息還是件值得的事。也就是說,我們會為了某個未來可能有助益的目標 (買車),願意欠債去提前去完成,而這個助益的價值高於利息。

但在軟體開發中呢?利息是什麼?在演講中有提到幾個:開發效率降低、產生的 bugs 數變多、開發體驗變差可能導致人員離職等等。一般生活中的利息是錢,白紙黑字很清楚,但上述的幾點卻很難量化。所以很難判斷助益的價值是否高於利息...

自己的觀察是技術債都是選擇來的,只是這個選擇有幾種可能:

無知的選擇。這裡的無知是中性詞,並不是在罵人。軟體開發的領域,技術一直在革新,沒有人是無所不知的,即便是資深的的工程師也會有盲點,只是資歷較淺的工程師通常比較容易做出無知的選擇,因為不知道有更好的設計。這個階段,比較是知難行易,有工具自動化的偵測確實能幫助團隊移除技術債,或是透過 code review,讓資深的工程師有機會介紹更好的設計來避免留下技術債。

當下的選擇。根據當下已知的需求,在眾人討論後做出的合適選擇,但可能隨著時間,業務規模變大或方向轉換,當時的選擇成為了現在的阻礙,這種情況蠻常發生的,但通常是利息開始變重,團隊才會有明顯的感知,能靠自動化的工具時時提醒團隊絕對是好事。

無奈的選擇。之所以無奈,就是團隊知道這樣不好,但可能為了時程,為了快速搶佔市場或是測試市場,團隊只好選擇一個較快但是不好的設計。這是刻意留下的技術債,所以需要一個清單管理這些刻意留下的技術債,日後要安排時間還,但有多少公司確實還債呢?在難以量化的利息前,決策者能否很好地判斷:要欠新的債去追求更大的目標,還是停下腳步來還債?於是,通常是到利息痛到受不了時才決定要還債 (或是工程師自己受不了,用下班的時間還債)。

這裡分享一個故事,大家覺得這是哪一種選擇:

一個小 app,是針對某個知名客戶做的新嘗試,由於不知道之後會有多少客戶會使用,加上要用的客戶很急,於是當時決定以最快速最簡單的方式,要在數天內就交付給客戶,承接的工程師想:至少套個簡單的 MVC 吧?但由於時間會拉長,最後就寫成一團能動的泥球。而這個 app 後來越來越多客戶使用,工程師只好用下班之餘的時間慢慢修改...

事實上,技術債是還活著的公司才需要考慮跟煩惱的,如果產品失敗,公司倒閉了,技術債就不用煩惱了,當然也會有人說:「就是因為技術債才拖垮產品的。」這句話可能是對的,但由於難以量化技術債帶來的影響,沒有充分的證據來證明這句話。因此,我不會說永遠不要欠技術債,畢竟無奈的選擇很常出現。

但是,即便要貸款,也有多種選擇,可以全額貸款,也可以部分額度貸款,技術債也是一樣,排除無知的選擇和當下的選擇,在做出無奈的選擇時,個人的建議是不要 all in,和決策者討論一個平衡點,讓之後還債時能比較輕鬆一點

特別是某些技術決策一旦決定了,後面要再修改就非常痛苦。像是資料庫的選擇,一開始可能沒有大量的資料,沒有特別的感覺,當資料越來越多,不同資料庫可能遇到的狀況不同,但都會慢慢開始浮現,這時不只程式要轉換很麻煩,光是資料要轉換就是一件苦差事。所以,最起碼,存取資料庫一定要保留抽象層 (參閱閒談軟體設計:Repository)。

另外,便是避免 vendor lock-in,通常技術廠商會提供不少開發上的糖衣,讓使用該廠商的技術時,省去不少工夫或時間,一開始開發效率會很好,但系統流量開始增加後,和資料庫一樣,也是會有奇怪的問題冒出來,此時,如果已經被廠商鎖死時,轉換也是相當痛苦。解決辦法還是一樣,至少留下抽象層隔離 (參閱閒談軟體設計:友善的距離)。

也就是說,不管要欠什麼樣的技術債,切記,抽象層花不了太多的時間 (不是零,也不見得很少),卻可以讓之後要還債時,容易一點。


avatar-img
53會員
104內容數
這是從 Medium 開始的一個專題,主要是想用輕鬆閒談的方式,分享這幾年軟體開發的心得,原本比較侷限於軟體架構,但這幾年的文章不僅限於架構,也聊不少流程相關的心得,所以趁換平台,順勢換成閒談軟體設計。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Spirit的沙龍 的其他內容
今天來聊個最近很夯的主題 DDD,但不是 DDD 的本尊 Domain Driven Design,而是無所不在的 Database Driven Design,Database Driven Design 不是不好,只是你的模型容易變成貧血模型,邏輯都集中在 service 層等等。
有趣的是,Model 其實沒什麼嚴格的定義,所以每個人對 Model 的解讀也不盡相同,有人覺得資料怎麼儲存屬於 Model 的一部份 (受 ORM 工具的影響),有人覺得工作流程 (workflow) 是 Model 的一部份,我個人也有自己的想法,而且隨專案的規模和特性,也不是總是一樣的。
起源是當時 Facebook 有篇文章討論不少人分不清楚上述二者的差別,當時寫了首部曲《閒談軟體設計:API Naming Style》,接著是《閒談軟體設計:內部函式庫》,但始終沒談到 library 和 framework 的差別,主要是沒有好的例子,這次這例子還蠻不錯的。
我自己偏好用 Repository 搭配 decorator 來管理 cache,而不是在 controller 層或是到處都有快取的邏輯,如果程式都是透過 Repository 更新資料,Repository 就會是一個不錯的地方更新快取,邏輯也就不會散亂在各處了。
提到後端工程師,似乎就只是開發 API,但一個複雜的系統其實不太可能只透過 API 就能完成,例如一個簡單的功能,註冊會員,其實是由好幾個不同類型的工作互相配合,您才能收到開通信,才確保資料庫不會有一堆未開通帳號等。所以今天就來聊聊一個系統有幾種不同執行方式的工作。
最近隨著 FP 的流行,immutability 一直被提倡,物件有狀態,會被修改好像是一種惡,但真是如此?immutability 很好,但所謂的狀態就是會隨著操作變動,差別只在於變動發生在哪裡?
今天來聊個最近很夯的主題 DDD,但不是 DDD 的本尊 Domain Driven Design,而是無所不在的 Database Driven Design,Database Driven Design 不是不好,只是你的模型容易變成貧血模型,邏輯都集中在 service 層等等。
有趣的是,Model 其實沒什麼嚴格的定義,所以每個人對 Model 的解讀也不盡相同,有人覺得資料怎麼儲存屬於 Model 的一部份 (受 ORM 工具的影響),有人覺得工作流程 (workflow) 是 Model 的一部份,我個人也有自己的想法,而且隨專案的規模和特性,也不是總是一樣的。
起源是當時 Facebook 有篇文章討論不少人分不清楚上述二者的差別,當時寫了首部曲《閒談軟體設計:API Naming Style》,接著是《閒談軟體設計:內部函式庫》,但始終沒談到 library 和 framework 的差別,主要是沒有好的例子,這次這例子還蠻不錯的。
我自己偏好用 Repository 搭配 decorator 來管理 cache,而不是在 controller 層或是到處都有快取的邏輯,如果程式都是透過 Repository 更新資料,Repository 就會是一個不錯的地方更新快取,邏輯也就不會散亂在各處了。
提到後端工程師,似乎就只是開發 API,但一個複雜的系統其實不太可能只透過 API 就能完成,例如一個簡單的功能,註冊會員,其實是由好幾個不同類型的工作互相配合,您才能收到開通信,才確保資料庫不會有一堆未開通帳號等。所以今天就來聊聊一個系統有幾種不同執行方式的工作。
最近隨著 FP 的流行,immutability 一直被提倡,物件有狀態,會被修改好像是一種惡,但真是如此?immutability 很好,但所謂的狀態就是會隨著操作變動,差別只在於變動發生在哪裡?
你可能也想看
Google News 追蹤
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
一、從小觀察 從上電腦課學會用 Excel 這個文書處理軟體時開始注意到爸爸有用 Excel 記帳的習慣(簡單記錄,有時候會忘記金額所以不一定確實),每次爸爸發現我在觀察他記帳的時候一定會對我說:「固定支出越少每個月才能存到更多錢。」以及「不要小看雜支,常常花最多花得最莫名其妙的就是雜支。」 高
Thumbnail
看到有人因為這次的事情在說這是因為沒有校園沒有髮禁、禁止體罰、延後到校時間導致學生逐漸沒有紀律,覺得自己什麼都能做......我第一個想到的是我爸說他高中時畢業典禮教官只要走得慢一點一定會被憤怒的學生蓋布袋拖去打。發生這樣的事情當然得檢討,但希望不是以一種意氣用事、情緒主導的心態......
Thumbnail
「一群人所決定的,就是對的嗎?」 這是民主的盲點也是缺點
Thumbnail
黑色的咖啡始於白色的花。 初春在古坑淺山區散步,花香勾人,一轉過頭就與陽光下的白精靈打了照面。 (本文為之前投稿大人的四季的貼文,當初倉促寫成,沒有得獎也滿合理。但是我很喜歡那個瞬間的美好,遂放上來分享。)
Thumbnail
前言須知-《閒人隨筆》 看官沒錯,歡迎來到閒人的復耕系列《閒人隨筆》,沒錯本系列所有作品是閒人將以往作品重新經查證,彙整的新文章。白話說法補足故事彙整或翻譯失誤等。
Thumbnail
最近身旁有幾位正在懷孕、或剛生產完的朋友,讓我想起自己在懷孕期間印象最深刻的三件「怪事」,其中又以第三件事最誇張。
Thumbnail
不知道大家在買房之前是不是都會參考親朋好友的意見,或是上網看一些買房注意事項,有時候考慮了這塊就忘了那塊,考慮的那塊又忘了這塊.......
Thumbnail
婚姻是人生大事,對溥儀尤其如此,因為如果皇帝大婚,就代表溥儀可以脫離眾多便宜老媽的束縛而得以親政。 但詭異的是,這個可以讓他脫離便宜老媽掌控的婚姻,卻還是要由便宜老媽進行主導並且居中角力......
Thumbnail
上次我提到:溥儀就是個死小孩。其實這不能全怪溥儀,而要怪詭異的宮廷教育及生活制度......
Thumbnail
近期電影「末代皇帝」重新修復上映。 為了推坑這部經典之作,本人決定以溥儀本身的自傳《我的前半生》為主要基底,和大家談一些電影中礙於篇幅或是藝術改編,而不容易察覺或是沒有呈現的真實歷史。
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
一、從小觀察 從上電腦課學會用 Excel 這個文書處理軟體時開始注意到爸爸有用 Excel 記帳的習慣(簡單記錄,有時候會忘記金額所以不一定確實),每次爸爸發現我在觀察他記帳的時候一定會對我說:「固定支出越少每個月才能存到更多錢。」以及「不要小看雜支,常常花最多花得最莫名其妙的就是雜支。」 高
Thumbnail
看到有人因為這次的事情在說這是因為沒有校園沒有髮禁、禁止體罰、延後到校時間導致學生逐漸沒有紀律,覺得自己什麼都能做......我第一個想到的是我爸說他高中時畢業典禮教官只要走得慢一點一定會被憤怒的學生蓋布袋拖去打。發生這樣的事情當然得檢討,但希望不是以一種意氣用事、情緒主導的心態......
Thumbnail
「一群人所決定的,就是對的嗎?」 這是民主的盲點也是缺點
Thumbnail
黑色的咖啡始於白色的花。 初春在古坑淺山區散步,花香勾人,一轉過頭就與陽光下的白精靈打了照面。 (本文為之前投稿大人的四季的貼文,當初倉促寫成,沒有得獎也滿合理。但是我很喜歡那個瞬間的美好,遂放上來分享。)
Thumbnail
前言須知-《閒人隨筆》 看官沒錯,歡迎來到閒人的復耕系列《閒人隨筆》,沒錯本系列所有作品是閒人將以往作品重新經查證,彙整的新文章。白話說法補足故事彙整或翻譯失誤等。
Thumbnail
最近身旁有幾位正在懷孕、或剛生產完的朋友,讓我想起自己在懷孕期間印象最深刻的三件「怪事」,其中又以第三件事最誇張。
Thumbnail
不知道大家在買房之前是不是都會參考親朋好友的意見,或是上網看一些買房注意事項,有時候考慮了這塊就忘了那塊,考慮的那塊又忘了這塊.......
Thumbnail
婚姻是人生大事,對溥儀尤其如此,因為如果皇帝大婚,就代表溥儀可以脫離眾多便宜老媽的束縛而得以親政。 但詭異的是,這個可以讓他脫離便宜老媽掌控的婚姻,卻還是要由便宜老媽進行主導並且居中角力......
Thumbnail
上次我提到:溥儀就是個死小孩。其實這不能全怪溥儀,而要怪詭異的宮廷教育及生活制度......
Thumbnail
近期電影「末代皇帝」重新修復上映。 為了推坑這部經典之作,本人決定以溥儀本身的自傳《我的前半生》為主要基底,和大家談一些電影中礙於篇幅或是藝術改編,而不容易察覺或是沒有呈現的真實歷史。