從維護地獄中拯救你的程式碼:一個軟體重構實戰經驗

更新於 發佈於 閱讀時間約 6 分鐘
「散彈槍式修改」壞味道,容易造成「維護地獄」

「散彈槍式修改」壞味道,容易造成「維護地獄」

「維護地獄」的徵兆

2022 年中,我們在開發的 SEMI EDA 專案,要加某個功能。

當時在規劃這個功能時,我與功能規劃師 JJ 估計這個大約要花 1 個 sprint 吧,也就是二個禮拜。三個 sprints 過去了,這個功能還沒有完成,大夥們還提出這個、那個也要修改。另外發現修改後有幾個單元測試沒有通過,可能要改程式或者是改測試,才能解決問題。工程師們的結論是估計再一個 sprint 就可以完成。

晨間站會結束了以後,我心想,應該是遇到了「維護地獄」。大家的估計,是一種不成熟的估計,就是單純想要趕快完成,沒有考慮到他們說的「這個、那個也要修改」、「許多的單元測試要修,可能改程式,或是改測試」。從描述中,隱約可以感覺到,還有一些他們還沒有看到的問題。另外,我也注意到了,參與的工程師們,似乎不容易看懂這些程式,這是最大的問題了。連程式的理解都有困難,還能夠預估什麼、修改什麼呢?這個功能的維護地獄,應該是早已經開始了。

如果你是 agile / scrum 的 leader,當你發現上述的情況時,你應該要有警覺。如果沒有警覺並且馬上提出對策,可能會讓團隊陷入維護地獄,久久無法脫離。會多久?我曾經聽過一個團隊做一個似乎不大的功能,做了半年,還在做。想必他們內心的壓力只會越來越大吧。我猜,應該是他們團隊中沒有人有這類的知識,來處理維護地獄吧。

開始拯救

此時,如果我不拯救的話,在地獄中徘徊就要好一陣子了。快速地翻過整個系統,總共約有 16,000 行程式。程式檔案數我不記得了,大約數十多個吧。這套系統在當年年底已經包含程式碼都賣掉了,現在我手上也沒有資料可以查。

畢竟初期這個系統架構是我定的,我對它多少有些基礎認識。花了二天快速地瀏覽程式、標註各種味道,大約接近百個吧。

關於(壞)味道,在一些重構或是討論簡潔程式碼的書中都有提到。我是在大約 20 年前,由 Martin Fowler 的《重構:改善既有程式的設計》一書中學到的。另外,我還找了一些線上課程研讀學習,大約花了二萬塊左右吧。又到處找一些可以練習的程式。約莫在二年的時間,我已經把「Trivia 重構」做過三次練習了。從那時起,我對於(壞)味道很敏感,有時還真的感覺聞到一股臭味。真是不可思議,這應該是將知識內化成為本能之後的反應吧。

當時我已經有幾個月沒有看這個專案的程式碼了,系統架構看起來沒有什麼大改變。不過,累積留下的味道,多到讓我驚訝。我在公司有做簡潔程式碼的教育訓練,畢竟大家第一次學到這門知識,還沒有內化成為本能。知道歸知道,應用歸應用,有落差吧。

現在把壞味道標註出來了,先從可讀性著手。可讀性是簡潔程式碼的第一步。可讀性好,能看懂,才有可能進行下一步的重構。在我的線上課程「寫出簡潔程式碼」中,也有提到「重構的優先順序」,第一步,就是提升可讀性。

再來,我大約花了 4 或 5 天,將系統重構改寫,去除這些壞味道。過程中,許多單元測試失敗了,這個也要做改寫。單元測試部份,我大約花了 3 或 4 天。總計剛好在一輪的 sprint 時間內完成。

重構後的程式碼,總計約 6,000 行,比原本的少了一萬行。這其中,還包括刪除一個以前做進去的功能,但是後來不使用了的技術債部份,這個部份大約刪了 3,000 行。總之,這是改善後內聚力集中的效果。

接下來的一輪 sprint,就是撿回原來的工作卡片,把它們做完。這一次,工程師們能看懂程式,很順利地完成了。再下一輪的 sprint,我們又繼續開發新功能,也能順利完成。總算,我們脫離了維護地獄。

壞味道

記憶中,當時看到的味道有(列表項目沒有次序之分,想到就寫):

  • 重覆程式碼
  • 方法過長
  • 類別過大
  • 參數過多
  • 不恰當的命名,造成誤會或錯誤的猜測
  • 過度偏好基礎型別
  • 多層巢狀結構
  • 臨時狀態變數 (這種很可怕,狀態會過期喔。而且單元測試測不出來,整合測試也不容易發現。發生時,也很難找到是哪裡出問題。)
  • 喜歡別人的東西

如果你對於(壞)味道不熟悉,你不妨可以看我的線上課程「寫出簡潔程式碼」說明,網址我放在文章後面。直接看目錄,你可以看到我介紹的 30 種壞味道。

在我們的專案中,上述的壞味道,尤其是「喜歡別人的東西」、「重覆程式碼」以及「過度偏好基礎型別」這幾個,把系統的內聚力打散了,導致系統越寫越大。並且,由於多人開發,各寫各的,每個人只專注在自己的工作卡片,沒有人注意到內聚力已經散掉了這個事實。因此,本來應該抽離出來成為一個聚焦目標的類別或方法,卻已經被分散或是重寫到各個地方了。

AI 能夠幫我們重構程式嗎?

在 AI 時代,我有想過,是不是就交給 AI 來處理這些壞味道?

我的結論是,AI 可以幫助我們,但還是需要人來做決定。畢竟,AI 目前還沒有辦法理解系統大範圍的意圖。多半是你叫它寫什麼,於是 AI 就寫什麼,直接就做出了「重覆程式碼」、「過度偏好基礎型別」或是其它的壞味道。

我知道 Claude Code 可以做大範圍的程式設計,甚至也能重構。只是,操作 Claude Code 的人,必須要有簡潔程式碼的知識,才能夠指揮 AI 做出正確的決定。否則,AI 只會單純的產出結果,可能會產生更多的壞味道,或者偏離設計意圖。

所以,如果讓一個沒有簡潔程式碼知識的人來操作 AI 處理這些壞味道,最後得到的結果是好是壞,只有天知道了。畢竟,指揮 AI 的人沒有這份知識,無法指出要用什麼手段來消除壞味道,以及辨識 AI 的建議是否正確。

文中提到的連結:


留言
avatar-img
留言分享你的想法!
avatar-img
Art Tsai的沙龍
0會員
1內容數
你可能也想看
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
程式設計與技術能力 在現代社會中的重要性越來越明顯,尤其是在人工智能(AI)和自動化技術迅速發展的背景下。理解編程語言,如Python、R等,以及熟悉相關技術架構和工具,能夠幫助個人在這樣的環境中更好地工作。這種能力不僅對技術專業人士至關重要,也對非技術領域的人士日益重要,因為基礎的程式設計知識已
Thumbnail
程式設計與技術能力 在現代社會中的重要性越來越明顯,尤其是在人工智能(AI)和自動化技術迅速發展的背景下。理解編程語言,如Python、R等,以及熟悉相關技術架構和工具,能夠幫助個人在這樣的環境中更好地工作。這種能力不僅對技術專業人士至關重要,也對非技術領域的人士日益重要,因為基礎的程式設計知識已
Thumbnail
本書大多數的內容都以 OO 的概念出發,詳列了許多設計的臭味道,也有大量的例子。個人雖然不會這樣寫程式,但仍是覺得受益良多,至少在 code review 時能更清楚知道該怎麼描述問題。不過,即便不是用 OO 的概念,有些章節還是可以帶來一些想法,用 OO 概念寫程式的人更不該錯過這本好書。
Thumbnail
本書大多數的內容都以 OO 的概念出發,詳列了許多設計的臭味道,也有大量的例子。個人雖然不會這樣寫程式,但仍是覺得受益良多,至少在 code review 時能更清楚知道該怎麼描述問題。不過,即便不是用 OO 的概念,有些章節還是可以帶來一些想法,用 OO 概念寫程式的人更不該錯過這本好書。
Thumbnail
軟體開發專案管理的失敗原因複雜多樣,但管理不善是其中一大原因。學習為軟體開發專案而設的管理方法是有效管理的第一步,需對軟體開發專案的特徵進行評估,選擇合適的軟體開發生命週期和專案管理方法。
Thumbnail
軟體開發專案管理的失敗原因複雜多樣,但管理不善是其中一大原因。學習為軟體開發專案而設的管理方法是有效管理的第一步,需對軟體開發專案的特徵進行評估,選擇合適的軟體開發生命週期和專案管理方法。
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
學習程式語言是一個不容易的過程,但有效的學習方法可以幫助你克服挫折,這篇文章分享了一個程式設計師的學習心得以及一些建議,包括課後實作、短期學習、跟別人比較等注意事項,同時提供了一些相關的教學資源。
Thumbnail
學習程式語言是一個不容易的過程,但有效的學習方法可以幫助你克服挫折,這篇文章分享了一個程式設計師的學習心得以及一些建議,包括課後實作、短期學習、跟別人比較等注意事項,同時提供了一些相關的教學資源。
Thumbnail
這篇文章探討了在軟體開發中的技術債可能來自哪些原因,以及如何自動化偵測與修復技術債。作者透過分享不同情境下的技術債選擇,提供了對於技術債的思考與建議,針對開發人員在需要做出無奈的技術決策時,提供了一些建議。此外,還提供了一些在做出技術決策時的方法,如保留抽象層和避免vendor lock-in。
Thumbnail
這篇文章探討了在軟體開發中的技術債可能來自哪些原因,以及如何自動化偵測與修復技術債。作者透過分享不同情境下的技術債選擇,提供了對於技術債的思考與建議,針對開發人員在需要做出無奈的技術決策時,提供了一些建議。此外,還提供了一些在做出技術決策時的方法,如保留抽象層和避免vendor lock-in。
Thumbnail
程式設計中不可或缺的一部分 介面是使用者與程式互動的媒介,因此介面的設計會影響使用者的體驗和感受。一個清晰明白、易懂的介面,可以讓使用者輕鬆地使用程式,並獲得良好的使用體驗。 需要與程式設計師密切溝通 設計師需要了解程式的功能和需求,並根據使用者的習慣和需求進行設計。設計師和程式設計師之間的溝
Thumbnail
程式設計中不可或缺的一部分 介面是使用者與程式互動的媒介,因此介面的設計會影響使用者的體驗和感受。一個清晰明白、易懂的介面,可以讓使用者輕鬆地使用程式,並獲得良好的使用體驗。 需要與程式設計師密切溝通 設計師需要了解程式的功能和需求,並根據使用者的習慣和需求進行設計。設計師和程式設計師之間的溝
Thumbnail
確保沒有遺漏或錯誤 程式的完整資訊資料對於程式設計至關重要。這是因為只有透過完整的資訊,我們才能確保在程式設計中沒有任何遺漏或錯誤。最終,後台管理扮演著管理系統中所有動作和行為是否符合特定標準的重要角色。 採取不符合預期的行動 這種符合性的重要性在於,當我們設計程式時,希望使用者按照預期的方式
Thumbnail
確保沒有遺漏或錯誤 程式的完整資訊資料對於程式設計至關重要。這是因為只有透過完整的資訊,我們才能確保在程式設計中沒有任何遺漏或錯誤。最終,後台管理扮演著管理系統中所有動作和行為是否符合特定標準的重要角色。 採取不符合預期的行動 這種符合性的重要性在於,當我們設計程式時,希望使用者按照預期的方式
Thumbnail
資料的統合 在程式設計中,其他人通常關心是否注意到執行的細節。作為程式設計師,主要應該關心的是程式的表現,但往往忽略了很多細節,這些細節可以決定程式的好壞。程式的好壞很大程度上取決於資料的統合,也就是資料是否被正規化。 不同類型的資料在系統中呈現一致 正規化可能對一些人來說聽起來很抽象,有些人
Thumbnail
資料的統合 在程式設計中,其他人通常關心是否注意到執行的細節。作為程式設計師,主要應該關心的是程式的表現,但往往忽略了很多細節,這些細節可以決定程式的好壞。程式的好壞很大程度上取決於資料的統合,也就是資料是否被正規化。 不同類型的資料在系統中呈現一致 正規化可能對一些人來說聽起來很抽象,有些人
Thumbnail
系統的分析與規劃 在談到程式設計時,首要的是進行系統的分析與規劃。程式設計的起點通常是系統分析與規劃,這涉及到如何分析和設計系統的大原則和方向。為了達到預期效果,重要的是擁有對產業的清晰邏輯認識和深入了解。 進行深入了解 若要進行系統分析,必須對企業的設計和程式設計的對象進行深入了解,以充分理
Thumbnail
系統的分析與規劃 在談到程式設計時,首要的是進行系統的分析與規劃。程式設計的起點通常是系統分析與規劃,這涉及到如何分析和設計系統的大原則和方向。為了達到預期效果,重要的是擁有對產業的清晰邏輯認識和深入了解。 進行深入了解 若要進行系統分析,必須對企業的設計和程式設計的對象進行深入了解,以充分理
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News