(本文發(fā)表于《程序員雜志》第九期,略有刪改)
?
?
作者:錢安川(Moxie)
Email:qiananchuan@gmail.com
我們Pair
做任何一件事情。
???????????????????????????????????????????
?
——ThoughtWorks
西安Office
我的第一次Pair(Pair Programming的簡(jiǎn)稱,即結(jié)對(duì)編程。后面都是用Pair代替)是在ThoughtWorks公司面試進(jìn)行的。那次,他們來(lái)自英國(guó)的項(xiàng)目經(jīng)理Andy面試我,和我一起進(jìn)行Pair。Andy問(wèn)我以前是否Pair過(guò),我說(shuō):“沒有,這是我第一次Pair”。隨即他就告訴我:“It’s very fun.(它非常有趣)。”
就這樣,開始了我的第一次Pair,也是加入TW最重要的一輪面試。其實(shí),剛開始很不習(xí)慣,我那可憐的英語(yǔ)口語(yǔ),陌生的測(cè)試優(yōu)先開發(fā)(TDD Test Driven Development? 一種軟件開發(fā)方式,先寫單元測(cè)試代碼,再寫業(yè)務(wù)代碼。我以前也寫過(guò)很多單元測(cè)試,但從沒有測(cè)試優(yōu)先)。當(dāng)我看到需求文檔時(shí),大腦幾乎是一片空白,不知從何處下手。
但面試總不能就這樣放棄吧。我又仔細(xì)看了一遍文檔,嘗試著寫了幾段業(yè)務(wù)代碼。做在我旁邊的Andy搖了搖頭,從我手里拿了鍵盤。他說(shuō)應(yīng)該這樣做,先寫測(cè)試代碼。于是他一邊和我解釋業(yè)務(wù)需求,一邊寫測(cè)試代碼。并提醒我,如何去對(duì)一個(gè)復(fù)雜的功能進(jìn)行分解,并且小步伐的前進(jìn)。
在Andy的引導(dǎo)下,我慢慢的進(jìn)入了角色。充分理解業(yè)務(wù)之后,也就清楚了該如何寫業(yè)務(wù)代碼。我從Andy那里要了鍵盤,又寫了幾段代碼。然后運(yùn)行單元測(cè)試,綠色狀態(tài),測(cè)試成功。Andy微笑的向我豎起了大拇指。
受到鼓勵(lì)的我,這是已完全放松進(jìn)入狀態(tài)。我們又試著完成了幾個(gè)功能。這時(shí),我們已經(jīng)不只覺的渡過(guò)了2.5個(gè)小時(shí)。Pair確實(shí)是一件非常有趣的事。
進(jìn)入ThoughtWorks公司之后,發(fā)現(xiàn)在大家不僅Pair編程,還Pair研究技術(shù),Pair撰寫文章,Pair翻譯,等等。只要是Pair能完成的工作,我們就不一個(gè)人完成。甚至在生活中也出現(xiàn)了很多Pair的影子。在我們的西安Office里流傳這樣一句話:“我們Pair做任何一件事情”。兩個(gè)人Pair,可以一起一起分享工作樂趣,一起承擔(dān)工作壓力。
這些天的Pair生活,讓我深深體會(huì)到了Pair的優(yōu)點(diǎn)。
一、Pair
可以最大化的提高工作效率。
軟件開發(fā)并不只是程序員堆砌代碼的過(guò)程,它更多的是一個(gè)創(chuàng)新的過(guò)程,是一個(gè)發(fā)現(xiàn)問(wèn)題、分析問(wèn)題、解決問(wèn)題的過(guò)程。一個(gè)人編程時(shí),往往有了一絲零碎的想法就開始編寫代碼。寫完代碼之后,忽然發(fā)現(xiàn)這個(gè)方案行不通,只好廢棄這些代碼,重新開始新的想法。當(dāng)一個(gè)人在遇到疑難問(wèn)題時(shí),很容易走入“死角”。而Pair則不同,一個(gè)人有了想法,首先要表達(dá)出來(lái),讓自己的同伴理解,經(jīng)過(guò)深刻的討論,一致認(rèn)可之后才開始編寫代碼。一個(gè)人編寫代碼,另一個(gè)則在旁邊思考,會(huì)為下一步的工作提出建設(shè)性的意見。發(fā)現(xiàn)了問(wèn)題可以及時(shí)的指正。大大的提高了代碼質(zhì)量。
一個(gè)人一天有效工作時(shí)間不超過(guò)3-4個(gè)小時(shí)。兩個(gè)人一起Pair。一個(gè)人編寫代碼,另一個(gè)人則從設(shè)計(jì)的角度思考下一步的工作,有了想法之后,互相討論,再互換角色。在開發(fā)過(guò)程中,設(shè)計(jì)思考和編碼實(shí)現(xiàn)不停的進(jìn)行交換,保持了良好的開發(fā)節(jié)奏。同時(shí)可以互相督促,使彼此更加認(rèn)真的工作。遇到問(wèn)題和壓力時(shí),可以一起面對(duì),互相鼓勵(lì)。可以一起分享解決問(wèn)題的成就和樂趣。
二、Pair
是知識(shí)傳播的最好途徑。
很多軟件公司都建立有自己的知識(shí)庫(kù),有的還建立自己的培訓(xùn)部門,甚至高薪聘請(qǐng)一些專家做技術(shù)培訓(xùn)。但發(fā)現(xiàn)效果并不理想。培訓(xùn)之后,開發(fā)人員面臨實(shí)際的項(xiàng)目,還是一片茫然。而與有經(jīng)驗(yàn)的同事一起Pair則是在實(shí)際項(xiàng)目中學(xué)習(xí),具有非常強(qiáng)的針對(duì)性。你學(xué)到的不僅是一些技術(shù)和技巧,更多是他們思考問(wèn)題方式、解決問(wèn)題的方法。和各種不同經(jīng)驗(yàn)的同事一起Pair,你的經(jīng)驗(yàn)和能力可以得到快速的提高。
在ThoughtWorks公司,如果你要加入一個(gè)項(xiàng)目,完全不用擔(dān)心它使用的技術(shù)和涉及的業(yè)務(wù)。只要你有一定的基礎(chǔ),和有經(jīng)驗(yàn)的同事一起Pair能讓你很快熟悉和掌握它們。
三、Pair
可以打造出最佳的合作團(tuán)隊(duì)。
團(tuán)隊(duì)是有組織有計(jì)劃的,合理有效地利用各種資源,進(jìn)行最佳的組合。Pair并不是一對(duì)固定的伙伴,我們鼓勵(lì)在團(tuán)隊(duì)中經(jīng)常交換Pair伙伴。這時(shí)我們發(fā)現(xiàn),項(xiàng)目不再是一個(gè)人的事情,也不是兩個(gè)人的事情,而是整個(gè)團(tuán)隊(duì)的事情。
通過(guò)Pair,大家可以在最短的時(shí)間內(nèi)完成磨合。Pair很好的促進(jìn)了團(tuán)隊(duì)的溝通交流,經(jīng)常一起合作Pair的伙伴,彼此了解、熟悉,很多都是工作和生活上的好友。在這樣的團(tuán)隊(duì)里,大家很樂意互相協(xié)助,一起分享知識(shí),分享快樂。
?
在聽過(guò)我們一番熱情洋溢的闡述之后,某些項(xiàng)目管理者會(huì)點(diǎn)頭并且認(rèn)可Pair帶來(lái)的力量。但,我們也聽到了一些拒絕Pair的聲音。下面是我們聽到的拒絕Pair的最主要的理由,當(dāng)然也包括了我們的辯解。
一、
Pair
浪費(fèi)資源。
以前是一個(gè)人完成的工作,而現(xiàn)在卻是由兩個(gè)人一起完成。一個(gè)人在寫程序,而另一個(gè)卻在旁邊觀望。為開發(fā)人員支付報(bào)酬的老板是多么心疼那些白花花的銀子。
?
可是,作為老板的你可曾做過(guò)統(tǒng)計(jì)過(guò),每天加班工作12小時(shí),滿臉疲憊的開發(fā)人員到底為你創(chuàng)造了多少的價(jià)值?在這漫長(zhǎng)的12小時(shí)中,能高效工作的時(shí)間又能有多少呢?一個(gè)開發(fā)人員每天編寫幾百行的代碼,可是真正具有實(shí)效性的代碼又有多少呢?
?
軟件的本質(zhì)就是很難用一種標(biāo)準(zhǔn)去衡量它的進(jìn)度和實(shí)效性。開發(fā)人員能力的高與低、經(jīng)驗(yàn)的多與少、工作的主動(dòng)與被動(dòng),對(duì)軟件開發(fā)的成本有非常大的影響。前期糟糕的代碼,在后期修正,是需要付出幾倍甚至更多的代價(jià)。在軟件的行業(yè)里,人月和代碼行永遠(yuǎn)是神話。
在1999年,猶他州立大學(xué)(University of Utah)做了一項(xiàng)試驗(yàn)。.兩組學(xué)生,一組獨(dú)自工作(一共13人),一組Pair(一共28人,即14對(duì))。他們完成相同的任務(wù)(由助教預(yù)先設(shè)計(jì)和開發(fā)了測(cè)試案例)。
下面的表格(圖-1)是完成相同的四個(gè)程序,獨(dú)自工作和Pair工作使測(cè)試案例成功通過(guò)的百分比。
(圖-1)
下面的柱狀圖(圖-2)則是完成相同的程序,兩組所花費(fèi)的時(shí)間比。雖然Pair的學(xué)生在剛開始的階段比獨(dú)自工作的學(xué)生花在同樣任務(wù)的時(shí)間較多,但很快Pair的學(xué)生的時(shí)間開始大幅度的下降。而獨(dú)立工作的學(xué)生需要花費(fèi)比Pairs更多的時(shí)間來(lái)達(dá)到接近的代碼質(zhì)量。
(圖-2)
而且,在具體項(xiàng)目中。Pair會(huì)帶來(lái)比上面結(jié)果更高的價(jià)值。一、在實(shí)際開發(fā)中,如果錯(cuò)誤越多,就要花費(fèi)越多的時(shí)間去修復(fù)它。在我們的試驗(yàn)中,沒有統(tǒng)計(jì)修復(fù)錯(cuò)誤所花費(fèi)的時(shí)間。二、從圖-1可以看出,Pair在產(chǎn)生高質(zhì)量代碼時(shí),也即意味著對(duì)需求的準(zhǔn)確理解。個(gè)人團(tuán)隊(duì)對(duì)需求理解偏差比較大,后期也要花費(fèi)更大的代價(jià)來(lái)糾正。三、從圖-2可以看到,Pair的團(tuán)隊(duì)開發(fā)能力提高很快,這是潛在的價(jià)值。
在比較試驗(yàn)之后的問(wèn)卷調(diào)查之后發(fā)現(xiàn):
ü?????
Pair能用較少的時(shí)間生產(chǎn)更高質(zhì)量的代碼。
ü?????
Pair的學(xué)生們認(rèn)為自己比一個(gè)人的時(shí)候更勤奮和更聰明的工作,因?yàn)椴幌胱屪约旱?/span>partner失望。
ü?????
Pair的學(xué)生認(rèn)為自己比一個(gè)人的時(shí)候更專著,緊湊和由紀(jì)律的工作,而且是持續(xù)的。而獨(dú)立工作的學(xué)生也可以專著和緊湊的工作,但往往不持續(xù)。
ü?????
在緊張時(shí)間安排和繁重的工作壓力下,獨(dú)自工作的學(xué)生很容易蛻變?yōu)闆]有紀(jì)律的程序員。
?
同時(shí),在ThoughtWorks這樣的咨詢公司,每個(gè)開發(fā)者都是能夠獨(dú)擋一面。ThoughtWorks的開發(fā)者,在一般的軟件公司都是類似項(xiàng)目經(jīng)理或架構(gòu)師的角色。你可以想象公司肯定要為他們提供不翡的待遇。可是,他們卻Pair做任何一件事情,也從不認(rèn)為自己是在浪費(fèi)資源。相反,ThoughtWorks從實(shí)踐中得出:Pair能夠充分的利用每個(gè)開發(fā)者,讓他們發(fā)揮最大的價(jià)值。
?
二、人手不夠。
也許,在你的公司,昨天又有一個(gè)老員工遞交了辭職申請(qǐng)。老板看著一張張新的面孔,很無(wú)奈的搖了搖頭。招聘員工并不困難。但如何讓新員工快速進(jìn)入角色,掌握公司的技術(shù)和業(yè)務(wù)呢?
???
人員的流動(dòng)一直是讓很多軟件公司非常困擾的問(wèn)題。特別是老員工的離去,也就意味著公司多年的技術(shù)和業(yè)務(wù)積累的流失。
而在Pair工作的團(tuán)隊(duì)中,幾乎不用擔(dān)心這個(gè)問(wèn)題。Pair可以快速的進(jìn)行知識(shí)傳遞,通過(guò)Pair和Pair伙伴的交換,知識(shí)不再是掌握在一個(gè)人的手中,而是整個(gè)團(tuán)隊(duì)一起共享。
在ThoughtWorks內(nèi)部,工作的調(diào)整和變換是非常頻繁的。但很少會(huì)對(duì)項(xiàng)目造成影響。相反,這樣的變換卻加快了知識(shí)的傳遞。
?
三、開發(fā)者不能很好的合作,Pair
對(duì)開發(fā)者要求太高。
真的要求很高嗎?看看求職簡(jiǎn)歷,不是每個(gè)開發(fā)者都口口聲稱自己具有很好的團(tuán)隊(duì)合作精神嗎?如果你不能很好的和別人Pair,團(tuán)隊(duì)精神又從何談起呢?
那任何兩個(gè)人都可以搭配進(jìn)行Pair嗎?
不,Pair對(duì)開發(fā)者是有要求的。它要求開發(fā)者樂意和別人溝通、合作,要求開發(fā)者能夠彼此尊重,愿意和別人分享自己的知識(shí)。這不正是我們一直倡導(dǎo)的團(tuán)隊(duì)合作精神嘛!
Pair的搭配是一個(gè)有趣的問(wèn)題。有人說(shuō),最好的搭配就是兩個(gè)人能力相當(dāng)。其實(shí)不然,Pair應(yīng)該是一種多樣的變換組合。在Pair的團(tuán)隊(duì)中,經(jīng)驗(yàn)豐富的開發(fā)者有責(zé)任帶領(lǐng)新人,傳知授道解惑,同時(shí)可以享受傳道的樂趣。新人,更應(yīng)主動(dòng)找有經(jīng)驗(yàn)的伙伴Pair,快速學(xué)習(xí)提高自己。Pair的核心就是溝通,只要兩個(gè)人能很好的進(jìn)行溝通,那么他們就可以很好的搭配。
關(guān)于Pair的實(shí)施,其實(shí)并不困難。我們需要的只是經(jīng)驗(yàn),當(dāng)然經(jīng)驗(yàn)也只會(huì)來(lái)源于實(shí)踐。
最后,我要說(shuō)的是:我在ThoughtWorks中國(guó),有幸多次和傳說(shuō)中的美女天才程序員一起Pair,其中的感覺也就不用多說(shuō)了,呵呵。
?
參考資料:
http://www.pairprogramming.com/
這是一個(gè)專門介紹和研究Pair的一個(gè)網(wǎng)站
聯(lián)系作者:
Email:qiananchuan@gmail.com
http://moxie.blogdriver.com/moxie/index.html