敏捷開發(fā)的推理
我查閱了一下敏捷開發(fā)相關(guān)的資料,結(jié)合我長期對敏捷開發(fā)的實(shí)踐,我將對敏捷開發(fā)的本質(zhì)進(jìn)行一次探討。本文我打算理清敏捷開發(fā)的核心,并由核心衍生出它的價(jià)值觀。我希望能夠通過拋出本文這塊磚,能夠引出高手的玉來。
符合現(xiàn)實(shí)的軟件
軟件是為著解決現(xiàn)實(shí)的問題而產(chǎn)生的。從而軟件存在的意義就是與現(xiàn)實(shí)相適應(yīng)。敏捷開發(fā)的核心即:符合現(xiàn)實(shí)的軟件。一個(gè)符合現(xiàn)實(shí)的軟件,才能夠可持續(xù)地與現(xiàn)實(shí)共同發(fā)展。一旦軟件與現(xiàn)實(shí)背離,軟件的生命周期也就到了結(jié)束的時(shí)候了。
現(xiàn)實(shí)的世界是動(dòng)態(tài)變化的,人類造出來的東西,往往是落后于世界的變化的。如,地圖造出來之后,可能又多修了幾條路,幾個(gè)建筑;剛買了一款高配置的計(jì)算機(jī),幾個(gè)月后,自己的機(jī)器配置又處于被甩的地位了……這些變化,人是被迫要去接受。因?yàn)檫@些東西屬于硬件,人在目前還無法輕易地改變硬件。
而與此不同的軟件,則是另外一種現(xiàn)象了。改變軟件的代價(jià)是相當(dāng)?shù)土?。改變軟件,?shí)際上只是改變硬盤上的磁性。改變軟件的容易性,帶來的結(jié)果是: 一、軟件開發(fā)者容易以自己的想象來決定軟件怎么做。 開發(fā)出一個(gè)無用的軟件,比起因?yàn)槌鲥e(cuò)而要?dú)У舸鍪鄣?0萬張地圖,比起因?yàn)楣に嚶┒炊谢匾呀?jīng)出售的計(jì)算機(jī)來講,代價(jià)太低廉了。 二、軟件更加具備符合現(xiàn)實(shí)的條件。 開發(fā)者讓軟件與現(xiàn)實(shí)相適應(yīng),所要付出的代價(jià)非常低廉。
所以,敏捷開發(fā)的核心就是符合現(xiàn)實(shí)的軟件。為了造出符合現(xiàn)實(shí)的軟件,才有了進(jìn)一步的價(jià)值觀及方法論。
簡單
簡單,是在人認(rèn)識(shí)到事物的本質(zhì)的時(shí)候才能夠獲得的。在開發(fā)軟件的時(shí)候,我們往往疲于應(yīng)付各種各樣的需求。很少有人能夠?qū)?fù)雜的需求化為簡單的概念。比如,做一個(gè)音樂軟件,有“我喜歡的”、“最近播放”、“最新添加”等不同的性質(zhì)的歌。有些開發(fā)者會(huì)做出三個(gè)列表來存放三種性質(zhì)的歌。而實(shí)際上他們的本質(zhì)是一樣的,即播放列表。區(qū)別在于觸發(fā)加入播放列表的條件不同而已。因而只需要做一個(gè)列表,在列表中標(biāo)記每首歌的觸發(fā)條件。
把軟件做得很復(fù)雜,通常說明軟件所抓住的本質(zhì)還很少。需要再好好考慮一下如何進(jìn)一步進(jìn)行簡化。軟件的概念簡單,一方面可以讓用戶很容易理解和操作;另一方面能夠適應(yīng)世界的變化。再拿以上的音樂軟件來說。如何做成三個(gè)列表,再要加一個(gè)“聽了又聽”的歌,又得創(chuàng)建一個(gè)列表。而使用一個(gè)列表的方法,則只需要處理“聽了又聽”這個(gè)觸發(fā)條件。
符合現(xiàn)實(shí)的軟件必然是簡單的。所以,敏捷開發(fā)的第一條價(jià)值觀是:簡單。我們在實(shí)施敏捷開發(fā)的時(shí)候,都是圍繞“簡單”這一價(jià)值觀而進(jìn)行實(shí)施的。即,時(shí)刻保證軟件的簡單性。簡單性包括兩個(gè)方面:一是對于用戶而言,概念很簡單;二是對于開發(fā)者而言,開發(fā)的技術(shù)及代碼很簡單。
軟件的可持續(xù)性也取決于軟件是否簡單??沙掷m(xù)性是指,快速響應(yīng)現(xiàn)實(shí)的變化。一個(gè)復(fù)雜的軟件,要么讓用戶無所適從,要么讓代碼無法維護(hù)。這都將導(dǎo)致軟件無法持續(xù)。這會(huì)迫使我們以制造硬件的方式來開發(fā)軟件。硬件是在迫不得已的情況下才丟掉重新升級(計(jì)算機(jī)在實(shí)在沒有辦法用的時(shí)候,才買新的),要讓軟件也這樣做,軟件開發(fā)低廉代價(jià)的優(yōu)勢就白白浪費(fèi)掉了。
反饋
一個(gè)軟件要符合現(xiàn)實(shí),就需要通過現(xiàn)實(shí)的反饋來發(fā)展。軟件前進(jìn)的動(dòng)力是現(xiàn)實(shí)的反饋。敏捷開發(fā)是歡迎現(xiàn)實(shí),擁抱變化的開發(fā)。強(qiáng)調(diào)該條價(jià)值觀,是為了消除開發(fā)者容易犯的錯(cuò)誤——以自己的想象去決定軟件怎么做。
因而,在做一個(gè)軟件之前,首先要找到能夠給出反饋的人。如果連能夠給出反饋的人都沒有,那么這個(gè)軟件就沒有做的必要了。
反饋的重要性,更可以這樣說:矛盾推動(dòng)事物的發(fā)展。反饋是指出不足的矛,軟件是彌補(bǔ)不足的盾。在矛的不斷攻擊之下,盾才能不斷完善。矛之不存,盾何以壯。
在方法論上面,敏捷開發(fā)強(qiáng)調(diào)快速發(fā)布版本,取得現(xiàn)實(shí)的反饋而不是開發(fā)者大腦中自己想像的反饋。如果開發(fā)者正好也是使用者,那么軟件做成的幾率就要大很多。開源軟件大多數(shù)都是開發(fā)者自己要解決問題而產(chǎn)生的。
溝通
溝通是開發(fā)者取得反饋的手段。一個(gè)優(yōu)秀的開發(fā)者,是善于溝通的。溝通包含口語、寫文檔等各種方式。優(yōu)秀的開發(fā)者應(yīng)該能夠清晰而有條理地表達(dá)自己的想法。
現(xiàn)實(shí)世界中,人們普遍認(rèn)為:軟件開發(fā)者因?yàn)楦鷻C(jī)器打交道,從而是內(nèi)向的,不善于溝通的。實(shí)際上,這樣的開發(fā)者不能算是優(yōu)秀的。他們所做的事情,更多地是把需求轉(zhuǎn)化為計(jì)算機(jī)語言的工作,即翻譯員。而現(xiàn)在都出來谷歌翻譯了,人類語言翻譯成計(jì)算機(jī)語言只是時(shí)間問題了。
溝通的目的是進(jìn)行思想碰撞。在溝通當(dāng)中了解別人的思維方式,表達(dá)自己的思維方式,進(jìn)一步揚(yáng)棄為更加優(yōu)秀的思維方式。在優(yōu)秀的思維方式之下才能保持讓自己與現(xiàn)實(shí)相符合。優(yōu)秀的開發(fā)者是不會(huì)放棄獲取優(yōu)秀的思維方式的機(jī)會(huì)的。
在敏捷開發(fā)當(dāng)中,提出這一價(jià)值觀,正是要開發(fā)者變得優(yōu)秀。放棄優(yōu)秀的開發(fā)者無法適應(yīng)敏捷開發(fā)。
勇氣
在現(xiàn)實(shí)生活中,缺乏勇氣比較常見。比如,不敢大大方方地表白,不敢嘗試新的事物……在軟件開發(fā)領(lǐng)域,缺乏勇氣更是常見:技術(shù)更新好幾代了,公司還不敢使用新技術(shù);公司不敢嘗試新的開發(fā)模式(敏捷開發(fā))……
勇氣,本質(zhì)上來講,是對現(xiàn)狀的否定。人們往往一廂情愿地相信永恒;一旦確定,就不愿意改變。這正是勇氣的用武之地。勇氣使人去否定永恒,擁抱改變。勇氣是創(chuàng)造的源泉。人沒有勇氣,人就永遠(yuǎn)是他現(xiàn)在的這樣了,正是勇氣才迫使他去改變。
在開發(fā)的時(shí)候,我們可能花了很多時(shí)間寫了很多代碼,但要決定放棄已經(jīng)寫過的所有代碼,這是非常需要勇氣的。而如果能夠做到這一點(diǎn),在軟件開發(fā)上就占據(jù)了非常有利的位置。比如,我們可能會(huì)花大量時(shí)間去寫頁面原型,以希望能夠得到用戶反饋。在確定得到用戶反饋之后,我們可以完全放棄原型代碼,進(jìn)而可以得到更加符合現(xiàn)實(shí)(也更加簡單)的代碼。
敏捷開發(fā)強(qiáng)調(diào)勇氣這一價(jià)值觀,正是要開發(fā)者去擁抱現(xiàn)實(shí)的變化,讓開發(fā)者及軟件朝著符合現(xiàn)實(shí)的路線走。
迭代開發(fā)
講完四個(gè)價(jià)值觀之后,接下來我把四個(gè)價(jià)值觀聯(lián)系起來,得到一個(gè)方法論——迭代開發(fā)。
如圖所示,簡單是軟件開發(fā)的起點(diǎn),也是軟件開發(fā)的終點(diǎn)。
說它是起點(diǎn),是因?yàn)椋绻_發(fā)的東西還是復(fù)雜的,那就有必要把概念弄得簡單一些。這包含兩個(gè)方面的行動(dòng):一、把復(fù)雜的系統(tǒng)砍掉一半的功能(廣度上);二、盡可能對各個(gè)功能進(jìn)行抽象(深度上,參考前面音樂軟件的例子)。
接下來,我們拿著簡單的軟件(或者軟件原型)進(jìn)入溝通環(huán)節(jié)。我們可以在兩個(gè)方面進(jìn)行溝通:一、與用戶溝通軟件的邏輯是否滿足要求;二、與開發(fā)者溝通軟件是否在技術(shù)上代價(jià)很高,如何權(quán)衡。
溝通之后,我們可以得到現(xiàn)實(shí)的反饋,在現(xiàn)實(shí)的反饋之下,我們才有勇氣進(jìn)行改變,使用我們的軟件繼續(xù)維持其簡單性。這就完成了軟件的一個(gè)迭代。
結(jié)束語
敏捷開發(fā)不僅是一種開發(fā)方法,更是訓(xùn)練自己心智的手段。敏捷開發(fā)所訓(xùn)練的是:讓人做符合現(xiàn)實(shí)的事情。在做這樣的事情的時(shí)候,人更尊重的是活生生的現(xiàn)實(shí)而非權(quán)威(你尊重現(xiàn)實(shí)),人得到的是對現(xiàn)實(shí)敏銳的反應(yīng)能力(現(xiàn)實(shí)回敬你禮物)。