为什么许多程序员讨厌结对编程?

结对编程是国外非常盛行的一种敏捷开发方式,今天 Google 最顶级的两位程序员 Jeff Dean 和 Sanjay Ghemawat 就是结对编程世界让人颇为津津乐道的人物。不过,有人喜欢有人讨厌,本文作者 Tylor Borgeson 作为结对编程的实践者,为我们具体分析了它的好与坏,以及可以如何执行结对编程来更好地适合团队现状。

作者 | Tylor Borgeson,已获作者翻译授权
译者 | 罗昭成
原文 | What they don’t say about Pair Programming
本文首发于 CSDN 微信(ID:CSDNnews)

1. 写在前面

这是我「主流软件开发实践」系列文章中的第五部分,在本系列文章中,我计划包含软件工程师通过提升开发流程和实践来改善软件开发的一系列方法。我曾在 ThoughtWorks 担任软件顾问,现在我在德国一家大型的零售公司工作,这些方法都是我在我的职业生涯中学习并实践验证过的。

结对编程,有些人喜欢,有些人讨厌,有些人从未尝试过,还有一些人每天都在使用。

那群喜欢结对编程的人认为,结对编程有利于团队的知识共享,打破成员间的知识孤岛。另一方面,结对编程(PP)可以促进团队之前的协作,也能够加快新成员的融入,更加快速的创建价值。还有结对编程与 CI/CD 以及主干开发能够很好的融合在一起。

可是在另外一群不喜欢结对编程的人眼中,却有另一番观点,他们认为,结对编程会降低效率,尤其是两个开发人员经验差距较大的时候。他们还认为,这种工作方式会让开发者无法集中注意力。每一个人的工作方式都不同,在同一台电脑上工作,具有非常大的挑战。

我曾经分别与这些人讨论过,但是我发现,那些结对编程中的重要事项却没有受到多大的关注。

2. 双刃剑

结对编程是一把双刃剑,有优势也有劣势。

结对编程并不能解决所有的问题,但是对比其它方法,它是降低工作难度的一个行之有效的方法。

按照结对编程的几种正确姿势(领航员-驾驶员模式,乒乓模式),可以使用结对编程的过程变得非常的顺畅。

如果不是领航员-驾驶员模式,对于没有键盘和鼠标的人来说,很有可能变成这一对中的真正的“乘客”。

在团队中,与其他成员配对完成有挑战的任务时,可以扩大整个团队的知识共享,增强整个团队的协作能力。

如果团队中每一个配对的人,都需要花费相同的时间去工作,这些会给整个团队带来压力,导致不兼容的配对。

在结对编程中,要经常休息,推荐使用番茄钟(在指定的时间专注工作后休息一会儿)等技术,即能好好休息,又能高效编程。

允许其他同事打扰,使用两个成员都脱离“工作”。

对每一个任务都进行结对编程有可能会给团队带来压力。

如果仅对“复杂”的任务使用结对编程,这样会使大多数任务看起来“不复杂”。

3. 礼节

我们需要从原来带着耳机一个人工作变成与其他人一起协作,这是一个工作方式的转变,非常困难,这也是结对编程最具有挑战的部分。

从本质上讲,这与你从一个人独自生活到与一个室友一起生活一样。你不得不花时间去学习如何让你的队友工作高效,如何让他觉得和你一起工作很舒服。当然,你的队友也会做同样的事情。在这种情况下,对于任何事情,都有可能需要你们做出让步,需要你们妥协。

当你与室友生活在一起时,有一些事情需要你做到,如按时交房租,打扫卫生等。在结对编程中,也是一样,有一些规则需要大家去遵守:

  • 结对编程中的成员需要行动一致。不论做什么事情,都要保证你的队友能够完全理解;

  • 对于鼠标和键盘的控制,你和你队友的时间要进行均分,各控制一半的时间;

  • 耐心,强大的耐心;

  • 有同理心,并相信队友。相信他能以他的能力和经验处理好问题;

  • 拥抱伙伴的想法;

  • 渴望知识与快乐。

4. 结对编程很难

一个人工作的时候,一天工作结束,拿下耳机,与结对编程结果完全不一样。参与一天结对编程,有时候,真的很累。但是这一部分内容却有很少的人讨论到。

结对编程有很多挑战,需要我们付出很多努力,他和其它技能一样。这不是一件自然而然的事情,需要我们进行不断的练习。

结对编程会让人觉得是在工作时有人盯着。

结对编程可能会重新点燃程序员的“冒名顶替综合症”,很多他们能做到的事情他们却觉得自己做不到。

当遇到问题时,你要把你的思路转化成别人能理解的文字,这是一个非常艰巨的任务,就像考试一样。

对于开发人员来说,对于 IDE 的快捷键都可能有不同的设置,不仅这些,还有很多工具也存在差异。这些差异都会使开发人员,在开发过程中感到非常的不舒服。

讽刺的是,要让程序员在结对编程感到更加的舒服,我们需要在工作结束,或者在番茄钟间歇的时候,多多交流,相互反馈。但程序员大多数沉默少言,并且很内向,他们之间的反馈和交流非常的不容易。

简而言之,整个事情都不容易。

5. 总结

结对编程优势不可能被否认,是有据可查的。但结对编程存在的问题却很少被提到,但这些也非常重要。

郑重声明,我是一个结对编程的践行者。对于我来说,和很多人一样,我们都会对挑战所带来的收益进行评估,判断是否值得自己去付出努力。但是我也相信,和其它的挑战一样,当你准备好,知道你自己应该做什么的时候,事情就会变得很容易。

我们经常谈论各种各样的挑战,我们可以使用我们的智慧来找到解决办法。我们可以从中获得好处并减少问题带来的挑战。举个例子,我们并不需要对每一个任务都进行结对编程,我们可以间歇性的执行结对编程,更好地适合你团队的现状。

最后,分享一些结对编程的优秀资源:

https://martinfowler.com/articles/on-pair-programming.html

https://www.agilealliance.org/glossary/pairing/

https://stackify.com/pair-programming-advantages/

6. 系列阅读

1. 为什么持续集成和部署在开发中非常重要?

2. 被高估了的测试驱动开发?

3. 为什么程序员如此“嫌弃”主干开发模式?

4. 程序员为什么千万不要瞎努力?

5. 为什么许多程序员讨厌结对编程?

6. 程序员如何用代码彻底终结系统那些事儿?

你可能感兴趣的:(程序员指北,翻译)