关于结对编程

2017-04-16  本文已影响0人  楚秀才

如果在百度上搜索结对编程的话,偶尔会搜到一些奇怪的内容,比如“和妹子结对编程是什么样的体验”、基情四射的好基友结对编程图,对于那些喜欢黑程序员,说程序员不懂幽默,不懂生活的群体来说,绝对是一个强有力的反证!

不同的观点

不过这里还是想稍微严肃一点,所以先把这些搞怪的信息排除掉,剩下的观点差不多有这么3类:

  1. 强烈支持
  1. 强烈反对
  1. 辩证观点,适合就结对,不适合就单干

一般来说我们对事物的看法都会存在支持、反对和中庸3种态度,支持和反对多半是出现在不同的维度上,但对结对来说支持和反对两种态度在相同的维度呈现出完全的对立,这就值得我们好好思考一下原因在哪。

个人观点

我个人经常使用结对编程实践,在和团队的不同同事进行结对时获得的体验是完全不同的。

不过整体来说,结对对于新人的培养、知识备份、代码质量方面都会有加分,在团队氛围方面来看,结对开发相当于是代码走查的极限形式,如果团队的代码走查的氛围 OK,那么在实践结对开发时可能最初的几次会有一些不适,但马上就能适应的很好,反过来如果多次尝试结对编程都有强烈的不适感,就需要反过来回顾下团队成员之间的关系和沟通方式,以及代码走查是否的确有效的开展。

原因在哪

错误的方式

  1. 不理解什么叫做结对
    结对的要领在于一个人领航,一个人实施,两个人在同一时间做同一件事情,在最初实践结对时,常常因为搞不清楚领航者和实施者之间该怎么配合和交流,就演变成了一个人写测试用例,一个人写业务代码,或者一个人写类A,一个人写类B,这种方式显然不能叫做结对。

  2. 不在一个频道上
    正确的结对方式下,两个人的思想是时刻保持高度同步,如果你发现你的队友有点follow不上了,一定要先缓一缓确认下出现了什么问题,先同步上再继续;如果在结对时出现了严重的意见不合,互相不能说服对方的,可以找其他同事一起讨论达成一致后再继续,实在不能达成一致的可以终止结对。

  3. 缺乏交流的技巧
    我有时会怀疑这会不会是很多人选择程序员这个行业的理由,但其实软件开发是一个非常重视交流技巧的职业,比如敏捷宣言中就强调“个体与交互”。如果在结对时浪费太多时间在猜测对方在说什么上面,那结对的效率和效果将会大打折扣。

  4. 过度关注细节
    有时候是因为缺乏代码公约,对细节缺少统一的标准,有时候则是因为结对的一方为了掩盖自己缺乏对代码的把控,过度的关注细节,导致另一方难以忍受,虽然变量命名很重要,但完全可以先放一放把用例先跑通,然后回过头来重构。

能力差距

前面提到过,结对时如果双方的能力差距比较大,则能力较强的一方会觉得效率被明显拉低,而较弱的一方会比较挫败,甚至伤及自尊,最终导致双方对于结对的效果都会给负分。所以结对最好是在能力相当或者差不太多的两人间进行,这样才能保证结对过程中保持有效的互补和高度的专注,最终不仅仅是开发效率提升了,结对双方的能力也能因此而得到提升。

反过来说,通过频繁的、正确的结对,团队成员之间的能力差异一定程度上会减小,当较弱的一方能力得到提升后,他的信心会增强,反而他的自尊心反而就没有那么容易受到伤害,对于较强的一方来说,在结对时也能获得一些差异性的观点,而且团队整体能力的提升长远来看也会减下自己的开发负担。

心智模式

心智模式是借用自《第五项修炼》中的概念,事情在变好之前可能会先变糟,或者说引入变化和得到结果之间存在延时,或者简单点说就是学习曲线。

人类在演进的过程中对外部世界的抽象一直保持着简单线性的模型,因和果之间的距离很短,比如说:

刚才打dota的时候我选择了最新的英雄和战术,我输了,所以下次我还是选择我最擅长的英雄和战术吧。

对于大多数场景这个认知模型已经够用了,所以进化论并没有将这样的人给淘汰掉,然而在现代社会中,特别对于软件开发这种高度复杂和抽象的工作,我们需要重新调整下我们的认知,才能应对这个复杂的世界,比如说:

刚才打dota的时候我尝试了最新的英雄和战术,虽然我输了,但是我想如果能操作更好一些,赢面比选择最擅长的英雄和战术要更大,所以下次我还会选择新的英雄和战术。

我们在尝试结对开发时,往往尝试一两次没有取得明显的效果就立刻放弃了,就是因为我们没有意识到学习的曲线本身就是起起落落,在爬到更高的山顶之前我们需要先走一段下坡路,并不是像爬楼梯一样是一直向上的。

上一篇 下一篇

猜你喜欢

热点阅读