敏捷方法是一種從1990年代開始逐漸引起廣泛關注的一些新型軟體開發方法,是一種應對快速變化的需求的一種軟體開發能力。敏捷開發(agile development)是一種以人為核心、疊代、循序漸進的開發方法。
基本介紹
- 中文名:敏捷方法
- 開始時期:1990年代
- 原則:以人為核心、疊代、循序漸進
- 實際用:新型軟體開發方法
簡介
敏捷開發
然而,我們不得不面對的現實卻是,模式與方法的最佳化並不意味著問題的終結。作為一種開發模式,敏捷開發同樣需要面對眾多挑戰。
- 個體和互動 勝過 過程和工具
- 可以工作的軟體 勝過 面面俱到的文檔
- 客戶合作 勝過 契約談判
- 回響變化 勝過 遵循計畫
- 我們最優先要做的是通過儘早的、持續的交付有價值的軟體來使客戶滿意。
- 即使到了開發的後期,也歡迎改變需求。敏捷過程利用變化來為客戶創造競爭優勢。
- 經常性地交付可以工作的軟體,交付的間隔可以從幾個星期到幾個月,交付的時間間隔越短越好。
- 在整個項目開發期間,業務人員和開發人員必須天天都在一起工作。
- 圍繞被激勵起來的個體來構建項目。給他們提供所需的環境和支持,並且信任他們能夠完成工作。
- 在團隊內部,最具有效果並富有效率的傳遞信息的方法,就是面對面的交談。
- 工作的軟體是首要的進度度量標準。
- 敏捷過程提倡可持續的開發速度。責任人、開發者和用戶應該能夠保持一個長期的、恆定的開發速度。
- 不斷地關注優秀的技能和好的設計會增強敏捷能力。
- 簡單是最根本的。
- 最好的構架、需求和設計出於自組織團隊。
一、敏捷開發方法
(一) 說明
本文是閱讀Alistair Cockburn的Agile Software Development和William C. Wake的XP Explored的一些筆記和想法,Agile Software Development是一組軟體開發方法的總稱,包括(Crystal , Extreme Programming , Adaptive software development等等)。敏捷開發方法又稱為“輕量級”開發方法。
多數軟體開發仍然是一個顯得混亂的活動,即典型的“邊寫邊改” (code and fix)。設計過程充斥著短期的,即時的決定,而無完整的規劃。這種模式對小系統開發其實很管用,但是當系統變得越大越複雜時,要想加入新的功能就越來越困難。同時錯誤故障越來越多,越來越難於排除。一個典型的標誌就是當系統功能完成後有一個很長的測試階段,有時甚至有遙遙無期之感,從而對項目的完成產生嚴重的影響。
我們使用這種開發模式已有很長時間了,不過我們實際上也有另外一種選擇,那就是“正規方法”(methodology)。這些方法對開發過程有著嚴格而詳盡的規定,以期使軟體開發更有可預設性並提高效率,這種思路是借鑑了其他工程領域的實踐。
這些正規方法已存在了很長時間了,但是並沒有取得令人矚目的成功,甚至就沒怎么引起人們的注意。對這些方法最常聽見的批評就是它們的官僚繁瑣,要是按照它的要求來,那有做太多的事情需要做,而延緩整個開發進程。所以它們通常被認為是“繁瑣滯重型”方法,或Jim HighSmith 所稱的“巨型”(monumental)方法。
作為對這些方法的反叛,在過去幾年中出現了一類新方法。儘管它們還沒有正式的名稱,但是一般被稱為“敏捷型”方法。對許多人來說,這類方法的吸引之處在於對繁文縟節的官僚過程的反叛。它們在無過程和過於繁瑣的過程中達到了一種平衡,使得能以不多的步驟過程獲取較滿意的結果。
敏捷型與滯重型方法有一些顯著的區別。其中一個顯而易見的不同反映在文檔上。敏捷型不是很面向文檔,對於一項任務,它們通常只要求儘可能少的文檔。從許多方面來看,它們更象是“面向源碼”(code-oriented)。事實上,它們認為最根本的文檔應該是源碼。
但是,我並不以為文檔方面的特點是敏捷型方法的根本之點。文檔減少僅僅是個表象,它其實反映的是更深層的特點:
? 敏捷型方法是“適配性”而非“預設性”。 重型方法試圖對一個軟體開發項目在很長的時間跨度內作出詳細的計畫,然後依計畫進行開發。這類方法在計畫制定完成後拒絕變化。而敏捷型方法則歡迎變化。其實,它們的目的就是成為適應變化的過程,甚至能允許改變自身來適應變化。
? 敏捷型方法是“面向人”的(people-oriented) 而非“面向過程”的 (process-oriented)。 它們試圖使軟體開發工作順應人的天性而非逆之。它們強調軟體開發應當是一項愉快的活動。
我認為以上兩個特點很好的概括了敏捷開發方法的核心思想:適應變化和以人為中心
(二) 方法背後的思想
1 following 遵循一個定義好的process
2 detaching 知道不同process的適用範圍,在不同的場合使用不同的process
3 fluent 不關心是否遵循特定的process,知道在什麼情況下採用什麼動作
一般軟體開發有兩個目標:1 儘快的生產出軟體2 為下一個team或項目做準備,有時這兩個目標是矛盾的,我們要在這兩個目標之間尋求平衡
1 容易犯錯誤,因此必須在錯誤擴散之前找到並改正錯誤
2 當覺得可能失去較多的時候,不願意冒險
3 重新構造而不願意重複使用已有的東西
4 難於堅持一個習慣
1 具體的模型較抽象的模型更容易理解
2 從一個例子開始是容易的
3 通過觀察他人的成果學習
4 要有足夠的不受打擾的時間
5 分配的工作要與個人意向,能力匹配
6 不正確的獎勵會有壞作用,從長期看個人興趣比獎勵更重要,培養在工作中的自豪感:
1) pride in work參與工作的自豪感,通常參與一個重要的工作會有自豪感
2) pride in accomplishment 完成工作的自豪感,長期未完的工作會使士氣低落
3)pride in contribution 為他人貢獻的自豪感
7 鼓勵關心其他人的工作和整體的工作
1 對所有的項目使用同一種過程
2 沒有彈性
3 過於沉重
4 增加不必要的“必須完成”(“should do” is really should?)
5 沒有經過實踐檢驗
1 互動的面對面的交流是代價最小,最迅速的交換信息的方法
2 超過實際需要的過程是浪費的
3 大的團隊需要重量級方法
4 處理重大問題的項目需要重量級方法強調
5 增加反饋和交流可以減少中間產品和文檔的需求
6 輕量級方法更強調理解(understanding),自律(discipline)和技能(skill),重量級方法更強調文檔(documentation),過程(process)和正式(formality)
understanding指整個團隊關於項目的全部知識,包括討論的過程,documentation只能記錄其中的一部分
discipline是指個人主動的完成工作,process指個人根據指令完成工作
skill指具有良好技能的人可以省略中間的產品,formality指必須按照規定步驟完成工作
對於瓶徑處的工作應該儘量加快,減少重複,(使用更熟練的人,使用更多的人,使用更好的工具,使瓶徑處的工作的深入儘量穩定)對於非瓶徑處的工作可以多一些重複,在輸入還不確定的情況下也可以儘早開始。
1 向一個項目增加人員要花費較大代價(constly),因為原有人員和新人員之間的交流要花費大量時間
2 團隊的規模經常是跳躍的,例子:需要6個熟練的程式設計師,但是只有4個,於是增加不熟練的程式設計師,結果團隊的大量時間花費在培訓不熟練的程式設計師上面,最後增加到了20個不熟練的程式設計師。
3 應該側重於提高團隊的技能而不是擴充團隊
4 對不同的項目使用不同的過程
5 在適用的條件下,輕量級的方法優於重量級的方法
6 對不同的項目要裁減過程
敏捷開發重點
敏捷開發安全性
- 時刻關注安全性完成的定義(DoD)。
- 用驗收標準來驗證滿足了安全性需求。
- 在產品評審過程中,請利益相關者攻擊產品安全性。
- 用回顧反省的方法調整你的安全策略。
- 群聚解決安全問題。