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