我负责的一个软件项目,客户说项目的功能里面有两个问题,但是负责写这个项目的程序员有事不在公司,所以我就把他写的代码拉过来看看,结果,我以为十几分钟就能解决的问题,我搞了几个小时!而且每解决一个问题都要刷新我的三观,要知道,写这个项目的程序员号称已经有七年编程经验了,想不到马大哈到如此地步!这个人下称小G!

打开网易新闻 查看精彩图片

第一个问题是系统中有一个使用集合存放的实体,虽然是个集合,但是小G负责的功能只需要取集合第一个实体。

按道理说,小G只需要通过集合的下标取第一个数据(也就是下标0)的数据,或者使用Linq直接使用First()这个函数来取第一个也行。

但是,小G的做法是先定义一个局部实体变量,然后通过循环的方式来取,哪怕用循环,笨一点的方法也是在循环第一遍以后,直接break出去就可以了,但是,小G的做法是每循环一次都要给哪个局部实体变量赋值一次。

懂得人都应该看出来了,这个局部的实体变量的值本来应该取第一个,但是因为使用循环,且每次循环都要赋值一遍,最后这个实体变量的值就等于集合的最后一个实体了!

这个问题我找的时间不算长,估计也就十几二十分钟左右吧,因为我自己负责的功能是使用循环遍历的,具体逻辑我这里也不解释了,但是因为我自己负责的功能用到了循环,我看他代码的时候就会有种代入感,感觉上是看不出来问题的。

折腾了十几分钟,我总算从我自己的代码的代入感中跳出来,于是发现了他代码的问题。我感觉他是像把我的代码先粘贴过来,不假思索就稍微改动了一下导致出现了现在的问题!

但是,接下来这个问题着实很棘手,我找了一个多小时都没找到问题出现的原因,但是当我真正找到问题后,我不光觉得自己蠢,还感觉像被什么东西踹了一脚!

简单地讲,在小G负责的功能里面有几个初始化函数,用于初始化系统的一些配置,每个初始化函数都会返回一个Boolean值。

如果按照常理,既然所有函数返回的都是Boolean值,那么只需要定义一个Boolean变量来分别接收这几个函数的返回值即可。

我当然也是这么想的,于是又陷入了这种代入感中。

找了一个多小时问题,我突然发现,小G在接收初始化函数A时,使用了变量“result”,在接收初始化函数B时,使用了变量“results”,但是,小G在判断初始化函数B的返回值是否为true时,判断的却是“result"!

乍一看,是不是觉得我说的这段有点莫名其妙?仔细看您就明白了!

以上两个折腾了我几个小时的问题,为了演示,我自己写了一个Demo,不懂得可以根据Demo来理解!

打开网易新闻 查看精彩图片

有人可能会说:”你不会调试吗?“

这里还真不能调试,因为我们公司的软件是需要对接硬件的,但有的硬件公司里面没有,所以我们在编写一些简单的硬件对接逻辑的时候,往往会一边写,一边把软件发给在客户现场的同事去测试,所以,基本上就等于“盲写”!因此,虽然这两个问题看似非常容易被发现,可实际上不细心真的很难发现!

第一个问题是可以通过调试解决的,因为正好公司有这个设备,所以我只花了十几分钟就找到了问题所在。

但是,第二个问题因为我们公司没有设备,因此对于才耗那么长时间!

但是,虽然第二个问题无法调试,可是他调用的函数是我写的并且已经经过验证的逻辑函数,所以我在找问题的时候一直以为是我写的函数有问题。但是,把我已经写好的相关功能拿出来,发现功能正常,但是就小G这里不正常,于是我觉得小G代码写得有问题的可能性极大!

我稍微对比了我之前调用这个函数写的逻辑和小G写的调用这个函数的逻辑,发现代码写得“差不多”几乎一模一样,这里的“差不多"我打了引号,因为我和他的代码唯一的区别就是他用了多个result变量来接收函数的返回值,而我只用了一个!

但是,一眼望去,我们俩的代码几乎一模一样!

所以,不出我所料的话,小G应该是又把我的代码复制粘贴过去,然后改了一点东西!

结语

我从来不排斥程序员复制粘贴,但是小G让我无法忍受的是他的代码肯定没有测,如果说问题二无法测试的话,问题一出现的问题跟没测试有很大的关系,而且,他复制粘贴代码根本没有代入自己的想法。

不管怎样,问题是不是超简单?但他着实把我坑了一把!这样的程序员我不是没有碰到过,但是基本上都是那种一两年最多两三年的那种程序员,像小G这样有七年编程经验的,项目写成这样基本上在任何公司都是不可被原谅的。

后来,我把我的”发现“告诉了小G,小G竟然还故作慌张,调侃道:”我在想我还要不要去公司,我怕你揍我!“。

但是遇到这种事情,真的没心情跟他开玩笑了!