標籤彙整: YAGNI

軟體開發:你不會用到

最近在從事軟體開發時,常有兩種荒謬的感覺。

情境一


為了滿足新的需求,我需要寫一個類別。
總覺得可以多寫幾個函式,創造出某種漂亮的架構…算了,我先寫幾個蠢函式來用好了。
(動手寫code)…。
咦?突然就結束了。已經成功了,這幾個蠢函式已經滿足所有需求了。
不想進一步去改寫成什麼漂亮架構了。

真荒謬,我是不是只做了半成品就交差?

情境二


為了滿足新的需求,我需要寫一個類別。
總覺得可以多寫幾個函式,創造出某種漂亮的架構…算了,我先寫幾個蠢函式來用好了。
(動手寫code)…。
啊,解決一部份問題了,不過這幾個蠢函式果然不夠用。
只好把這幾個蠢函式全部刪掉重寫了。
(動手寫code)…。
多寫幾個函式,創造出漂亮的架構了。解決問題了!
我是不是一開始不應該寫那幾個蠢函式啊?
明明感覺不太夠用卻還繼續寫,果然全部刪掉重寫了。浪費了一些時間。

真荒謬,每次都硬從蠢函式開始寫。根本是刻意在浪費時間?

思考這個問題的時候,找到了一篇相關的文章。
翻譯出來跟各位分享。
原文:You Arent Gonna Need It


你不會用到

「你不會用到」是極限編程的一種實踐:

「永遠在你真正需要的時候才去實作,別預估需要就去實作。」

即使你非常、非常、非常確定你等一下就會需要這個功能,也不要現在就實作。事情通常有兩種發展:
一、你發現根本不需要
二、你發現真正需要的跟一開始預估的差很多

這不是在說軟體的彈性不重要。這是在說,你不應該根據你以為晚點需要的東西去過度設計。

這種實踐有兩個主要理由:

* 節省時間。因為你沒去寫那些最後發現並不需要的程式碼。
* 讓程式碼更漂亮。因為你沒讓一開始那多少有點弄錯的預估去汙染你的程式碼。

RonJeffries提出一個情境說明:
你正在寫某個類別。你剛加上幾個你需要的功能。你知道你晚點會需要其他幾個功能。如果你現在不需要,就不要現在加進去。
為什麼?

「好吧,Sam,你幹嘛現在加上去?」
「呃,Ron,這會讓我們節省一些時間啊。」

除非你我活在平行宇宙,不然你無法現在多做事情,卻在「節省」時間。除非晚點做這件事比現在做更花時間。所以你的意思是:

「如果現在多花點功夫做好它,最後總共花的時間會比較少。」

除非你我的專案長不一樣,不然專案都是那副德性:現在要做的事情總是有夠多。在事情很多的時候還想做更多,是非常糟糕的。

然後除非你我的腦袋構造長不一樣,不然很有可能你最後會發現根本用不著,或是你用到的時候必須重寫、修正這些程式碼。不管哪個發生了,總體來看你都是在浪費時間,還導致你到時無法把真正需要的東西加進去。

「可是,Ron,我現在知道怎麼做,晚點我可能會忘記。」
「所以,Sam,你是在說你寫的類別複雜到你本人也無法維護?」

保持簡單。如果你需要,晚點再加上去即可。如果你不需要,根本別費這功夫了。今天就好好休息吧。

(Photo via Héctor García, CC licensed.)