美文网首页
关于结对编程

关于结对编程

作者: 楚秀才 | 来源:发表于2017-04-16 22:32 被阅读0次

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

    不同的观点

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

    1. 强烈支持
    • 更高质量的代码
    • 更高的“巴士指数”
    • 更高的开发效率
    • 更好的团队氛围
    • 更容易维护的代码
    • 更有助于团队成员发展
    1. 强烈反对
    • 单干得到的代码质量、维护性本身就很高
    • 更低的开发效率
    • 很难适应的团队氛围
    • 能力提升是自己的事情
    1. 辩证观点,适合就结对,不适合就单干

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

    个人观点

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

    • 在和团队最厉害的高手结对时,会发现开发效率的确提升了不少,不管是架构还是细节都更好,整个结对的过程精神高度集中在代码上,甚至会忘记时间的存在,到下班时才感到精疲力尽,甚至会有轻微的头痛感。
    • 而如果是和团队的新手结对,就需要额外花时间去解释为什么这样更好,时不时还要确认下对方是否还在follow状态。
    • 个别的同事,在结对时需要特别注意措辞和引导的方式,在讨论设计的时候注意不要触及对方的自尊心。

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

    原因在哪

    错误的方式

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

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

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

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

    能力差距

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

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

    心智模式

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

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

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

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

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

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

    相关文章

      网友评论

          本文标题:关于结对编程

          本文链接:https://www.haomeiwen.com/subject/xplvattx.html