# 6.2 敏捷開發
## 6.2 敏捷開發
在Web開發領域你大概聽到過“敏捷開發”,或者接觸過一些敏捷的方法和工具,比如站立會議、結對編程(Pair Programming)、持續集成,等等,你甚至可能正某個使用XP或Scrum開發方式的團隊里工作(XP和Scrum都是敏捷的一種流派)。那么敏捷究竟是什么?為什么要敏捷以及如何做到敏捷呢?
### 什么是敏捷開發?為什么要敏捷?
敏捷開發是一套軟件工程理論,同時也是一套實踐方法;區別于傳統的瀑布流(waterfall)模式,敏捷強調積極地適應需求的變化(與之相對,傳統瀑布流模式在一開始就鎖定需求,直至最終產品完成),通過漸進的開發方法。
按照Wiki的定義——“**敏捷開發(agile software development)**是指一系列的軟件開發原則,在這種開發中需求和解決方案都逐漸演化,通過由自組織(self-organizing)、跨功能(cross-functional)的開發人員組成的開發團隊的合作來達到。”[1](#fn_1)
這句話概述了敏捷的目標和方法:敏捷是為了適應需求的變化,提供逐漸演化的解決方案,由自組織和跨功能的開發人員組成的團隊合作達成。下面詳細闡述這句話的含義。
#### 變化的需求
需求會變化,主要是因為有些軟件在一開始難以預計最終的需求,或者需求隨著時間的推移在改變(比如三月前的需求跟三個月后的不一樣,如果一個軟件按三個月前的需求開發了三個月,那么完成之后也是無用的)。這些都是傳統瀑布流模式難以應對的,而敏捷開發可以做得很好。
#### 迭代
*逐漸演化的解決方案*一般通過*迭代(iteration)*來完成。下圖通過與瀑布流模式的對比解釋了什么是迭代:

通常瀑布流模式通常包含“計劃”、“分析”、“設計”、“編碼”、“測試”、“部署”這幾個階段,最后產出可用的軟件產品;迭代則是把整個產品開發周期分割為若干個小的迭代周期(一般1~4個禮拜),在每個迭代周期內完成從“計劃”到“部署”的全部工作,并且在每個迭代周期結束時都產出可以工作的軟件。通過在每個迭代周期新增或改進一部分產品功能,使產品變得越來越完善;同時,需求的變化也會得到及時的處理。
#### 自組織
*自組織(self-organizing)*的團隊是一個自治團隊:
- 每個成員都能自主工作,而不是由他人指派工作
- 成員之間可以有效地(面對面)交流
- 相互信任,相互配合,共同完成工作
敏捷開發強調自治團隊的重要性和積極性[2](#fn_2)。如果團隊不能按照敏捷的方式工作,那么開發就無法達到敏捷。
#### 跨功能
*跨功能(cross-functional)*是指團隊成員來自相關的各個部門。其中很重要的一點是:須要有客戶代表加入,共同開發。客戶代表的作用是傳達客戶的業務需求、隨時解答各種關于業務的細節問題;并在每個迭代周期結束時驗收產品,保證產品的功能都是客戶需要的并且達到了客戶的需求。這是敏捷開發適應變化的關鍵之一:如果沒有客戶的參與,開發會很快失去方向或者向錯誤的方向進行。
### 如何進行敏捷開發?
上面提到,敏捷需要“組織自治、跨功能的團隊進行迭代式開發”。但這句話還是太寬泛了,不足以指導具體的開發活動。實際上,敏捷不只是一套理論,更是一套詳細的實踐指南,告訴你具體應該怎么做,包括:如何在一個迭代中做計劃、如何進行有效率的溝通、每個開發者如何領取任務……等等。這套行動指南的內容十分豐富,而且在具體做法上形成了不同的流派,如[XP](https://en.wikipedia.org/wiki/Extreme_programming)(eXtreme Programming,極限編程)和[Scrum](https://en.wikipedia.org/wiki/Scrum_%28software_development%29)等。但不論是何流派,在敏捷的宗旨上都是一致的。如果你想進一步了解敏捷開發,我推薦:
- [敏捷開發的Wiki](https://en.wikipedia.org/wiki/Agile_software_development)——對敏捷涉及的概念、方法和流派有豐富的說明和鏈接
- [《The Art of Agile Development》](http://shop.oreilly.com/product/9780596527679.do),中譯《敏捷開發的藝術》——這本書深入淺出地介紹了敏捷實踐,值得一讀
另外,敏捷還涉及一些工具,它們能幫助你更好/更容易地達到敏捷,包括:
- 版本控制系統,如Git——敏捷對版本控制系統沒有特殊的要求,但是敏捷的實踐要求這種版本控制系統必須具有很好的“分支-合并”功能,在這方面Git是一個上佳選擇。
- 持續集成(Continuous Integration)工具,如[Jenkins](https://jenkins.io/)
- 項目管理/協作系統,如[Rally](https://www.rallydev.com/)
- 敏捷的Web開發框架,如[Ruby on Rails](http://rubyonrails.org/)
敏捷開發的內涵和實踐都十分豐富,即使你不能從頭到尾讀完一本敏捷專著,了解一下敏捷的基本概念也是十分有益的。
最后,我想以**敏捷宣言(The Agile Manifesto)**——敏捷的“憲法”——的十二條基本原則作為結束:
1. Customer satisfaction by early and continuous delivery of valuable software
2. Welcome changing requirements, even in late development
3. Working software is delivered frequently (weeks rather than months)
4. Close, daily cooperation between business people and developers
5. Projects are built around motivated individuals, who should be trusted
6. Face-to-face conversation is the best form of communication (co-location)
7. Working software is the principal measure of progress
8. Sustainable development, able to maintain a constant pace
9. Continuous attention to technical excellence and good design
10. Simplicity—the art of maximizing the amount of work not done—is essential
11. Best architectures, requirements, and designs emerge from self-organizing teams
12. Regularly, the team reflects on how to become more effective, and adjusts accordingly
> 1. "Agile software development describes a set of principles for software development under which requirements and solutions evolve through the collaborative effort of self-organizing cross-functional teams." - [https://en.wikipedia.org/wiki/Agile\_software\_development](https://en.wikipedia.org/wiki/Agile_software_development)[?](#reffn_1 "Jump back to footnote [1] in the text.")
> 2. "Best architectures, requirements, and designs emerge from self-organizing teams" - 《敏捷宣言(Agile Manifesto)》的十二條原則之一[?](#reffn_2 "Jump back to footnote [2] in the text.")
- 前言
- 1 Web概述
- 1.1 什么是Web
- 1.2 超文本和超鏈接
- 1.3 URL
- 1.4 DNS
- 1.5 HTTP
- 1.5.1 客戶端請求
- 1.5.2 服務器應答
- 1.5.3 進一步了解HTTP
- 1.6 HTTPS
- 2 Web瀏覽器
- 2.1 HTML
- 2.1.1 文檔類型聲明
- 2.1.2 標簽和屬性
- 2.1.3 文檔結構
- 2.1.4 DOM
- 2.1.5 進一步了解HTML
- 2.2 CSS
- 2.2.1 樣式與樣式表
- 2.2.2 樣式表語法
- 2.2.3 級聯樣式表
- 2.2.4 進一步了解CSS
- 2.3 JavaScript
- 2.3.1 script標簽
- 2.3.2 操縱DOM
- 2.3.3 jQuery
- 2.3.4 進一步了解JavaScript
- 2.4 Ajax
- 2.5 移動設備與響應式Web設計
- 3 Web服務器
- 3.1 方法與資源
- 3.2 狀態代碼
- 3.3 靜態內容與動態內容
- 3.4 編程語言與技術
- 3.4.1 CGI
- 3.4.2 PHP
- 3.4.3 Java
- 3.4.4 Python
- 3.4.5 Ruby
- 3.4.6 Node.js
- 3.5 RESTful Web API
- 3.6 服務器架構
- 3.7 Web緩存
- 3.8 服務器推送
- 4 數據庫
- 4.1 關系型數據庫
- 4.2 NoSQL數據庫
- 5 Web服務器的其他組件
- 5.1 Cron
- 5.2 消息隊列
- 5.3 郵件服務器
- 6 開發工具與技術
- 6.1 Git
- 6.1.1 Git基礎操作
- 6.1.2 Git基本原理
- 6.1.3 進一步了解Git
- 6.2 敏捷開發