上班摸鱼不如结队编程

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

摸鱼

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

结对编程

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

经历

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

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

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

然后同事写的代码:

1
2**32

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
* @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;
};

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* @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.性格不合不适合结对编程

总结

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


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