结对编程搞了两年,我学到了这些!

结对编程是被极限编程运动带上舞台的,而且在当今的生产环境中,它越来越受到欢迎。在两年的结对编程经验中,我发现,有时候结对编程很奇妙,甚至可以说是神奇。有时它却真的非常糟糕。我想要探究藏在背后的真正原因,并且揭示一些模式,也许通过这些模式我们能够层层深入,分析怎样才能把结对编程做得更好。

我的结对编程经验

我相信,了解我有什么样的经验对你来说十分重要,这样你就可以有更好的背景知识评价本文。两年里,我分别就职于两个不同的公司,几乎天天都以结对编程的形式开展工作。一个是咨询公司,在那里我为客户开发应用。另一个是高速发展的创业公司,开发大型 SaaS 产品。整个这段时间,我和超过 20 个开发者结对工作,他们有不同的背景、个性、技能、经验和文化背景。

旁注:在进行结对编程时,你会发现有很多好处。对我来说,就是遇到非常多了不起的人,并且和他们成为朋友。

结对编程是否物有所值

写这个主题时,我在草稿纸上列出一连串相关的内容,但是后来我都删了,这是因为我不想把本文的中心写散。有太多的研究论文、观点、统计资料说这说那。我认为这个问题和大背景没多大关系。有太多的可变因素在里面。

在以下的文章中,你将会看到我认为好的和糟糕的结对编程。所以,我对这个问题的回答在我们这个行业中可以说是最受欢迎的——“视情况而定了。”  :)

当你专注于这个主题时,我会阐述在我观察下结对编程对工作的帮助,可能也会对程序员有所帮助。(这部分可能会写在今后的文章中。)

高效结对的特点

当我回想起我那些好的坏的结对经历时,许多问题闯入我脑海。我不会反复讲述这些故事,但是我会将其归入这样一个精美的、MBA 式,咨询样式的 2×2 矩阵中。

结对编程成功矩阵

定义

工作能力的差异

据我观察,结对双方相关性最强、区别性最大的因素是他们两人的效率差距。很多东西会影响程序员的效率,包括他们先前的经验、领域知识、语言知识等。如果我们把这些综合起来,我们就能得出“效率”。考量“效率”可能还有另外一种方式,看他们产出的潜在强度,包括完成的速度与质量。为了在这里讨论方便,我将高效和低效程序员分别对应为“高级程序员”和“低级程序员”。

获益

当开始结对时,理想情况是公司(及个人)将会比两个人独立工作获益更多。

效率相近的两人结对

在我的经验中,效率相近的两人结对通常会比差距较大的效果更好。原因可能是由于开发人员有更多共同点,这等于即时“无代价”的情感沟通,有助于他们增进交流。这点在矩阵中的位置是十分清晰的。本质上,强强联合能够产生更好的化学反应。他们了解并尊重彼此,能够经常交换意见,互相帮助学习。其结果往往是令人满意而且相互受益的互动。当然也会有很多乐趣。

如果我们进一步深入研究,可以发现低级程序员和高级程序员结对时还有不同的特征。

低级程序员结对

据我观察,低级程序员结对与高级程序员结对相比收获更多。这是为什么呢?可能因为低级开发者并不一味坚持主见,他没有强大的自尊心影响,与“正确性”相比,他们更加关心学习。

我也认为存在“新生入学”效应影响。想像你还是个孩子,在学期中全家搬入一个新的城市。如果恰好班上另一个孩子和你一样,也是刚刚加入这个班级,那么你们很可能变成好朋友,因为你们两个处于相同的情况。结对编程同样。如果你们两个都是刚刚接触应用/技术/语言/无论其他什么,你们将会立即产生共鸣。你们想要探索相似的事情,会为解决相同类型的问题而激动不已,通常也会更好地合作。

当两个低级程序员结对,他们的主要目标应该是学习。

高级程序员结对

当两个开发者都是高级程序员,往往有相同的原因导致他们很难良好配对。每个程序员都是不同的,都有不同的主见。经验更多,会有更强的个人主见。而且,当你知道得越多,越有可能自尊心膨胀。当一个人有很强的自尊心时,搭档可能会屈从于一个拙劣的决定,原因可能是没有安全感,或者是因为他“小心行事”,确保他们不会伤害到搭档的自尊心。

更糟糕的是,结对双方都有很强的自尊心。在这种情况下,他们争论(不是辩论)许多问题,整个氛围由于敌意变得紧张。我所见过更糟的情况是,当领航员离开工作站躲避一会。搭档在这时没有给予任何沟通,很显然这时处于负收益阶段。

优秀的高级程序员结对会彼此尊重对方。他们会谈论许多。他们辩论、讨论、做计划。他们以专业的水准在工作,而不是仰仗个人。这才是美妙的事情。这时公司能够从高产出中获得极大的收益。

当两个高级程序员结对,主要的目的就是生产。

当低级程序员遇到高级程序员

把低级程序员和高级程序员融合在一起需要的方法不同。这种配对安排多见于新开发人员加入一家公司或者转入新的开发环境中。对于新人,“低级程序员”可能会分配给一个期望他能够飞速进步的“高级程序员”。如果高级程序员不是合适的人选,或者有错误的预期,事情反而会变糟,会打击低级程序员的士气。

预期

领导层必须了解,这种能提升低级程序员的安排要尽可能的快。但是,每个与他有利害关系的同伴也必须明白这个道理,无论他的同伴是开发者、设计师、质检员等,特别是对于高级程序员。同伴不应该施加任何压力,因为一旦他们表现出来,将会破坏相互间的动态平衡。由于高级程序员工作会被拖慢,或者遥遥领先于低级程序员,双方都对陷入挫折感。

当进行教学时,产出会降低。

教学

一旦高级程序员明白他们的角色是导师,而不是独立承担所有事情,在这之后,结对双方才开始进行最有成效地工作。但是还有更多的事情需要考虑。

好的导师聆听、回答问题,观察和提出引领性的问题。

作为普通人,这(导师)真的是很难做到,我们往往倾向于成为相反的一方。所以,以下几点必须牢记:

不要告诉他们键入什么,也不要告诉他们去做什么,更不要直接将事情自己接管下来然后做给他们看。你先要把自己停下来。亲眼看着他们自己犯错,让他们体会错误带来的结果,思考结果为什么会如此糟糕,然后自己更正错误。在整个过程中他们可以问你问题,你要尝试回答。如果他们被这个问题困住了,那你要引领他们解答这个问题。

我记得当我与一个实习生结对时,我真的是在很大压力下完成工作。我故意给我的伙伴施加压力然后不停地道歉,虽然这样做可能不会让他感觉好点。回头看来,我应该改变这种结对安排或者寻找一种方法来减压。

作为一名好的导师,应该充满耐心、自信和同理心。我们想培养低级程序员,又不想把你知道的展示给他们。据我所见,好的编程导师在业界是十分紧缺的。每个人都忙着完成任务,或者他们只是没有好的沟通技巧把这件事做好。一些问题可能能够帮助确定一个人是否是一个好导师:

他们是否经常分享知识帮助低级程序员?他们是否固守他们的技术或者观点?他们是否愿意为团队的利益做出自我牺牲?

当高级程序员和低级程序员结对时,他们的主要目的是教学与学习。

领导层的作用

文化

在任何情况下,当两个人达成共识,事情就会向好的方向发展。结对编程也不无例外。相互理解源自与同理心、沟通和自信。公司和技术领导者能够树立榜样,使良好的氛围传播给其他成员。文化就来自于最顶端。它不是由人们的言论决定的,而是由人们一言一行决定的。

期望

正如上文我的亲身体会,每一个结对情景都是不同的。只有意识到他们的不同,了解什么对他们最有益,与每个需要了解的人沟通,才能使对期望清晰明确,才能随着结对情况变化时刻改变期望值。

总结

对我来说,结对编程是一个特别的主题,加强了我对编程的看法——和技术相比,人的因素同样重要。我们是人,为人编写软件,和其他人一起工作。技术很显然是必须的,但是在成为一个卓越的程序员的同时,我们也可以成为一个优秀的人。

结对编程愉快!

1 2 收藏 1 评论

关于作者:myillusion3852

主要兴趣领域为图像处理,模式识别和机器学习方向,希望多与大家交流。 个人主页 · 我的文章 · 11

相关文章

可能感兴趣的话题



直接登录
最新评论
跳到底部
返回顶部