?
首次采用敏捷方式進(jìn)行開(kāi)發(fā),我想把我們的做法與大家分享下,同時(shí)希望大家指出我們的不足和需要改進(jìn)的地方,讓我們的項(xiàng)目進(jìn)行的更順利,目前項(xiàng)目已過(guò)三分之一,客戶(hù)比較滿意,還算順利。
?
項(xiàng)目簡(jiǎn)介:一個(gè)DMS小項(xiàng)目,預(yù)計(jì)時(shí)間14人月.客戶(hù)需求不是很明確,想一邊做一邊提,適合引入敏捷開(kāi)發(fā)(實(shí)際上用戶(hù)的需求也一直在變,當(dāng)他們看到每次的small release時(shí)都會(huì)有新的想法)。
?
Team主要成員:一個(gè)team leader(兼BA職責(zé)),兩個(gè)工程師,一個(gè)UI設(shè)計(jì)師。
成員主要職責(zé):team leader主要負(fù)責(zé)召開(kāi)會(huì)議,明確每天的開(kāi)發(fā)任務(wù)以及項(xiàng)目的總體大概進(jìn)程,保持團(tuán)隊(duì)成員清楚的知道項(xiàng)目目前的狀態(tài),保持團(tuán)隊(duì)溝通順暢讓團(tuán)隊(duì)保持高昂的士氣。還有個(gè)作用是敢于對(duì)項(xiàng)目的成敗負(fù)責(zé)(當(dāng)然團(tuán)隊(duì)每個(gè)成員都有責(zé)任)。工程師的主要職責(zé)是開(kāi)發(fā),設(shè)計(jì)師主要職責(zé)是UI設(shè)計(jì)。
?
開(kāi)發(fā)環(huán)境配備:硬件:兩個(gè)PC機(jī)兩個(gè)顯示器兩套鼠標(biāo)鍵盤(pán)(工作的時(shí)候切換到一個(gè)PC機(jī)上pair編程,共享一個(gè)主機(jī),用轉(zhuǎn)換器使一個(gè)主機(jī)上面接兩個(gè)顯示器,兩套鼠標(biāo)鍵盤(pán),這樣就不用擠在一個(gè)顯示器前搶一套鼠標(biāo)鍵盤(pán)pair了),一個(gè)測(cè)試服務(wù)器,上裝svn服務(wù)器和cruisecontrol來(lái)管理代碼和實(shí)現(xiàn)定時(shí)自動(dòng)化測(cè)試(測(cè)試一定要自動(dòng)化,這樣可以讓機(jī)器來(lái)干它喜歡并擅長(zhǎng)干的事情,讓工程師專(zhuān)注自己的業(yè)務(wù);我們使用yahoo的一個(gè)模擬熔巖燈來(lái)監(jiān)視測(cè)試結(jié)果。),一個(gè)發(fā)布服務(wù)器,客戶(hù)可以遠(yuǎn)程及時(shí)適用后給出反饋意見(jiàn)和建議。
?
開(kāi)發(fā)簡(jiǎn)介:
一、迭代(Iteration)和發(fā)布(release)計(jì)劃
由于項(xiàng)目開(kāi)發(fā)人員比較少,我們決定采用最短的迭代周期(一周),每個(gè)迭代前由BA評(píng)估story需求風(fēng)險(xiǎn),開(kāi)發(fā)人員評(píng)估story技術(shù)風(fēng)險(xiǎn)和COST,選出能在本輪迭代周期中完成的任務(wù);每個(gè)迭代結(jié)束來(lái)一次small release
?
二、我們對(duì)實(shí)現(xiàn)XP價(jià)值觀所做的努力
1、? 溝通(communication)
再怎么強(qiáng)調(diào)溝通的重要性都不為過(guò),尤其是在軟件行業(yè)。所以在XP中communication被放在首位也不為奇。
我們項(xiàng)目組每天早上開(kāi)一次Standup Meeting,通報(bào)彼此昨天做了哪些工作,以便讓開(kāi)發(fā)小組所有人了解各自的工作情況,然后確定今天要做的task,目前公司地牌兒還不夠遼闊,我們小組還沒(méi)有足夠的地兒掛白板,就把story和task寫(xiě)在Excel表里面;每個(gè)星期一的早上(迭代開(kāi)始前)會(huì)有一個(gè)IPM(迭代計(jì)劃會(huì)議),主要內(nèi)容是大概確定本次迭代周期開(kāi)發(fā)需開(kāi)發(fā)的story,工程師評(píng)估每個(gè)story完成所需的時(shí)間開(kāi);每個(gè)周五下午(迭代結(jié)束前)會(huì)有一個(gè)Retrospective(迭代結(jié)束前會(huì)議),會(huì)議主要內(nèi)容是對(duì)本次迭代做的好的方面以及待改進(jìn)的地方進(jìn)行總結(jié);工程師pari編程。
2、? 簡(jiǎn)單(simplicity)
保持代碼和設(shè)計(jì)盡可能簡(jiǎn)單是系統(tǒng)可擴(kuò)展性和可維護(hù)性的重要保障。關(guān)于Simple Design的討論可見(jiàn)徐X的
Agile 101: Pair Programming & Simple Design? 。kent beck用四個(gè)條件定義了簡(jiǎn)單的系統(tǒng)代碼:運(yùn)行所有的測(cè)試獲得通過(guò)、意圖明確、沒(méi)有重復(fù)、使用盡可能少的類(lèi)和方法。我和accompanier也一直在向這個(gè)目標(biāo)努力。
3、? 反饋(feedback)
沒(méi)有持續(xù)的反饋,敏捷將無(wú)從談起。customer、accompanier、team以及test result的反饋給我們向用戶(hù)交付真正需要的系統(tǒng)提供了保證。我們的BA每天和客戶(hù)溝通,掌握用戶(hù)真正、迫切需要的功能和需求。由于我們的系統(tǒng)是一周發(fā)布一次,所以客戶(hù)也能在很短的時(shí)間內(nèi)知道完成的新功能,并及時(shí)提出改進(jìn)意見(jiàn)和建議(其實(shí)客戶(hù)的需求也是一直不停地在變的)。
4、? 勇氣(courage)
為了使代碼更加清晰、質(zhì)量更好,對(duì)工作代碼進(jìn)行大范圍的修改和重構(gòu)需要勇氣,把某些代碼徹底拋棄需要勇氣,告訴客戶(hù)無(wú)法再添加新功能需要勇氣。我和accompanier目前都還有這樣的勇氣,希望系統(tǒng)越來(lái)越大、代碼越來(lái)越多的時(shí)候還有這樣的勇氣。
?
三、測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(TDD)
關(guān)于TDD我們一直在嘗試尋找更爽的方法,目前采用的是webwork、spring、hibernate的組合框架,在大腦里無(wú)意識(shí)的已經(jīng)存在了三層結(jié)構(gòu),我覺(jué)得采用TDD,這三層結(jié)構(gòu)應(yīng)該是最后被驅(qū)動(dòng)出來(lái)產(chǎn)生的,而不是一開(kāi)始就定好三層,然后再TDD編碼。
我們目前是分別對(duì)每層進(jìn)行TDD,還是覺(jué)得service層驅(qū)動(dòng)最有成就感,看到green bar 就令人興奮,action層老是mock來(lái)mock去的走流程實(shí)在屬?zèng)]啥意思。
最近又看到了
使用Selenium和Castle進(jìn)行測(cè)試驅(qū)動(dòng)開(kāi)發(fā) ,本想采納,但是使用Selenium進(jìn)行至頂向下的驅(qū)動(dòng)的話通過(guò)一個(gè)測(cè)試所需的時(shí)間太長(zhǎng)了,我是對(duì)
green bar有點(diǎn)上癮了的人,不能忍受那么長(zhǎng)時(shí)間的red bar,懷疑它會(huì)對(duì)偶的身心健康造成影響,所以就作罷,還是由底至上的方法使測(cè)試通過(guò)的實(shí)踐最短,不知道各位對(duì)這樣的三層結(jié)構(gòu)是怎么TDD的?
?
Robert C. Martin大叔的TDD三條軍規(guī)如下:
1.除非這能讓失敗的單元測(cè)試通過(guò),否則不允許去編寫(xiě)任何的產(chǎn)品代碼。
2.只允許編寫(xiě)剛好能夠?qū)е率〉膯卧獪y(cè)試。 (編譯失敗也屬于一種失敗)
3.只允許編寫(xiě)剛好能夠?qū)е乱粋€(gè)失敗的單元測(cè)試通過(guò)的產(chǎn)品代碼。
對(duì)于任何功能,一定要從編寫(xiě)它的單元測(cè)試開(kāi)始;但是到了原則2,你就不能再為那個(gè)單元測(cè)試寫(xiě)更多內(nèi)容。只要一出現(xiàn)該單元測(cè)試代碼編譯失敗,或是斷言失敗,你就必須停下來(lái)開(kāi)始編寫(xiě)產(chǎn)品代碼;但是到了原則3,你就只能編寫(xiě)產(chǎn)品代碼,直到讓測(cè)試編譯成功或通過(guò)斷言為準(zhǔn)。
?
這三條軍規(guī)我覺(jué)得太經(jīng)典了,完全做到了才算TDD做到位了。
?
前幾個(gè)迭代周期我們沒(méi)有采用TDD,功能代碼寫(xiě)了然后寫(xiě)測(cè)試,兩個(gè)月后對(duì)系統(tǒng)進(jìn)行了一次比較大的重構(gòu)時(shí),所有的測(cè)試都通過(guò)了,但是發(fā)布上去了還是由bug,所以這種干法是不行的,測(cè)試不能達(dá)到令人滿意的覆蓋度。TDD完全可以使測(cè)試達(dá)到令人滿意的覆蓋度。基本上只要測(cè)試通過(guò)了,就能確定重構(gòu)沒(méi)有對(duì)系統(tǒng)造成影響。
?
四、驗(yàn)收測(cè)試(acceptance test)/客戶(hù)測(cè)試(customer test)
?
五、pair 編程