背景
常常被很多朋友問到關(guān)于XP的問題泌神,如什么是XP力穗,什么又是工程實(shí)踐,跟敏捷啥關(guān)系等等這樣的問題局义。相信這些看似簡單的問題喜爷,有很多人抱有同樣的疑問冗疮。
本文旨在幫助工程師了解XP的知識(shí)點(diǎn),更深入的話題請參考擴(kuò)展閱讀檩帐,對某一話題的辯論請移步至相應(yīng)辯論區(qū)的文章术幔,本文只做基本解釋,不做更深入探討湃密。如果有陳述謬誤诅挑,請?jiān)谠u論區(qū)注明,非常感謝泛源。
什么是XP拔妥?
XP是Extreme Programming的縮寫,中文譯為極限編程俩由,是Kent Beck[1]等人在上世紀(jì)九十年代發(fā)明的一種軟件工程方法毒嫡。極限編程是一種強(qiáng)調(diào)團(tuán)隊(duì)工作的工作方式,它是多種敏捷方式的一種幻梯。與Scrum不同的是兜畸,Scrum是一種工作方式的框架,從組織到團(tuán)隊(duì)的設(shè)計(jì)碘梢,而XP關(guān)注的是具體的工程技術(shù)實(shí)踐咬摇。XP旨在通過工程實(shí)踐的合理搭配使用,使開發(fā)者們能夠自信地響應(yīng)客戶需求煞躬。強(qiáng)調(diào)反饋環(huán)機(jī)制肛鹏,客戶與研發(fā)團(tuán)隊(duì)之間的反饋環(huán),測試與開發(fā)的反饋環(huán)恩沛,具體代碼實(shí)現(xiàn)跟單元測試之間的反饋環(huán)在扰,結(jié)對之間的反饋環(huán)。極限編程認(rèn)為在軟件研發(fā)過程中雷客,變化是無所不在的芒珠,人們不應(yīng)回避變化,而應(yīng)該適應(yīng)變化搅裙,通過對反饋的檢視皱卓,去適應(yīng)變化。
在XP中部逮,常見的工程實(shí)踐有:
測試驅(qū)動(dòng)開發(fā) (TDD: Test-Driven Development)
也有人稱之為單元測試先行娜汁。這是一種編程方式,在傳統(tǒng)的瀑布軟件開發(fā)中兄朋,人們習(xí)慣把單元測試當(dāng)做測試的一部分掐禁,認(rèn)為編程就是指產(chǎn)品代碼的實(shí)現(xiàn),只有在產(chǎn)品代碼實(shí)現(xiàn)之后才能編寫單元測試去驗(yàn)證代碼的實(shí)現(xiàn),在編程的過程中穆桂,人們更關(guān)注實(shí)現(xiàn)的部分宫盔,即所謂的HOW,單元測試是后置的享完。但是,在TDD中有额,單元測試被認(rèn)為是描述單元需求(大部分是函數(shù)的需求)一種手段般又,測試用例成為一種自動(dòng)化的單元測試代碼,首先通過單元測試確定要實(shí)現(xiàn)什么巍佑,即所謂WAHT的部分茴迁,再實(shí)現(xiàn)產(chǎn)品代碼,即HOW的部分萤衰,產(chǎn)品代碼的編寫始終以需求來驅(qū)動(dòng)堕义。
測試驅(qū)動(dòng)開發(fā)的原理是:
- 沒有單元測試,不實(shí)現(xiàn)任何功能代碼脆栋;
- 只編寫僅能代表一種失敗情況的測試代碼倦卖;
- 只編寫恰好能通過單元測試的產(chǎn)品代碼。
驗(yàn)收測試驅(qū)動(dòng)開發(fā)(ATDD)
ATDD是Acceptance Test-Driven Development的縮寫椿争。很多的工程師把它理解為自動(dòng)化測試驅(qū)動(dòng)開發(fā)(Automatic Test Driven Development)怕膛,因?yàn)樵诤芏喙驹趶?qiáng)調(diào)測試的自動(dòng)化,其實(shí)這兩者之間并沒有太大的聯(lián)系秦踪。ATDD強(qiáng)調(diào)的也是需求的澄清褐捻,通過舉例的手段對用戶故事需求進(jìn)行澄清,再接著讓這些例子變成一個(gè)個(gè)的測試用例椅邓,在功能需求被實(shí)現(xiàn)后柠逞,用這些測試用例去驗(yàn)證功能實(shí)現(xiàn)是否滿足需求,而這需求的澄清和測試用例的實(shí)現(xiàn)是前置在具體的開發(fā)實(shí)現(xiàn)之前的景馁。因?yàn)槭峭ㄟ^舉例的形式來描述功能的需求說明板壮,也稱之為SbE(Specification by Example,中文譯為實(shí)例化需求)裁僧,其同樣要求測試前置个束。可以比較著TDD的概念來理解聊疲,TDD是對函數(shù)級(jí)別的需求說明茬底,再驅(qū)動(dòng)實(shí)現(xiàn),而ATDD是對用戶故事的級(jí)別的需求說明获洲,分析阱表,再驅(qū)動(dòng)實(shí)現(xiàn),他們都要求測試前置,即關(guān)注WHAT最爬。
而測試自動(dòng)化是一種縮短反饋周期涉馁,實(shí)現(xiàn)回歸測試(Regression Test)的手段。結(jié)合著持續(xù)集成系統(tǒng)爱致,可以實(shí)現(xiàn)一鍵自動(dòng)化的集成與部署烤送。
結(jié)對編程
結(jié)對編程(Pair Programming),即兩個(gè)人一起編寫代碼糠悯,共享顯示器及鍵盤帮坚,一位同事?lián)蔚氖莕avigator的角色,另一位是driver的角色互艾。結(jié)對編程的前提是代碼集體所有制(Collective Code Ownership)试和,即代碼為團(tuán)隊(duì)所共有,團(tuán)隊(duì)為代碼的質(zhì)量共同承擔(dān)責(zé)任纫普。一般人理解結(jié)對編程是兩個(gè)人干一件事阅悍,是對人力資源的浪費(fèi),實(shí)則不然昨稼。因?yàn)椋?/p>
- 結(jié)對編程可以及時(shí)的完成結(jié)對代碼審查节视,減少代碼的缺陷率
- 結(jié)對編程可以幫助人員的能力提升
- 結(jié)對編程可以幫助攻關(guān)
- 結(jié)對編程可以提高編程工作的專注度
想了解更多結(jié)對編程的內(nèi)容,可以參考之前的文章:關(guān)于結(jié)對開發(fā)的那些事兒
持續(xù)集成 (Continuous Integration)
持續(xù)集成在XP的實(shí)踐中占據(jù)著非常重要的位置悦昵。首先要了解什么是集成肴茄,然后再討論持續(xù)的概念。集成無非就是收集但指、打包和驗(yàn)證的過程寡痰,這就是集成的概念。軟件的代碼由不同的人編寫棋凳,需要將所有的代碼從不同的位置收集到一處拦坠,然后進(jìn)行編譯,這就是一般SCM的概念(即軟件配置管理)剩岳,將編譯出來的二進(jìn)制文件部署到驗(yàn)證環(huán)境中贞滨,進(jìn)行軟件的驗(yàn)證,這就是一般傳統(tǒng)理解的測試[2]的概念拍棕。 為了讓產(chǎn)品可以持續(xù)地交付到客戶那里晓铆,從客戶處獲得客戶的反饋,就有必要讓產(chǎn)品可以持續(xù)地集成绰播,加快集成的頻率骄噪,縮短集成的周期,這就是持續(xù)的概念蠢箩。為了讓集成能夠持續(xù)地運(yùn)轉(zhuǎn)链蕊,我們就有了持續(xù)集成系統(tǒng)事甜,如Jekins幫助我們管理一個(gè)個(gè)持續(xù)集成的任務(wù),Git或subversion做軟件的配置管理滔韵,用自動(dòng)化的編譯工具對代碼進(jìn)行打包(因不同的開發(fā)語言而不同)逻谦,自動(dòng)化的單元測試,自動(dòng)化的驗(yàn)收測試陪蜻。提供一個(gè)清晰快速的反饋機(jī)制等等邦马。進(jìn)而可以演化為通過持續(xù)集成系統(tǒng)可以對整個(gè)開發(fā)工作進(jìn)行可視化,精益方法運(yùn)用到持續(xù)集成的工作中囱皿,指導(dǎo)項(xiàng)目的管理等等勇婴。進(jìn)而延伸到持續(xù)部署、持續(xù)交付嘱腥。
如果XP的各個(gè)工程實(shí)踐是珍珠的話,那么串起這些珍珠項(xiàng)鏈的繩子就是持續(xù)集成拘悦。
如何學(xué)習(xí)和實(shí)踐XP
除了了解這些基本概念外齿兔,需要了解這些實(shí)踐背后的本質(zhì):反饋環(huán) —— 通過獲得反饋,持續(xù)改進(jìn)的方式來適應(yīng)變化的能力础米。還有就是不斷實(shí)踐分苇,這不像學(xué)習(xí)別的東西,聽個(gè)概念就可以跟人辯駁屁桑,XP是一門實(shí)踐性非常強(qiáng)的方法医寿,與Scrum和Kanban有著非常大的不同,Scrum是組織框架設(shè)計(jì)和角色定義蘑斧,Kanban適用于團(tuán)隊(duì)局部優(yōu)化靖秩,也適用于組織層面工作流的梳理,而XP卻是實(shí)打?qū)嵉丶夹g(shù)實(shí)踐竖瘾。小到可以從單個(gè)工程師編寫代碼養(yǎng)成良好地單元測試的習(xí)慣沟突,再到兩個(gè)人結(jié)對開發(fā),進(jìn)行可以做團(tuán)隊(duì)的持續(xù)集成捕传,大到整個(gè)產(chǎn)品級(jí)別或系統(tǒng)級(jí)別的持續(xù)集成和交付惠拭。不積跬步無以至千里;不積小流庸论,無以成江海职辅。
結(jié)尾
最后希望本文能夠?qū)π枰私釾P的同學(xué)有所幫助,也希望有更多的朋友能夠一道學(xué)習(xí)聂示,我們不只是要成為了一名把活干完的工程師域携,而是成為一名如何把活干好的工程師,不是成為了一名只想著構(gòu)造的工程師催什,而是在構(gòu)造之前會(huì)思考需要構(gòu)造什么的工程師涵亏,我們是要制造產(chǎn)品宰睡,而不是次品,我們不是碼農(nóng)气筋,而是匠人拆内。
閱讀原文 >
轉(zhuǎn)載請注明原文出處,謝謝
– EOF –