為什麼開發人員總是會產生過度設計的程式碼?

為什麼開發人員總是會產生過度設計的程式碼?

問題的來源

什麼是過度設計?開發人員為什麼會過度設計?過度設計與預先設計有什麼關係?過度設計是最終導致的結果,而預先設計無非是想讓軟體的程式碼撰寫落在刀口上,減少時間的支出來產生可交付的程式碼。但是這件事情好像沒這麼簡單?即便談需求的是我,我還是會有過度設計的程式碼產生,為什麼回如此呢?但這樣真的完全不好嗎?

會產生過度設計可能有以下幾個原因。

  1. 分析時間過久

以前筆者曾提過傳統的瀑布式容易造成分析時間過長,最終就導致過度的設計而不自知,撰寫程式碼時因為關起門來寫,一些就是 3 個月或半年,脫節的需求產出的程式碼可能大部分不是客戶要的,這也是種過度設計,只是大部分設計出不正確的程式碼。

這會產生比較嚴重的反效果,一個是因為需求的脫節,即便抓回方向,但錯誤的設計已經使系統長歪,要修復往往非常的耗時耗力,甚至打掉重練比較快的情況也可能發生。

  1. 搞不清楚客戶說什麼

所謂隔行如隔山,軟體公司常只接針對特定領域的專案,或熟悉的領域進行客製化,好比筆者10幾年前曾待過專接流通業的 SI 公司,突然接金融電信領域的專案通常前 1-2 個失敗機率極高,為什麼,因為不熟悉這個產業的通用語言。然而這樣的接案就是極高的風險,筆者甚至分享以前遭遇到的經驗,曾經有同行求救於我們公司,他們因為不熟悉該領域硬是接下後無法收尾,而求助於我們公司熟悉金融領域的部門,當然,最後我們也沒有答應協助收這個爛攤子。

所以,Gelis 認為,搞清楚客戶說什麼常重要,在三地確認客戶腦袋的想法也很種要。

  1. 需求不明確

有可能需求訪談客戶主事者不在,或者具備決定權剛好不在、又或者客戶因為處於新員交接、正在熟悉此業務,所提需求自然諸多漏洞 + 沒想清楚。這筆者就曾遇過客戶端兩位經理在訪談會議時爭吵需求執行內容,讓在場的廠商非常傻眼,很想請他們去廁所打一架看誰贏了,我就做哪一個需求。

或者純粹是使用者想太多,想變更需求。或者自己搞不懂自己想要什麼,這比較常見。

也有可能開發團隊最後自己腦補,產生了一些設計,結果最後又不同於客戶確認的規格內容,這也是種過度設計,因為你設計了一堆不需要的架構內容。

如此一來,程式碼修修改改,不產生技術債都難。

  1. 保留設計

這接續前面的需求不明確,就因為需求不明確,所以開發人員就做了許多『預先設計』的保留,以應付未來當 user 又說這個需求要做時,預先保留的設計便派上的用場。但此舉也有可能讓一些設計從未需要使用到,最終會導致累贅又未使用的爛 code 越來越多,最後搞不清楚哪一些是現有 Business 使用的?哪一些是預留的?最後導致複雜度增加,而形成重構困難,因為一些後來根本用不上的設計參雜其中,反而增加技術債。嚴重時,可能部分打掉重練,這又形成一種嚴重的浪費,因為最糟情況專案也有可能因此失敗。

  1. 試驗新技術

這也是種常見的情況,當有一個全新的專案時,因為通常全新的專案沒有過往的技術包袱,於是開發人員就想利用這個專案練練使用新的技術是常有的事情,但新的技術可能有一定的學習曲線,在有時程壓力的專案裡當遭遇到技術的使用問題時,往往得花費數日,甚至無法解決,最後反而壓縮到專案的驗收時間。

之前我曾在[軟體開發之路(https://www.facebook.com/groups/361804473860062/permalink/8216510725056025/)]貼過就是探討 Side Project 測試新技術的相關貼文,試驗新技術比較適合在 Side Project 上練功,因為專案通常不是你新技術的試煉場,這得看情況,在時程壓力之下,不熟悉的技術比較容易產生過多的設計 或 錯誤的設計爾後最後形成另一種技術債。

結語:

其實我認為,過度設計這件事情在專案開發中是一種,像 Bug 一樣無法避免的正常情況,正常發揮就對了!XD 什麼?老師..你在說什麼!?我是說,軟體設計本來就會先設計、爾後才撰寫程式碼,難道你沒想清楚就開始寫 code?😂好.. 那既然無法避免,那如何降到最低?或者是怎麼拿捏分寸?其實這很難回答,沒有標準答案,總之你得搞清楚方向、有個全貌+並收斂、還有知道應該要做什麼時,才開始動工寫 code

好了,後來有人問我,到底是過多的設計寫 code 傷害比較小,還是不進行預先設計就寫 code 的傷害比較小?我的建議是,我還是寧可稍微進行多一點點的預先設計會 "優" 於完全的不設計,我的多一點點是=真的就是 "一點點" 不多不少,多個 5% 就好,因為多 5% 的預先設計頂多是這 5% 打掉從練;好過『完全不設計』就『直接寫』 code 最後整個打掉重練來的更好。

迷之音:

不能 10% 嗎?其實這沒有標準答案,就像在【API 設計原則】一書中 Dave Thomas 曾說過:過早設計是愚蠢的、但不提早設計是更愚蠢的。

延伸閱讀:

(1). 關於『預先設計』 vs. 『過度設計』
https://www.facebook.com/groups/361804473860062/permalink/7175055019201606/

留言

這個網誌中的熱門文章

軟體工程師 - 成長的 10 個階段

常見的程式碼壞味道(Code Smell or Bad Smell)

什麼是 gRPC ?