作者:Amr Elssamadisy 著,simaetin 譯
本文選自:UMLCHINA
2002年05月13日
我們在ThoughtWorks這樣的大型項目中應用XP方法的時間超過了15個月。這個項目開始于三年前,那時它有大量的需求文檔和幾個獨立的功能小組。從2000年1月起,我們決定應用XP,雖然當時我們已經知道XP并不適用于大型項目。那時,我們需要向客戶提交功能演示,并要通過提交一個工作子集而不僅僅是原型來贏得他們的信心(我們在團隊中有超過25名開發人員和大約15名分析員)。但我們并未準備好功能,各個組都使用自己的代碼框架,一個完整的應用無從談起。簡短地說,就是客戶想要看到點什么,但我們還沒有真正的功能。應該說開發的第一迭代期是成功的:我們給客戶提交了一個真正的應用子集。成功的首要原因是我們讓來自Asset,
AR 和GUI組從事不同工作的開發者融合在一起。當然,其間也有"成長的煩惱":在分析員和開發者之間發生某些個人沖突,但我們成功跨越了這些障礙。那時一切都很美好:我們以飛快的速度成功地提交了功能演示,但隨著時間的流逝和項目的繼續,有些事情卻不如我們所愿。這就是這篇文章要講述的內容:我們真正的收獲在"蜜月"期后,關于我們如何在一年半中管理一個50人的項目開發并及時完成階段性的提交(盡管有時并不成功),關于我們經歷的痛苦,我們后續的工作,我們最終學到的以及作為改進要用到下一個項目中的經驗。
首先,我們給出我們開始的狀況:15個月前我們是如何應用XP的,然后展示我們現在的XP應用情況。也就是說,下面將討論我們改變技術的原因。這是一個自然選擇的過程,它剔除了許多不好的想法,或把它們改造成更有效的方法,使之更適于大型項目。最后我們將總結并給出在大型項目中使用XP的謹慎建議。
大型項目中XP的元素
好吧,讓我們來進入正題。我們開發和分析的隊伍由大約35名開發人員、15名分析人員和10名QA組成。開發人員依賴分析人員作為項目的客戶。盡管有實際的客戶,分析人員還是要協同工作以便有選擇地做出客戶決策。下表演示了[1]所討論的XP基本元素并簡要介紹了這些方面如何應用到項目的各個階段。我們用這個表來分析我們團隊自然選擇的實踐,以及書本上的XP如何應用到一個超過50人的大型項目中。
計劃 | 提交周期 | 比喻 | 設計的簡單性 | 測試 | 重構 | |
1/2000 | 大跨度的迭代計劃會議。開發和分析組的全部成員整天在一起討論新的故事卡片和預估。大多數開發者簽入(sign up)新的功能。 | 1個月 | 無 | 轉變已有的代碼基準。已有的代碼依然復雜,但新的代碼要盡可能簡單。這個階段包括拋棄老的代碼和重寫那些"今后可能會被用到"的功能代碼。 | 單元測試開始于一些新的代碼。推動建立一個大的測試基準。QA做所有的功能測試并有權留棄故事卡片。 | 對于舊有代碼,如有必要就進行重構。 |
7/2000 | 基本同1/2000,但確實感覺十分低效。多數與會者沒能很好地參與。拖沓的討論,50人的會議是無法忍受的。 | 1個月 | 無 | 以盡可能簡單的原則繼續設計。完成對已有設計的重構。完成代碼會審,旨在全體范圍中討論新設計以便整個團隊了解代碼和設計的發展趨勢。 | 更好的單元測試覆蓋更大的范圍,盡管沒有完全覆蓋。代碼功能測試幫助覆蓋測試范圍。 | 多數開發人員埋頭于新功能的開發,很少會去做重構。代碼基準在迭代期末向QA組提交卡片時變得糟糕起來。 |
1/2001 | 希望能盡快做出每個迭代期間的計劃-我們的辦法是在正式會議前以小組為單位進行更多的準備工作。 | 2 周 | 無 | 多數的設計基于已有的設計:保留標準,代碼會審逐漸停止,因為新的設計和重構尚未完成。 | 試圖去掉代碼功能測試而代之以屏幕搜刮(Screen Scraper),若失敗就回到代碼功能測試 。加入新的單元測試但仍然沒有全部覆蓋。QA組開始結合界面測試使用自動功能測試。 | 重構開始更頻繁,因為部分代碼開始變得凌亂不堪。需要清理的原因主要是實現簡單和迭代期限使得代碼在沒有重要重構的情況下增長。 |
6/2001 | 舉行一些討論卡片或相關卡片組的會議,參加者包括對這些功能感興趣或有經驗的開發者和負責這些卡片的分析人員。 | 2 周 | 無 | 隊伍中的大多數人及整個QA組準備提交1.0版本給客戶。代碼的基準分離以便加入沒有測試的新功能。對單元測試有更多的依賴。 | 盡管仍有遺漏,測試范圍已經基本穩定。QA組不再測試新功能,因為焦點是1.0版本的提交。 | 在發布版上做的重構很少,而在繼續開發的版本上,開發人員會很盡責地進行重構,特別是在年初被迫做了更大更痛苦的重構以后. |
結對編程 | 集體所有 | 持續集成 | 40小時周 | 在場客戶 | 代碼規范 | |
1/2000 | 由于我們決定采用XP,整個團隊讀了[1]。每個人都做了嘗試,多數人被吸引。 | 由于最初階段的分組是面向功能,因此此時我們并未意識到集體所有 (collective ownership) ,也沒有意識到代碼的保護。 | 從第一迭代期開始,進行在線集成,參見[2] | 這是一個概念工作時間:因為我們希望客戶在場。于是我們會花另外的時間來滿足最后期限。 | 事務分析人員是在場的客戶,他們15人一組。真正的客戶是不在的,由分析人員同他們溝通。 基本上是JAVA的一般語法。 | |
7/2000 | 結對編程依舊盛行:開發者對新功能進行結對編程,但改錯和維護工作由單個人來做。也有一些開發者停止了結對編程。 | 當開發者越來越多地接觸系統不同的部分的時候,代碼的所有者逐漸顯現出來。成員間通過閑談,代碼互審和短小的站立會議(Stand up meeting)進行很好的溝通。 | 代碼功能測試加入構造過程。 | 為了通過故事卡片,在每個迭代期的最后工作時間達到50至60小時。 | 同上 | 兩周一次的代碼互審給開發人員一個機會討論不同子系統的實現方式。我們可以接受某些子系統代碼的非正式方式。 |
1/2001 | 結對編程更少了,因為這一階段編碼更直接,而有些人在進行重構。 | 因為效率低,站立會議被棄用,但代碼的所有顯現得更加清晰。開發人員開始專職負責系統的某部分。 | 穩定_同上。 | 以2周為迭代期,開發人員的工作時間更接近于40小時… | 同上 | 代碼互審逐漸減少,設計及編碼規范趨于飽和。 |
6/2001 | 定下了規則:所有新功能要應用結對編程,而改錯和維護則由一人完成。 | 隨著專業化分工的繼續,不同的開發小組人員擁有不同部分代碼的知識,于是我們將使他們在接下來相應模塊的設計中起更活躍的作用,但代碼仍是集體共有。 | 穩定同上。 | 同上 | 同上 | 同上 |