当开始接触到结对编程这个名词的时候,我很疑惑这是一个什么样的编程形式。当逐步深入读了邹欣老师《构建之法》第二版75页4.5节之后,我不禁想起了一个这样的画面。在准备考研复试阶段,我请了一位编程能力比我强人来指导我学习编程。当时做的是ACM水题,基础的原因,只能从水体开始练习。开始时我坐在电脑前,他坐在我旁边,他看着我进行编程。当遇到一个语法上的错误时,他记得清的就改正我,记不清的就叫我翻书,找到后又回来改代码。遇到算法上的问题的时候,他在纸上给我画一些草图帮我屡屡思路。我还记得那是一道大数相加题,印象最深的是我不知道怎么把一个整型换成字符串,他说在后面加""就可以,于是问题解决了。
我想那个时候就已经开始接触到结对编程。到现在他是我的室友,对于作业上的功能我不能总是麻烦他来帮我解决,我只能先自己动手找些资料过来先学习,等到要编程的时候我就叫他过来帮我看看。在结对编程中我体会到自己的思路会有很多局限,这个时候听指挥的才是正确的。往往一边动手一遍动脑会很难把逻辑捋顺,两个人一起编程时,一个做驾驶员,一个做领航员;一个负责编程,一个负责指挥。
驾驶员想的是如何操作。敲代码是一个类似于游泳、骑自行车的工作,只有通过亲身的感受和实践才能一点点地学习其中的知识。还记得杨老师在开学初说的一段话,意思是不亲自去骑一下自行车就怎么也学不会。我通过自己的实践,渐渐的领悟着这个过程。敲带码一定要亲力亲为。想起当初学游泳的时候也是同样的道理。那时候个子很小,下到水池最浅的地方脚还够不到底,我就把这岸沿乱蹬腿。等后来长大些,两只脚能够到水池底了,胆子就稍大了点,于是撒开岸沿试着在水里走了起来。等到再大点,家里给我报了个游泳班,游泳班的第一节课就是让每个学员在跳水的台子上跳下去。要知道这个我以前从没敢试过,最后还是被迫跳了下去。从那以后我就学会了换气。慢慢的掌握了水性,后来一点点的学会了蛙泳、自由泳、仰泳。通过在水中的不断实践我能够熟悉每个动作以及感受到每个动作在水中的阻力,我因此可以不断的调整自己的姿势以达到更好。编程的过程中也是这样。通过自己的操作,我能够感受到机器是不是认可我的做法,更明显感觉到这点的是有时候我虽然不知道这个语法对不对,但是机器返回给我的是正确的,并且能够返回给我想要的值。我回过头来进行总结,这样的学习使我觉得很灵活。
领航员想的是如何指挥。代码的确是通过手来敲出来的,但是没有支配其行动的大脑,手也只能是乱忙。我感受到指挥是纵观全局,从清楚输入什么最后得到什么,到每个语句执行通畅和简洁。这其中每个环节都离不开一个指挥者的控制。打个比方,一次篮球赛结束后,指挥者叫同学们把桌子抬回去,要是指挥者没有清楚的告诉谁把哪张桌子抬回哪个教室。要是学生素质很好自然有人来抬,不然可能只剩下指挥者自己抬回去了。所以指挥者清楚地洞察全局,把每个细节的信息传递给执行者,这个是一个有技术而且很值得推敲的工作。要想达到有效地传递信息也并不是一件容易的事。我在指挥的时候懒得动手去指屏幕,就告诉室友你那里少了一个等号。要是软件给标识出来了室友找一下还能找到,可是大多数情况下室友都是拿鼠标找完后问我在哪呢。让执行者明白指挥者的想法,这仍需要勤加练习。
在结对编程过程,两个人都有各自的承担,要想把任务完成,两个人都必须各司其职。在此过程中两个的动手能力和思维能力都能够得到提升。