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