季度总结大会,下午三点,公司最大的会议室。
温然坐在倒数第三排靠过道的位置,笔记本电脑屏幕亮著,上面是这次版本的测试报告。她没在看,只是习惯性让屏幕亮著,这样就不会被注意到。
台上,陈序正在演示新架构的设计方案。
“……并发承载能力提升百分之四十,响应时间平均缩短两百毫秒,这是压力测试的数据。”他点击下一页PPT,柱状图跳出来,全场掌声响起。
温然没鼓掌。她盯著屏幕上某一行数据,眉头微微皱起来。
旁边的小张用力拍手,胳膊肘撞到她:“温姐,你不鼓掌吗?陈总这架构也太牛了,百分之四十啊!”
“嗯。”温然应了一声,目光没移开。
掌声渐歇,陈序站在台上,视线扫过全场:“如果没有问题,这个架构下周一就开始全面迁移。”
“没问题!”“陈总威武!”“终于不用忍受老系统崩溃了!”
会议室里此起彼伏的声音。陈序微微点头,准备合上电脑。
温然感觉自己的手心在出汗。
那组数据不对。压力测试的峰值虽然达标,但边界条件没考虑——如果并发量瞬间超过测试值,系统会直接崩溃,没有任何缓冲。这是个隐藏极深的bug,正常情况下不会触发,但一旦触发就是灾难。
她应该说吗?
这是陈序,公司技术总监,天才架构师。他的代码在行业内被当作教科书。而她只是一个测试员,入职三年,连年会都没参加过。
说了,全场会看她,陈序会下不来台,以后的日子可能不好过。
不说,系统上线后某一天突然崩溃,数据丢失,业务中断,到时候所有人都会问:测试怎么做的?
温然的手指蜷起来,抠著笔记本边缘的橡胶条。
台上陈序已经合上电脑:“那今天就到这里——”
“等一下。”
声音不大,但会议室太安静了,所有人都听到了。
温然站起来。
她不知道自己怎么站起来的,腿有点软。全场的目光像聚光灯一样打过来,前排的几个总监转头看她,眼神里写著“这谁”。
小张在旁边倒吸一口气。
陈序站在台上,手还放在电脑上,视线越过一排排座椅,落在她身上。
“你是哪个部门的?”旁边的主持人问,语气有点急,“有问题会后可以单独沟通——”
“测试部,温然。”温然打断他,看著台上的陈序,“陈总监,您这个架构,高并发下有一个边界条件没考虑。”
全场死寂。
有人倒吸气的声音清晰可闻。旁边小张已经缩成一团,恨不得把自己塞进椅子缝里。
温然看到陈序的表情没变,但按在电脑上的手指动了一下。
“说清楚。”陈序的声音很平。
温然深吸一口气,打开笔记本,调出她昨晚跑过的测试数据:“您的压力测试最高峰是每秒一万两千次请求,响应时间稳定在两百毫秒以内。但如果并发量瞬间达到一万五千次,并且持续三秒以上,系统的缓存策略会失效,直接穿透到底层数据库。”
她停了一下,全场没人说话。
“数据库连接池的默认最大值是五千,超过就会排队。但您的架构里没设置排队策略,默认是直接丢弃请求。一万五千次并发,减去缓存承载的八千次,剩下七千次全部打到数据库——五千个连接瞬间占满,剩下两千个请求直接报错。报错后客户端会重试,重试又会产生新的请求,最后雪崩。”
温然说完了。
会议室安静得能听到空调的声音。
陈序站在台上,没说话,视线落在她身上。隔得太远,温然看不清他的表情,只感觉那道目光像探照灯一样,把她从头到脚扫了一遍。
旁边有人小声嘀咕:“她谁啊……”
“测试部的吧……”
“胆子也太大了……”
主持人的表情很精彩,看看温然,又看看陈序,张了张嘴,不知道该说什么。
温然站在原地,手心里全是汗。她看到陈序的手机亮了,他低头看了一眼,然后抬起头,目光再次锁定她。
“你叫什么?”
“温然。温暖的温,然后的然。”
陈序点头,没说对也没说错,只是看著她,顿了两秒:“会后找我。”
然后他拿起电脑,从侧门走了出去。
会议室像被按了播放键,瞬间吵杂起来。温然听到周围各种声音交织在一起,有人问“她说的是真的假的”,有人说“陈总脸色都变了”,还有人说“这测试员完了,以后没好日子过了”。
小张拽她的衣角:“温姐……你疯了……”
温然没说话,慢慢坐下。笔记本屏幕上,她的测试报告还开著,最后一页写著一行红字:边界条件未覆盖,建议重新评估。
她只是做了应该做的事。
散会的时候,李姐挤过来,拍拍她的肩:“丫头,胆子不小。”
温然抬头:“数据是真的。”
“我知道。”李姐压低声音,“但你知道他是谁吗?陈序,公司合伙人级别的技术总监,从来没人敢当面说他有问题。你这是当众打脸。”
温然没说话。她当然知道。正因为知道,才犹豫了那么久。
“不过说都说了,去吧。”李姐朝门口努努嘴,“他让你去,现在就去,别拖。”
温然合上电脑,站起来。
测试部在五楼,技术总监办公室在十七楼。电梯里只有她一个人,镜子照出她的脸——没化妆,头发随便扎著,身上是公司统发的卫衣。和刚才台上那个穿著衬衫、被所有人仰视的人,不是一个世界的人。
电梯门打开,十七楼安静得像图书馆。
温然走过长长的走廊,尽头是陈序的办公室。门虚掩著,里面有说话的声音。
她走到门口,刚想敲门,听到里面传出一句:“……一个测试员,也敢当众打你脸?”
温然的手停在半空。
温然的手停在半空。
里面那个声音还在继续:“……这种事以前从来没有过,你打算怎么处理?”
她听出来了,是技术副总裁老张的声音。
“什么怎么处理?”陈序的声音听不出情绪。
“她当众让你下不来台,全公司都看著呢。你不做点什么,以后怎么管理团队?”
温然攥紧了笔记本边缘。她想敲门,但手像被钉住一样。
“她指出了问题。”陈序说。
“问题可以私下提,非要在大会上?这种员工就是不懂事——”
“老张。”陈序打断他,“你刚才说的那个需求变更,我下午看完回你。”
逐客令。
里面安静了几秒,然后是脚步声。温然来不及退开,门被拉开,老张站在门口,看到她,愣了一下,表情有点尴尬。
“那个……小温是吧?”他咳了一声,“进去吧,陈总等著呢。”
温然点头,侧身让开。老张走过去,脚步声消失在走廊尽头。
她站在门口,深吸一口气,敲了敲已经敞开的门。
“进来。”
陈序坐在办公桌后面,电脑屏幕亮著。他没抬头,视线落在屏幕上,手指偶尔敲几下滑鼠。
温然走进去,站在办公桌前。
会议室里隔得远,她没看清他长什么样。现在看清了——眉眼很深,鼻梁挺直,穿一件浅灰色的衬衫,袖口挽到手肘。没穿西装外套,但气场比台上还强。
屏幕上是一个文档,她认出来了,是她提交的测试报告。
陈序看了十几秒,才抬起头:“坐。”
温然没坐。她背挺得笔直,手里攥著笔记本,准备好了应对接下来的任何话。
——你的数据不准确。
——你当众质疑我,考虑过后果吗?
——以后测试部的工作流程需要重新规范。
她把可能的话都在脑子里过了一遍,准备好了解释和道歉。
陈序靠进椅背,视线落在她脸上:“你的报告,格式不对。”
温然一愣。
“第七页的边界条件测试,应该放在异常场景分类下,不是常规场景。”他语气很平,像在说今天天气不错,“还有,结论写得太简单,只有‘建议重新评估’,没有具体风险等级和发生概率。这样的报告,产品部门看不懂。”
温然张了张嘴。
她以为会是批评,还真是批评。但批评的方向和她想的完全不一样。
“测试报告不是给开发看的,”陈序继续说,“是给所有人看的。产品、运营、管理层,他们需要通过你的报告做决策。格式混乱、结论模糊,他们看不懂,就不会重视你的问题。”
温然没说话。她看著陈序,发现他的表情很认真,不是在找茬,是真的在指出问题。
“我……”她顿了一下,“我知道了。”
陈序点头,视线回到屏幕上,滑鼠点了几下。办公室安静了几秒。
温然站著,不知道该不该走。
“那个边界条件,”陈序突然开口,“你怎么发现的?”
“跑测试跑的。”温然说,“压力测试的脚本是我自己写的,会比标准测试多跑几个极端值。”
陈序抬起头看她。
“标准测试只测到一万二,”温然继续说,“但我习惯往上加百分之三十,看看系统什么时候崩。昨晚跑到一万五的时候,日志开始报错,我追下去发现是数据库连接池的问题。”
陈序没说话,就那么看著她。
温然被他看得有点不自在,垂下眼:“所以……会上说的那个,不是临时想的,是昨晚就跑出来的数据。”
又安静了几秒。
然后陈序说:“那个边界条件,我确实漏了。谢谢。”
温然愣住。
她抬起头,看著陈序。他的表情没变,语气也和平时开会一样平淡,但那两个字像石头一样砸进她耳朵里。
“你……”她下意识说,“不批评我?”
“为什么批评?”陈序反问。
“我当众……”温然顿了一下,“让你下不来台。”
陈序看著她,忽然扯了一下嘴角。不是笑,但比刚才的表情松弛了一点。
“我写的代码有bug,别人指出来,我应该感谢。”他说,“至于下不来台,那是我的问题,不是你该考虑的。”
温然没说话。她发现自己有点不知道说什么。
陈序的视线回到屏幕上,敲了几下滑鼠:“以后你的报告,直接发我邮箱。不用等周报。”
“……好。”
“还有别的事吗?”
温然摇头。
陈序“嗯”了一声,又开始看屏幕。温然转身往外走,走到门口,听到身后又传来声音:
“温然。”
她回头。
陈序还是看著屏幕,但手指停在滑鼠上:“你的测试脚本,方便发我一份吗?”
温然愣了一秒:“……方便。”
“谢谢。”他说。
温然推开门出去,走廊还是那么安静。她走到电梯口,才发现自己手心里全是汗。
电梯门打开,里面站著周晓阳。他看到温然,眼睛瞬间亮了。
“温然!温大神!”他往旁边让,“你从十七楼下来?陈总找你?怎么样怎么样?他骂你了吗?还是夸你了?你刚才在大会上太勇了你知道吗全公司群都在刷你——”
温然走进电梯,按了五楼:“没事。”
“没事是什么意思?是没事还是没事?”周晓阳凑过来,“陈总什么反应?他有没有说以后测试部的人都要小心点?还是说他其实很欣赏你这种敢说话的?”
温然想了想陈序那句“谢谢”,又想了想那句“报告格式不对”。
“没说什么。”她说。
周晓阳一脸失望:“你这个人,怎么什么都问不出来。”
电梯到五楼,温然走出去。身后周晓阳还在喊:“有什么进展第一时间告诉我啊!我站你这边!”
温然没回头。
测试部工位区,小张看到她,蹭一下站起来:“温姐!怎么样!”
旁边几个同事也看过来,眼神里写满了好奇和同情。
温然走到自己工位,坐下:“没事。”
“没事?”小张凑过来,“真的没事?陈总没骂你?没说以后不让你参与核心项目?”
“没有。”
小张松了口气:“那就好那就好,吓死我了。温姐你刚才真的太猛了,我都不敢呼吸。”
温然打开电脑,邮箱界面弹出来。她一边输密码一边说:“该干嘛干嘛,版本还有bug要修。”
小张“哦”了一声,缩回自己座位。
温然点开邮箱,收件箱里躺著十几封未读邮件。她一条条往下看,准备开始处理工作。
然后她看到一封邮件,发件人:陈序。
发送时间:半小时前。
她在大会上讲话的时候,这封邮件已经发出来了。
温然点开。
“附件是今天演示的架构代码,帮我看看还有没有bug。”
附件是一个压缩包,名字是“架构核心模块_v2.3.1”。
温然盯著屏幕,好半天没动。
旁边小张探头过来:“温姐,你怎么了?”
温然关掉邮箱:“没什么。”
她打开压缩包,代码一行一行跳出来。窗外午后的阳光斜照进来,落在键盘上,她发现自己的手指有点抖。
不是害怕的那种抖。
温然打开压缩包。
代码整整齐齐,注释清晰,变量命名规范。她随便翻了几个文件,不得不承认——陈序的代码写得确实漂亮。架构清晰,逻辑严密,几乎是教科书级别的。
但教科书也会有bug。
她开始跑测试脚本。
第一个问题出现在半小时后。某个模块的缓存策略在特定条件下会失效,虽然概率极低,但理论上存在。温然在文档里记下来,准备一并发给陈序。
她继续往下测。
第二个问题出现在晚上八点。一个边界判断写成了小于等于,应该是小于。这种错误不会导致崩溃,但会让某个功能在边界值时表现异常。
温然盯著那行代码看了十秒,确认不是自己眼花。
她开始怀疑——这真的是陈序写的?那个传说中代码零bug的天才架构师?
窗外天已经黑了。小张下班时过来打招呼,她“嗯”了一声没抬头。李姐路过问她要不要一起去吃饭,她说“等会儿”。然后等会儿就等到了十点。
第三个问题。
第四个问题。
温然发现自己有点兴奋。不是发现bug本身兴奋,而是——这些bug藏得很深,像故意藏在角落里的小彩蛋,需要一层一层剥开才能看到。她很久没遇到这么有挑战性的测试了。
十一点,她测完三分之二。
十二点,还剩最后一个模块。
公司的灯一盏盏灭了。温然没注意。她盯著屏幕,手指在键盘上快速敲击,测试脚本一行行跑过去,日志文件不停地刷新。
凌晨两点,最后一个模块测完。
温然靠进椅背,揉揉眼睛。屏幕上开著七八个窗口,每个窗口里都是一个bug的详细描述。她数了数——七个。七个bug,藏在那套被全公司吹捧的完美架构里。
她开始写邮件。
第一个bug:缓存穿透风险,建议增加二级缓存。
第二个bug:边界条件判断错误,建议将“