1. 程式人生 > >阿里內貿團隊敏捷實踐(三)結對程式設計

阿里內貿團隊敏捷實踐(三)結對程式設計

原文發表於《程式設計師》雜誌2012年2月刊

本文主要從提升專案質量、促進知識傳遞及減少專案風險等角度出發,講述作者所在團隊在結對程式設計實踐中的一些經歷,以及如何避免或減少其所帶來的負面影響。

你瞭解結對程式設計嗎?你嘗試過結對程式設計實踐嗎?也許你還未曾嘗試甚至還不曾瞭解,那麼我們一起來學習和了解敏捷結對程式設計實踐,相信對敏捷感興趣的你會有收穫。

什麼是結對程式設計

結對程式設計(Pair Programming)是一種敏捷軟體開發實踐,指兩個程式設計師並排坐在一臺電腦前,面對同一個顯示器,使用同一個鍵盤和滑鼠一起工作。一個人輸入程式碼,而另一個人審查他輸入的每一行程式碼。輸入程式碼的人稱作駕駛員,審查程式碼的人稱作觀察員(或導航員), 兩個程式設計師定期互換角色。他們在一起完成需求分析、系統設計、編碼、單元測試、整合測試(Integration Test)、寫文件等工作。基本上所有的開發環節都一起肩並肩地、平等地、互補地進行工作(如圖1所示)。

上面是極限程式設計(eXtreme Programming,XP)對結對程式設計的描述,它有如下主要的優點:

  • 有利於提升專案質量,減少Bug;
  • 有利於知識傳遞,降低學習成本;
  • 多人熟悉同一段程式碼,減少專案風險;
  • 與別人一起工作會增加責任和紀律性等。

儘管結對程式設計有諸多誘人的優點,但實行結對程式設計實踐的卻為數不多,其主要原因可能有:

  • 結對程式設計需要投入更多的資源;
  • 結對雙方需同時注意力集中,否則效率更低;
  • 結對人員能力要求相適,否則起不到觀察者的作用,甚至產生依賴;
  • 不成功的配對,經常引發爭吵,產生內耗,導致團隊不和諧等。

結對程式設計是頗具爭議的敏捷實踐之一,除上述一些優缺點外,可能大家還有更多不同的看法,但分析利弊不是本文所要討論的重點。

實踐經驗

就我所在的專案團隊而言,6人左右的開發團隊需要支援多箇中小型獨立產品的需求開發,在繁重的業務壓力下,使用者價值的快速交付是首要的,所以想嘗試共用一臺電腦進行結對開發的實踐只能是一種奢望。讓團隊開發人員儘可能熟悉相互間的產品程式碼,提升專案開發效率以及保證良好的專案質量,是我們在專案開發過程中需要重點解決的問題。

我們試圖通過集體Code Review和設計交流分享等活動,來提升程式碼質量以及相互間業務程式碼的熟悉度,但一直收效甚微。問題主要在於這種集中式活動時間較難安排,人多交流效果不佳,價效比不高。後來,得益於公司的導師機制,在一對新人和導師身上,找到了敏捷結對的原型。由於他們的緊密合作,遇到問題及時溝通,新人在專案進度和質量都有不錯表現,很好地融入了團隊。在後續的專案過程中,我們不斷地嘗試和優化這種結對形式,逐漸形成相對固定的工作方法。

與XP結對程式設計相比,敏捷結對程式設計最為顯著的差異是結對進行需求分析、系統設計和問題討論,但分別編碼實現,通過過程中頻繁的Review來實現結對的效果。開發人員兩兩結對,共同認領開發任務,一起對所承擔的開發任務負責。在需求理解、設計階段雙方一起設計和討論,然後分工各自編碼實現,並通過Code Review以確保實現與設計一致。對結對過程中發現的問題,隨時溝通和討論。由於產品業務邏輯相對不是特別複雜,所以通過這種小範圍、高效的溝通,可以解決專案中的絕大部分問題,實現更高的開發效率並確保程式碼質量。目前,在開發流程中的主要結對活動如圖2所示。

結對活動(如圖3所示)給我們帶來了哪些好處?

  • 提升專案質量。結對開發人員在需求理解、設計思路上進行了充分的溝通和討論,能儘早地發現和解決問題,避免前期因需求理解偏差、設計缺陷問題造成返工。
  • 知識傳遞。對於新員工或經驗略遜的開發人員,通過經常性的溝通和討論,能迅速地進入角色和積累經驗,發揮了傳幫帶的作用。
  • backup,規避專案風險。結對人員之間互為backup,有利於團隊成員之間熟悉業務程式碼,若有人員異動時有利於專案風險控制。

無論新老結對還是強弱結對,都要盡力避免一方對另一方產生依賴,要給新人足夠的成長和鍛鍊空間,讓其獨立思考和解決問題,並允許在可控範圍內嘗試失敗,以獲取寶貴經驗得到成長。否則,團隊只會多一個執行者,結對難以達到預想的效果。同時,一定程度的獨立活動,可以讓大家保留自己的工作習慣,而且形式更為自由和靈活。當然,大家可能會有疑問,如何保證結對人選中資深工程師工作的正確性,因為新人和弱者很有可能無法提出想要的Review幫助。這個問題在我們的結對中不可避免,有選擇地邀請其他資深專家Review,也許會是個不錯的解決方案,特別是對於一些重要的複雜業務邏輯。

參加結對的工程師應具備獨立思考和解決問題的能力,並且具備較好的團隊協作意識。否則,不僅不能有好的結對效果,反而會帶來一些新問題。此外,結對也不僅限在研發工程師之間,研發和測試工程師之間或同產品經理之間的結對(如圖4所示),同樣可以帶來不錯的效果。

引入敏捷實踐,貴在充分理解、結合實際,能揚長避短,且是一個適應、發展的過程,而按部就班絕對不是個好主意。有選擇地結對對我們來說也許是上策,在結對的人選、場合、結對的環節等方面進行選擇性的實施。


金大怪

金建法,阿里巴巴B2B公司技術主管,具有多年網際網路開發和專案管理經驗,對J2EE和敏捷專案管理有著濃厚興趣。