NetReptile推薦 [2005-7-17]
出處:ZDNet
作者:Steve Hayes
配對(duì)編程是極限編程里爭議最大的做法之一——支持者和反對(duì)者對(duì)此的反應(yīng)都相當(dāng)強(qiáng)烈。那么什么是配對(duì)編程?為什么人們對(duì)此的反應(yīng)這么大?
Laurie Williams將配對(duì)編程(pair programming)描述為“一種編程風(fēng)格,它由兩個(gè)程序員并排在一臺(tái)計(jì)算機(jī)上工作,連續(xù)協(xié)作完成同一個(gè)設(shè)計(jì)、算法、代碼或者測(cè)試”。從上面的描述我們可以清楚地看出,配對(duì)編程的含義不僅僅是編程本身的鍵入,我個(gè)人認(rèn)為“配對(duì)開發(fā)(pair development)”應(yīng)該是對(duì)這種活動(dòng)的更好描述。
配對(duì)編程不是一個(gè)人簡單地看著另一個(gè)在做什么——在卓有成效的配對(duì)工作里,這兩個(gè)合作伙伴常常工作在不同抽象層次,一個(gè)人關(guān)注的是為實(shí)現(xiàn)眼前目標(biāo)而編寫的代碼的細(xì)節(jié),而另一個(gè)人考慮的是更大的前景和下一步要做的事情,這兩個(gè)人的角色頻繁進(jìn)行更換。這是一項(xiàng)高強(qiáng)度的、嚴(yán)密的,且常常令人疲勞的活動(dòng),但是能夠創(chuàng)造出經(jīng)過深思熟慮的高質(zhì)量代碼。
反對(duì)配對(duì)編程的大多數(shù)強(qiáng)烈反應(yīng)都源于配對(duì)編程對(duì)社會(huì)上業(yè)已形成的軟件開發(fā)習(xí)慣的挑戰(zhàn)。
對(duì)編程的傳統(tǒng)看法是在隔離上花一大段時(shí)間,在此期間程序員進(jìn)入一個(gè)“流程”,只與計(jì)算機(jī)和他們自己的思考模式進(jìn)行交互。這樣做的結(jié)果就是,編程往往更受性格內(nèi)向的人的歡迎,因?yàn)檫@樣的人喜歡將社交活動(dòng)減到最少,而對(duì)那些外向的人卻吸引力不大,因?yàn)樗麄兏M麜r(shí)時(shí)刻刻進(jìn)行合作。
當(dāng)然這些都是一般的想法,但是總有不愿意與其他人肩并肩工作程序員,對(duì)他們工作的滿意度肯定會(huì)受到像配對(duì)編程這樣的事的影響,了解這種情況是非常重要的。
對(duì)配對(duì)編程也有反應(yīng)不太強(qiáng)烈的反對(duì),一般都是與讓兩個(gè)人在一臺(tái)機(jī)器上工作所花費(fèi)的時(shí)間肯定要比他們各自獨(dú)立工作然后合并工作成果所需要的時(shí)間多一倍的思想有關(guān)。
如果將軟件開發(fā)的因素限定為編程的時(shí)候我們能夠輸入有多快,這肯定是對(duì)的,但是根據(jù)Kent Beck的觀察,如果情況真的如此的話,我們給每個(gè)程序員一份Mavis Beacon(盲打教學(xué)軟件)就行了。
我自己不會(huì)盲打,我也從來都沒有在面試別人的時(shí)候問過他們的打字速度,所以打字速度是我們的主要關(guān)注因素的想法是值得懷疑的。然而,軟件開發(fā)是一項(xiàng)智力活動(dòng),它能夠從清楚的表達(dá)和思想的合作發(fā)展中受益,而配對(duì)編程在這兩個(gè)方面都有所幫助。
另外一個(gè)誤解是,配對(duì)編程成功與否,應(yīng)該最終由產(chǎn)出的軟件的質(zhì)量來確定。當(dāng)兩個(gè)人合作的時(shí)候,至少有三種結(jié)果:
- 軟件
- 對(duì)應(yīng)用程序的共同理解(業(yè)務(wù)域、設(shè)計(jì)和實(shí)現(xiàn))
- 技能的轉(zhuǎn)移
這些變化的比例取決于配對(duì)的平衡和動(dòng)態(tài),但是上述所有三者都會(huì)在某種程度上表現(xiàn)出來。當(dāng)一個(gè)經(jīng)驗(yàn)豐富的程序員與一個(gè)新手配對(duì)的時(shí)候,配對(duì)產(chǎn)生的軟件可能不會(huì)被那個(gè)有經(jīng)驗(yàn)的程序員單獨(dú)工作產(chǎn)生的軟件更多,但是這個(gè)新手肯定會(huì)學(xué)到很多關(guān)于這個(gè)應(yīng)用程序的知識(shí)以及關(guān)于編程的基本知識(shí)。
將這一情形與兩人單獨(dú)工作相比較——我們可能得到更多的軟件(盡管我們可能希望更加注意新手編寫的軟件的質(zhì)量),但是我們卻沒有實(shí)現(xiàn)知識(shí)或者技能的轉(zhuǎn)移。如果我們讓這兩個(gè)人在同一個(gè)小組里,配對(duì)編程就是兩個(gè)人度過共同時(shí)光的理想方法。
而另一方面,兩個(gè)有經(jīng)驗(yàn)的人可能會(huì)發(fā)現(xiàn)配對(duì)編程里沒有什么技能的轉(zhuǎn)移,但是讓他們?cè)诓煌某橄髮哟谓鉀Q同一個(gè)問題會(huì)讓他們更快地找到解決方案,而且錯(cuò)誤更少。
配對(duì)編程的另一個(gè)目標(biāo)是盡可能廣泛地傳播應(yīng)用程序設(shè)計(jì)和實(shí)現(xiàn)的知識(shí)。
這是通過配對(duì)輪換實(shí)現(xiàn)的,這樣小組配對(duì)的每個(gè)人都可以通過一段時(shí)間和其他所有人進(jìn)行配對(duì),而且應(yīng)用程序的特定部分都會(huì)由盡可能多的人來解決。在這種環(huán)境里,糟糕的代碼不會(huì)存在太久,因?yàn)樗槐┞对诤芏嚯p眼睛下(這就與開發(fā)人員代碼開發(fā)背后的一個(gè)原理相似),而且當(dāng)設(shè)計(jì)周期到來的時(shí)候,小組就會(huì)從所有人的貢獻(xiàn)里受益,而不需要僅僅依賴某個(gè)熟悉應(yīng)用程序特定部分的個(gè)人。
配對(duì)編程還有其他多種好處:
- 直接的、連續(xù)的代碼回顧
- 與別人工作會(huì)增加責(zé)任和紀(jì)律性。在有人盯著的時(shí)候去偷懶要困難得多!
- 兩個(gè)程序員具有相同的缺點(diǎn)和盲點(diǎn)的可能性很小,所以我們會(huì)獲得一個(gè)強(qiáng)大的解決方案。
- 如果走進(jìn)死胡同,配對(duì)浪費(fèi)的時(shí)間要少得多,因?yàn)槠渲幸粋€(gè)人不可避免地會(huì)厭煩,從而希望尋求幫助。
在定期配對(duì)輪換的情況下,上面列表里的最后兩項(xiàng)尤其現(xiàn)實(shí)。當(dāng)然,做得看起來像配對(duì)編程的方式有很多,但是卻無法實(shí)現(xiàn),或者破壞了這些優(yōu)勢(shì)。
如果不進(jìn)行配對(duì)輪換,那么你所獲得只會(huì)是編程的小圈子,知識(shí)和技術(shù)的轉(zhuǎn)移也只會(huì)是最小。有些公司將配對(duì)編程用作是消滅個(gè)人空間(每兩個(gè)程序員只需要一張桌子和一臺(tái)計(jì)算機(jī),不是嗎?)的理由,這只會(huì)忽視程序員的人類需求。
希望讓程序員一天八個(gè)小時(shí)都配對(duì)工作是不現(xiàn)實(shí)的——配對(duì)的持續(xù)交互帶來了精確和清晰的結(jié)果,但是這一過程也是耗費(fèi)精力的,而且(一個(gè)人)總是會(huì)有開發(fā)以外的任務(wù)要完成。
實(shí)踐經(jīng)驗(yàn)告訴我們,配對(duì)編程是提高軟件質(zhì)量和減少開發(fā)時(shí)間的有效方法,但是它并不適用于所有的程序員,它需要一種經(jīng)過仔細(xì)思考的方式實(shí)現(xiàn)才能有效。
Steve Hayes是Internet Business Systems(IBS)公司的軟件開發(fā)經(jīng)理。IBS公司為金融服務(wù)行業(yè)提供敏捷開發(fā)方法咨詢和開發(fā)服務(wù),以及瀏覽器托管解決方案。