【破門(mén)點(diǎn)滴】敏捷究竟需要什么?
“簡(jiǎn)單、清楚的目的和原理引起了復(fù)雜、智能的行為,
復(fù)雜的規(guī)則和制度引起了簡(jiǎn)單、愚蠢的行為”
——(Dee Hock 1994)Visa International 前CEO,
他在職期間使Visa全年收益由7.5億美金增長(zhǎng)到650億美金。
從貫徹敏捷原理的角度來(lái)說(shuō),過(guò)度強(qiáng)調(diào)對(duì)敏捷實(shí)踐的嚴(yán)格執(zhí)行其實(shí)反而會(huì)與敏捷背道而馳。因此任何一個(gè)團(tuán)隊(duì)準(zhǔn)備引入敏捷方法之前,必須要從最本質(zhì)的角度即敏捷原理來(lái)考察自己的項(xiàng)目(客戶、團(tuán)隊(duì)和資源),確定是否要執(zhí)行敏捷方法以及具體采用那些敏捷實(shí)踐。那么敏捷方法所依據(jù)的核心原理是什么呢?實(shí)踐敏捷究竟需要做到什么呢?本文談?wù)劽艚菰硪约耙恍?shí)踐應(yīng)用體會(huì)。
破門(mén)
2007年5月17日
1 交付有用的產(chǎn)品
敏捷團(tuán)隊(duì)必須時(shí)刻提醒自己,軟件項(xiàng)目的目標(biāo)就是向客戶交付有用的產(chǎn)品。如果沒(méi)有能上線的系統(tǒng)產(chǎn)品,無(wú)論你怎么強(qiáng)調(diào)你的團(tuán)隊(duì)實(shí)力、項(xiàng)目的進(jìn)展,從最本質(zhì)的角度來(lái)看,沒(méi)有可用的產(chǎn)品,項(xiàng)目就是失敗的!“必須把紅旗插在山頭上!不然,死多少人都沒(méi)有用!”——這是我在一個(gè)項(xiàng)目中客戶領(lǐng)導(dǎo)對(duì)我說(shuō)過(guò)的話。
因此,敏捷方法學(xué)首先考慮這個(gè)原理提供了一系列非常有用的實(shí)踐。
1.1 現(xiàn)場(chǎng)客戶
在集成公司做過(guò)項(xiàng)目的朋友們絕大多數(shù)都應(yīng)該經(jīng)歷過(guò)現(xiàn)場(chǎng)開(kāi)發(fā)了,客戶總是希望能夠與開(kāi)發(fā)人員面對(duì)面的交流,并且他們希望能在出現(xiàn)問(wèn)題的時(shí)候第一時(shí)間找到能夠解決問(wèn)題的人。現(xiàn)場(chǎng)開(kāi)發(fā)讓客戶以為能夠很好地解決上面兩個(gè)問(wèn)題。但實(shí)際上,效果可能并不如客戶所想像。
這里的問(wèn)題其實(shí)就是軟件項(xiàng)目最初遇到的難題,需求獲取和實(shí)現(xiàn)。現(xiàn)場(chǎng)開(kāi)發(fā)項(xiàng)目往往將全部的精力放在滿足用戶需求方面了,但是誰(shuí)又能保證說(shuō)滿足項(xiàng)目中說(shuō)了算的那個(gè)客戶提出的需求就是對(duì)產(chǎn)品最有用的呢?
這個(gè)實(shí)踐就是要解決如果最快速提供有用的產(chǎn)品,必須滿足需求你不滿足肯定不行,但是全部的需求都去滿足也肯定不行。因此,敏捷方法在這里要求現(xiàn)場(chǎng)客戶的用意就是要時(shí)刻保持與客戶的溝通,以便確定最合適的需求范圍,讓團(tuán)隊(duì)能否高效運(yùn)作,用最小的代價(jià)提供出有用的產(chǎn)品。
1.2 小發(fā)布
敏捷方法要求最短時(shí)間內(nèi)發(fā)布可用的產(chǎn)品,小發(fā)布是十分有效的實(shí)踐。要實(shí)踐小發(fā)布就必須有大幅裁剪需求的能力,結(jié)合現(xiàn)場(chǎng)客戶實(shí)踐,可以更有效地定義小發(fā)布需要實(shí)現(xiàn)的特性,并且保證每次發(fā)布的產(chǎn)品都包含有實(shí)際可用的用戶價(jià)值。
因?yàn)樾。院?jiǎn)單。如何將大的需求和系統(tǒng)變小卻是一門(mén)需要經(jīng)驗(yàn)和膽量的學(xué)問(wèn)。當(dāng)你沒(méi)辦法決定的時(shí)候,直覺(jué)也許是最可靠的了。沒(méi)有什么需要擔(dān)心,反正每次的發(fā)布都很小,所以改變方向起來(lái)也容易J
小發(fā)布是敏捷方法響應(yīng)和控制需求變化的有效機(jī)制,第一時(shí)間將系統(tǒng)發(fā)布給現(xiàn)場(chǎng)客戶或是最終用戶,就可以在第一時(shí)間獲取反饋,從而降低需求變化對(duì)系統(tǒng)帶來(lái)的沖擊。
1.3 測(cè)試優(yōu)先
測(cè)試優(yōu)先是敏捷方法廣為接受的實(shí)踐了,先按照測(cè)試框架編寫(xiě)單元測(cè)試,再為系統(tǒng)添加實(shí)現(xiàn)的代碼,可以有效防止過(guò)度設(shè)計(jì)。讓程序員們自然而然的把注意力集中到提供客戶價(jià)值上,而不是將精力泛濫在無(wú)邊無(wú)際的代碼技巧之中。
完善的測(cè)試也為系統(tǒng)重構(gòu)提供有效的屏障,檢驗(yàn)系統(tǒng)的重構(gòu)是否成功的標(biāo)準(zhǔn)仍然是系統(tǒng)是否有效地提供用戶價(jià)值。
1.4 持續(xù)集成
持續(xù)集成為項(xiàng)目提供了基線,為小發(fā)布提供便捷。每時(shí)每刻項(xiàng)目都有保障通過(guò)測(cè)試并且可以運(yùn)行的系統(tǒng)。再也不需要為準(zhǔn)備發(fā)布而辛苦地熬夜、匆忙地測(cè)試、混亂地運(yùn)行,然后準(zhǔn)備迎接無(wú)數(shù)的系統(tǒng)bug的煎熬了。持續(xù)集成讓這些過(guò)程每時(shí)每刻都在項(xiàng)目中自動(dòng)有序地進(jìn)行著。
發(fā)布只需要從集成服務(wù)器上取出最新完成的版本就可以了。
2 依賴于人和協(xié)作
軟件項(xiàng)目的成功依賴于人和協(xié)作,在這點(diǎn)上沒(méi)有人能否認(rèn)。傳統(tǒng)軟件方法也是想盡一切辦法來(lái)加強(qiáng)協(xié)作的效率以及消除人對(duì)項(xiàng)目的負(fù)面影響。敏捷方法則從另一角度來(lái)強(qiáng)調(diào)要發(fā)揮人的積極因素以及強(qiáng)調(diào)直接的交流來(lái)提高協(xié)作效率,傳統(tǒng)的標(biāo)準(zhǔn)化管理流程和基于文檔的協(xié)作對(duì)于快速變化的項(xiàng)目要求已經(jīng)明顯不能適應(yīng)。因此,敏捷方法重新回到了發(fā)揮人和團(tuán)隊(duì)潛力的方向。任何系統(tǒng)和過(guò)程的適應(yīng)能力都無(wú)法與人來(lái)比,因此,充分發(fā)揮團(tuán)隊(duì)的個(gè)人和協(xié)作能力,就能夠得到最高的效率和最好的效果。
2.1 白板
白板是敏捷項(xiàng)目團(tuán)隊(duì)必備的利器,沒(méi)有白板的團(tuán)隊(duì)是無(wú)法想像的。
在白板前面站立著的時(shí)候就是思維最活躍的時(shí)候,因?yàn)檎l(shuí)也。敏捷團(tuán)隊(duì)最常采用的方法就是所謂頭腦風(fēng)暴法,大家針對(duì)目標(biāo)主題在白板前討論,將所有能想到的概念、方法、詞句統(tǒng)統(tǒng)寫(xiě)到白板上,很快行之有效的解決方案就會(huì)突然之間出現(xiàn)在大家面前了。
2.2 站立會(huì)議
站著開(kāi)會(huì)往往效率更高,目標(biāo)更加清晰。每天團(tuán)隊(duì)之間需要時(shí)時(shí)刻刻保持高效的交流。夸張點(diǎn)說(shuō),敏捷團(tuán)隊(duì)的工作室往往更像一個(gè)熱鬧鬧的市集。安靜的環(huán)境并不一定就是軟件開(kāi)發(fā)最高效的環(huán)境。
2.3 PP
結(jié)對(duì)編程是提高個(gè)人效率非常有效的實(shí)踐,人們往往說(shuō)做什么都最好有個(gè)伴。巡警執(zhí)勤,飛行戰(zhàn)斗編隊(duì),拉力賽車,都是兩兩組合的生動(dòng)案例。軟件開(kāi)發(fā)中的結(jié)對(duì)編程要求更高,兩個(gè)人同時(shí)坐在電腦前面完成一個(gè)任務(wù),一個(gè)人負(fù)責(zé)實(shí)際操作,另外一個(gè)人負(fù)責(zé)即時(shí)審查,任何需要的時(shí)候兩人都可以互換角色。在PP對(duì)不同角色的名稱來(lái)說(shuō),更類似拉力賽車手。
即時(shí)審查、點(diǎn)對(duì)點(diǎn)壓力、即時(shí)溝通、目標(biāo)導(dǎo)向、知識(shí)傳播,結(jié)對(duì)編程的好處不用在這里一一細(xì)數(shù)了。結(jié)對(duì)編程是將協(xié)作效率發(fā)揮到極致的實(shí)踐,不過(guò)認(rèn)真執(zhí)行它還真需要勇于嘗試,甚至需要強(qiáng)制性的約束。
2.4 不加班
加班是否真的無(wú)法避免?至少我經(jīng)歷的項(xiàng)目還沒(méi)有不加班的時(shí)候,有時(shí)候是必須,有些時(shí)候則是自愿,反正我個(gè)人是沒(méi)辦法做到每天8個(gè)小時(shí)滿負(fù)荷運(yùn)轉(zhuǎn)然后每周只工作5天。作為一個(gè)典型的中國(guó)程序員,我進(jìn)入工作狀態(tài)以及從工作狀態(tài)中退出都需要不少時(shí)間。不過(guò)身體狀態(tài)的確是一天不如一天,這也許是中國(guó)程序員的編程生命周期普遍比歐美短的重要原因吧。
這個(gè)實(shí)踐,只有真正的高手才能做到罷。用中國(guó)的古語(yǔ)來(lái)說(shuō):靜如處子,動(dòng)如脫兔。能夠有效地控制自己工作狀態(tài)的人,誰(shuí)敢說(shuō)他不是高手?因此,對(duì)于這個(gè)實(shí)踐,我的建議是反過(guò)來(lái)考慮,努力不斷地嘗試控制自己的狀態(tài),應(yīng)該算是向高手邁進(jìn)的一個(gè)有效途徑吧J。
3 做盡可能簡(jiǎn)單的事情
我個(gè)人認(rèn)為敏捷原理中最核心的原理就是簡(jiǎn)單了。一句話,簡(jiǎn)單可不簡(jiǎn)單!復(fù)雜、厚重的方法自然是稱不上敏捷的。因此,敏捷就是做盡可能簡(jiǎn)單的事情。簡(jiǎn)單的事情才有把握和可能去做好。當(dāng)項(xiàng)目中無(wú)數(shù)簡(jiǎn)單的事情都被做好以后,它必然就是一個(gè)不簡(jiǎn)單的成功項(xiàng)目了。
3.1 將盡可能多的工作丟棄不做的藝術(shù)
簡(jiǎn)單是將盡可能多的工作丟棄不做的藝術(shù)。在開(kāi)始動(dòng)手之前,要問(wèn)問(wèn)自己和團(tuán)隊(duì),如果我不做這件事情,會(huì)發(fā)生什么情況呢?會(huì)失去什么呢?
敏捷方法會(huì)幫助我們來(lái)確定哪些工作是可能丟棄的,反過(guò)來(lái)說(shuō),丟棄盡可能多的工作,你所使用的方法就盡可能地趨于敏捷了。這也是一個(gè)不斷迭代和進(jìn)步的過(guò)程。
3.2 更少的文檔
敏捷方法最先倡導(dǎo)的一個(gè)實(shí)踐就是丟棄繁重的文檔,只用最少的時(shí)間和代價(jià)來(lái)記錄需求、設(shè)計(jì)和會(huì)議。文檔的目的也是為了交流,當(dāng)團(tuán)隊(duì)或者客戶能面對(duì)面交流的時(shí)候,我們就不要寫(xiě)文檔,直接面對(duì)面討論,然后用簡(jiǎn)單的方法記錄下結(jié)論,盡快去落實(shí)執(zhí)行。
3.3 簡(jiǎn)單設(shè)計(jì)
簡(jiǎn)單設(shè)計(jì)的目標(biāo)依然是為了減少工作,在沒(méi)有清晰地理解需求和目標(biāo)之前,我們不去做那些前置設(shè)計(jì)工作。換句話說(shuō),只針對(duì)已知的需求設(shè)計(jì)和實(shí)現(xiàn)。這是敏捷方法能夠快速適應(yīng)的重要實(shí)踐經(jīng)驗(yàn),設(shè)計(jì)的不足可以用不斷的重構(gòu)來(lái)彌補(bǔ)。重構(gòu)設(shè)計(jì)的驅(qū)動(dòng)過(guò)程也是針對(duì)變動(dòng)的需求來(lái)的,只不過(guò)是針對(duì)進(jìn)一步了解的更多已知需求來(lái)設(shè)計(jì)和實(shí)現(xiàn),為此我們要對(duì)原先的設(shè)計(jì)進(jìn)行調(diào)整和優(yōu)化。
3.4 目標(biāo)和特征驅(qū)動(dòng)
敏捷方法中需要不斷調(diào)整的內(nèi)容就是階段目標(biāo),因此我們采用快速迭代的過(guò)程,每次迭代都針對(duì)特定的功能需求和系統(tǒng)目標(biāo),在這點(diǎn)上敏捷也是特征驅(qū)動(dòng)的。這同樣也符合交付有用的產(chǎn)品原理。
4 結(jié)語(yǔ)
敏捷方法學(xué)提倡是知之而用的實(shí)踐精神,所有的敏捷方法都是實(shí)踐驅(qū)動(dòng)的。因此認(rèn)真地學(xué)習(xí)和理解敏捷原理才有助于我們理解敏捷實(shí)踐規(guī)則背后的相互關(guān)系。我們僅僅是引入幾條敏捷實(shí)踐不能說(shuō)就是實(shí)踐了敏捷方法,而要看我們項(xiàng)目實(shí)施是否時(shí)刻貫徹了敏捷原理的精神,針對(duì)項(xiàng)目的實(shí)際需要選擇甚至創(chuàng)造出最適合團(tuán)隊(duì)和項(xiàng)目環(huán)境的敏捷實(shí)踐,每個(gè)敏捷團(tuán)隊(duì)和敏捷項(xiàng)目都擁有自己獨(dú)特的敏捷方法。
不得窺道門(mén),不得悟佛門(mén),不得入窄門(mén),實(shí)乃破門(mén)。