当被问及提高代码质量的***方法时,我一般回答是:代码审查。代码审查是***的减少 bug 的方法。但我更喜欢的是 —— 结对编程。
我这一生中,很少进行结对编程,当然非正式的除外(例如和别人一起解决bug)。在 Typemock 工作的时候,我大部分时间都在改 bug,没有特定的做法,也没有人指导应该怎么合作,仅仅是随意地和不同的人解决不同的问题。
最近我又接触到了结对编程,我现在的感觉和以前完全不同。我更加注重这个过程,而以前的我仅仅对结果感兴趣。
以下是我最近总结的一些要点。大部是作为专家的拍档的角度来说,有些也从主导人的角度。
氛围. 开始一段工作的时候,你大概可以估摸到事情会怎样发展。你有多投入,你的拍档有多投入,你们对问题和代码有多熟悉,这些都很重要。你们***能做到多好,决定于你们的开始。
耐性. 这是说给急性子听的。我不知道以前自己是不是有耐心,但是现在我真的需要下大功夫去培养一下耐心。当我是主导人的时候,我常常需要不厌其烦地对拍档作出巨细无遗的解释。
静心聆听,不要一味反驳. 当我不是主导人的时候,我会一次又一次地要求主导人解释他的方案是怎样解决问题的。当然,我需要安静地听他讲解,才能听明白。但是,要我一声不吭的,太难了。
不当沉默的羔羊. 当我不是主导人的时候,我常常在心里衡量,要不要提出我的疑问。说出来的话,怕他会笑我笨。沉默的话,的确不会引来嘲笑。但是我还是常常逼着自己提问,一般这样开头:“可能是我太笨,但是我不太明白……”。结果,有时候我们会就这个问题讨论下去,有时候拍档则会像看傻瓜一样看着我。
态度很重要. 我自己的态度固然重要,但是拍档的态度也很大程度上影响了结果。例如,当我不是主导人的时候,对方有些言语和举动使我感觉到自己好像拖慢了进度。我经常告诉自己不要那样想。当我是主导人的时候,我尽量控制自己的言行举止,以免拍档误会。当主导人与不,都难啊。
拍档也是很重要的. 无论是菜鸟还是高手,都没有***的拍档,只有最适合的拍档。有时候,你不能选择和谁合作,但你的拍档总有值得你学习的地方。
学会协商. 即使是这个层面的合作,也脱离不了付出和收获的关系。你需要根据进度决定什么时候讨论相应的话题,从命名到测试点。你的拍档可能同意,或者不同意,又或者与你击掌欢呼。失败总是存在的,做好心理准备吧。
缺少争论. 当带领一个新手的时候,我说出来的话好像都是对的,像是无可厚非的事实。这实际上是非常危险的。我们应该鼓励人们发问,对我们的观点提出疑问和建议。可是,很多时候即使我的假设是错的,我还是很难放弃我观点。
结对编程不仅仅是一种开发的手段,它更是一种技巧,需要不断地改进,并应用到实践中去。即使多花点时间也是值得的,就像单元测试一样。当然,结对编程也需要有一些准则:即使尴尬也要提问;当你确信自己的观点是对的时候要大胆地提出来;为了大局,有时候需要妥协一下。