607
社区成员
有这样的疑问主要源于以下几个方面:
如果我们做的项目是真实的,有具体而多变的需求,有工期、质量和资源的矛盾,团队成员各自的水平、目标也不一致,那么团队内部不可能没有矛盾。
每个人有不同的习惯、解决问题的方式,所以两人在许多细节的问题可能有不同的意见,这种时候产生的矛盾如何解决?如果都是听从水平较高的程序员,那与该程序员一个人完成有何区别?而且这个阶段耗费的时间是否都是有意义的时间?
一切交流只能通过Scrum大师来完成。这一措施较好地平衡了“交流”与“集中注意力”的矛盾。
那是否说明在编程的时候专注于编程、交流的时候专注于交流才能取得更好的成果?结对开发中是否存在“交流”与“集中注意力”的矛盾?
结对编程中,因为有随时的复审和交流,程序各方面的质量取决于一对程序员中各方面水平较高的一个。
如果说结对开发对于水平较差的人来说能提高自己的水平,那对于那个水平较高的人有什么意义?
每个人每天的高效率工作时段不超过3-4个小时。
一对程序员完成预定任务之后,就可以休息,或者开展其他较轻松的工作,而不应该死板地按照工作日八小时的规定而继续编程。
结对编程加剧了压力,长时间紧张工作,导致工作时段降低,再加上两人同时完成一个任务,是否耗费了更多的时间?
对于这个问题,笔者在结对编程的过程中就遇到了。由于两人时间上的安排以及开发的子问题的特性,笔者和队友采取了结对编程结合独立开发的方式。笔者在结对编程的总结时对于分工以及轮转效率问题就给出了自己的看法。
结对编程和分工开发就好比单线程与多线程。当任务的工作量较大,并且各模块的开发任务能分解为并行度较高的子任务的时候,很明显进行分工“多线程”开发的效率会高一些。再基于上一条,在面对工作量较大的任务,结对编程很有可能会在推进开发进度上出现困难。在笔者结对编程的前期,两人编程的效率是比较可观的,很快就完成了基本功能。但随之而来的测试、优化、回归测试、GUI绘制等等任务使得本来时间就不太富裕的结对编程出现的进度推进上的困难。最终笔者两人将部分任务的任务进行了分工开发,缓解结对任务的压力。
结对编程是一种多人开发的方法。然而并不是所有的情况下都适合结对编程,需要结合实际情况来进行取舍。在选择开发方式、决定分工时需要对于产生的开销进行预估。当预期的效率不尽人意时可以考虑融入其他的开发方式,或者直接改变开发的策略。
经过自己的实际操作,结对编程是可以提高效率的。在团队项目中,我和另一个队友写后端,由于我们两个人刚开始接触ruby这门语言,在实际操作中非常不熟练,我们采取了结对编程的方式,两个人的思维能力都提高了很多,能及时发现对方的错误,或者在某个方面提出更好的实现方法。虽然最后写出来的代码被大佬否定了。即使是很少时间量的结对编程,也能从对方身上学习到一些提高编程效率的方法。
在阅读相关论文"Case study: using pair programming in development of a complex module."后,论文提出了结对编程需要满足的条件:
1、结对成员必须在一些编程观念上达成一致
2、结对成员之间必须保持良好的交流,愿意相互合作
3、结对成员技术知识必须具有可比性。如果一个经验丰富的成员和一个没有经验的成员一起工作,他们可以建立良好的指导关系,但他们不同的经验水平不利于有成效的结对编程。
如果说结对开发对于水平较差的人来说能提高自己的水平,那对于那个水平较高的人有什么意义?
对于高水平的人, 他的收益是:
1)培训了水平低的团队成员,帮助水平低的成员减少了很多bug, 不然这些bug 都会耽误很多时间,包括水平高的同学的时间 (深夜打电话来求帮助...)
2)对团队的水平有进一步的了解, 会提出更加有效的系统改进方案。
3)建立了个人的技术威信和影响力
我们在编程的过程中确实遇到了一些意见不同的时候,我们选择了一起讨论,直至一个人说服另一个人的方式,这个讨论的过程也是互相学习的过程,我们可以学习到对方一些好的编程习惯,也能了解到一种不同的思维方式,虽然耗费一些时间,但我并不认为这个时间是无意义的,这些收获都是独自编程无法体会到的。
因为我和我的队友比较熟悉,可以直接清楚地说出自己的意见,而不用过多考虑措辞等其他方面,所以相比于编程,社交方面增大的压力可以忽略不计。
我和队友的编程水平处于持平的状态,所以会听取双方的建议、从中择优,在这个过程中,我们都能有所收获。我认为,即使是水平高与水平低的人一起编程,也总会有一些收获。
如在第一点所述,虽然在讨论的过程中会耗费时间,但我并不认为这个时间的花费是毫无意义的,在这个时间里,我们收获了自己编程难以得到的体会,如不同思维方式间的碰撞等。