再認(rèn)識(shí)結(jié)對編程
原創(chuàng)摘要
結(jié)對編程是敏捷軟件開發(fā)中的重要實(shí)踐活動(dòng),然而國內(nèi)業(yè)界對結(jié)對編程如何提高軟件開發(fā)效率的實(shí)現(xiàn)并不明確。作者根據(jù)親身敏捷軟件開發(fā)過程的經(jīng)驗(yàn),深入探討了其對提高軟件開發(fā)效率的實(shí)際作用。
正文
結(jié)對編程是極限編程(XP)的十二個(gè)實(shí)踐之一,是指兩位程序員肩并肩地坐在同一臺(tái)電腦前合作完成同一個(gè)設(shè)計(jì)、同一個(gè)算法以及同一段代碼,并且兩人的角色可以隨時(shí)互換。XP認(rèn)為結(jié)對編程能提高軟件開發(fā)效率,很多國外軟件企業(yè)都在熱衷于結(jié)對編程,F(xiàn)acebook程序員肯特•貝克(Kent Beck)表示:“結(jié)對程序員之間的交流非常充分,你甚至可以再也不用言語進(jìn)行交流。你只要簡單描述再結(jié)合著手勢就可以。”Grockit***執(zhí)行官羅伊•吉爾伯特(Roy Gilbert)表示,這種模式已經(jīng)證明非常成功,他的程序員“正在繼續(xù)推廣這種做法。”而IBM還為結(jié)對編程推出了協(xié)同開發(fā)工具ECF。
然而,結(jié)對編程在國內(nèi)確處于一個(gè)尷尬的境地,業(yè)界對其如何提高軟件開發(fā)效率的理論并不明確,也有認(rèn)為不但不能提高效率,反而會(huì)降低效率的觀點(diǎn)。本文作者根據(jù)親身經(jīng)歷,結(jié)合查閱國外的很多資料,將結(jié)對編程提高軟件開發(fā)效率的心得與各位讀者分享。
在正確認(rèn)識(shí)結(jié)對編程如何提升軟件開發(fā)效率之前,首先要認(rèn)清對結(jié)對編程理解的兩個(gè)誤區(qū)。
誤區(qū)一,兩個(gè)人工作效率比一個(gè)人高
這個(gè)誤區(qū)又分為兩種情況。一種是簡單地認(rèn)為兩個(gè)人做事應(yīng)該更快,的確,日常的生活和工作經(jīng)驗(yàn)都告訴我們,一般情況下,兩個(gè)人合力做一件事,是比一個(gè)人獨(dú)立來做要快的。兩個(gè)程序員合力寫一個(gè)程序,應(yīng)該比一個(gè)人來寫這個(gè)程序速度快。但國內(nèi)商業(yè)軟件公司開發(fā)的實(shí)際情況是,如果有兩個(gè)人,那么就要寫兩個(gè)程序,而不是只給你一個(gè)程序的任務(wù)。讓兩個(gè)人順序完成兩個(gè)程序,效率顯然比每人負(fù)責(zé)一個(gè)程序,并行開發(fā)兩個(gè)程序來的低。所以這個(gè)說法是不符合國情的。
另一種情況是所結(jié)對編程時(shí),兩個(gè)人可以相互討論來解決遇到的問題,要比一個(gè)人冥思苦想的效率高。初看這種說法很有道理,但現(xiàn)實(shí)是在商業(yè)軟件開發(fā)公司中,對于一個(gè)熟練的軟件工程師來說,并不是經(jīng)常遇到難題,大部分時(shí)候收到的需求都是能很快想到解決方案的,根本沒有做大量討論的必要。而但碰到疑難問題的時(shí)候,還有很多更加有效率的方法,比如直接尋求相關(guān)技術(shù)專家的幫助,或者召集多位編程達(dá)人做一次頭腦風(fēng)暴等,結(jié)對編程在這點(diǎn)上說提高軟件開發(fā)效率是很勉強(qiáng)的,作者認(rèn)為反而是降低效率。
誤區(qū)二,防止偷懶,提高效率
這個(gè)說法在國外的資料上沒有,但是國內(nèi)的很多培訓(xùn)和資料上都有提到過。它說如果單獨(dú)工作,在遇到困難的時(shí)候,并不是所有人都立刻積極地去解決問題,這時(shí)或許會(huì)上網(wǎng)和網(wǎng)友聊聊天,看看無關(guān)的網(wǎng)站等等。有可能因?yàn)楣ぷ鞯拇驍啵蟀胩斓臅r(shí)間都浪費(fèi)了。而結(jié)對編程有一種相互督促的作用,在一邊工作疲憊狀態(tài)不好使,另一邊會(huì)起一個(gè)鼓勵(lì)和激發(fā)斗志的作用。
但是這個(gè)說法其實(shí)只是一廂情愿,由于軟件開發(fā)是很講究團(tuán)隊(duì)配合意識(shí)的,所以軟件開發(fā)公司內(nèi)的同事關(guān)系基本都很融洽的。兩個(gè)關(guān)系好的同事坐在一起的時(shí)候,不但不會(huì)互相監(jiān)督,反而會(huì)互相掩護(hù)。
以上是作者認(rèn)為國內(nèi)業(yè)界對結(jié)對編程認(rèn)識(shí)的兩個(gè)誤區(qū),那么結(jié)對編程是如何提高軟件開發(fā)效率的呢?
提高代碼走查效率
在當(dāng)今的軟件工程概念中,代碼走查是一個(gè)很重要的過程。代碼走查的目的是提高軟件的質(zhì)量,以及可維護(hù)性,經(jīng)過走查的代碼是能夠更容易地被項(xiàng)目組其他成員看懂的。然后代碼走查的成本不低,有經(jīng)驗(yàn)的軟件工程師都清楚,要一個(gè)開發(fā)人員完全理解另一個(gè)人的代碼是一件不容易的事情,不只是代碼編程習(xí)慣的不同會(huì)導(dǎo)致閱讀代碼的困難,在復(fù)雜的業(yè)務(wù)邏輯下,不同的開發(fā)人員的設(shè)計(jì)思路也有很大不同的,導(dǎo)致不同的人對代碼的理解有很大差異。所有很多時(shí)候代碼走查緊緊只是看看代碼中是否有語法上的錯(cuò)誤,是否符合編程規(guī)范,而要發(fā)現(xiàn)業(yè)務(wù)邏輯上的深層錯(cuò)誤是很困難的,以至很多浮躁的軟件開發(fā)公司甚至直接省略代碼走查這個(gè)步驟。
結(jié)對編程則正是提高代碼走查效率和質(zhì)量的非常有效的手段。兩個(gè)開發(fā)人員坐在一起,共同思考和討論設(shè)計(jì)思路,輪流編寫程序代碼,輪流走查另一個(gè)人在寫的代碼,代碼走查和編碼并行開展,而不是等完全編碼之后才做代碼走查,產(chǎn)生的程序代碼風(fēng)格是兩個(gè)人都能接受的。這樣就不存在要一個(gè)人去理解另一個(gè)的代碼的問題,實(shí)際是兩個(gè)人共同理解代碼。而且由于兩個(gè)人的思想盲區(qū)要遠(yuǎn)小于一個(gè)人的思想盲區(qū),所以能夠在編碼過程中及時(shí)地發(fā)現(xiàn)程序在業(yè)務(wù)邏輯實(shí)現(xiàn)上的深層問題,大大提高代碼走查的效率和質(zhì)量。對于包含代碼走查階段的軟件開發(fā)過程而言,結(jié)對編程是能大大提升軟件開發(fā)效率的。
結(jié)對編程還有很多優(yōu)點(diǎn),比如提高軟件代碼的質(zhì)量,促進(jìn)知識(shí)傳遞,降低新員工學(xué)習(xí)成本等。除此之外,作者還發(fā)現(xiàn)結(jié)對編程還有一個(gè)很大的優(yōu)點(diǎn),就是能讓敏捷開發(fā)所倡導(dǎo)的共同責(zé)任理念落到實(shí)處。
敏捷開發(fā)強(qiáng)調(diào)項(xiàng)目是整個(gè)項(xiàng)目團(tuán)隊(duì)共同擁有的,所以項(xiàng)目的問題是項(xiàng)目團(tuán)隊(duì)所有成員的責(zé)任,而不只是某個(gè)人的責(zé)任,項(xiàng)目團(tuán)隊(duì)的所有成員應(yīng)該共同努力來解決和避免所有的項(xiàng)目問題。結(jié)對編程則能很好地體現(xiàn)這個(gè)理念,在結(jié)對編程中兩個(gè)人頻繁變換角色,對于程序代碼存在錯(cuò)誤,就很難分清是誰的責(zé)任,甚至很難分清楚哪里的代碼是誰寫的,所以代碼問題至少是結(jié)對的兩個(gè)人的共同責(zé)任,從根本上促進(jìn)了共同責(zé)任的理念。

























