ExtremeProgramming(極限編程,簡稱XP)是由KentBeck在1996年提出的。KentBeck在九十年代初期與WardCunningham共事時(shí),就一直共同探索著新的軟件開發(fā)方法,希望能使軟件開發(fā)更加簡單而有效。Kent仔細(xì)地觀察和分析了各種簡化軟件開發(fā)的前提條件、可能行以及面臨的困難。1996年三月,Kent終于在為DaimlerChrysler所做的一個(gè)項(xiàng)目中引入了新的軟件開發(fā)觀念——XP。
XP是一個(gè)輕量級的、靈巧的軟件開發(fā)方法;同時(shí)它也是一個(gè)非常嚴(yán)謹(jǐn)和周密的方法。它的基礎(chǔ)和價(jià)值觀是交流、樸素、反饋和勇氣;即,任何一個(gè)軟件項(xiàng)目都可以從四個(gè)方面入手進(jìn)行改善:加強(qiáng)交流;從簡單做起;尋求反饋;勇于實(shí)事求是。XP是一種近螺旋式的開發(fā)方法,它將復(fù)雜的開發(fā)過程分解為一個(gè)個(gè)相對比較簡單的小周期;通過積極的交流、反饋以及其它一系列的方法,開發(fā)人員和客戶可以非常清楚開發(fā)進(jìn)度、變化、待解決的問題和潛在的困難等,并根據(jù)實(shí)際情況及時(shí)地調(diào)整開發(fā)過程。
什么是軟件開發(fā)
軟件開發(fā)的內(nèi)容是:需求、設(shè)計(jì)、編程和測試!
需求:不僅僅是用戶需求,應(yīng)該是開發(fā)中遇到的所有的需求。比如,你首先要知道做這個(gè)項(xiàng)目是為了解決什么問題;測試案例中應(yīng)該輸入什么數(shù)據(jù)……為了清楚地知道這些需求,你經(jīng)常要和客戶、項(xiàng)目經(jīng)理等交流。
設(shè)計(jì):編碼前,肯定有個(gè)計(jì)劃告訴你要做什么,結(jié)構(gòu)是怎樣等等。你一定要按照這個(gè)來做,否則可能會一團(tuán)糟。
編程:如果在項(xiàng)目截止日,你的程序不能跑起來或達(dá)不到客戶的要求,你就拿不到錢。
測試:目的是讓你知道,什么時(shí)候算是完成了。如果你聰明,你就應(yīng)該先寫測試,這樣可以及時(shí)知道你是否真地完成了。否則,你經(jīng)常會不知道,到底有哪些功能是真正完成了,離預(yù)期目標(biāo)還差多遠(yuǎn)。
軟件開發(fā)中,客戶和開發(fā)人員都有自己的基本權(quán)利和義務(wù)。
客戶:
定義每個(gè)用戶需求的商業(yè)優(yōu)先級;
制訂總體計(jì)劃,包括用多少投資、經(jīng)過多長時(shí)間、達(dá)到什么目的;
在項(xiàng)目開發(fā)過程中的每個(gè)工作周,都能讓投資獲得最大的收益;
通過重復(fù)運(yùn)行你所指定的功能測試,準(zhǔn)確地掌握項(xiàng)目進(jìn)展情況;
能隨時(shí)改變需求、功能或優(yōu)先級,同時(shí)避免昂貴的再投資;能夠根據(jù)各種變化及時(shí)調(diào)整項(xiàng)目計(jì)劃;
能夠隨時(shí)取消項(xiàng)目;項(xiàng)目取消時(shí),以前的開發(fā)工作不是一堆垃圾,已開發(fā)完的功能是合乎要求的,正在進(jìn)行或未完成的的工作則應(yīng)該是不難接手的。
開發(fā)人員:
知道要做什么,以及要優(yōu)先做什么;
工作有效率;
有問題或困難時(shí),能得到客戶、同事、上級的回答或幫助;
對工作做評估,并根據(jù)周圍情況的變化及時(shí)重新評估;
積極承擔(dān)工作,而不是消極接受分配;
一周40小時(shí)工作制,不加班。
這就是軟件開發(fā),除此之外再還有其它要關(guān)心的問題!
靈巧的輕量級軟件開發(fā)方法
一套軟件開發(fā)方法是由一系列與開發(fā)相關(guān)的規(guī)則、規(guī)范和慣例。重量級的開發(fā)方法嚴(yán)格定義了許多的規(guī)則、流程和相關(guān)的文檔工作。靈巧的輕量級開發(fā)方法,其規(guī)則和文檔相對較少,流程更加靈活,實(shí)施起來相對較容易。
在軟件工程概念出現(xiàn)以前,程序員們按照自己喜歡的方式開發(fā)軟件。程序的質(zhì)量很難控制,調(diào)試程序很繁瑣,程序員之間也很難讀懂對方寫的代碼。1968年,EdsgerDijkstra給CACM寫了一封題為GOTOStatementConsideredHarmful的信,軟件工程的概念由此誕生。程序員們開始摒棄以前的做法,轉(zhuǎn)而使用更系統(tǒng)、更嚴(yán)格的開發(fā)方法。為了使控制軟件開發(fā)和控制其它產(chǎn)品生產(chǎn)一樣嚴(yán)格,人們陸續(xù)制定了很多規(guī)則和做法,發(fā)明了很多軟件工程方法,軟件質(zhì)量開始得到大幅度提高。隨著遇到的問題更多,規(guī)則和流程也越來越精細(xì)和復(fù)雜。
到了今天,在實(shí)際開發(fā)過程中,很多規(guī)則已經(jīng)難于遵循,很多流程復(fù)雜而難于理解,很多項(xiàng)目中文檔的制作過程正在失去控制。人們試圖提出更全面更好的一攬子方案,或者寄希望于更復(fù)雜的、功能更強(qiáng)大的輔助開發(fā)工具(CaseTools),但總是不能成功,而且開發(fā)規(guī)范和流程變得越來越復(fù)雜和難以實(shí)施。
為了趕進(jìn)度,程序員們經(jīng)常跳過一些指定的流程,很少人能全面遵循那些重量級開發(fā)方法。
失敗的原因很簡單,這個(gè)世界沒有萬能藥。因此,一些人提出,將重量級開發(fā)方法中的規(guī)則和流程進(jìn)行刪減、重整和優(yōu)化,這樣就產(chǎn)生了很多適應(yīng)不同需要的輕量級流程。在這些流程中,合乎實(shí)際需要的規(guī)則被保留下來,不必要的復(fù)雜化開發(fā)的規(guī)被拋棄。而且,和傳統(tǒng)的開發(fā)方法相比,輕量級流程不再象流水生產(chǎn)線,而是更加靈活。
ExtremeProgramming(XP)就是這樣一種靈巧的輕量級軟件開發(fā)方法。
為什么稱為“Extreme”(極限)
“Extreme”(極限)是指,對比傳統(tǒng)的項(xiàng)目開發(fā)方式,XP強(qiáng)調(diào)把它列出的每個(gè)方法和思想做到極限、做到最好;其它XP所不提倡的,則一概忽略(如開發(fā)前期的整體設(shè)計(jì)等)。一個(gè)嚴(yán)格實(shí)施XP的項(xiàng)目,其開發(fā)過程應(yīng)該是平穩(wěn)的、高效的和快速的,能夠做到一周40小時(shí)工作制而不拖延項(xiàng)目進(jìn)度。
XP的軟件開發(fā)是什么樣
1極限的工作環(huán)境
為了在軟件開發(fā)過程中最大程度地實(shí)現(xiàn)和滿足客戶和開發(fā)人員的基本權(quán)利和義務(wù),XP要求把工作環(huán)境也做得最好。每個(gè)參加項(xiàng)目開發(fā)的人都將擔(dān)任一個(gè)角色(項(xiàng)目經(jīng)理、項(xiàng)目監(jiān)督人等等)并履行相應(yīng)的權(quán)利和義務(wù)。所有的人都在同一個(gè)開放的開發(fā)環(huán)境中工作,最好是所有人在同一個(gè)大房子中工作,還有茶點(diǎn)供應(yīng);每周40小時(shí),不提倡加班;每天早晨,所有人一起站著開個(gè)短會;墻上有一些大白板,所有的Story卡、CRC卡等都貼在上面,討論問題的時(shí)候可以在上面寫寫畫畫;下班后大家可以一起玩電腦游戲……。
2極限的需求
客戶應(yīng)該是項(xiàng)目開發(fā)隊(duì)伍中的一員,而不是和開發(fā)人員分開的;因?yàn)閺捻?xiàng)目的計(jì)劃到最后驗(yàn)收,客戶一直起著很重要的作用。開發(fā)人員和客戶一起,把各種需求變成一個(gè)個(gè)小的需求模塊(UserStory),例如“計(jì)算年級的總?cè)藬?shù),就是把該年級所有班的人數(shù)累加。”;這些模塊又會根據(jù)實(shí)際情況被組合在一起或者被分解成更小的模塊;它們都被記錄在一些小卡片(StoryCard)上,之后分別被程序員們在各個(gè)小的周期開發(fā)中(Iteration,通常不超過3個(gè)星期)實(shí)現(xiàn);客戶根據(jù)每個(gè)模塊的商業(yè)價(jià)值來指定它們的優(yōu)先級;開發(fā)人員要做的是確定每個(gè)需求模塊的開發(fā)風(fēng)險(xiǎn),風(fēng)險(xiǎn)高的(通常是因?yàn)槿狈︻愃频慕?jīng)驗(yàn))需求模塊將被優(yōu)先研究、探索和開發(fā);經(jīng)過開發(fā)人員和客戶分別從不同的角度評估每個(gè)模塊后,它們被安排在不同的開發(fā)周期里,客戶將得到一個(gè)盡可能準(zhǔn)確的開發(fā)計(jì)劃;客戶為每個(gè)需求模塊指定驗(yàn)收測試(功能測試)。
每發(fā)布一次開發(fā)的軟件(經(jīng)過一個(gè)開發(fā)周期),用戶都能得到一個(gè)可以開始使用的系統(tǒng),這個(gè)系統(tǒng)全面實(shí)現(xiàn)了相應(yīng)的計(jì)劃中的所有需求。而在一些傳統(tǒng)的開發(fā)模式中,無論什么功能,用戶都要等到所有開發(fā)完成后才能開始使用。
3極限的設(shè)計(jì)
從具體開發(fā)的角度來看,XP內(nèi)層的過程是一個(gè)個(gè)基于測試驅(qū)動的開發(fā)(TestDrivenDevelopment)周期,諸如計(jì)劃和設(shè)計(jì)等外層的過程都是圍繞這些展開的。每個(gè)開發(fā)周期都有很多相應(yīng)的單元測試(UnitTest)。剛開始,因?yàn)槭裁炊紱]有實(shí)現(xiàn),所以所有的單元測試都是失敗的;隨著一個(gè)個(gè)小的需求模塊的完成,通過的單元測試也越來越多。通過這種方式,客戶和開發(fā)人員都很容易檢驗(yàn),是否履行了對客戶的承諾。XP提倡對于簡單的設(shè)計(jì)(SimpleDesign),就是用最簡單的方式,使得為每個(gè)簡單的需求寫出來的程序可以通過所有相關(guān)的單元測試。XP強(qiáng)調(diào)拋棄那種一攬子詳細(xì)設(shè)計(jì)方式(BigDesignUpFront),因?yàn)檫@種設(shè)計(jì)中有很多內(nèi)容是你現(xiàn)在或最近都根本不需要的。XP還大力提倡設(shè)計(jì)復(fù)核(Review)、代碼復(fù)核以及重整和優(yōu)化(Refectory),所有的這些過程其實(shí)也是優(yōu)化設(shè)計(jì)的過程;在這些過程中不斷運(yùn)行單元測試和功能測試,可以保證經(jīng)過重整和優(yōu)化后的系統(tǒng)仍然符合所有需求。
4極限的編程
既然編程很重要,XP就提倡兩個(gè)人一起寫同一段程序(PairProgramming),而且代碼所有權(quán)是歸于整個(gè)開發(fā)隊(duì)伍(CollectiveCodeOwnership)。程序員在寫程序和重整優(yōu)化程序的時(shí)候,都要嚴(yán)格遵守編程規(guī)范。任何人都可以修改其他人寫的程序,修改后要確定新程序能通過單元測試。
5極限的測試
既然測試很重要,XP就提倡在開始寫程序之前先寫單元測試。開發(fā)人員應(yīng)該經(jīng)常把開發(fā)好的模塊整合到一起(ContinuousIntegration),每次整合后都要運(yùn)行單元測試;做任何的代碼復(fù)核和修改,都要運(yùn)行單元測試;發(fā)現(xiàn)了BUG,就要增加相應(yīng)的測試(因此XP方法不需要BUG數(shù)據(jù)庫)。除了單元測試之外,還有整合測試,功能測試、負(fù)荷測試和系統(tǒng)測試等。所有這些測試,是XP開發(fā)過程中最重要的文檔之一,也是最終交付給用戶的內(nèi)容之一。
XP中的重要慣例和規(guī)則
1項(xiàng)目開發(fā)小組(Team)
在XP中,每個(gè)對項(xiàng)目做貢獻(xiàn)的人都應(yīng)該是項(xiàng)目開發(fā)小組中的一員。而且,這個(gè)小組中必須至少有一個(gè)人對用戶需求非常清晰,能夠提出需求、決定各個(gè)需求的商業(yè)價(jià)值(優(yōu)先級)、根據(jù)需求等的變化調(diào)整項(xiàng)目計(jì)劃等。這個(gè)人扮演的是“客戶”這個(gè)角色,當(dāng)然最好就是實(shí)際的最終用戶,因?yàn)檎麄€(gè)項(xiàng)目就是圍繞最終用戶的需求而展開的。程序員是項(xiàng)目開發(fā)小組中必不可少的成員。小組中可以有測試員,他們幫助客戶制訂驗(yàn)收測試;有分析員,幫助客戶確定需求;通常還有個(gè)Coach(教練),負(fù)責(zé)跟蹤開發(fā)進(jìn)度、解決開發(fā)中遇到的一些問題、推動項(xiàng)目進(jìn)行;還可以又一個(gè)項(xiàng)目經(jīng)理,負(fù)責(zé)調(diào)配資源、協(xié)助項(xiàng)目內(nèi)外的交流溝通等等。項(xiàng)目小組中有這么多角色,但并不是說,每個(gè)人做的工作是別人不能插手或干預(yù)的,XP鼓勵每個(gè)人盡可能地為項(xiàng)目多做貢獻(xiàn)。平等相處,取長補(bǔ)短;這就是最好的XP開發(fā)小組。
2計(jì)劃項(xiàng)目(PlanningGame)、驗(yàn)收測試、小規(guī)模發(fā)布(SmallReleases)
XP開發(fā)小組使用簡單的方式進(jìn)行項(xiàng)目計(jì)劃和開發(fā)跟蹤,并以次預(yù)測項(xiàng)目進(jìn)展情況和決定未來的步驟。根據(jù)需求的商業(yè)價(jià)值,開發(fā)小組針對一組組的需求進(jìn)行一系列的開發(fā)和整合,每次開發(fā)都會產(chǎn)生一個(gè)通過測試的、可以使用的系統(tǒng)。
計(jì)劃項(xiàng)目
XP的計(jì)劃過程主要針對軟件開發(fā)中的兩個(gè)問題:預(yù)測在交付日期前可以完成多少工作;現(xiàn)在和下一步該做些什么。不斷的回答這兩個(gè)問題,就是直接服務(wù)于如何實(shí)施及調(diào)整開發(fā)過程;與此相比,希望一開始就精確定義整個(gè)開發(fā)過程要做什么事情以及每件事情要花多少時(shí)間,則事倍功半。針對這兩個(gè)問題,XP中又兩個(gè)主要的相應(yīng)過程:
軟件發(fā)布計(jì)劃(ReleasePlanning)??蛻絷U述需求,開發(fā)人員估算開發(fā)成本和風(fēng)險(xiǎn)??蛻舾鶕?jù)開發(fā)成本、風(fēng)險(xiǎn)和每個(gè)需求的重要性,制訂一個(gè)大致的項(xiàng)目計(jì)劃。最初的項(xiàng)目計(jì)劃沒有必要(也沒有可能)非常準(zhǔn)確,因?yàn)槊總€(gè)需求的開發(fā)成本、風(fēng)險(xiǎn)及其重要性都不是一成不變的。而且,這個(gè)計(jì)劃會在實(shí)施過程中被不斷地調(diào)整以趨精確。
周期開發(fā)計(jì)劃(IterationPlanning)。開發(fā)過程中,應(yīng)該有很多階段計(jì)劃(比如每三個(gè)星期一個(gè)計(jì)劃)。開發(fā)人員可能在某個(gè)周期對系統(tǒng)進(jìn)行內(nèi)部的重整和優(yōu)化(代碼和設(shè)計(jì)),而在某個(gè)周期增加了新功能,或者會在一個(gè)周期內(nèi)同時(shí)做兩方面的工作。但是,經(jīng)過每個(gè)開發(fā)周期,用戶都應(yīng)該能得到一個(gè)已經(jīng)實(shí)現(xiàn)了一些功能的系統(tǒng)。而且,每經(jīng)過一個(gè)周期,客戶就會再提出確定下一個(gè)周期要完成的需求。在每個(gè)開發(fā)周期中,開發(fā)人員會把需求分解成一個(gè)個(gè)很小的任務(wù),然后估計(jì)每個(gè)任務(wù)的開發(fā)成本和風(fēng)險(xiǎn)。這些估算是基于實(shí)際開發(fā)經(jīng)驗(yàn)的,項(xiàng)目做得多了,估算自然更加準(zhǔn)確和精確;在同一個(gè)項(xiàng)目中,每經(jīng)過一個(gè)開發(fā)周期,下一次的估算都會有更過的經(jīng)驗(yàn)、參照和依據(jù),從而更加準(zhǔn)確。這些簡單的步驟對客戶提供了豐富的、足夠的信息,使之能靈活有效地調(diào)控開發(fā)進(jìn)程。每過兩三個(gè)星期,客戶總能夠?qū)崒?shí)在在地看到開發(fā)人員已經(jīng)完成的需求。在XP里,沒有什么“快要完成了”、“完成了90%”的模糊說法,要不是完成了,要不就是沒完成。這種做法看起來好像有利有弊:好處是客戶可以馬上知道完成了哪些、做出來的東西是否合用、下面還要做些什么或改進(jìn)什么等等;壞處是客戶看到做出來的東西,可能會很不滿意甚至中止合同。實(shí)際上,XP的這種做法是為了及早發(fā)現(xiàn)問題、解決問題,而不是等到過了幾個(gè)月,用戶終于看到開發(fā)完的系統(tǒng)了,然后才告訴你這個(gè)不行、那個(gè)變了、還要增加
哪個(gè)內(nèi)容等等。
驗(yàn)收測試
客戶對每個(gè)需求都定義了一些驗(yàn)收測試。通過運(yùn)行驗(yàn)收測試,開發(fā)人員和客戶可以知道開發(fā)出來的軟件是否符合要求。XP開發(fā)人員把這些驗(yàn)收測試看得和單元測試一樣重要。為了不浪費(fèi)寶貴的時(shí)間,最好能將這些測試過程自動化。
頻繁地小規(guī)模發(fā)布軟件(SmallReleases)
每個(gè)周期(Iteration)開發(fā)的需求都是用戶最需要的東西。在XP中,對于每個(gè)周期完成時(shí)發(fā)布的系統(tǒng),用戶都應(yīng)該可以很容易地進(jìn)行評估,或者已經(jīng)能夠投入實(shí)際使用。這樣,軟件開發(fā)對于客戶來說,不再是看不見摸不著的東西,而是實(shí)實(shí)在在的。XP要求頻繁地發(fā)布軟件,如果有可能,應(yīng)該每天都發(fā)布一個(gè)新版本;而且在完成任何一個(gè)改動、整合或者新需求后,就應(yīng)該立即發(fā)布一個(gè)新版本。這些版本的一致性和可靠性,是靠驗(yàn)收測試和測試驅(qū)動的開發(fā)來保證的。
3簡單設(shè)計(jì),PairProgramming,測試驅(qū)動開發(fā),重整和優(yōu)化
XP程序員不但做為一個(gè)開發(fā)小組共同工作,還以兩個(gè)人為一個(gè)小開發(fā)單元編寫同一個(gè)程序。開發(fā)人員們進(jìn)行簡單的設(shè)計(jì),編寫單元測試后再編寫符合測試要求的代碼,并在滿足需求的前提下不斷地優(yōu)化設(shè)計(jì)。
簡單設(shè)計(jì)
XP中讓初學(xué)者感到最困惑的就是這點(diǎn)。XP要求用最簡單的辦法實(shí)現(xiàn)每個(gè)小需求,前提是按照這些簡單設(shè)計(jì)開發(fā)出來的軟件必須通過測試。這些設(shè)計(jì)只要能滿足系統(tǒng)和客戶在當(dāng)下的需求就可以了,不需要任何畫蛇添足的設(shè)計(jì),而且所有這些設(shè)計(jì)都將在后續(xù)的開發(fā)過程中就被不斷地重整和優(yōu)化。
在XP中,沒有那種傳統(tǒng)開發(fā)模式中一次性的、針對所有需求的總體設(shè)計(jì)。在XP中,設(shè)計(jì)過程幾乎一直貫穿著整個(gè)項(xiàng)目開發(fā):從制訂項(xiàng)目的計(jì)劃,到制訂每個(gè)開發(fā)周期(Iteration)的計(jì)劃,到針對每個(gè)需求模塊的簡捷設(shè)計(jì),到設(shè)計(jì)的復(fù)核,以及一直不間斷的設(shè)計(jì)重整和優(yōu)化。整個(gè)設(shè)計(jì)過程是個(gè)螺旋式的、不斷前進(jìn)和發(fā)展的過程。從這個(gè)角度看,XP是把設(shè)計(jì)做到了極致。
PairProgramming
XP中,所有的代碼都是由兩個(gè)程序員在同一臺機(jī)器上一起寫的——這是XP中讓人爭議最多、也是最難實(shí)施的一點(diǎn)。這保證了所有的代碼、設(shè)計(jì)和單元測試至少被另一個(gè)人復(fù)核過,代碼、設(shè)計(jì)和測試的質(zhì)量因此得到提高??雌饋磉@樣象是在浪費(fèi)人力資源,但是各種研究表明事實(shí)恰恰相反?!@種工作方式極大地提高了工作強(qiáng)度和工作效率。
很多程序員一開始是被迫嘗試這點(diǎn)的(XP也需要行政命令的支持)。開始時(shí)總是不習(xí)慣的,而且兩個(gè)人的效率不會比一個(gè)人的效率高。這種做法的效果往往要堅(jiān)持幾個(gè)星期或一兩個(gè)月后才能很顯著。據(jù)統(tǒng)計(jì),在所有剛開始PairProgramming的程序員中,90%的人在兩個(gè)月以后都很認(rèn)為這種工作方式更加高效。
項(xiàng)目開發(fā)中,每個(gè)人會不斷地更換合作編程的伙伴。因此,PairProgramming不但提高了軟件質(zhì)量,還增強(qiáng)了相互之間的知識交流和更新,增強(qiáng)了相互之間的溝通和理解。這不但有利于個(gè)人,也有利于整個(gè)項(xiàng)目、開發(fā)隊(duì)伍和公司。從這點(diǎn)看,PairProgramming不僅僅適用于XP,也適用于所有其它的軟件開發(fā)方法。
測試驅(qū)動開發(fā)
反饋是XP的四個(gè)基本的價(jià)值觀之一——在軟件開發(fā)中,只有通過充分的測試才能獲得充分的反饋。XP中提出的測試,在其它軟件開發(fā)方法中都可以見到,比如功能測試、單元測試、系統(tǒng)測試和負(fù)荷測試等;與眾不同的是,XP將測試結(jié)合到它獨(dú)特的螺旋式增量型開發(fā)過程中,測試隨著項(xiàng)目的進(jìn)展而不斷積累。另外,由于強(qiáng)調(diào)整個(gè)開發(fā)小組擁有代碼,測試也是由大家共同維護(hù)的。即,任何人在往代碼庫中放程序(CheckIn)前,都應(yīng)該運(yùn)行一遍所有的測試;任何人如果發(fā)現(xiàn)了一個(gè)BUG,都應(yīng)該立即為這個(gè)BUG增加一個(gè)測試,而不是等待寫那個(gè)程序的人來完成;任何人接手其他人的任務(wù),或者修改其他人的代碼和設(shè)計(jì),改動完以后如果能通過所有測試,就證明他的工作沒有破壞愿系統(tǒng)。這樣,測試才能真正起到幫助獲得反饋的作用;而且,通過不斷地優(yōu)先編寫和累積,測試應(yīng)該可以基本覆蓋全部的客戶和開發(fā)需求,因此開發(fā)人員和客戶可以得到盡可能充足的反饋。
重構(gòu)(Refactoring)
XP強(qiáng)調(diào)簡單的設(shè)計(jì),但簡單的設(shè)計(jì)并不是沒有設(shè)計(jì)的流水賬式的程序,也不是沒有結(jié)構(gòu)、缺乏重用性的程序設(shè)計(jì)。開發(fā)人員雖然對每個(gè)USERSTORY都進(jìn)行簡單設(shè)計(jì),但同時(shí)也在不斷地對設(shè)計(jì)進(jìn)行改進(jìn),這個(gè)過程叫設(shè)計(jì)的重構(gòu)(Refactoring)。這個(gè)名字最早出現(xiàn)在MartinFowler寫的《Refactoring:ImprovingtheDesignofExistingCode》這本書中。
Refactoring主要是努力減少程序和設(shè)計(jì)中重復(fù)出現(xiàn)的部分,增強(qiáng)程序和設(shè)計(jì)的可重用性。Refactoring的概念并不是XP首創(chuàng)的,它已經(jīng)被提出了近30年了,而且一直被認(rèn)為是高質(zhì)量的代碼的特點(diǎn)之一。但XP強(qiáng)調(diào),把Refactoring做到極致,應(yīng)該隨時(shí)隨地、盡可能地進(jìn)行Refactoring,只要有可能,程序員都不應(yīng)該心疼以前寫的程序,而要毫不留情地改進(jìn)程序。當(dāng)然,每次改動后,程序員都應(yīng)該運(yùn)行測試程序,保證新系統(tǒng)仍然符合預(yù)定的要求。
4頻繁地整合,集體擁有代碼(CollectiveCodeOwnership),編程規(guī)范
XP開發(fā)小組經(jīng)常整合不同的模塊。為了提高軟件質(zhì)量,除了測試驅(qū)動開發(fā)和PairProgramming以外,XP要求每個(gè)人的代碼都要遵守編程規(guī)范,任何人都可以修改其他人寫的代碼,而且所有人都應(yīng)該主動檢查其他人寫的代碼。
頻繁地整合(Integration)
在很多項(xiàng)目中,開發(fā)人員往往很遲才把各個(gè)模塊整合在一起。在這些項(xiàng)目中,開發(fā)人員經(jīng)常在整合過程中發(fā)現(xiàn)很多問題,但不能肯定到底是誰的程序出了問題;而且,只有整合完成后,開發(fā)人員才開始稍稍使用整個(gè)系統(tǒng),然后就馬上交付給客戶驗(yàn)收。對于客戶來說,即使這些系統(tǒng)能夠通過終驗(yàn)收測試,因?yàn)槭褂脮r(shí)間短,客戶門心里并沒有多少把握。
為了解決這些問題,XP提出,整個(gè)項(xiàng)目過程中,應(yīng)該頻繁地,盡可能地整合已經(jīng)開發(fā)完的USERSTORY(每次整合一個(gè)新的USERSTORY)。每次整合,都要運(yùn)行相應(yīng)的單元測試和驗(yàn)收測試,保證符合客戶和開發(fā)的要求。整合后,就發(fā)布一個(gè)新的應(yīng)用系統(tǒng)。這樣,整個(gè)項(xiàng)目開發(fā)過程中,幾乎每隔一兩天,都會發(fā)布一個(gè)新系統(tǒng),有時(shí)甚至?xí)惶彀l(fā)布好幾個(gè)版本。通過這個(gè)過程,客戶能非常清楚地掌握已經(jīng)完成的功能和開發(fā)進(jìn)度,并基于這些情況和開發(fā)人員進(jìn)行有效地、及時(shí)地交流,以確保項(xiàng)目順利完成。
集體擁有代碼(CollectiveCodeOwnership)
在很多項(xiàng)目開發(fā)過程中,開發(fā)人員只維護(hù)自己的代碼,而且很多人不喜歡其他人隨意修改自己的代碼。因此,即使可能有相應(yīng)的比較詳細(xì)的開發(fā)文檔,但一個(gè)程序員卻很少、也不太愿意去讀其他程序員的代碼;而且,因?yàn)椴磺宄渌说某绦虻降讓?shí)現(xiàn)了什么功能,一個(gè)程序員一般也不敢隨便改動其他人的代碼。同時(shí),因?yàn)槭亲约壕S護(hù)自己的代碼,可能因?yàn)闀r(shí)間緊張或技術(shù)水平的局限性,某些問題一直不能被發(fā)現(xiàn)或得到比較好的解決。針對這點(diǎn),XP提倡大家共同擁有代碼,每個(gè)人都有權(quán)利和義務(wù)閱讀其他代碼,發(fā)現(xiàn)和糾正錯(cuò)誤,重整和優(yōu)化代碼。這樣,這些代碼就不僅僅是一兩個(gè)人寫的,而是由整個(gè)項(xiàng)目開發(fā)隊(duì)伍共同完成的,錯(cuò)誤會減少很多,重用性會盡可能地得到提高,代碼質(zhì)量是非常好。
為了防止修改其他人的代碼而引起系統(tǒng)崩潰,每個(gè)人在修改后都應(yīng)該運(yùn)行測試程序。(從這點(diǎn),我們可以再次看到,XP的各個(gè)慣例和規(guī)則是怎樣有機(jī)地結(jié)合在一起的。)
編程規(guī)范
XP開發(fā)小組中的所有人都遵循一個(gè)統(tǒng)一的編程標(biāo)準(zhǔn),因此,所有的代碼看起來好像是一個(gè)人寫的。因?yàn)橛辛私y(tǒng)一的編程規(guī)范,每個(gè)程序員更加容易讀懂其他人寫的代碼,這是是實(shí)現(xiàn)CollectiveCodeOwnership的重要前提之一。
5Metaphor(系統(tǒng)比喻),不加班
XP過程通過使用一些形象的比喻讓所有人對系統(tǒng)有個(gè)共同的、簡潔的認(rèn)識。XP認(rèn)為加班是不正常的,因?yàn)檫@說明關(guān)于項(xiàng)目進(jìn)度的估計(jì)和安排有問題。
Metaphor(系統(tǒng)比喻)
為了幫助每個(gè)人一致清楚地理解要完成的客戶需求、要開發(fā)的系統(tǒng)功能,XP開發(fā)小組用很多形象的比喻來描述系統(tǒng)或功能模塊是怎樣工作的。比如,對于一個(gè)搜索引擎,它的Metaphor可能就是“一大群蜘蛛,在網(wǎng)上四處尋找要捕捉的東西,然后把東西帶回巢穴。”
不加班
大量的加班意味著原來的計(jì)劃是不準(zhǔn)確的,或者是程序遠(yuǎn)不清楚自己到底什么時(shí)候能完成什么工作。而且,開發(fā)管理人員和客戶也因此無法準(zhǔn)確掌握開發(fā)速度;開發(fā)人員也因此非常疲勞。XP認(rèn)為,如果出現(xiàn)大量的加班現(xiàn)象,開發(fā)管理人員(比如Coach)應(yīng)該和客戶一起確定加班的原因,并及時(shí)調(diào)整項(xiàng)目計(jì)劃、進(jìn)度和資源。
XP中一些基本概念的簡介
UserStory:開發(fā)人員要求客戶把所有的需求寫成一個(gè)個(gè)獨(dú)立的小故事,每個(gè)只需要幾天時(shí)間就可以完成。開發(fā)過程中,客戶可以隨時(shí)提出新的UserStory,或者更改以前的UserStory。
StoryEstimates和開發(fā)速度:開發(fā)小組對每個(gè)UserStory進(jìn)行估算,并根據(jù)每個(gè)開發(fā)周期(Iteration)中的實(shí)際情況反復(fù)計(jì)算開發(fā)速度。這樣,開發(fā)人員和客戶能知道每個(gè)星期到底能開發(fā)多少UserStory。
ReleasePlan和ReleaseScope:整個(gè)開發(fā)過程中,開發(fā)人員將不斷地發(fā)布新版本。開發(fā)人員和客戶一起確定每個(gè)發(fā)布所包含的UserStory。
Iteration(開發(fā)周期,或稱迭代)和IterationPlan:在一個(gè)Release過程中,開發(fā)人員要求客戶選擇最有價(jià)值的UserStory作為未來一兩個(gè)星期的開發(fā)內(nèi)容。
TheSeed:第一個(gè)迭代(Iteration)完成后,提交給客戶的系統(tǒng)。雖然這不是最終的產(chǎn)品,但它已經(jīng)實(shí)現(xiàn)了幾個(gè)客戶認(rèn)為是最重要的Story,開發(fā)人員將逐步在其基礎(chǔ)上增加新的模塊。
ContinuousIntegration(整合):把開發(fā)完的UserStory的模塊一個(gè)個(gè)拼裝起來,一步步接近乃至最終完成最終產(chǎn)品。
驗(yàn)收測試(功能測試):對于每個(gè)UserStory,客戶將定義一些測試案例,開發(fā)人員將使運(yùn)行這些測試案例的過程自動化。
UnitTest(單元測試):在開始寫程序前,程序員針對大部分類的方法,先寫出相應(yīng)的測試程序。
Refactoring(重構(gòu)):去掉代碼中的冗余部分,增加代碼的可重用性和伸縮性。
小結(jié)
XP的一個(gè)成功因素是重視客戶的反饋——開發(fā)的目的就是為了滿足客戶的需要。XP方法使開發(fā)人員始終都能自信地面對客戶需求的變化。XP強(qiáng)調(diào)團(tuán)隊(duì)合作,經(jīng)理、客戶和開發(fā)人員都是開發(fā)團(tuán)隊(duì)中的一員。團(tuán)隊(duì)通過相互之間的充分交流和合作,使用XP這種簡單但有效的方式,努力開發(fā)出高質(zhì)量的軟件。XP的設(shè)計(jì)簡單而高效;程序員們通過測試獲得客戶反饋,并根據(jù)變化修改代碼和設(shè)計(jì),他們總是爭取盡可能早地將軟件交付給客戶。XP程序員能夠勇于面對需求和技術(shù)上的變化。
XP很象一個(gè)由很多小塊拼起來的智力拼圖,單獨(dú)看每一小塊都沒有什么意義,但拼裝好后,一幅美麗的圖畫就會呈現(xiàn)在你面前。