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