第三个问题。
第四个问题。
温然发现自己有点兴奋。不是发现bug本身兴奋,而是——这些bug藏得很深,像故意藏在角落里的小彩蛋,需要一层一层剥开才能看到。她很久没遇到这么有挑战性的测试了。
十一点,她测完三分之二。
十二点,还剩最后一个模块。
公司的灯一盏盏灭了。温然没注意。她盯著屏幕,手指在键盘上快速敲击,测试脚本一行行跑过去,日志文件不停地刷新。
凌晨两点,最后一个模块测完。
温然靠进椅背,揉揉眼睛。屏幕上开著七八个窗口,每个窗口里都是一个bug的详细描述。她数了数——七个。七个bug,藏在那套被全公司吹捧的完美架构里。
她开始写邮件。
第一个bug:缓存穿透风险,建议增加二级缓存。
第二个bug:边界条件判断错误,建议将“<=”改为“<”。
第三个bug:……
她写得很详细,每个bug都附上了复现步骤、影响范围、修改建议。写完最后一个,她看了眼时间——凌晨三点五十分。
温然犹豫了。
七个bug,一次性全发出去,会不会太多了?陈序会不会觉得她是故意的?或者觉得她小题大做?
她盯著屏幕,手指悬在鼠标上。
然后她想起陈序下午那句话:“我写的代码有bug,别人指出来,我应该感谢。”
温然点击了发送。
邮件发出去的瞬间,她又有点后悔。凌晨四点发邮件,会不会显得太刻意?好像她在加班一样。虽然她确实是在加班。
算了。发都发了。
温然准备关电脑下班,突然听到手机震了一下。
她拿起来,屏幕上弹出邮箱通知。
发件人:陈序。
时间:凌晨四点零三分。
内容:两个字。
“还有吗?”
温然愣住。
她盯著那两个字,看了足足十秒。凌晨四点,他没睡?还是被邮件吵醒了?正常人谁会在这个时间点回邮件?
她还在发呆,手机突然响了。
来电显示:陈序。
温然差点把手机扔出去。她深吸一口气,接通。
“喂?”
“你没睡?”陈序的声音透过话筒传来,背景音有点空旷,不像在家里。
温然下意识说:“准备睡了。”
“在哪?”
“公司。”
对面沉默了一秒。
温然突然反应过来——她说在公司,这个点,凌晨四点。她赶紧补充:“我刚测完你的代码,准备回家——”
“下来。”陈序打断她。
“什么?”
“我在公司楼下。”他说,“下来,当面说。”
温然下楼的时候,电梯里只有她一个人。
镜子里的自己头发有点乱,眼睛下面青黑一片,身上还是那件公司卫衣。她用手胡乱拨了拨头发,发现越拨越乱,索性放弃。
一楼大厅空荡荡的,旋转门外站著一个人。
陈序背对著门,穿一件深灰色的外套,手里拎著两个纸杯。路灯的光从侧面照过来,在地上拉出一道长长的影子。
温然推门出去,冷风灌进来,她打了个哆嗦。
陈序转过身,看到她,眉头微微动了一下。
“走。”他把一个纸杯递过来,“边走边说。”
温然接过纸杯,烫的。低头一看,是豆浆。她愣了一下,抬头想说什么,陈序已经往前走了。
她只好跟上。
凌晨四点的街道很安静,偶尔有计程车开过,轮胎摩擦地面的声音在夜色里格外清晰。路灯一盏一盏从头顶掠过,把两个人的影子拉长又缩短,缩短又拉长。
温然捧著豆浆喝了一口,烫得舌尖发麻。
陈序走在她旁边,没说话。
温然也不知道说什么。
她第一次遇到这种情况——凌晨四点,和公司技术总监一起走在街上,手里还拿著他买的豆浆。这画面怎么想怎么不对。
“七个bug。”陈序突然开口。
温然抬头看他。
“我写的代码,一般人能找出两三个就不错了。”他没看她,视线落在前方,“你怎么发现的?”
温然想了想:“就……仔细看。”
陈序转头看她。
温然被他看得有点不自在,补充道:“我跑测试的时候,会把所有分支都跑一遍。正常的、异常的、边界的、极端的,能想到的都跑。跑多了就能发现问题。”
“所有分支?”陈序问。
“嗯。”
“一个模块几十个分支,你都手动跑?”
“写脚本。”温然说,“我自己写的脚本,会自动生成测试用例,覆盖所有路径。”
陈序没说话,继续往前走。
温然不知道他什么意思,只好继续喝豆浆。
走了大概二十米,陈序又开口:“我以前觉得,测试就是走过场。”
温然握著纸杯的手紧了一下。
“写用例,跑脚本,出报告,”他语气很平,像在陈述事实,“大部分人只是完成流程,真正有问题也发现不了。”
温然没接话。
“你让我改观了。”他说。
温然抬起头,看著他的侧脸。路灯的光从斜上方照下来,他的眉眼在光影里显得有点深,看不清表情。
“谢谢。”她说。
陈序转头看她,似乎没料到这个反应。
温然意识到自己在说什么,赶紧补充:“我是说……谢谢你的评价。”
陈序“嗯”了一声,转回去继续走路。
又安静了几秒。
温然觉得气氛有点奇怪,想找点什么话题。她想起刚才那七个bug,想起自己大学时第一次看到他的代码——
“其实,”她开口,“大学的时候,我也参加过你那个项目。”
话说出口的瞬间她就后悔了。
陈序的脚步停下来。
温然也停下来,手里捧著豆浆,感觉那杯豆浆突然变得很烫。
陈序转过身,看著她。路灯就在他头顶上方,光线把他的表情照得很清楚——眉头微微皱著,眼神里有疑惑,还有别的东西。
“哪个项目?”他问。
温然张了张嘴,不知道该怎么接。
“我大学期间做过很多项目,”陈序往前走了一步,“你说的是哪个?”
温然后退半步,背抵上了路边的护栏。
“就……”她垂眼,“那个开源框架,你写的底层架构,我们学校有人参与测试……”
陈序盯著她,沉默了几秒。
“什么时候?”
“大三。”
“你的名字?”
“温然。”她说,“当时用的就是这个名字。”
陈序没说话。他看著她,目光从她脸上慢慢移开,落在她身后某个看不见的地方,像是在回忆什么。
温然趁机偷偷呼吸。她发现自己刚才一直屏著气。
“我不记得了。”陈序终于开口,声音比刚才低了一点,“那个项目人太多,我没见过所有测试人员。”
温然点头:“正常,人那么多,不记得也正常。”
她努力让语气听起来轻描淡写。
陈序看著她,眉头还皱著,似乎在想什么。
温然低头喝豆浆,发现豆浆已经没那么烫了。她听到自己的心跳声,咚咚咚的,不知道是因为刚才说漏了嘴,还是因为陈序就站在她面前不到一米的距离。
“你怎么会参与那个项目?”陈序问。
“老师推荐的。”温然说,“说有个开源项目需要测试,问我们谁愿意去。我就报名了。”
“然后呢?”
“然后就测试啊。”温然耸肩,“测了两个月,提交了几十个bug报告,项目结束,就没然后了。”
陈序盯著她,眼神有点复杂。
温然被他看得心虚:“怎么了?”
“没什么。”陈序转开视线,“走吧,前面有家早餐店,开得很早。”
他继续往前走。
温然愣了一秒,跟上。
接下来的路,陈序没再说话。温然也没说。两个人并排走著,中间隔著大概一米的距离,手里各自捧著一杯豆浆。
走了大概五分钟,陈序突然停下脚步。
温然差点撞上他。
“那个项目,”陈序转过身,看著她,“我记得有一次,有人发现了一个很隐蔽的边界条件,发邮件提醒我,我没回。”
温然的心跳漏了一拍。
陈序看著她,目光很专注,像在确认什么。
“那个人,是你吗?”
温然看著陈序,感觉手里的豆浆突然不烫了。
那个人是你吗?
她张了张嘴,想说什么,但喉咙像被堵住一样。
凌晨四点多的街道安静极了,远处偶尔传来一两声鸟叫。路灯的光落在陈序脸上,他的眼神很专注,像在等待一个答案。
温然垂下眼:“我忘了。”
陈序没说话。
“那么久的事了,”她听到自己的声音,努力保持平稳,“可能是我发的吧,也可能是别人。我不记得了。”
陈序还是没说话。
温然抬起头,挤出一个笑:“你不是说前面有早餐店吗?走吧,我饿了。”
她先往前走,没看陈序的表情。
身后传来脚步声,陈序跟上来。
接下来的路,两个人谁都没说话。温然捧著豆浆,眼睛盯著前方,不敢往旁边看。她能感觉到陈序的视线偶尔落在她身上,像有什么话要说,但最终什么都没说。
早餐店在一个十字路口拐角,很小的店面,门口的蒸笼冒著白气。店里只有两三桌客人,都是早起干活的工人。
陈序推开门,让温然先进去。
他们在靠窗的位置坐下。老板娘走过来,陈序点了两份豆浆、两根油条、两个茶叶蛋。
温然说:“我不用那么多——”
“你加班到现在,多吃点。”陈序打断她。
温然闭嘴了。
等餐的时候,陈序又开口了:“那个项目,你测试了哪些模块?”
温然心里一紧。他怎么还在问?
“记不清了,”她低头看桌面,“时间太久了。”
“主要负责哪部分功能?”
“真的记不清了。”
“测试报告写了多少份?”
温然抬起头,看著陈序。他的表情很认真,像在追一个bug的复现步骤。
“陈总,”她说,“大三的事,现在我二十六了,真的记不住。”
陈序看著她,顿了两秒,点点头:“也是。”
温然松了一口气。
早餐上来,她低头吃东西,不敢抬头。茶叶蛋剥了半天没剥干净,碎壳掉了一桌子。
“你当时,”陈序突然又开口,“为什么会去那个项目?”
温然的手顿了一下。
“老师推荐的。”她说,“我不是告诉你了吗?”
“我是说,”陈序看著她,“你自己愿意去吗?”
温然没说话。
她自己愿意去吗?
当然愿意。那时候听说有个开源项目,底层架构是学校一个很厉害的学长写的,她连项目内容都没看清楚就报名了。后来才知道那个学长叫陈序,大三就被好几家公司预定,写的代码被老师当成教学案例。
她报名只是为了测试,但测试的时候,她把他写的每一行代码都看过。
“愿意啊,”她说,“开源项目,对学分有帮助。”
陈序点点头,没再问。
吃完早餐,天边开始泛白。他们走出早餐店,站在路边。
“你怎么回去?”陈序问。
“地铁。”温然说,“首班车快开了。”
陈序点头,没说话。