[敏捷開(kāi)發(fā)與傳統(tǒng)開(kāi)發(fā)方式的比較]
敏捷開(kāi)發(fā)的起源
在90年代末期砌函,傳統(tǒng)軟件開(kāi)發(fā)的方式因?yàn)槠浞彪s的過(guò)程,以及對(duì)文檔的過(guò)于嚴(yán)格的要求材鹦,造成了很大程度上的效率下降屹蚊,也就是人們所說(shuō)的“重型化危機(jī)”。因?yàn)檫@一原因坝辫,人們開(kāi)始反思傳統(tǒng)方法的利弊篷就,并對(duì)其弊端進(jìn)行了改進(jìn)射亏,提出了敏捷方法近忙。
2001年2月竭业,由Martin Fowler,Jim Highsmith等17位軟件開(kāi)發(fā)專家起草的敏捷宣言發(fā)表及舍,敏捷聯(lián)盟成立未辆。敏捷開(kāi)發(fā)作為一種新的方法正式誕生。敏捷宣言中所表述的價(jià)值觀分為四個(gè)方面:
(1)個(gè)體和互動(dòng) 高于 流程和工具
(2)工作的軟件 高于 詳盡的文檔
(3)客戶合作 高于 合同談判
(4)響應(yīng)變化 高于 遵循計(jì)劃
同時(shí)敏捷宣言還包括12條原則锯玛。這十二條原則是以上四條主要的價(jià)值觀在實(shí)際工作中的體現(xiàn)咐柜。
敏捷開(kāi)發(fā)的12準(zhǔn)則:
我們的最高目標(biāo)是,通過(guò)盡早和持續(xù)地交付有價(jià)值的軟件來(lái)滿足客戶攘残。
歡迎對(duì)需求提出變更——即使是在項(xiàng)目開(kāi)發(fā)后期拙友。要善于利用需求變更,幫助客戶獲得競(jìng)爭(zhēng)優(yōu)勢(shì)歼郭。
要不斷交付可用的軟件遗契,周期從幾周到幾個(gè)月不等,且越短越好
項(xiàng)目過(guò)程中病曾,業(yè)務(wù)人員與開(kāi)發(fā)人員必須在一起工作牍蜂。
要善于激勵(lì)項(xiàng)目人員,給他們以所需要的環(huán)境和支持泰涂,并相信他們能夠完成任務(wù)鲫竞。
無(wú)論是團(tuán)隊(duì)內(nèi)還是團(tuán)隊(duì)間,最有效的溝通方法是面對(duì)面的交談逼蒙。
可用的軟件是衡量進(jìn)度的主要指標(biāo)从绘。
敏捷過(guò)程提倡可持續(xù)的開(kāi)發(fā)。項(xiàng)目方其做、開(kāi)發(fā)人員和用戶應(yīng)該能夠保持恒久穩(wěn)定的進(jìn)展速度顶考。
對(duì)技術(shù)的精益求精以及對(duì)設(shè)計(jì)的不斷完善將提升敏捷性。
要做到簡(jiǎn)潔妖泄,即盡最大可能減少不必要的工作驹沿。這是一門藝術(shù)。
最佳的架構(gòu)蹈胡、需求和設(shè)計(jì)出自于自組織的團(tuán)隊(duì)渊季。
團(tuán)隊(duì)要定期反省如何能夠做到更有效,并相應(yīng)地調(diào)整團(tuán)隊(duì)的行為罚渐。
總體來(lái)說(shuō)却汉,敏捷開(kāi)發(fā)作為一種新的軟件工程方法,與傳統(tǒng)方法相比更加注重人的因素荷并。不再把開(kāi)發(fā)者當(dāng)作一個(gè)物化的合砂,投入多少時(shí)間可以完成相應(yīng)數(shù)量代碼的代碼開(kāi)發(fā)機(jī)器;而是注重開(kāi)發(fā)者之間的互動(dòng)以及開(kāi)發(fā)者和用戶之間的互動(dòng)源织,同時(shí)因?yàn)樵黾恿私涣骱蛥f(xié)作使得開(kāi)發(fā)的項(xiàng)目更加靈活和易于修改翩伪。
敏捷開(kāi)發(fā)的主要特點(diǎn)
與傳統(tǒng)開(kāi)發(fā)方法相比微猖,在敏捷開(kāi)發(fā)的整個(gè)過(guò)程中,有以下幾個(gè)主要的特點(diǎn):
(1)敏捷開(kāi)發(fā)的過(guò)程有著更強(qiáng)的適應(yīng)性而不是預(yù)設(shè)性缘屹,從敏捷宣言的第四條響應(yīng)變化高于預(yù)設(shè)計(jì)劃便可以看出來(lái)凛剥。因?yàn)檐浖_(kāi)發(fā)過(guò)程的本身的不可預(yù)見(jiàn)性,很多用戶在項(xiàng)目開(kāi)始時(shí)不可能對(duì)于這個(gè)項(xiàng)目有著一個(gè)完整而明確的預(yù)期轻姿。很多對(duì)軟件的預(yù)期都在后期的修改和完善過(guò)程中產(chǎn)生犁珠。因此高適應(yīng)性顯然更加符合軟件工程開(kāi)發(fā)的實(shí)際。而敏捷開(kāi)發(fā)實(shí)現(xiàn)其適應(yīng)性的方式主要在于互亮,第一犁享,縮短把項(xiàng)目提交給用戶的周期;第二豹休,增加用戶饼疙,業(yè)務(wù)人員,開(kāi)發(fā)人員這三者之間的交流慕爬;第三窑眯,通過(guò)減少重構(gòu)的成本以增加軟件的適應(yīng)性。
(2)敏捷開(kāi)發(fā)的過(guò)程中医窿,更加的注重人的因素磅甩。在傳統(tǒng)軟件工程中,個(gè)人的因素很少的被考慮到分工中姥卢,每個(gè)個(gè)體都是只是整個(gè)代碼開(kāi)發(fā)機(jī)器的一個(gè)小小的螺絲釘卷要,個(gè)人的意志和創(chuàng)造力很大程度上的被抹去為了更好的為集體服務(wù)。而在敏捷開(kāi)發(fā)過(guò)程中独榴,每個(gè)個(gè)人的潛力被充分的考慮僧叉,應(yīng)用什么技術(shù)很大程度上直接由在第一線開(kāi)發(fā)的技術(shù)人員決定;每個(gè)人的特點(diǎn)和創(chuàng)造力都可以充分地發(fā)揮棺榔,這樣開(kāi)發(fā)出來(lái)的軟件更加的具有生命力瓶堕,因?yàn)樗谌肓碎_(kāi)發(fā)者的心血和創(chuàng)意,開(kāi)發(fā)者不再是進(jìn)行機(jī)械的乏味的堆砌症歇,而是創(chuàng)造屬于自己的藝術(shù)品郎笆,這樣的條件下產(chǎn)生的代碼必然在質(zhì)量上更占優(yōu)勢(shì)。
(3)在敏捷開(kāi)發(fā)的過(guò)程中忘晤,整個(gè)項(xiàng)目是測(cè)試驅(qū)動(dòng)的而不是文檔驅(qū)動(dòng)的宛蚓。不僅每個(gè)模塊有著自己的相應(yīng)的測(cè)試單元,開(kāi)發(fā)人員在開(kāi)發(fā)自己的模塊的過(guò)程中必須保證自己所開(kāi)發(fā)的模塊可以通過(guò)這一單元的測(cè)試设塔,并且集成測(cè)試貫穿了整個(gè)開(kāi)發(fā)過(guò)程的始終凄吏。集成測(cè)試每天會(huì)進(jìn)行十幾次甚至幾十次,而不是像傳統(tǒng)方法一樣只有當(dāng)各個(gè)模塊的編碼都結(jié)束了之后再進(jìn)行聯(lián)合調(diào)試。這樣痕钢,在軟件開(kāi)發(fā)的進(jìn)程中每一點(diǎn)改動(dòng)所引起的問(wèn)題都容嘉容易暴露出來(lái)表谊,使得更加容易在錯(cuò)誤剛剛產(chǎn)生的時(shí)候發(fā)現(xiàn)問(wèn)題從而解決問(wèn)題。這樣就避免了在最后整個(gè)系統(tǒng)完成時(shí)錯(cuò)誤隱藏的太深給調(diào)試造成極大的困難盖喷。
敏捷過(guò)程模型的一個(gè)實(shí)例:極限編程
敏捷過(guò)程作為一種開(kāi)發(fā)過(guò)程模型,產(chǎn)生了很多不同的可以應(yīng)用到實(shí)際中的編程方法难咕。這里介紹一種應(yīng)用的比較廣泛的開(kāi)發(fā)方法课梳,極限編程,來(lái)具體體現(xiàn)一些敏捷開(kāi)發(fā)過(guò)程的特點(diǎn)余佃。
極限編程過(guò)程分為策劃暮刃、設(shè)計(jì)、編碼和測(cè)試四個(gè)階段爆土。
(1)策劃階段
首先在策劃階段椭懊,用戶和開(kāi)發(fā)這進(jìn)行交流,開(kāi)發(fā)者總結(jié)出一系列“用戶故事”步势,描述軟件某一部分功能氧猬。之后客戶對(duì)這些功能進(jìn)行優(yōu)先級(jí)排序,xp團(tuán)隊(duì)評(píng)估每一個(gè)故事的成本坏瘩。之后客戶和xp團(tuán)隊(duì)共同決定在開(kāi)發(fā)的下一個(gè)版本中將會(huì)新增哪些功能盅抚。而在版本不斷的迭代的過(guò)程中,會(huì)進(jìn)行很多次這樣的策劃過(guò)程倔矾,每一次客戶都可以根據(jù)已有的功能來(lái)決定是否要新增一些功能妄均,以及要新增哪些功能。
(2)設(shè)計(jì)階段
在設(shè)計(jì)階段哪自,開(kāi)發(fā)人員會(huì)根據(jù)用戶故事丰包,提出這些用戶故事的實(shí)現(xiàn)方案。設(shè)計(jì)的過(guò)程中主要遵循簡(jiǎn)潔的原則壤巷,也就是盡量使用簡(jiǎn)介的表述而不是復(fù)雜的表述邑彪。而設(shè)計(jì)的另一個(gè)方面則是重構(gòu),重構(gòu)是一種通過(guò)不改變代碼的外部功能的情況下改變軟件模塊的內(nèi)部結(jié)構(gòu)從而優(yōu)化軟件系統(tǒng)的功能的過(guò)程胧华。這是一種改進(jìn)代碼的設(shè)計(jì)锌蓄。
在設(shè)計(jì)的這兩個(gè)層面中,我們可以看到在xp開(kāi)發(fā)過(guò)程中撑柔,設(shè)計(jì)和開(kāi)發(fā)是同步進(jìn)行的瘸爽。我們?cè)诓粩鄬?shí)現(xiàn)開(kāi)始設(shè)計(jì)的過(guò)程中,同時(shí)要對(duì)到嗎進(jìn)行優(yōu)化也就是重新設(shè)計(jì)铅忿。這樣剪决,大大的增強(qiáng)了整個(gè)軟件開(kāi)發(fā)的適應(yīng)性,而不是始終刻板的實(shí)現(xiàn)最開(kāi)始的第一版設(shè)計(jì)。
(3)編碼階段
xp開(kāi)發(fā)的第一件任務(wù)不是直接對(duì)初步的設(shè)計(jì)和用戶故事進(jìn)行編碼柑潦,而是針對(duì)這些設(shè)計(jì)全力開(kāi)發(fā)單元測(cè)試享言。完成了單元測(cè)試也就確定了開(kāi)發(fā)者要實(shí)現(xiàn)的所有功能。這樣開(kāi)發(fā)者就只需要全力通過(guò)單元測(cè)試渗鬼,而不必在實(shí)現(xiàn)什么功能上再浪費(fèi)不必要的時(shí)間和精力览露。這正體現(xiàn)了敏捷開(kāi)發(fā)的以測(cè)試驅(qū)動(dòng)的特點(diǎn)。
而在敏捷開(kāi)發(fā)中譬胎,很重要的一個(gè)提高效率的方式就是結(jié)對(duì)編程差牛。在結(jié)對(duì)編程的過(guò)程中,兩個(gè)開(kāi)發(fā)者共用一臺(tái)電腦堰乔,并各有分工偏化。其中一個(gè)人進(jìn)行實(shí)際的編碼實(shí)現(xiàn),另一個(gè)人在旁邊考慮代碼在宏觀上該如何實(shí)現(xiàn)镐侯,比如針對(duì)什么功能應(yīng)該使用什么樣的算法侦讨。這樣,在編碼者工作遇到問(wèn)題時(shí)苟翻,兩個(gè)人交換位置韵卤。這時(shí)在旁邊思考的人更有可能可以解決這一問(wèn)題。事實(shí)上崇猫,結(jié)對(duì)編程的形式不必拘泥于什么規(guī)矩怜俐。關(guān)鍵在于,兩個(gè)人共同開(kāi)發(fā)的過(guò)程中邓尤,兩個(gè)人的交流可以使得大部分的問(wèn)題可以在第一時(shí)間解決拍鲤。并且,因?yàn)閮蓚€(gè)人中只有一個(gè)人在進(jìn)行編程這一項(xiàng)比較疲憊的工作汞扎,另一個(gè)人較為輕松季稳,這樣可以保證開(kāi)發(fā)效率一直保持在一個(gè)比較高的狀態(tài)。
(4)測(cè)試階段
每一個(gè)模塊都通過(guò)自己的單元測(cè)試之后澈魄,開(kāi)發(fā)者會(huì)將所有的模塊集成到一起進(jìn)行測(cè)試景鼠。這樣可以及時(shí)發(fā)現(xiàn)每一模塊在最近一次改動(dòng)之中出現(xiàn)的問(wèn)題同時(shí)避免一些兼容性問(wèn)題。每一次改動(dòng)一點(diǎn)小問(wèn)題要比等到最后一次集中修改所有問(wèn)題要容易得多痹扇。
敏捷開(kāi)發(fā)生態(tài)系統(tǒng)
敏捷開(kāi)發(fā)模型在實(shí)際中有著很多表現(xiàn)形式铛漓。極限過(guò)程開(kāi)發(fā)(xp)時(shí)其中的最為廣泛應(yīng)用的一種。還有很多其他的鲫构,比如:自適應(yīng)軟件開(kāi)發(fā)浓恶、Scrum、動(dòng)態(tài)系統(tǒng)開(kāi)發(fā)结笨、Crystal包晰、特征驅(qū)動(dòng)開(kāi)發(fā)湿镀、精益軟件開(kāi)發(fā)、敏捷建模伐憾、敏捷統(tǒng)一過(guò)程等勉痴。這里只舉兩個(gè)例子介紹一下其主要的特點(diǎn)。
自適應(yīng)軟件開(kāi)發(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開(kāi)發(fā)方法雏掠,這個(gè)開(kāi)發(fā)方法最大的特征就是每日例會(huì)。在每日例會(huì)中筛谚,每個(gè)人交流自己昨天干了什么,今天將要干什么停忿,以及自己在工作中遇到了哪些問(wèn)題驾讲。這樣大大地加強(qiáng)了團(tuán)隊(duì)成員之間的交流。
我們可以看到席赂,很多人都投入到了敏捷開(kāi)發(fā)的研究和使用中吮铭。敏捷開(kāi)發(fā)確實(shí)有著非常強(qiáng)大的生命力。
敏捷開(kāi)發(fā)與傳統(tǒng)開(kāi)發(fā)方法的比較
優(yōu)勢(shì)
敏捷開(kāi)發(fā)的高適應(yīng)性颅停,以人為本的特性谓晌,和輕量型的開(kāi)發(fā)方法即以測(cè)試為驅(qū)動(dòng)取代了以文檔為驅(qū)動(dòng),這三個(gè)主要的特點(diǎn)癞揉,也就是敏捷開(kāi)發(fā)相對(duì)與傳統(tǒng)開(kāi)發(fā)方式的主要有點(diǎn)纸肉。因?yàn)樗拥撵`活并且更加充分的利用了每個(gè)開(kāi)發(fā)者的優(yōu)勢(shì),調(diào)動(dòng)了每個(gè)人的工作熱情喊熟。
劣勢(shì)
與傳統(tǒng)開(kāi)發(fā)方式相比柏肪,敏捷開(kāi)發(fā)的最主要的劣勢(shì)在于敏捷開(kāi)發(fā)歡迎新的需求,而在每次新的需求產(chǎn)生時(shí)都可能引起整個(gè)系統(tǒng)的大幅度的修改芥牌。因?yàn)殚_(kāi)發(fā)者在開(kāi)發(fā)上一個(gè)版本的時(shí)候烦味,完全沒(méi)有考慮以后的優(yōu)化將要如何進(jìn)行。這樣的開(kāi)發(fā)方式實(shí)際的軟件開(kāi)發(fā)過(guò)程中壁拉,并不一定總是有效的谬俄。
而另一個(gè)方面,敏捷開(kāi)發(fā)因?yàn)槿狈芏嘣诿艚蓍_(kāi)發(fā)中被認(rèn)為“不重要”的文檔弃理,這樣在一個(gè)大型項(xiàng)目比如一個(gè)操作系統(tǒng)開(kāi)發(fā)的時(shí)候溃论,由于其項(xiàng)目周期很長(zhǎng),所以很難保證開(kāi)發(fā)的人員不更換痘昌,而沒(méi)有文檔就會(huì)造成在交接的過(guò)程中出現(xiàn)很大的困難蔬芥。
參考文獻(xiàn)
[1]基于scrum敏捷開(kāi)發(fā)的軟件過(guò)程管理研究 王敏
[2]敏捷開(kāi)發(fā)在軟件開(kāi)發(fā)的過(guò)程中的應(yīng)用研究 彭志楠
[3]敏捷軟件開(kāi)發(fā)技術(shù)研究 周瑩瑩
[4]敏捷軟件開(kāi)發(fā)應(yīng)用研究 范洪濤
[5]http://agilemanifesto.org/iso/zhchs/manifesto.html 敏捷軟件開(kāi)發(fā)宣言
[6]http://agilemanifesto.org/iso/zhchs/manifesto.html CSDN 敏捷開(kāi)發(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和敏捷的七條缺陷