长时间摸鱼不如结对编程

4,998 阅读4分钟

记一次公司结对编程的经历

摸鱼

这应该是一个普遍现象了。公司可能某一段事件内没有任务,或者任务权重低,于是乎神经不紧绷,手头空闲,开启了群聊,开始了一天的摸鱼时光。欢乐的时光就要开始了,扯房子,扯车子,扯日子,扯薪资,装萌新,就是不来提升自己。不是不想提升,控制力敌不过懒惰,摸鱼更具有吸引力。

结对编程

有一个很有趣的现象。很多人喜欢打游戏,但是不会很愿意一个人单独打。这也可能是更愿意摸鱼的原因吧。一个人编码学习总是枯燥无味。于是有了一个敏捷开发模式-结对编程。两个程序员在一个计算机上共同工作。一个人输入代码,而另一个人审查他输入的每一行代码。输入代码的人称作驾驶员,审查代码的人称作观察员(或导航员)。两个程序员经常互换角色。

经历

我最近就和其他同事结对编程了。最开始是我做导航员,他做驾驶员。

1.需要知道2的32次方是多少?我第一想到的就是

const m = (a,n)=> n==0?1:a*m(a,n-1);// 前提为n为正数
m(2,32);

然后同事写的代码:

2**32

我:???原来还能这样?我怀疑我是一个假的三年前端。

2.看到同事总是使用a.indexOf(b)>-1来判断a字符串中是否包含b字符。这里我就分享了我喜欢的一个用法:

var a = 'abc';
console.log(~a.indexOf(b))

用位运算符~ 。当b不存在于a字符串中,那么indexOf方法会返回-1,~ -1等于0,js中0则为false。这种换位取反的方式可以是代码看上去更加简洁,B格更高。当然还有扩展,~~可以用来取整数,类似Math.floor()。

3.看同事刷力扣,有一个题目很有意思.leetcode-cn.com/problems/zi… 此时我和同事的思维就分散开了。我们都没有看其他解析思维哦。 我想着就是找寻其中规律,通过Index的方式来获取字符串并拼接。通过画图比对,我找到了其中规律。每一个长的竖排与前面竖排相差值都会为(numRows - 1) * 2,于是代码就出来了

/**
 * @param {string} s
 * @param {number} numRows
 * @return {string}
 */
var convert = function(s, numRows) {
    if(numRows==1){
    return s
  }
  var dvalue = (numRows - 1) * 2;// 找到竖排差值
  var str = '';
  for (var i = 0; i < numRows; i++) {
    var df = true; //如果index超出s长度则跳出轮询
    var dd = true; // 折线规律体现情况参数
    var num = i
    while (df) {                                                       
      if (s[num]) {
        str += s[num]
      } else {
        df = false;
      }
      if (i == 0 || i == numRows - 1) {
        num = num + dvalue;
      } else {
        num = dd ? num + dvalue - i * 2 : num + i * 2;
        dd = !dd
      }
    }
  }
  return str;
};

正当我洋洋得意看同事做好没,发现他的思路和我完全不同。他是先创建相应行数的数组,然后将字符串依次分解填充到对应数组中再返回数据的。代码如下

/**
 * @param {string} s
 * @param {number} numRows
 * @return {string}
 */
var convert = function(s, numRows) {
    if(numRows==1){
        return s
    }
    var ar = [];
   for(var i =0;i<numRows;i++){
       ar.push([])
   }
    var plus = true; //字符串填充数据方向
    var nm = 0;
    for(var i =0;i<s.length;i++){
        ar[nm].push(s[i]);
        if(nm==numRows-1 || nm ==0 ){
            plus = !plus
        }
        if(plus){
             nm++;
        }else{
             nm--;
        } 
    }
    return ar.reduce((a,b)=>a+b.join(''),'')
};

代码简洁思路清晰。但是落后于我的时间,可以发现领航员可以通过画图等方式思考问题,比驾驶员敲代码思考的时间更长,能更早的想到和编写方法代码。

我做驾驶员期间有时候,首先自己很少用某些api,加上有人看代码质量,多少有点紧张,多次翻阅百度查找api的结构用法。同时对这个api的记忆更加深刻了。

优劣势

1.结对编程可以发现自己和别人的思维方式的区别。思维模式上对自己的一个补充。
2.结对编程可以让自己更加熟记少见的api。
3.结对编程是一个很好的学习机会。
4.结对编程能更少的出现烂代码。
5.结对编程最好只在空闲时间做,非空闲时间就是对人力的浪费。
6.性格不合不适合结对编程

总结

空闲时间总是会有的,偶尔摸摸鱼也是挺好的。但是对于长时间摸鱼不愿意学习,我更加愿意结对编程。

原文链接:tech.gtxlab.com/together.ht…

*作者简介: 张栓,人和未来大数据前端工程师,专注于html/css/js的学习与开发。