敏捷開發(agile development)是很是流行的軟件開發方法。據統計,2018年90%的軟件開發採用敏捷開發。程序員
可是,到底什麼是敏捷開發,能說清的人卻很少。本文嘗試用簡潔易懂的語言,解釋敏捷開發。架構
敏捷開發的核心是迭代開發(iterative development)。敏捷必定是採用迭代開發的方式。ide
那麼什麼是"迭代開發"呢?迭代的英文是 iterative,直譯爲"重複",迭代開發其實就是"重複開發"。工具
對於大型軟件項目,傳統的開發方式是採用一個大週期(好比一年)進行開發,整個過程就是一次"大開發";迭代開發的方式則不同,它將開發過程拆分紅多個小週期,即一次"大開發"變成屢次"小開發",每次小開發都是一樣的流程,因此看上去就好像重複在作一樣的步驟。測試
舉例來講,SpaceX 公司想造一個大推力火箭,將人類送到火星。可是,它不是一開始就造大火箭,而是先造一個最簡陋的小火箭 Falcon 1。結果,第一次發射就爆炸了,直到第四次發射,才成功進入軌道。而後,開發了中型火箭 Falcon 9,九年中發射了70次。最後,纔開發 Falcon 重型火箭。若是 SpaceX 不採用迭代開發,它可能直到如今還沒法上天。ui
迭代開發將一個大任務,分解成屢次連續的開發,本質就是逐步改進。開發者先快速發佈一個有效但不完美的最簡版本,而後不斷迭代。每一次迭代都包含規劃、設計、編碼、測試、評估五個步驟,不斷改進產品,添加新功能。經過頻繁的發佈,以及跟蹤對前一次迭代的反饋,最終接近較完善的產品形態。編碼
迭代開發只是要求將開發分紅多個迭代,並無回答一個重要的問題:怎麼劃分迭代,哪一個任務在這個迭代,哪一個任務在下個迭代?這時,通常採用"增量開發"(incremental development)劃分迭代。lua
所謂"增量開發",指的是軟件的每一個版本,都會新增一個用戶能夠感知的完整功能。也就是說,按照新增功能來劃分迭代。spa
舉例來講,房產公司開發一個10棟樓的小區。若是採用增量開發的模式,該公司第一個迭代就是交付一號樓,第二個迭代交付二號樓......每一個迭代都是完成一棟完整的樓。而不是第一個迭代挖好10棟樓的地基,第二個迭代建好每棟樓的骨架,第三個迭代架設屋頂......設計
增量開發加上迭代開發,纔算真正的敏捷開發。
敏捷開發的第一個好處,就是早期交付,從而大大下降成本。
仍是以上一節的房產公司爲例,若是按照傳統的"瀑布開發模式",先挖10棟樓的地基、再蓋骨架、而後架設屋頂,每一個階段都等到前一個階段完成後開始,可能須要兩年才能一次性交付10棟樓。也就是說,若是不考慮預售,該項目必須等到兩年後才能回款。
敏捷開發是六個月後交付一號樓,後面每兩個月交付一棟樓。所以,半年就能回款10%,後面每月都會有現金流,資金壓力就大大減輕了。
敏捷開發的第二個好處是,及時瞭解市場需求,下降產品不適用的風險。
請想想,哪種狀況損失比較小:10棟樓都造好之後,才發現賣不出去,仍是造好第一棟樓,就發現賣不出去,從而改進或停建後面9棟樓?
對於軟件項目來講,先有一個原型產品,瞭解市場的接受程度,每每是項目成功的關鍵。有一本書叫作《夢斷代碼》,副標題就是"20+個程序員,三年時間,4732個bug,100+萬美圓,最後失敗的故事",這就是沒有采用敏捷開發的結果。相反的,Instagram 最初是一個地理位置打卡 App,後來發現用戶不怎麼在意地理位置,更喜歡上傳照片,就改作照片上傳軟件,結果成了獨角獸。
因爲敏捷開發能夠不斷試錯,找出對業務最重要的功能,而後經過迭代,調整軟件方向。相比傳統方式,大大增長了產品成功的可能性。若是市場需求不肯定,或者你對該領域不熟悉,那麼敏捷開發幾乎是惟一可行的應對方式。
雖然敏捷開發將軟件開發分紅多個迭代,可是也要求,每次迭代都是一個完整的軟件開發週期,必須按照軟件工程的方法論,進行正規的流程管理。
具體來講,每次迭代都必須依次完成如下五個步驟。
- 需求分析(requirements analysis)
- 設計(design)
- 編碼(coding)
- 測試(testing)
- 部署和評估(deployment / evaluation)
每一個迭代大約持續2~6周。
《敏捷軟件開發宣言》裏面提到四個價值觀。
- 程序員的主觀能動性,以及程序員之間的互動,優於既定流程和工具。
- 軟件可以運行,優於詳盡的文檔。
- 跟客戶的密切協做,優於合同和談判。
- 可以響應變化,優於遵循計劃。
該宣言還提出十二條敏捷開發的原則。
(完)