为什么结对编程凉了,你体验过吗?

250 阅读5分钟

之前公司推行敏捷开发,因为项目经常延期,有产品经理提出,为了提高代码质量,是不是应该学习下国外的结对编程。

我寻思咱这啥条件啊,又不是地主老财。本来好好的一人份的工作量,需要两个人才能完成,而且开发水平不一。大佬带小白可以,可以让小白进步。同水平的写起来不得天天有意见,可别想着什么结对编程,净整些没用的。

实际上多数项目延期的原因是因为需求不确定,以及试错导致的时间成本。正确的解决方案是,建立良好的需求评审机制,以及定期的code review。在产品设计和技术管理方面同时发力,确保项目的正常交付。

不过后来,我认真研究了结对编程,存在即合理,还是有很多优点的。

什么是结对编程?

结对编程是一种敏捷软件开发的方法,需要两个程序员在一台电脑上工作。一个人写代码,另一个人审查代码。写代码的人称作驾驶员,审查代码的人称作观察员(或导航员)。就像下图这样,两个程序员还需要经常互换角色。

image.png

在结对编程中,观察员要在审查代码的同时,考虑工作的战略性方向,提出改进的意见。即时发现未来可能会出现的问题,以及当前代码中的隐患。

这样使驾驶者可以集中全部注意力完成当前任务,而不同过多的去思考可能出现的问题。观察员当作安全网和指南。结对编程对开发程序有很多好处。比如增加纪律性,可以写出更好的代码。

优点

1.减少代码缺陷

一些研究发现程序员结对工作与单独工作相比,可以写出更短的程序,更好的设计,以及更少的缺陷。研究发现,根据程序员的经验以及任务的复杂度不同,缺陷率可以降低15%到50%。

结对编程比单独编程相比,通常会考虑更多的设计选项,达成更简单,更易维护的设计;程序员们也会更早地捕捉到设计的缺陷。

结对编程与一个程序员承担同一个任务相比工作会完成的更快。结对的程序员经常发现当他们一同工作时表面上“不可能”的问题变得容易,或更加快速,或至少有可能解决。

2.共同进步

在两个程序员工作时,两个程序员之间传递着知识。他们分享关于系统细节的知识,并且互相学习编程技巧。新的员工很快地获得团队的习惯,并学习到系统的细节。团队中的每个程序员轮流与所有其他程序员结对编程,而不是仅与某个程序员编程,使得系统的知识在整个团队中传播,减少了程序员离开团队带来的风险。

3.互相监督,利于管理

结对编程通常会带来纪律和时间管理的提升。程序员在与结对的伙伴一同工作时,不太会忘记编写单元测试,或偷工减料。两个人一起划水摸鱼的情况也比较少,结对的伙伴“让他们保持精力高度集中的工作状态”。

缺点

1.成本高

虽然结对编程通常比一个程序员单独工作更快地完成,但是整体程序编写时间(程序员数目 × 花费的时间)增加了。管理者需要在工作更快的完成以及缩减测试和调试时间和更高的编码成本之间平衡。

2.对于很多项目不适用

对于一些比较复杂的项目,两个大脑去思考,可能会更快的提出解决方案,或者经过头脑风暴后会更迅速的解决问题。但是大多处工作都是比较简单的人力劳动,使用两个大脑去处理,导致生成力的净下降。

3.对于很多人不适用

部分程序员不善于和他人沟通,但是善于自己解决问题。对于这些人来说,结对编程就像是给他们套上了一层枷锁来敲代码,对于社恐太不友好。

网友吐槽

Wallace B. McClure

结对编程只是将开发变成了一种社交活动。它将花在任何一行代码上的钱翻了一番,效率降低了 50% 以上。这是一个净负数。来源

Ridhish Guhan

要使结对编程发挥作用,您需要 2 个人不仅擅长开发,而且愿意看着那些对键盘快捷键/开发技巧效率不高的人进行控制。我知道我不喜欢看到速度较慢的程序员使用神圣的鼠标和键盘。我只会打哈欠。基本上,它需要很大的耐心,使用工具的效率需要时间来学习。因此,即使我教给我的 PPP 一些有用的快捷方式,我也不能指望他/她从那里快速使用它。

有些人喜欢在继续(我)之前把事情弄清楚。很多人就是喜欢把它搞砸。这样的人将无法一起工作。当我做某事时,我不仅想把它做好,我还希望下次能够更快、更努力地做这件事(最好不要再用谷歌搜索)。很多人认为在做一些工作时速度是最重要的。这是两种思想流派,它们本身运作良好,但不能并存。

在某些情况下,两个选项同样好/坏(例如命名约定)。必须达成妥协。一个人必须放弃。如果两个人都在为这样的事情而奋斗,那么结对编程可能是一场噩梦。

两个人应该具有相同的波长,并且应该能够在工作时每隔一段时间进行一次轻松愉快的对话(否则你会觉得你正在和僵尸一起工作)。来源