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

http://www.infoq.com/cn/news/2015/04/experiences-remote-pairing

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

为什么要在远程工作中使用结对编程的方式呢?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

QCon北京2016】《七周七并发模型》作者Paul Butcher、Dojo Toolkit联合发起人Dylan Schiemann、高盛技术部VP林文、峰瑞资本技术合伙人覃超、LinkedIn Java性能优化专家庄振运、Rust贡献者庄晓立等专家将聚首QCon,分享最佳技术实践,更多精彩。现在购票立减680,5人之上团购优惠多多。

时间: 2024-10-26 05:07:03

【转】远程结对编程实战:看看别人是怎么做的的相关文章

结对编程的体会

今天晚上,我与队友赵纯艺进行了一次结对编程,共同完成"微信抢票菜单调整"这个任务.因为在之前的开发中,我主要负责前后端借口,只是和数据库打交道,对与微信有关的接口不是很熟悉,所以在获取当前菜单和设置当前菜单时遇到了一点问题. 刚开始的时候,因为我们对彼此的工作都不是很了解,所以我花了比较长的时间向她说明我这部分的机制是如何运作的,理解了我的困惑后,她表示虽然记不太清楚,但是记得<开发指南>里有相关函数.通过查询文档,我们找到了对应的函数get_wechat_menu()和u

结对编程初识

按照敏捷开发的要求,我们测试小组开始了第二个story.我领到了结对编程和跟着江霄一起完成关于.Net下对具体的项目代码写出测试Demo的task. 在结对编程的task中,主要又分为了概念性认识和具体推行两个子任务.这次主要还是单元测试理论性的一些基本认识吧. 定义: 结对编程就是两位程序员坐在同一工作台前开发软件.也就是说,两位程序员来完同一个设计,一个作为领航者在后边说代码怎么写,另一个作为实施者写代码. 优势:    对项目: (1)两个程序员具有相同的缺点和盲点的可能性很小,所以当我们

对分治法思想的体会 &amp; 结对编程情况汇报

一.对分治思想的体会 1.帮助我们解决问题. 分治法,对大的问题拆封成规模较小的问题,我们求解小问题,再把小问题的答案合并起来,得出大问题的答案.大问题思考起来比较乱,犯迷糊,不易想到解决方法,比如汉诺塔问题.分解成小问题,我们就容易想出方法来解决问题 2.时间复杂度低 分治法思想核心是递归,递归的时间复杂度低.算法的复杂度低,提高了算法的质量 二.结对编程情况汇报 3道题都做完且答案正确,第三道题,没有按时间复杂度为O(logn)编程,后来查找资料知道如何写出O(logn)的算法.第一题,开始

结对编程2——单元测试

 周迪 201421123089    黄睿 201421123069  coding.net 地址:http://git.oschina.net/hr2324/SoftEngHW 1.我们的代码要使它的利用率大大提高,所以我们要通过单元测试进一步完善代码,发现细小的错误.于是这次就用JUnit进行了简单四则运算的单元测试. a.需求分析:(1)在上次的基础上将计算模块单独创建一个类: (2)针对计算类做单元测试: (3)主要做整数和真分数的加减乘除: (4) 增量式开发,用git命令提交到co

结对编程2—— 单元测试

结对伙伴:201421123048,201421123036 coding.net 地址:https://git.coding.net/YJh_/PairProject_2.git a. 需求分析:测试上有哪些详细的需求? 1.把计算模块提取出来,单独创建一个类2.通过单元测试代码,测试加法是否能正确工作3.通过单元测试代码,测试加减乘除功能4.通过单元测试代码,测试计算类对于各种参数的支持 输入是有错误的,例如 "1 ++ 2" 在数值范围是 -1000 .. 1000 的时候,传进

作业4:结对编程—词频统计

结对对象:石莉静 博客地址:http://www.cnblogs.com/shilijing/ Github地址:https://github.com/cchenhui/-4 贡献比例:1:1 结对编程照片: [必做 2] 读取小文本文件A_Tale_of_Two_Cities.txt 或者 大文本文件Gone_with_the_wind.txt,统计某一指定单词在该文本文件中出现的频率. 源程序: #include <iostream> #include <vector> #in

[笔记][Java7并发编程实战手册]3.3 资源的多副本并发访问控制Semaphore

[笔记][Java7并发编程实战手册]系列目录 简介 本文继续学习信号量Semaphore机制. 在3.2中其实已经讲解完了,之前对于信号量并发的使用场景不知道,看了本章节才想到一些: 下面就以 租车为列子来讲解并发访问的控制.(示例都很简单或许不符合现实逻辑) 信号量(非二进制信号量)是不保证同步的,需要额外的同步 示例 场景:有一个出租车公司,有三台车,有十个司机,每个司机工作的时间不一致,可以说是司机等待着别人还车后,接着租用汽车. /** * Created by zhuqiang on

Linux下的编程实战【转】

一篇比较不错的文章, 降到了 makefile make , gcc编译器,GDB调试器, Linux文件系统,Linux文件API,.C语言库函数(C库函数的文件操作实际上是独立于具体的操作系统平台的),进程控制与进程通信编程 1.Linux进程 Linux进程在内存中包含三部分数据:代码段.堆栈段和数据段.代码段存放了程序的代码.代码段可以为机器中运行同一程序的数个 进程共享.堆栈段存放的是子程序(函数)的返回地址.子程序的参数及程序的局部变量.而数据段则存放程序的全局变量.常数以及动态数

结对编程 电梯调度程序

这次老师安排的是结对编程作业,也是第一次接触两人结对编程,感觉比较新鲜,有感觉难以入手,在经过协商之后,我们一起完成了我们的编程作业,感觉到很开心,也体会到合作的愉快,这是我们这次的成果. 这是这次的题目,感觉操控4个电梯比较困难,而且考虑情况很多,所以我们在做了很多的构想以后,我们才开始编写程序. 1 #include<iostream> 2 #include<Windows.h> 3 #include <conio.h> 4 using namespace std;