多维角度聊聊结对编程

在敏捷软件开发的各种实践中,结对编程(Pair Programming,下文简称Pair)是特别有争议的。Pair有一个特点,那就是还没有进行过任何Pair实践前,你很可能对它已经有了“喜欢” 或者是“讨厌”的印象。如果有人问你,你喜欢持续集成吗?你多半会回答:不是很肯定,需要试试看。但如果有人问你,你喜欢Pair吗?我猜你会马上给予明 确的肯定或否定的回答。喜欢它的人会觉得好处多多而成本低低,不喜欢它的人会觉得讨厌得难以想象。喜欢与不喜欢都可以形成强大的阵营,两边都不乏重量级的 高手。Pair的优点说起来都很明显,比如:快速反馈,更好的设计,甚至更高的效率等等。但据我了解,不喜欢Pair的人基本上都承认Pair有优点,只 是他们通常会提出反对意见,比如:Pair要求两个人协调一致,每个人的作息时间需要同步,如果一个人请假,那另一个人怎么办?等待就太浪费时间了,如果 自己一个人做那就不是Pair了;或者也有很多人感觉到Pair的时候特别累,不像一个人工作那样自主,写一小时程序,上十分钟微博,两个人同一台电脑工 作自由就小多了。

我所在的公司是Pair的实践者,对于喜欢Pair或者不喜欢Pair的各种原因和心态我都有切身的体 会。在实践中,我们并没有完全一成不变地照搬Kent Beck在《Extreme Programming Explained》书中所定义的Pair模式(Driver Observer模式)。因为,Pair毕竟是一种实践方法,可以供我们在软件开发中参考,而不必像对待科学理论一样教条。另外,我认为要让这种实践方法 发挥它的威力,消除人们心中的讨厌甚至是恐惧情绪是首先要解决的问题,甚至我们可以为此修改一些Pair的传统做法。下面我先来大致描述一下我们的实践模 式(Owner Supporter模式):

<阶段1-Pair形成>

Team 在接到一个大的Story后经过讨论并分解任务形成一个个粒度适中的Task。Task的粒度一般在几小时到一两天这种级别,涉及的代码规模大约是几行到 几个类/函数。每一个Task,都有一个Owner作为责任人,这是和传统单兵开发模式相同的。不过,Owner的产生一般不是由ScrumMaster 来分配指定,而是Team成员自发地去协商选择适当的任务。Owner拿到Task以后会从Team中找一个Supporter,形成Pair。这也是一 个自发协商过程,没有强制指定,也没有固定的搭档,这样形成的Pair一般会是配合最默契也最适合相应Task的。

<阶段2-初始讨论>

Pair 形成以后, 一般是由Owner先分析需求,设计测试,并初步分析思考得出初步的设计思路。这时,Supporter可以暂时先不了解需求。然后Owner邀请 Supporter一起,向Supporter介绍需求和自己的设计思路。Supporter这时需要帮助Owner理解需求,设计测试,对设计方案提出 反馈意见,或者提出新的设计。讨论的理想结果是两人达成一致形成最终的设计方案,如果两人分歧严重不能达成一致则需要更多的人参与,比如:可以举行一个小 型的技术讨论会议把讨论扩大到整个Team。

<阶段3-具体实现>

这一阶段是根据讨论得出的设计方案开始编程实现。在经典Pair Programming中,两个人是在同一台电脑前一起工作,并不时地交换;但我们的实践发现这一点是特别容易让人疲倦,感觉不自在,从而抵触Pair的 最大因素。所以,我们在实践过程中,除了少数情况,基本上没有采用全程Pair工作,而是由Owner一个人完成。当然,如果Owner遇到了一些设计中 考虑不完善的地方,他可以随时再和Supporter讨论。

<阶段4-Review>

具 体实现完成以后,Owner又会邀请Supporter来review自己的工作。这个过程一般是借助版本控制工具对比代码改动,Supporter从实 现的角度来审查实现是否符合设计,有没有可以直接观察到的bug和潜在的问题。如果发现问题并讨论确认,Owner再做相应的改动,再Review。最终 Supporter不能review出问题了,Owner提交代码。

<阶段5-维护>

虽 然经过了讨论和review, 但在后续的测试或者上线后仍然会陆续发现问题,这时就涉及到维护工作。维护工作依然是由Owner牵头,分析log,看代码,重现,修正;但 是,Owner也可以随时邀请Supporter参与分析讨论,至少在Owner准备修改原先的代码时应该要告诉Supporter“原先我们某个地方没 有考虑周全,有什么什么问题,我打算怎么怎么改动”。这个过程好像又回到了阶段2,然后阶段3,阶段4 ... 开发中还有一种可能是,原先的Supporter或Owner已经不在Team内了,这时就需要加入一个新人形成Pair,有经验的人应该向自己的新搭档 介绍Task的相关背景。当然,还很有可能碰到根本没有熟悉该模块的人了,这时就必须形成一个新的Pair,把维护作为一项新Task。

上面基本上就是我们的Pair实践模式了。这种模式基本上还是保留了大部分经典Pair模式的要点,主要的区别在于:

1. 把Pair的形成纳入Scrum框架的任务划分过程。Scrum通常会在Sprint的计划会议中将大的User Story拆分成许多小的Task,每个Task一般对应几小时到一两天的工作量。Task列表出来以后,Team自发协商每个Task形成一个 Pair,整个过程一般没有管理者的直接干预。Story的背景需要Team中的每个人都了解,Task的细节由Pair负责。Pair的效果通常也依赖 于Task的合理划分。

2. 避免全程Pair。因为,全程Pair在实践和心理上会遇到很多问题,比如:时间同步问题,并行工作问题,不自在感问题。避免全程Pair可以使得 Owner和Supporter的时间安排更加灵活,增加并行性,减少不自在感。大部分不喜欢Pair的人基本上都是尤其不喜欢全程Pair,所以这项改 动对于吸引更多的人采用Pair具有重要的意义。

3. 区分Owner和Supporter的职责。经典Pair模式中Driver和Observer角色是随时交换的,也就是说对于一个Task来讲两个人的 职责是相同的,这样可以减小每一个人的压力,但又容易造成缺乏责任感。Owner Supporter模式是单兵模式和经典Pair模式之间的一种妥协,试图在责任和压力之间找到一种平衡。Owner是驱动整个过程的主导,并且是主要的 具体实现者;Supporter以辅助为主,在讨论和review的时候可以站在不同的角度帮助Owner。Supporter并非没有责任,熟悉Task的所有细节是Supporter的责任。当Owner由于请假或忙于其他事物时,Supporter应该立即可以代替Owner处理Task的实现或维护。如果Supporter做不到完全的backup,这就是Supporter的失职,在整个Team和领导的心中应该有这样的认识。

最后,除了显而易见的“引入反馈,提高质量”等很“官方”的优点外,我从管理者和开发人员的角度分别总结一下Owner Supporter模式的“不为人知”却真正很有价值的优点。

管理者角度:

1. 应对人员变动:每个模块至少两个人熟悉,这样在有人请假的时候都有backup,不会造成严重的耽误工作进度。如果有人要离职,交接工作通常也会非常轻 松,几乎没有什么需要特别交接的。很多项目都缺乏文档,只有实现的人知道怎么回事,而即使有文档也总有不清楚的地方,所以留住熟悉的人就是留下了活文档。

2. 增加对质量的信心:相比单兵作战模式,即使是不懂技术的管理者,Pair也可以自然地增加他们对于软件质量的信心,毕竟“三个臭皮匠顶个诸葛亮”。另外, 需要特别提到的是安全性问题。我曾经听说过一个电信计费项目,一个开发人员故意留了一个漏洞,把钱自动打入自己的银行卡,最终为公司带来了麻烦。如果采用 Pair方式,这种情况就不那么容易发生。

3. 增加反馈:对于同一个事物,不同的人也会有不同的看法,这是很正常的现象。比如,在对问题进行估计时一个人乐观,一个人悲观,这时管理层可以同时参考他们的意见,对问题掌握得更加全面。

4. 代替培训:相比传统课程或讲座式培训,Pair能让新员工更快地适应项目。Pair方法也和一些公司采用的导师制有明显的区别。导师制更强调师傅带徒弟, 而Pair则不然。在实践中,我们更鼓励基础比较好的新员工多做Owner,老员工作为Supporter支持;只对基础比较差的新员工先从 Supporter做起,然后逐步过渡到Owner。这样做是因为新员工一般积极性比较高,适合承担更多的具体工作,而老员工则应该避免重复劳动,而是以 辅助和指导为主。另外,新员工也可能带来一些新的思想、方法和技能,这些反而是老员工应该学习的。

开发人员角度:

1. 分担压力,增加默契:Task依然具有明确的责任人,但Supporter可以分担Owner的压力,即使是Team内的技术高手有一个人做backup也是有益的。有人讨论有人支持更容易达到良好的工作效果,而大家相互Support也可以让团队更加默契。

2. 消除经典Pair的不自在感: Owner Supporter模式与经典Pair的Driver Observer模式相比更少存在不自在感,因为整个过程是Owner主导的,他有更多的自由安排什么时候讨论,什么时候独立工作。

3. 分享知识和技能:在Pair的过程中Owner和Supporter会自然地相互传播和分享知识和技能,有助于学习提高。

4. 培养组织能力和表达能力: Owner相当于一个微型团队的leader,在Pair过程中可以锻炼组织能力和表达能力。这个过程可以让一些不善于交流和组织的技术人员逐渐改善交流和组织能力。

Owner Supporter模式在我们的实践中收到了良好的效果,而且成本很低,值得推荐!

转载于:https://www.cnblogs.com/mengheyun/archive/2011/02/22/1961603.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

17-直方图

直方图 何为直方图&#xff1f;没那么高大上&#xff0c;其实就是二维统计图。每个照片都是有像素点所组成&#xff0c;当然也是[0,255]&#xff0c;直方图就是统计每个值所对应的像素点有几个。 直方图横坐标表示0-255这些像素点值&#xff1b;纵坐标表示对应像素点值的个数有…

java求水电费_java水电费管理系统

每天记录学习&#xff0c;每天会有好心情。*^_^*今天和一个朋友共同完成了一个基于web的java水电费管理系统项目&#xff0c;我们在开发时选用的框架是SSM(MYECLIPSE)框架。我这个朋友知识有限&#xff0c;只会这个框架&#xff0c;哈哈&#xff0c;都是为了方便他。和往常一样…

zemax微透镜阵列示例_阵列反向! Ruby中的示例方法

zemax微透镜阵列示例阵列反向&#xff01; 方法 (Array reverse! Method) In this article, we will study about Array.reverse! method. You all must be thinking the method must be doing something related to reversing certain elements as we have done in the case o…

Opencv实战【1】人脸检测并对ROI区域进行部分处理(变身乔碧萝!!!)

步骤&#xff1a; 1、利用Opencv自带的分类器检测人脸 预备知识&#xff1a;Haar特征分类器 Haar特征分类器就是一个XML文件&#xff0c;该文件中会描述人体各个部位的Haar特征值。包括人脸、眼睛、嘴唇等等。 Haar特征分类器存放地址&#xff1a; &#xff08;找自己的安装…

【黑马甄选离线数仓day10_会员主题域开发_DWS和ADS层】

day10_会员主题域开发 会员主题_DWS和ADS层 DWS层开发 门店会员分类天表: 维度指标: 指标&#xff1a;新增注册会员数、累计注册会员数、新增消费会员数、累计消费会员数、新增复购会员数、累计复购会员数、活跃会员数、沉睡会员数、会员消费金额 维度: 时间维度&#xff08…

iPad和iPhone的app图标尺寸、用途、设置方法

下面是在iPhone专用程序、iPad专用程序和通用程序中使用图标文件的指导&#xff0c;由译言网翻译自苹果官方文档。原文 http://article.yeeyan.org/view/395/100567 注意&#xff1a;图标是你的程序包所必需的组成部分。如果你没有提供程 序所需的各种尺寸的图标&#xff0c;系…

18-傅里叶变化

以时间为参照就是时域分析&#xff0c;当然时间是动态变化的 而傅里叶变换是以频域为基准的&#xff0c;不用关心动态变化&#xff0c;只关心做了多少次而已&#xff0c;次数&#xff0c;频率 傅里叶说过&#xff0c;任何一个周期函数都可以用正弦函数堆叠起来形成。强吧&#…

java中访问修饰符_Java中的非访问修饰符是什么?

java中访问修饰符Java非访问修饰符 (Java non access modifiers) We have 7 non-access modifiers in Java. The name of these non-access modifiers are given below, Java中有7个非访问修饰符 。 这些非访问修饰符的名称如下所示&#xff1a; native 本机 synchronized 已同…

mui实现分享功能_MUI 分享功能(微信、QQ 、朋友圈)

配置文件&#xff1a;manifest.jsonplus ->plugins 下边"share": {/*配置应用使用分享功能&#xff0c;参考http://ask.dcloud.net.cn/article/27*/"qq": {"appid": "",/*腾讯QQ开放平台申请应用的AppID值*/"description"…

Java 注解学习笔记

转自&#xff1a;http://wanqiufeng.blog.51cto.com/409430/458883 一、什么是java注解 注解&#xff0c;顾名思义&#xff0c;注解,就是对某一事物进行添加注释说明&#xff0c;会存放一些信息&#xff0c;这些信息可能对以后某个时段来说是很有用处的。 Java注解又叫java标注…

Prime Palindromes

博客园速度非常不稳定&#xff0c;可能要考虑换地方了。虽然我非常喜欢博客园的模板和气氛。 这个题早就知道是怎么做的了。先求出回文数在再判断是不是素数。关键是不知道区间&#xff0c;那就把所有的全部求出来。虽然可能会超时&#xff0c;但是如果使用点技巧的话还是没问题…

Opencv——DFT变换(实现两个Mat的卷积以及显示Mat的频域图像)

DFT原理&#xff1a;&#xff08;单变量离散傅里叶变换&#xff09; 数学基础&#xff1a; 任何一个函数都可以转换成无数个正弦和余弦函数的和的形式。 通常观察傅里叶变换后的频域函数可以获得两个重要的信息&#xff1a;幅频曲线和相频曲线。 在数字图像处理中的作用&#…

python方法items_Python字典items()方法与示例

python方法items字典items()方法 (Dictionary items() Method) items() method is used to get the all items as a view object, the view object represents the key-value pair of the dictionary. items()方法用于获取所有项目作为视图对象&#xff0c;该视图对象表示字典的…

基于(Python下的OpenCV)图像处理的喷墨墨滴形状规范检测

通过图像处理&#xff0c;分析数码印花的喷头所喷出来的墨滴形状&#xff0c;与标准墨滴形状对比分析&#xff0c;来判断墨水及其喷头设备的状态&#xff0c;由两部分构成 PS&#xff1a;获取墨滴形状照片和标准墨滴形状照片都是手绘的&#xff0c;将就的看吧&#xff0c;主要…

const_iterator,const 迭代器

const 迭代器:是迭代器产量&#xff0c;该迭代器的值不能被修改&#xff0c;且需要初始化&#xff0c;初始化之后不能指向其他元素。const_iterator:当我们对const_iterator类型解引用时&#xff0c;返回一个const值&#xff0c;所以只能读&#xff0c;不能写。它是一种迭代器…

临时禁止令:诺西购摩托罗拉面临流产窘境?

近日&#xff0c;美国伊利诺伊州北区法院就中国华为起诉摩托罗拉公司和诺西一案作出初步裁决&#xff0c;禁止摩托罗拉解决方案公司(Motorola Solutions)向诺西披露华为的机密资料。此判决一出&#xff0c;各方评论纷沓而来。笔者认为&#xff0c;从诺西12以美元并购摩托罗拉部…

mysql replace into 语法_mysql Replace into与Insert update

Replace intoreplace into 跟 insert 功能类似&#xff0c;不同点在于&#xff1a;replace into 首先尝试插入数据到表中&#xff0c;1. 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据&#xff0c;然后插入新的数据。2. 否则&#xff0c;直接插入新数…

微机原理——指令系统——传送类指令(MOV、LEA、LDS、LES、LAHF、SAHF、XCHG、XLAT、PUSH、POP、PUSHF、POPF)

博主联系方式&#xff1a; QQ:1540984562 QQ交流群&#xff1a;892023501 群里会有往届的smarters和电赛选手&#xff0c;群里也会不时分享一些有用的资料&#xff0c;有问题可以在群里多问问。 【没事儿可以到我主页看看】https://blog.csdn.net/qq_42604176 传送类指令1&…

lastindexof方法_Java Vector lastIndexOf()方法与示例

lastindexof方法向量类别的lastIndexOf()方法 (Vector Class lastIndexOf() method) Syntax: 句法&#xff1a; public int lastIndexOf (Object ob);public int lastIndexOf (Object ob, int indices);lastIndexOf() method is available in java.util package. lastIndexOf(…

李开复:微博的价值在哪里

导读&#xff1a;微博可以改变社会现象&#xff0c;可以传播信息&#xff0c;可以帮助你成长&#xff0c;可以发出你的声音。它让我们能够人人成为记者&#xff0c;让每一个转发的人都变成了一个编辑 很多人问微博是抢了谁的生意&#xff0c;开心网还是人人网&#xff1f;其实它…