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