ASD:Agile Software Development——敏捷軟件開發
1、什么是敏捷軟件開發?
敏捷軟件開發是一個概念意義上的框架,用來取代軟件工程項目的概念;它強調在項目的整個生命周期中,擁抱并促進由于軟件進化式的發展所帶來的變化。
請注意其中的三個關鍵詞:
在項目的整個生命周期中:這就涉及到了【敏捷項目管理】、【敏捷需求獲取】、狹義的【敏捷軟件開發】三個主要的領域和過程。要注意的是,上述三個過程并不是互相分開的,而是你中有我,我中有你。
擁抱并促進變化:世界上唯一不變的是變化。不論在任何領域,漠視、甚至否認、抗拒變化,都不是一個理性,嚴肅的人所應有的態度。學會如何識別變化的大勢,并在可能的時候,促使變化向好的方向發展。這才是面對變化的正確應對之法。
軟件進化式的發展:雖然上面提到促進變化的發展,但是軟件的演化過程,我相信是有其自身內在邏輯的,存在一些根本規律和指導方針;并不是完全以人的主觀意識為主導。
了解了這三個方面,下面就要引入敏捷宣言(Manifesto for Agile Software Development)了,2001年提出的第一版的敏捷軟件開發宣言:
我們正在通過實踐和幫助其他人實踐,揭示更好的開發軟件的方法。我們從實踐中得出的價值觀是:
☆ 人和交互重于過程和工具。
☆ 可以工作的軟件重于求全責備的文檔。
☆ 客戶合作重于合同談判。
☆ 隨時應對變化重于循規蹈矩。
在敏捷宣言的背后,有其遵循的12條原則:
★ 我們最優先要做的是通過盡早的、持續的交付有價值的軟件來使客戶滿意。
★ 即使到了開發的后期,也歡迎改變需求,敏捷過程利用變化來為客戶創造競爭優勢。
★ 經常性地交付可以工作的軟件,交付的間隔可以從幾個星期到幾個月,交付的時間間隔越短越好。
★ 在整個項目開發期間,業務人員和開發人員必須天天都在一起工作。
★ 圍繞被激勵起來的個體來構建項目。給他們提供所需的環境和支持,并且信任他們能夠完成工作。
★ 在團隊內部,最具有效果并且富有效率的傳遞信息的方法,就是面對面的交流。
★ 工作的軟件是首要的進度度量標準。
★ 敏捷過程提倡可持續的開發速度。責任人、開發者和用戶應該能夠保持一個長期的、恒定的開發速度。
★ 不斷地關注優秀的技能和好的設計會增強敏捷能力。
★ 簡單——使未完成的工作最大化的藝術——是根本的。
★ 最好的構架、需求和設計出自于自組織的團隊。
★ 每隔一定時間,團隊會在如何才能更有效地工作方面進行反省,然后相應地對自己的行為進行調整。
2、一種深入解釋:
轉載地址:http://www.cnblogs.com/blusehuang/archive/2007/10/17/926802.html
Test-Driven Development,測試驅動開發。
它是敏捷開發的最重要的部分。在ThoughtWorks,我們實現任何一個功能都是從測試開始,首先對業務需求進行分析,分解為一個一個的Story,記錄在Story Card上。然后兩個人同時坐在電腦前面,一個人依照Story,從業務需求的角度來編寫測試代碼,另一個人看著他并且進行思考,如果有不同的意見就會提出來進行討論,直到達成共識,這樣寫出來的測試代碼就真實反映了業務功能需求。接著由另一個人控制鍵盤,編寫該測試代碼的實現。如果沒有測試代碼,就不能編寫功能的實現代碼。先寫測試代碼,能夠讓開發人員明確目標,就是讓測試通過。
Continuous Integration,持續集成。
在以往的軟件開發過程中,集成是一件很痛苦的事情,通常很長時間才會做一次集成,這樣的話,會引發很多問題,比如build未通過或者單元測試失敗。敏捷開發中提倡持續集成,一天之內集成十幾次甚至幾十次,如此頻繁的集成能盡量減少沖突,由于集成很頻繁,每一次集成的改變也很少,即使集成失敗也容易定位錯誤。一次集成要做哪些事情呢?它至少包括:獲得所有源代碼;編譯源代碼;運行所有測試,包括單元測試、功能測試等;確認編譯和測試是否通過,最后發送報告。當然也會做一些其它的任務,比如說代碼分析、測試覆蓋率分析等等。 在我們公司里,開發人員的桌上有一個火山燈用來標志集成的狀態,如果是黃燈,表示正在集成;如果是綠燈,表示上一次集成通過,開發人員在這時候獲得的代碼是可用而可靠的;如果顯示為紅燈,就要小心了,上一次集成未通過,需要盡快定位失敗原因從而讓燈變綠。在持續集成上,我們公司使用的是自己開發的產品。
Refactoring,重構。
相信大家對它都很熟悉了,有很多很多的書用來介紹重構,最著名的是Martin的《重構》,Joshua的《從重構到模式》等。重構是在不改變系統外部行為下,對內部結構進行整理優化,使得代碼盡量簡單、優美、可擴展。在以往開發中,通常是在有需求過來,現在的系統架構不容易實現,從而對原有系統進行重構;或者在開發過程中有剩余時間了,對現在代碼進行重構整理。但是在敏捷開發中,重構貫穿于整個開發流程,每一次開發者check in代碼之前,都要對所寫代碼進行重構,讓代碼達到clean code that works。值得注意的是,在重構時,每一次改變要盡可能小,用單元測試來保證重構是否引起沖突,并且不只是對實現代碼進行重構,如果測試代碼中有重復,也要對它進行重構。
Pair-Programming,結對編程。
在敏捷開發中,做任何事情都是Pair的,包括分析、寫測試、寫實現代碼或者重構。Pair做事有很多好處,兩個人在一起探討很容易產生思想的火花,也不容易走上偏路。在我們公司,還有很多事都是Pair來做,比如Pair學習,Pair翻譯,Pair做PPT。
Stand up,站立會議。
每天早上,項目組的所有成員都會站立進行一次會議,由于是站立的,所以時間不會很長,一般來說是15-20分鐘。會議的內容并不是需求分析、任務分配等,而是每個人都回答三個問題:1. 你昨天做了什么?2. 你今天要做什么? 3. 你遇到了哪些困難?站立會議讓團隊進行交流,彼此相互熟悉工作內容,如果有人曾經遇到過和你類似的問題,那么在站立會議后,他就會和你進行討論。
Frequent Releases,小版本發布。
在敏捷開發中,不會出現這種情況,拿到需求以后就閉門造車,直到最后才將產品交付給客戶,而是盡量多的產品發布,一般以周、月為單位。這樣,客戶每隔一段時間就會拿到發布的產品進行試用,而我們可以從客戶那得到更多的反饋來改進產品。正因為發布頻繁,每一個版本新增的功能簡單,不需要復雜的設計,這樣文檔和設計就在很大程度上簡化了。又因為簡單設計,沒有復雜的架構,所以客戶有新的需求或者需求進行變動,也能很快的適應。
Minimal Documentation,較少的文檔。
其實敏捷開發中并不是沒有文檔,而是有大量的文檔,即測試。這些測試代碼真實的反應了客戶的需求以及系統API的用法,如果有新人加入團隊,最快的熟悉項目的方法就是給他看測試代碼,而比一邊看著文檔一邊進行debug要高效。如果用書面文檔或者注釋,某天代碼變化了,需要對這些文檔進行更新。一旦忘記更新文檔,就會出現代碼和文檔不匹配的情況,這更加會讓人迷惑。而在敏捷中并不會出現,因為只有測試變化了,代碼才會變化,測試是真實反應代碼的。這時有人會問:代碼不寫注釋行嗎?一般來說好的代碼不是需要大量的注釋嗎?其實簡單可讀的代碼才是好的代碼,既然簡單可讀了,別人一看就能夠看懂,這時候根本不需要對代碼進行任何注釋。若你覺得這段代碼不加注釋的話別人可能看不懂,就表示設計還不夠簡單,需要對它進行重構。
Collaborative Focus,以合作為中心,表現為代碼共享。
在敏捷開發中,代碼是歸團隊所有而不是哪些模塊的代碼屬于哪些人,每個人都有權利獲得系統任何一部分的代碼然后修改它,如果有人看到某些代碼不爽的話,那他能夠對這部分代碼重構而不需要征求代碼作者的同意,很可能也不知道是誰寫的這部分代碼。這樣每個人都能熟悉系統的代碼,即使團隊的人員變動,也沒有風險。
Customer Engagement ,現場客戶。
敏捷開發中,客戶是與開發團隊一起工作的,團隊到客戶現場進行開發或者邀請客戶到團隊公司里來開發。如果開發過程中有什么問題或者產品經過一個迭代后,能夠以最快速度得到客戶的反饋。
Automated Testing ,自動化測試。
為了減小人力或者重復勞動,所有的測試包括單元測試、功能測試或集成測試等都是自動化的,這對QA人員提出了更高的要求。他們要熟悉開發語言、自動化測試工具,能夠編寫自動化測試腳本或者用工具錄制。
Adaptive Planning,可調整計劃。
敏捷開發中計劃是可調整的,并不是像以往的開發過程中,需求分析->概要設計->詳細設計->開發->測試->交付,每一個階段都是有計劃的進行,一個階段結束便開始下一個階段。而敏捷開發中只有一次一次的迭代,小版本的發布,根據客戶反饋隨時作出相應的調整和變化。
PS:
敏捷開發方法通常應用時間定量的迭代和進化式開發、使用自適應計劃、提倡增量交付并包含其它提倡敏捷性(快速和靈活的相應變更)的價值和實踐。具備進化式精化的計劃、需求和設計的短時間定量迭代是敏捷方法所共有的基本實踐。他們還提倡反映簡易、輕量、溝通、自組織團隊等更多敏捷性的實踐和原則。