一名软件测试工程师的加班经历

背景:
我们的软件产品需要在a、b、c三种硬件平台(理论上对我们的软件影响是不大的)上工作,早些时候已经成功在a上工作了,但在b、c上还有些问题,加班的那天是一个deadline,需要保证在b、c上也能够工作。这个产品由x、y、z三个部分组成,分别由三个team负责,基本的关系是:x和用户打交道,x调用y,y是数据进数据出,y调用z,z和硬件打交道。
其中,x和y都是新写的程序,而且早些时候,在x上发现了较多bug,y基本上没发现问题。z的代码在以前的产品中就有,相对已经比较稳定。由于项目的时间压力,这三个部分没有时间做分别的测试,只是程序员简单测一下自己的代码后,就要集成和测试了(这就是我的具体工作)。除了三个team的leader留下外,x的程序员都留下了;y的leader检查了team members的工作后,认为没什么问题就放他们回家了;z的leader最“无辜”,目送所有手下下班后,自己不得不留下。
都是指针惹的祸:
一开始要加班是因为x的工作还没有完成,于是大家就一边等,一边“催”(x的leader声称要到12点才能完成,真是乌鸦嘴),一边各忙各的(我在上网看新闻)。事实上,x到7点多就完成了,但一测试发现有明显的内存访问问题。于是x就调试,由于x在内存访问问题上已经“臭名昭著”了,所以大家(至少我)相信是以前类似的问题,或者是以前的修改没有彻底。
但很快,x发现问题是:y传了一个空指针给x;很快,y也证实了x的说法。大家责问y,为什么程序员自己测试时没有发现?其实很简单,程序员的单元测试程序会检查是否是空指针,如果空就打印空行。于是,x和y开始“踢球”,互相要对方加上空指针的错误处理代码;但踢了一会后,新的疑问出现了,y照理不应该出现空指针,所以要么y的代码有问题,要么y要证明自己没错。
找一个bug好难:
于是y的leader也加入了调试队伍,因为y的代码都有详细的log,所以很快就定位到了他的一个team member的代码里。不幸的是,y learder的开发机器在关键时刻down掉了。好在我们初步实施了软件配置管理,y leader很快在别人的机器上重新搭建好了调试环境。
y作了些修改(事实上,他改的这些代码都是无关紧要的),经我测试后,发现还是不行。以我的职业感觉,我觉得x也有问题(后来知道是歪打正着)。但x宁可上sina看“北京某景区有人裸泳”也不肯检查一下自己的代码。y经过艰苦的调试(其实绝大部分时间我想是在理解这些不属于他的代码),发现是因为某个数据没有取得而导致了空指针的出现,但照理,z应该总是把这项数据传送给y的。但y对z的“指控”很快被证明是无效的,因为z leader向大家“展示”了她从硬件取得的数据是好好的。
于是,z leader继续吃饼干;y leader继续调试;x一干人等继续“研究”我国风景区的管理问题。而我也终于无聊到了极点,开始“友情赞助”,检查y的问题代码。代码很少注释,写得也很随意,甚至缩进的格式都显林乱;但好在代码不长,逻辑也不复杂。我重点检查了内存的操作,但没有发现问题。
正在我纳闷同样一段代码,为什么其他数据都可以取得,偏偏这项数据取不到的时候,传来了y learder的叫声。虽然听起来很像绝望后的惨叫,但我敢肯定,这的确是找到真正问题后的欢呼(和惨叫相似也是情理之中,毕竟都是在身心及其疲惫后发出的)。果然,他发现了:这项取不到的数据的名称写错了,应该是status,但写成了state。(y向z要数据时,要传给z一个数据的名称,然后z就从硬件取得,并返回给y。这些数据的名称是z定义的)那么,怎么会发生这种低级错误的呢?原来,出错的代码y的那个程序员从另外一处copy来的,其他数据项的名称都是相同的,偏偏这项数据的名称不同。
有多少code可以重来:
y leader忙着改c文件和h文件,因为这个数据项的名称出现在多处,所以y leader改得很仔细,也很辛苦;我想他心里一定在臭骂他的这个team member,为什么不定义一个常量或者宏。在y leader改代码的时候,我也在想,这简直就像z在故意制造陷阱:这两组数据这么类似,而且其他数据项的名称都相同,为什么偏偏这项数据,一个叫state,另一个叫status,真是有空,真tmd。
y leader终于确认改正了所有该改的state。但用他的team member的单元测试程序一测发现还是有老问题。你可以想象到我们当时的感觉,就像吃了一吨广告上那个很夸张的“凉”得透顶的润喉糖。
但是! y leader大叫:单元测试程序里的state也要改成status。在无数双眼睛的注视下,y leader颤抖着replace all,save,f5。终于,当大家看到计算机上的一串字符后,每个人都舒心的笑了。(当然,如果没有刚才的虚惊一场,可能不是每个人都在快工作到午夜的时候还能笑得动的)。我想,此时此刻,此情此景,在y leader的眼里,一定滚动着些东西,除了眼屎。
现在,又轮到我上场了。build时发现x的代码中也需要把一些state改成status。(如果当初他们也检查一下就好了)。x的程序员也没有定义常量或者宏的习惯,所以我build了多次,他们才把所有要改的state改掉。
一个qa的精彩:
后来发生的事可以用一个“峰回路转”来形容,在无数双眼睛的注视下(我的手没有颤抖,因为人已经麻木了,或者说一切都习惯了),我启动了我们的软件,连接到b平台上,检查所有的数据,全部ok;连接到c平台上,检查所有的数据,全部ok。搞定了!
“回家,回家,回家的感觉是多么多么……”,我想,当时,也许每个人的心里都在回荡着王杰的这首老歌(如果知道这首歌的话),包括陪我们加班到深夜的可怜的老板。
当其他人已打算转身时,我的思想在激励的斗争着。看着同事们的脸,包括老板沧桑的脸和几张幼稚却不显年轻的程序员的脸,想着家里一天没能见到老爸的孩子,我想回家,但是,我是qa。我默默的连上了a平台,然后发现什么数据都没有。(如果把这个场景定格或者淡出,我怎么想都觉得象好莱坞预示续集的结尾)。
当我喊住大家时,我不知道该如何描述自己的感受。
无声,无声,又见无声!突然,老板告诉大家:今天的deadline搞定b和c平台就可以了,a平台下个礼拜再说。管他是真是假,老板发话就可以了,还不开溜。3分钟后(其中半分钟是给cvs打上tag),我坐上了回家的taxi。
凌晨一点的上海还是霓虹闪烁,好美。

新型电子镇流器控制芯片IR2156
去年销量最高的5部手机手机,荣耀8第四,iphone7都只排第二!
中国移动自主品牌首款5G手机曝光 AMOLED双曲面柔性屏+水滴屏设计
弘信电子拟将弘宇科打造成柔性电路板、背光板、软硬结合板等柔性电子相关产品的多元化一体提供商品的多
苹果遭老员工吐槽:这个公司正在摧毁设计!
一名软件测试工程师的加班经历
MTP/MPO光纤连接器的分类以及用途
板载电源设计(热插拔/LDO/滤波电容/升压电路)
必胜客为了吸引NFL球迷的注意,推出了特别版互动式AR披萨包装盒
工信部:今年将加快6G网络布局
携手 MLCommons,制定有效且值得信赖的 AI 安全基准
loRa无线报警系统运用了哪一些物联网技术
全世界113家运营商公布将5G商用
智慧路灯的应用场景
Protel到Allegro图解步骤
EOSRL宣布在MicroLED芯片巨量转移技术上实现了重大突破
STM32 ILI9341驱动TFTLCD屏(四)
中国电信举办安全生态论坛,与业界人物同讨大数据时代安全发展蓝图
简述工业以太网与现场总线技术1
激光切割机在很多行业都有应用,它的优势是什么