
「散彈槍式修改」壞味道,容易造成「維護地獄」
「維護地獄」的徵兆
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 的建議是否正確。
文中提到的連結:
- 寫出簡潔程式碼線上課程: https://www.pressplay.cc/link/s/4F2488B3