极限编程之结对编程

原文链接:https://www.jianshu.com/p/6b77fd80e941

在敏捷开发(Agile)越来越火的今天,大家或多或少也听过结对编程这个词。但是可能真正实践过的并不多,在这里我就来分享一下我们做结对编程经历以及看法。(话不多说,现在开始!)

主要内容:

  • 结对编程是什么?
  • 结对编程有什么好处?
  • 我们是如何做结对编程的?
  • 一点点想法以及建议。

结对编程是什么?

结对编程(英语:Pair programming)是一种敏捷软件开发的方法,两个程序员在一个计算机上共同工作。一个人输入代码,而另一个人审查他输入的每一行代码。输入代码的人称作驾驶员,审查代码的人称作观察员(或导航员)。两个程序员经常互换角色。

上面是维基百科上对于结对编程的定义,一开始去学习敏捷的时候会对于Agile, Scrum, XP的概念有些混乱。我理解为Agile是一套理论,XP是一套实现Agile的技术框架 (Scrum是另一种),而结对编程则是框架里面的一种方法,所以他们之间的关系从上到下依次是:Agile > XP > Pair Programming。

结对编程有什么好处

程序猿们可能习惯了孤军奋战,喜欢一个人享受电脑前成功的快感,通常对于结对编程会抗拒。

在他们眼中,结对编程是这样的

或是这样的:
还缺一张图 :)

其实并不然,结对编程在掌握对方法的情况下,还是有很多好处的:

  1. 因为有一个领航员同时审查代码,有助于提高代码质量(Code Quality)
  2. 在结对编程的时候,通常驾驶员是新人或是对所做任务涉及的知识缺乏的人,领航员会在过程中分享知识(knowledge sharing),可以快速帮助团队新人熟悉相关知识。
  3. 结对编程有助于集中团队成员的注意力,因为他们在结对的时候没办法玩手机、查邮件等个人事情,而且也不容易被其他人打扰。

我们是怎样做结对编程的

本人任职于一家香港本土公司IT部门,最近因为上级要求实践敏捷开发而开始接触结对编程。一开始大家也很是抗拒,也有人发文列举亚洲人为什么不能做结对编程blah blah。不过我们组执行的还不错,到现在大概进行了大概4-5个星期,这里我来说说我们是怎么做结对编程的。

1. 选伙伴

每次做sprint planning的时候我们会给每个task分配一个坐庄的人,这个人通常是对于这个task比较熟悉的人,另一个位置暂时空缺。

然后到了每天早会的时候,我们会分配另一个人给这个task,这个时候分配人选的方法比较多样。在刚开始的时候,鉴于大家比较害羞,我们会用随机抽取的形式来进行结对。久而久之成员就会自己主动选择task和结对伙伴(比如说我对task A了解的不多,而且我也有兴趣学习其中的知识的话,我就会主动选择这个task, 并与task A的庄家进行结对)

2. 结对ing

按照结对编程的标准,我们的配置是

  • 一台电脑
  • 两个屏幕 (镜像
  • 两套键鼠 (这样每个成员都可以去操纵电脑,如果条件有限的话也可以一套键鼠

结对一开始的时候,坐庄的同学会先当驾驶员,在完成任务的时候分享相关的知识,工作思路以及方法,领航员这时候主要以学习为主,能够有初步的了解,并且有能力能够开始工作。

接着会交换位置,坐庄的同学当领航员,给同伴实践的机会。这时候作为领航员也要继续分享知识,同时仔细审查驾驶员写的代码,并及时准确的给出建议。

之后会定时交换位置,以免某一位童鞋过于疲劳。

3. 换对象

当一个task做完以后,我们会换结对的对象。但我们会遇到一些情况,比如说别的结对小组还没做完任务怎么办?

我们的解决方法是,当一天结束,第二天开始的时候,会重新分配结对伙伴。初期为了做更充分的知识分享,如果一个任务没做完,会让成员继续结对。后期就会要求最好一天换一个结对伙伴。

一点点想法以及建议

同时我也有在看TW顾问推荐的一本书,Scrum and XP from the Trenches。结合自己的经历,总结一下几点分享给大家。
但是请注意,不一定适用于任何情况,应该要不断尝试,不断改变方法,才能找到最适合自己方法。

  • 尊重(Respect)以及耐心(Patience),在结对编程的时候一定要尊重队友,每个人都有自己的强弱项。作为领航员,当驾驶员不明白的地方要耐心解释,不要一把把控制权抢过来自己来写,一定要给伙伴足够的时间去消化和练习。还有不需要评价伙伴写代码的风格,这不是审查的重点。
  • 结对编程在短期是会消耗时间的,因为两个人做一件事。但是就长期来讲,是对效率有提升的,因为代码质量提高了,并且通过知识分享团队成员能够互相为对方做 Backup
  • 结对编程确实很累人,不需要一整天做结对编程。
  • 不是什么task都需要做结对,也不是为了结对而结对,只做有价值的结对编程(比如说需要提升质量或者做知识分享)。
  • 不在结对的时候可以做别的task,或者做一些technical story (例如技术债,写测试等等)。

你可能感兴趣的:(极限编程之结对编程)