[敏捷開發(fā)與傳統(tǒng)開發(fā)方式的比較]
敏捷開發(fā)的起源
在90年代末期,傳統(tǒng)軟件開發(fā)的方式因?yàn)槠浞彪s的過程,以及對(duì)文檔的過于嚴(yán)格的要求,造成了很大程度上的效率下降,也就是人們所說的“重型化危機(jī)”。因?yàn)檫@一原因,人們開始反思傳統(tǒng)方法的利弊,并對(duì)其弊端進(jìn)行了改進(jìn),提出了敏捷方法。
2001年2月,由Martin Fowler,Jim Highsmith等17位軟件開發(fā)專家起草的敏捷宣言發(fā)表,敏捷聯(lián)盟成立。敏捷開發(fā)作為一種新的方法正式誕生。敏捷宣言中所表述的價(jià)值觀分為四個(gè)方面:
(1)個(gè)體和互動(dòng) 高于 流程和工具
(2)工作的軟件 高于 詳盡的文檔
(3)客戶合作 高于 合同談判
(4)響應(yīng)變化 高于 遵循計(jì)劃
同時(shí)敏捷宣言還包括12條原則。這十二條原則是以上四條主要的價(jià)值觀在實(shí)際工作中的體現(xiàn)。
敏捷開發(fā)的12準(zhǔn)則:
我們的最高目標(biāo)是,通過盡早和持續(xù)地交付有價(jià)值的軟件來滿足客戶。
歡迎對(duì)需求提出變更——即使是在項(xiàng)目開發(fā)后期。要善于利用需求變更,幫助客戶獲得競爭優(yōu)勢。
要不斷交付可用的軟件,周期從幾周到幾個(gè)月不等,且越短越好
項(xiàng)目過程中,業(yè)務(wù)人員與開發(fā)人員必須在一起工作。
要善于激勵(lì)項(xiàng)目人員,給他們以所需要的環(huán)境和支持,并相信他們能夠完成任務(wù)。
無論是團(tuán)隊(duì)內(nèi)還是團(tuán)隊(duì)間,最有效的溝通方法是面對(duì)面的交談。
可用的軟件是衡量進(jìn)度的主要指標(biāo)。
敏捷過程提倡可持續(xù)的開發(fā)。項(xiàng)目方、開發(fā)人員和用戶應(yīng)該能夠保持恒久穩(wěn)定的進(jìn)展速度。
對(duì)技術(shù)的精益求精以及對(duì)設(shè)計(jì)的不斷完善將提升敏捷性。
要做到簡潔,即盡最大可能減少不必要的工作。這是一門藝術(shù)。
最佳的架構(gòu)、需求和設(shè)計(jì)出自于自組織的團(tuán)隊(duì)。
團(tuán)隊(duì)要定期反省如何能夠做到更有效,并相應(yīng)地調(diào)整團(tuán)隊(duì)的行為。
總體來說,敏捷開發(fā)作為一種新的軟件工程方法,與傳統(tǒng)方法相比更加注重人的因素。不再把開發(fā)者當(dāng)作一個(gè)物化的,投入多少時(shí)間可以完成相應(yīng)數(shù)量代碼的代碼開發(fā)機(jī)器;而是注重開發(fā)者之間的互動(dòng)以及開發(fā)者和用戶之間的互動(dòng),同時(shí)因?yàn)樵黾恿私涣骱蛥f(xié)作使得開發(fā)的項(xiàng)目更加靈活和易于修改。
敏捷開發(fā)的主要特點(diǎn)
與傳統(tǒng)開發(fā)方法相比,在敏捷開發(fā)的整個(gè)過程中,有以下幾個(gè)主要的特點(diǎn):
(1)敏捷開發(fā)的過程有著更強(qiáng)的適應(yīng)性而不是預(yù)設(shè)性,從敏捷宣言的第四條響應(yīng)變化高于預(yù)設(shè)計(jì)劃便可以看出來。因?yàn)檐浖_發(fā)過程的本身的不可預(yù)見性,很多用戶在項(xiàng)目開始時(shí)不可能對(duì)于這個(gè)項(xiàng)目有著一個(gè)完整而明確的預(yù)期。很多對(duì)軟件的預(yù)期都在后期的修改和完善過程中產(chǎn)生。因此高適應(yīng)性顯然更加符合軟件工程開發(fā)的實(shí)際。而敏捷開發(fā)實(shí)現(xiàn)其適應(yīng)性的方式主要在于,第一,縮短把項(xiàng)目提交給用戶的周期;第二,增加用戶,業(yè)務(wù)人員,開發(fā)人員這三者之間的交流;第三,通過減少重構(gòu)的成本以增加軟件的適應(yīng)性。
(2)敏捷開發(fā)的過程中,更加的注重人的因素。在傳統(tǒng)軟件工程中,個(gè)人的因素很少的被考慮到分工中,每個(gè)個(gè)體都是只是整個(gè)代碼開發(fā)機(jī)器的一個(gè)小小的螺絲釘,個(gè)人的意志和創(chuàng)造力很大程度上的被抹去為了更好的為集體服務(wù)。而在敏捷開發(fā)過程中,每個(gè)個(gè)人的潛力被充分的考慮,應(yīng)用什么技術(shù)很大程度上直接由在第一線開發(fā)的技術(shù)人員決定;每個(gè)人的特點(diǎn)和創(chuàng)造力都可以充分地發(fā)揮,這樣開發(fā)出來的軟件更加的具有生命力,因?yàn)樗谌肓碎_發(fā)者的心血和創(chuàng)意,開發(fā)者不再是進(jìn)行機(jī)械的乏味的堆砌,而是創(chuàng)造屬于自己的藝術(shù)品,這樣的條件下產(chǎn)生的代碼必然在質(zhì)量上更占優(yōu)勢。
(3)在敏捷開發(fā)的過程中,整個(gè)項(xiàng)目是測試驅(qū)動(dòng)的而不是文檔驅(qū)動(dòng)的。不僅每個(gè)模塊有著自己的相應(yīng)的測試單元,開發(fā)人員在開發(fā)自己的模塊的過程中必須保證自己所開發(fā)的模塊可以通過這一單元的測試,并且集成測試貫穿了整個(gè)開發(fā)過程的始終。集成測試每天會(huì)進(jìn)行十幾次甚至幾十次,而不是像傳統(tǒng)方法一樣只有當(dāng)各個(gè)模塊的編碼都結(jié)束了之后再進(jìn)行聯(lián)合調(diào)試。這樣,在軟件開發(fā)的進(jìn)程中每一點(diǎn)改動(dòng)所引起的問題都容嘉容易暴露出來,使得更加容易在錯(cuò)誤剛剛產(chǎn)生的時(shí)候發(fā)現(xiàn)問題從而解決問題。這樣就避免了在最后整個(gè)系統(tǒng)完成時(shí)錯(cuò)誤隱藏的太深給調(diào)試造成極大的困難。
敏捷過程模型的一個(gè)實(shí)例:極限編程
敏捷過程作為一種開發(fā)過程模型,產(chǎn)生了很多不同的可以應(yīng)用到實(shí)際中的編程方法。這里介紹一種應(yīng)用的比較廣泛的開發(fā)方法,極限編程,來具體體現(xiàn)一些敏捷開發(fā)過程的特點(diǎn)。
極限編程過程分為策劃、設(shè)計(jì)、編碼和測試四個(gè)階段。
(1)策劃階段
首先在策劃階段,用戶和開發(fā)這進(jìn)行交流,開發(fā)者總結(jié)出一系列“用戶故事”,描述軟件某一部分功能。之后客戶對(duì)這些功能進(jìn)行優(yōu)先級(jí)排序,xp團(tuán)隊(duì)評(píng)估每一個(gè)故事的成本。之后客戶和xp團(tuán)隊(duì)共同決定在開發(fā)的下一個(gè)版本中將會(huì)新增哪些功能。而在版本不斷的迭代的過程中,會(huì)進(jìn)行很多次這樣的策劃過程,每一次客戶都可以根據(jù)已有的功能來決定是否要新增一些功能,以及要新增哪些功能。
(2)設(shè)計(jì)階段
在設(shè)計(jì)階段,開發(fā)人員會(huì)根據(jù)用戶故事,提出這些用戶故事的實(shí)現(xiàn)方案。設(shè)計(jì)的過程中主要遵循簡潔的原則,也就是盡量使用簡介的表述而不是復(fù)雜的表述。而設(shè)計(jì)的另一個(gè)方面則是重構(gòu),重構(gòu)是一種通過不改變代碼的外部功能的情況下改變軟件模塊的內(nèi)部結(jié)構(gòu)從而優(yōu)化軟件系統(tǒng)的功能的過程。這是一種改進(jìn)代碼的設(shè)計(jì)。
在設(shè)計(jì)的這兩個(gè)層面中,我們可以看到在xp開發(fā)過程中,設(shè)計(jì)和開發(fā)是同步進(jìn)行的。我們在不斷實(shí)現(xiàn)開始設(shè)計(jì)的過程中,同時(shí)要對(duì)到嗎進(jìn)行優(yōu)化也就是重新設(shè)計(jì)。這樣,大大的增強(qiáng)了整個(gè)軟件開發(fā)的適應(yīng)性,而不是始終刻板的實(shí)現(xiàn)最開始的第一版設(shè)計(jì)。
(3)編碼階段
xp開發(fā)的第一件任務(wù)不是直接對(duì)初步的設(shè)計(jì)和用戶故事進(jìn)行編碼,而是針對(duì)這些設(shè)計(jì)全力開發(fā)單元測試。完成了單元測試也就確定了開發(fā)者要實(shí)現(xiàn)的所有功能。這樣開發(fā)者就只需要全力通過單元測試,而不必在實(shí)現(xiàn)什么功能上再浪費(fèi)不必要的時(shí)間和精力。這正體現(xiàn)了敏捷開發(fā)的以測試驅(qū)動(dòng)的特點(diǎn)。
而在敏捷開發(fā)中,很重要的一個(gè)提高效率的方式就是結(jié)對(duì)編程。在結(jié)對(duì)編程的過程中,兩個(gè)開發(fā)者共用一臺(tái)電腦,并各有分工。其中一個(gè)人進(jìn)行實(shí)際的編碼實(shí)現(xiàn),另一個(gè)人在旁邊考慮代碼在宏觀上該如何實(shí)現(xiàn),比如針對(duì)什么功能應(yīng)該使用什么樣的算法。這樣,在編碼者工作遇到問題時(shí),兩個(gè)人交換位置。這時(shí)在旁邊思考的人更有可能可以解決這一問題。事實(shí)上,結(jié)對(duì)編程的形式不必拘泥于什么規(guī)矩。關(guān)鍵在于,兩個(gè)人共同開發(fā)的過程中,兩個(gè)人的交流可以使得大部分的問題可以在第一時(shí)間解決。并且,因?yàn)閮蓚€(gè)人中只有一個(gè)人在進(jìn)行編程這一項(xiàng)比較疲憊的工作,另一個(gè)人較為輕松,這樣可以保證開發(fā)效率一直保持在一個(gè)比較高的狀態(tài)。
(4)測試階段
每一個(gè)模塊都通過自己的單元測試之后,開發(fā)者會(huì)將所有的模塊集成到一起進(jìn)行測試。這樣可以及時(shí)發(fā)現(xiàn)每一模塊在最近一次改動(dòng)之中出現(xiàn)的問題同時(shí)避免一些兼容性問題。每一次改動(dòng)一點(diǎn)小問題要比等到最后一次集中修改所有問題要容易得多。
敏捷開發(fā)生態(tài)系統(tǒng)
敏捷開發(fā)模型在實(shí)際中有著很多表現(xiàn)形式。極限過程開發(fā)(xp)時(shí)其中的最為廣泛應(yīng)用的一種。還有很多其他的,比如:自適應(yīng)軟件開發(fā)、Scrum、動(dòng)態(tài)系統(tǒng)開發(fā)、Crystal、特征驅(qū)動(dòng)開發(fā)、精益軟件開發(fā)、敏捷建模、敏捷統(tǒng)一過程等。這里只舉兩個(gè)例子介紹一下其主要的特點(diǎn)。
自適應(yīng)軟件開發(fā)主要從整體上強(qiáng)調(diào)軟件項(xiàng)目團(tuán)隊(duì)具有自我組織的動(dòng)態(tài)性、人與人之間的協(xié)作、個(gè)人以及團(tuán)隊(duì)的學(xué)習(xí),從而使團(tuán)隊(duì)更有可能取得成功。
Scrum開發(fā)方法,這個(gè)開發(fā)方法最大的特征就是每日例會(huì)。在每日例會(huì)中,每個(gè)人交流自己昨天干了什么,今天將要干什么,以及自己在工作中遇到了哪些問題。這樣大大地加強(qiáng)了團(tuán)隊(duì)成員之間的交流。
我們可以看到,很多人都投入到了敏捷開發(fā)的研究和使用中。敏捷開發(fā)確實(shí)有著非常強(qiáng)大的生命力。
敏捷開發(fā)與傳統(tǒng)開發(fā)方法的比較
優(yōu)勢
敏捷開發(fā)的高適應(yīng)性,以人為本的特性,和輕量型的開發(fā)方法即以測試為驅(qū)動(dòng)取代了以文檔為驅(qū)動(dòng),這三個(gè)主要的特點(diǎn),也就是敏捷開發(fā)相對(duì)與傳統(tǒng)開發(fā)方式的主要有點(diǎn)。因?yàn)樗拥撵`活并且更加充分的利用了每個(gè)開發(fā)者的優(yōu)勢,調(diào)動(dòng)了每個(gè)人的工作熱情。
劣勢
與傳統(tǒng)開發(fā)方式相比,敏捷開發(fā)的最主要的劣勢在于敏捷開發(fā)歡迎新的需求,而在每次新的需求產(chǎn)生時(shí)都可能引起整個(gè)系統(tǒng)的大幅度的修改。因?yàn)殚_發(fā)者在開發(fā)上一個(gè)版本的時(shí)候,完全沒有考慮以后的優(yōu)化將要如何進(jìn)行。這樣的開發(fā)方式實(shí)際的軟件開發(fā)過程中,并不一定總是有效的。
而另一個(gè)方面,敏捷開發(fā)因?yàn)槿狈芏嘣诿艚蓍_發(fā)中被認(rèn)為“不重要”的文檔,這樣在一個(gè)大型項(xiàng)目比如一個(gè)操作系統(tǒng)開發(fā)的時(shí)候,由于其項(xiàng)目周期很長,所以很難保證開發(fā)的人員不更換,而沒有文檔就會(huì)造成在交接的過程中出現(xiàn)很大的困難。
參考文獻(xiàn)
[1]基于scrum敏捷開發(fā)的軟件過程管理研究 王敏
[2]敏捷開發(fā)在軟件開發(fā)的過程中的應(yīng)用研究 彭志楠
[3]敏捷軟件開發(fā)技術(shù)研究 周瑩瑩
[4]敏捷軟件開發(fā)應(yīng)用研究 范洪濤
[5]http://agilemanifesto.org/iso/zhchs/manifesto.html 敏捷軟件開發(fā)宣言
[6]http://agilemanifesto.org/iso/zhchs/manifesto.html CSDN 敏捷開發(fā)的優(yōu)缺點(diǎn)
[7]http://www.vaikan.com/agile-programming-10-years-on-did-it-deliver/ 外刊IT評(píng)論 敏捷十年,成效幾何?
[8]http://www.infoq.com/cn/news/2010/02/scrum-failings Bob大叔關(guān)于Scrum和敏捷的七條缺陷