远程结对编程实战:看看别人是怎么做的

  • Ben Linders
  • 邵思华

2015 年 4 月 12 日

话题:语言 & 开发文化 & 方法

在进行远程工作时,使用结对编程方式能够有效地增进开发者之间的互动,并促进团队的良好关系。它不仅能够促进信息的流动,还能够防止开发者注意力分散的现象。你可以多尝试一下各种工具,以找到一种能够适合你进行远程结对的方式。结对编程是一种耗费精力而且缓慢的过程,有一些工作是你更愿意自己完成,而不是靠结对实现的。而在分布式团队中进行结对时,会自然地浮现出同理心与无私的特质。

为什么要在远程工作中使用结对编程的方式呢?Jake McCrary 在他的一篇博客帖子中提到了远程结对所带来的几种好处:

通常的结对编程方式所带来的优点同样适用于远程结对过程:让更多的人了解代码、使代码的质量提高、并且通过这种方式提供了一次指导学习的机会。除此之外还有一点优势,而这一优势在远程方式中表现得更为明显,即远程结对增加了社交互动性。

每次我告诉他人我在自己的公寓中进行远程工作时,最常见的一种反应就是“我很想念与同事进行互动的感觉”。在你在远程工作的同时,你确实会想念在办公室中的处处互动,而结对编程能够缓解这种思念,它能够帮助你与你的远程同事建立并维护良好的关系。

Nickolas Means 在他的博客帖子“让远程工作顺利开展”中,描述了一种情形,如果每个公司的每位员工都进行远程工作,那么实施结对能够带来一些额外的好处:

人们对于员工共处一堂的工作环境的看法是,通过偶尔间听到他人的对话,以及自发性的会议,能够让知识更易于在组织之间进行流动。而结对也能够实现同样的优点,尤其是在穿插性地进行结对实践的情况下。如果你经常变换与你结对的人,那么你将从你的伙伴那里获得知识,同样也会将你从之前几个星期中进行结对的伙伴那里学到的知识分享给新的伙伴,尤其是小组中的新人与有经验的人结对,更能够得到共享的价值所在。

结对方式也能够有效地防止开发者出现无意识的注意力分散现象。当所有成员共同处于一个办公室的情况下,能够更容易地(虽然仍然不算很容易,但至少已经容易些了)注意到是否有人产生受挫、无聊、沮丧等情绪,并在这种情绪蔓延开之前将其阻断。而独自进行远程工作更容易产生注意力分散的现象,但结对编程是一种近乎完美的解药。当你在 Skype 上与另一名开发者进行通话,并且将文本编辑器进行共享时,你很难会分散注意,转而去关注其它工作机会,而经常轮换式地进行结对能够让你与组织中的每个人建立起联系。

在 InfoQ 的文章《远程工作》中,Tom Howlett 为我们展示了他在家中进行远程工作时,是如何使用结对编程的方式开展合作与共享信息的:

全天的大部分时间中我都在进行远程结对编程,并且使用了屏幕共享或其它工具,例如 tmux。这种方式远胜于并肩坐在一起结对。我还听说有许多人即使在同一间办公室中也会选择这种远程结对方式,这种方式的好处在于,你在与其他人保持关联的同时,也能够保有你的办公桌与环境不受他人的影响。

当整个团队想要聚集起来,共同研究某个问题或是讨论下一步工作时又会怎样?我们选用一套在线工具进行会谈并分享屏幕,而且此时我们依旧坐在自己舒适的办公环境里——这会让我们感觉良好,而且比找到一间办公室或空闲的白板要容易得多。

当你打算进行远程结对时,你需要选择一些工具,让这一过程变得可能。Brett Chalupa 在他的博客帖子“最佳远程结对编程实战环境”中,列举了他认为“理想的远程结对实战环境”的一些需求:

  • 高速 —— 主机与客户机在进行键盘输入时应当尽可能地降低延迟,让他们感觉就像在同一台电脑上工作一样。
  • 易于配置 —— 任何两个人都应该能够毫不费力地完成安装与配置工作。
  • 快速启动 —— 启动结对会话的时间不应该超过两分钟。
  • 使用我们熟悉的工具 —— 在结对中应当使用我们有使用经验的编辑器与外壳程序,而不是使用新的工具。

基于以上这些需求,FullStack 选择了使用以下工具:

  • 使用 tmate 进行终端共享
  • 使用 Google Hangouts 进行音频通话与屏幕共享
  • 使用 Vim 进行文本编辑

McCrary 还建议你在结对中使用 tmate、Google hangout 或 Zoom 这样的工具进行终端共享。你还可以选择将你的开发机器进行标准化:

[Outpace] 的每个人都有一台运行 OS X 的电脑,如果他们需要,可以配置一个最低 27 英寸的显示器(多数情况下是一台苹果 27 英寸显示器或戴尔机),其分辨率可达到 2560x1440。由于每个人的硬件与软件配置基本相同,我们就能够使用 OS X 中内置的屏幕共享功能进行结对,并且能够将主机的桌面进行完全共享,而这种完全的桌面共享方式是一种能够模仿出你的伙伴就坐在旁边的座位上的一种最佳方式。这种方式也保证你可以使用任何编辑器,并且让双方能看到同样大小的浏览器窗口(对于测试 UI 或阅读参考文献相当有用)。在网络连接状态良好的情况下,两位程序员在编写代码时几乎没有延迟。这是我偏爱的结对方式。

Philippe Bourgau 在他的博客帖子《从零开始成为结对编程专家》中,描述了当团队中有一位新的远程同事加入时,他们是如何尝试各种远程结对编程工具的过程。

在一开始时,我们尝试了 Lync(微软的聊天系统),配合网络摄像头、耳机与屏幕共享。这种方式能够正常运作,但 Lync 的屏幕共享功能无法做到在巴黎与贝鲁特(黎巴嫩)之间的无缝远程控制。我们是这样处理这个问题的:

通过这些处理,Ahmad 迅速地提高了生产力。我们不再是两个专注于各自任务的子团队,而是一个共享一切信息的分布式团队。

  • 只有在特别情况下才使用 Lync 的“给予控制”特性:因为它的延迟太严重了
  • 选择小的提交,并在每次提交之后交换控制权
  • 如果你无法做到立即提交,就将代码暂时 shelve 到 perforce 上(你也可以使用 Git 获取结对伙伴的代码库),并交换控制权

并不是每个人都能够做到,或是愿意一直进行结对编程的,而且某些工作不进行结对也是有道理的。McCrary 将其称为独处,他对于如何获得一些独处的机会提供了以下建议:

获得独处机会的一种方式是将你的午餐时间与你的结对伙伴错开,这样你和你的伙伴都有机会获得一些独处的时间。

其它的一些短暂的独处时机还包括会议与面试,结对中的某一方会因为参加某个会议、进行一次面试、或是助其他开发者一臂之力而需要暂时离开,这种情形并不罕见。

而在团队中的成员数量不均衡的情况下,也会产生独处。如果你的团队成员数量为奇数,那么你有大把的机会成为一个独处的开发者。你可以尝试着自愿担当那个独处的开发者,但也要意识到不应变得过分孤立。

Jeffry Hesse 在他的博客帖子《我们是如何实施远程结对编程的》中,分享了在 Michael Prescott 和 Chris Wilper 之间的远程结对编程的实践经验。以下是他们所提到的部分经验:

Wilper:总的来说,我认为结对是一种积极的经验,它有着一些很明显的优点。最显著的一点是,它有助于打破知识的壁垒。

另一个优点在于,它能够减少交流的阻碍。

我在结对的经验中也发现了以下两个主要的挑战,虽然它们不会令我放弃再次进行结对的念头,但也值得我们提及。

首先,在结对的工作日中,每次在当天的工作结束之后,我都会感觉精神上的极度疲惫。我将造成这一点的原因归结为:我们在专注于开发任务的同时,还要维持着与对方的交流。其次,与各自开展工作相比,我认为这种方式的最终开发速度会有一点下降。从直觉上来说这是可以理解的,这也是我们为了打破知识壁垒所付出的必然的代价,而采用其它任何方式都会让这种壁垒继续存在。

Michael:我们必须承认,这种方式的一个代价是其他人会看到你在你的薄弱环节上出丑。Chris 和我都同时认识到我们总是记不住 mock 期望结果的 API,这让我们感到脸上有些发烫。但这种方式也有一个对应的优点,就是你的伙伴总是能够指出一些在工具使用上的技巧提示,而在其它工作方式中你是无法了解它们的(例如 IDE 中的导航或重构的快捷键、最实用的 karaf 命令等等)。

至于该如何应用远程结对这一点,我首先认为这是一种推倒壁垒、分享知识的优秀途径。因此,我建议在处理某些具有很大程度的设计不确定性、具有内在在复杂需求、涌现出逻辑方面的不自然性、或与复杂的第三方 API 进行交互时使用这一方式。

Means 也分析了结对过程怎样帮助他们建立起一个分布式的团队,并让该团队具备同理心和无私的精神的:

结对编程是一种招聘具有高情商的开发者的好方法。那些愿意进行全天结对的开发者往往具有高度的自知之明。他们不在乎可能会遭受侵犯,并且能够承认他们所不了解的知识。他们乐于赞商他人,并且他们大多能够避免常见的软件开发者陷阱,即总是想表现出他们看上去比团队中的其他所有人更聪明。

当你的团队中多数是具有高情商的开发者时,就能够自然地在团队中浮现出同理心、无私等等优秀的特质。

查看英文原文Experiences from Doing Remote Pairing

语言 & 开发文化 & 方法