jim yeh on 一月 8th, 2010

1/9 同人要在新竹分享敏捷開發方法的經驗與心得。很湊巧地,在這個禮拜我經歷了有關測試驅動開發與重構實務方法的熱烈討論,也先後寫了三篇文章來表達我的觀點。不過,前面寫的那三篇文章比較傾向用原理的角度來看測試驅動開發與重構,對於沒有接觸過測試驅動開發與重構實務的讀者而言,可能比較不容易體會。那麼有沒有比較生活化的例子可以用來隱喻測試驅動開發和重構呢?同人覺得用最近我們搬家整理房間的經驗,正好可以隱喻這些實務的開發方法。

同人最近才剛搬完家,一些還沒整理的東西都封裝在一箱一箱的紙箱中,我們也只能將它們暫時堆放在固定的角落,等到我們有空再慢慢整理。不過,老婆在育嬰假即將結束之前,剛好女兒的三歲生日也快到了,她希望幫女兒辦一個生日派對。邀集常和女兒在一起玩的小朋友以及他們的媽媽來我們家玩。

有了之前大家搓湯圓的經驗,辦生日派對應該不成問題,只是家裡有很多東西都還沒整理好,客廳也亂糟糟的,要如何邀請朋友來我們家玩呢?

所以要邀請朋友來我們家幫女兒辦生日派對,第一要務就是要把家裡整理乾淨,至少客廳要整理到看起來像個樣子。在沒有足夠時間整理之下,我們應該把客廳已經拆封紙箱內的物品,可以歸位的就將它歸位,還沒辦法歸位的物品則必須找地方將它們暫放,而尚未拆封的紙箱則必須在書房找位置整齊堆放,以免阻礙平常生活所需的動線與空間。

不過,也不能只把沒有拆封的箱子全部「藏起來」,客人來家裡參加生日派對,有關吃的、喝的、玩的相關物品,我們都必須將它們找出來,才能滿足為女兒舉辦生日派對的需要。

所以基於為女兒舉辦生日派對的需要,我們把派對需要用到的東西找出來,把與舉辦派對無關的東西收起來,等有那一天需要用到的時候再拿出來用。屆時,原來在派對需要用到的東西可能又會變得不符合實際需要的東西,我們會將它們收起來或是清理掉。不過,慢慢地,我們會清楚在我們搬過來的這個地方,我們會愈來愈清楚我們真正需要的物品是什麼,然後封箱的物品會愈來愈少,讓生活空間變大,可以容納更多生活對空間的需求。

以軟體開發的觀點來看,測試驅動開發的測試案例就好像整理房間的功能性需求一樣,為了符合舉辦生日派對物品及空間的需求。當決定了這個準則以後,我們就會知道我們實際上需要什麼東西,不需要的東西該放到什麼地方。於是我們可以花最少的努力來達成我們的目標,就好像測試驅動開發用最簡單的實作方式完成功能。至於重構是,當發現需求改變時,我們會再次調整空間的使用並整理需要的物品,以容納實際使用的需要。

其實,如果時間足夠,整理房間最完美的方式是把東西拆封定位,放到該放的位置上,並且清理掉不需要的東西。但現實的問題是,我們沒有足夠的時間,以及我們並不知道那些東西是我們真正需要的。有時候,今天我們認為需要的東西,明天可能根本就用不到,但如果丟掉它們,改天需要用的時候卻會遺憾我們已經丟掉了。

所以,比較敏捷的做法是整理現在需要用到的東西,以回應我們最重要的需求。一開始的需求不複雜,所以不需要花很大的心力來整理,等到對房間空間利用的需要更清楚的時候,再來更進一步的整理房間擺設。

整理房間是如此簡單明瞭地表現敏捷軟體開發的開發邏輯,相信寫到這裡,大家可以更清楚為什麼測試驅動開發並不一定要馬上重構程式碼了吧?尤其是徹底重構,整理房間的例子很清楚呈現:如果可以徹底重構,那我們也可以在第一時間把房間整理好,那也沒有重構這回事了。但從過去搬家整理房間的經驗看到,這根本就做不到呀!

延伸閱讀:(其它與測試驅動開發與重構的文章)
測試驅動開發的精神
測試驅動開發要徹底重構?
測試驅動開發的步驟



     

Leave a Reply

You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="">