1+1 >, =, <2 ?
记软件工程之结对编程pair-programming
顾名思义,结对编程技术是一个非常简单和直观的概念:两位程序员肩并肩地坐在同一台电脑前合作完成同一个设计。一个很有意思的问题是,这种编程方法能够带来必然的好处吗?两位程序员的时间、精力和能力各为1,那结对编程能使产出大于2吗?抑或是,很不幸的会小于等于2?
首先,结对编程能带来哪些可能的好处?
更好的想法——持续不断的头脑风暴和思维碰撞、更大的知识库、有更多的脑力解决设计问题;
更好的质量——更少的漏洞、想法的即时认证、始终如一的方法;
更全面的认识——经验共享与知识共享、对于为什么做、怎么做和做什么有更深入的理解;
更高的生产率——更好地集中精力及更高的工作强度、彼此促进并激励来达到最好的结果、更少的拖延和时间浪费,结对的时候哪里好意思去登录人人和围脖!
任何事物都有利弊,那结对编程的弊端是什么呢?
双倍的人力消耗——这意味着如果编程效率不能达到2*max(参与者1效率,参与者2效率),则单纯从产出上来看是亏本的;
花费时间在处理人-人关系而非处理代码问题上——同样是巨大的成本;
那么,怎样才能在最大化结对编程的效益而减小损失呢?
合适的pair组成——不是任何两个人都适合结对编程。最基本的要求有:双方至少在工作上合得来,不至于吵架;若双方只是初识的伙伴关系,最好技能差距不能太大,免得一方被轻视,而另一方不能忍;
合适的选题——不是所有的programming问题都适合用结对编程来解决。这样的问题必须有一定的难度,标准可能是要让两位参与者中间更强者也觉得有一定挑战性,否则让他一人敲完就OK了,还要pair干嘛;另外,这样的问题也最好能有一定模块性,方便轮换;
参与双方共同的认可——这是最基本的,双方首先要认可这个task,也要认可对方的能力和参与热情,否则猜疑不满必然容易滋生。
以下从我们这次的实际经历出发谈谈。
从组合来看,我(张宁)和陶宇在0811就是同学,来到MSRA之后也是室友,相处融洽没有问题,从技能上看,虽然我和搭档还是有一定差距,但还是不至于无能到无法容忍。
从选题来看,我们的工作是给academic map的数据库中organizations的地理位置信息进行更新和矫正,这个问题难度适中,也能有比较好的模块性,不算很不适合结对。我们将问题分成了3个模块,第一个模块是利用google,yahoo,bing,(wikipedea)的api查询,通过这四种途径获得近20000个组织的位置信息,预计花费两天,但因为google api对单个ip每日查询数量的限制,最终花了3天时间;第二个模块中通过excel计算orginal coordinate, google coordinate, yahoo coordinate, bing coordinate共4项两两组合12种坐标值的球面距离,并按照某种优先级考虑得到了最终的坐标信息,预计花一天,其实半天就OK了;第三个模块中,我们抽取了100个机构的位置人工检查所得坐标的准确性,这个部分就是体力活,静下心来也就是两小时的事情。第一个模块里,陶宇首先利用Python完成了google api的使用,并解决了一系列的编码等问题,然后我模仿和学习他完成了bing的部分;第二个模块由我处理而第三个模块我们各负责了50个机构的人工检查。
除了较好的完成了编程的工作并获得了不错的数据结果,此次结对编程主要的益处还在于让我学习到了高手的编程技巧和操作习惯,看到了提升和学习的空间也刺激了学习的动力,包括python脚本语言的强大,命令行式交互式运行程序的方便等等。有贴身学习大牛的机会,总是一件最最幸运的事请。
BY 张宁