下一章 目录 设置
1、白箱崩溃 第17题集 ...
-
周五晚十点,白箱把卓澄的第17题停在百分之九十。
进度条没有消失。它停在最后一格前,像有人把一扇已经推开的门硬生生卡住。两秒后,屏幕中央跳出一行红字:
【隐藏测试点状态无法回写。】
今晚原本只是一次常规周测。白箱从八点半开放,前十六题都能在几十秒内返回完整报告。有人先做最难的题,再回头补基础分;有人把每次错误都截图,准备周末交反思。第17题是最后一道,也是玻璃榜墙本周权重最高的一道。
九点四十以后,教室里已经没有人说闲话。键盘声密得像一阵持续不断的雨点,却没有人抬头看窗外。穆一衡临时去了信息中心,只在群里留下要求:十点前提交的记录进入本周训练统计,故障或网络问题单独申报。
“单独申报”四个字看起来清楚,真正执行起来却没有入口。白箱页面只有成功、失败、撤回三种状态。值日班长在讲台电脑里翻了两遍,没找到“故障”选项,只能先建一张临时表。
方祁九点五十二分第一次卡住时,还觉得是自己的循环条件写反。他把代码重排了一遍,进度从六十走到七十,停在同一位置。坐他前面的学生走的是完全不同的递归方案,也在最后两组之间来回闪红。有人把结果当成共同错误,开始在小群里交换代码;卓澄看见后提醒他们先别互传完整文件,否则第二天连原始版本都分不清。
“那你说怎么办?”有人问。
“各自保存当前版本,记下停点。”
“你确定不是题目错?”
“我现在什么都不能确定。”
这句话让对方明显失望。竞培室里的人习惯卓澄给出顺序:先做什么,再排除什么,最后应该得到什么。他很少把“不知道”直接留在桌面上。
九点五十七分,玻璃榜墙刷新过一次。有人因为前十六题的稳定通过升到年级前列,也有人被第17题的连续失败拉下去。榜墙只认当前结果,不知道三种不同算法为什么会卡在同一组数据。教室里几个人下意识回头看自己的排名,卓澄没有。他把榜墙的刷新时间写进纸边,后续若要重算,这次刷新会决定哪些数据已经被家长端和班主任端看见。
十点整,最后一轮自动提交同时发出。三台电脑先后返回失败,随后整排页面开始失去响应。不是所有人都停在同一个百分比:有人四十七,有人七十,有人九十。真正相同的是右上角那行提示。
三楼自习室已经过了统一晚自习时间。电子班牌熄了,顶灯只留靠窗两排,空调在十点整自动停机,出风口最后一阵凉气卷起讲义最上面那页。窗外的玻璃榜墙仍亮着,红色排名从一楼反到玻璃上,隔着夜色落在桌沿。谁的名次上升,谁的曲线变绿,本来都能在几秒内显示出来。
今晚没有。
靠后两排的十几块屏幕同时留下不同进度。方祁的页面卡在百分之七十,他把椅子往前一蹬,探头去看旁边同学的电脑:“你也九十?”
“我七十。”
“那你比系统稳定。”
笑声起了一半,又被下一条提示压下去。有人连续按刷新,有人问是不是全校内网断了。一个女生把代码窗口拖到最左边,确认自己刚才改过的变量还在;另一名学生直接点开提交历史,想把失败记录删掉,删除按钮却在故障状态下变成灰色。
“今晚成绩还算周榜吗?”
“家长端已经推送了。”
“我妈刚问我为什么从八十掉到六十。”
“先截屏,别一会儿恢复了又说我们记错。”
值日班长原本已经在群里发过“十点零五分锁榜”,看见十几张红色页面后,立刻撤回提醒。他站到讲台边,拿着手机问穆一衡要不要统一登记。电话没接通,屏幕上只显示对方正在通话。
白箱平时把每一次运行整理得过于顺滑。绿色代表通过,红色代表失败;失败下面再自动列出题意误读、算法缺陷、实现错误和粗心。大多数人只需要从四个框里选一个,第二天把订正页交上去。系统真正停下来时,教室里的人才发现,他们熟悉的是分类后的结果,不知道一条暂时无法归因的记录应该放在哪里。
走廊尽头传来保洁车轮压过门槛的声音。值班老师敲了两下玻璃门,提醒十点十五分统一锁楼。
还剩十四分钟。
足够重新提交一次,不够让十几个人从头查完。几名学生开始互相借充电线,准备把代码复制到个人设备;有人用手机连拍红色页面,有人把草稿纸塞进书包,打算回家再看。方祁已经打开新的提交窗口,手指停在运行键上:“再跑一次总没坏处吧?”
卓澄没有碰刷新键。
他把题面重新抄到纸上。第一版证明放左边,第二版放右边,中间留出一条窄空位。第17题要求判断两种状态的可达性,最后一组隐藏条件却要求两个互斥标记同时成立。下午验算时,他已经把交集为空写了三种方法;若题面没有遗漏,正确程序不可能同时满足两条分支。
但“我证明过”不能直接等于“系统错了”。
他从第一行重新核到最后一行,把每个量的定义、边界与转移条件逐项对回原题。草稿上的勾越来越多,四个错因栏却始终没有一个能被填实。
方祁把电脑转过来:“我最后一组也是红。你看我这是不是数组越界?”
卓澄扫了一遍输出:“先别改。”
“为什么?”
“你和我不是同一种写法,停在同一个隐藏点。先留原结果。”
“万一只是网络抽了?”
“那也要留住它怎么抽的。”
方祁皱着脸,手从键盘上挪开。他不喜欢放着一个明显失败不动,尤其榜墙就在楼下亮着。可他还是把当前代码另存成只读副本,在文件名后面加了“原”。
手机在卓澄右手边亮起。
【妈妈:榜单刷新后把曲线发我。筛选前不要留异常记录。】
下一条跟着学校推荐材料的时间表,黄色标记压在“连续稳定”四个字上。周末还有一次家庭安排,母亲已经替他把竞培训练、月考分析和推荐材料的整理时间切成了半小时一格。只要今晚曲线出现一块红,周一导出时就需要额外说明。
卓澄看了几秒,把手机屏幕扣在桌面。
他过去会先处理最容易消除的东西:重跑、覆盖、改名、提交一版更干净的记录。那样做不一定是作弊,只是把故障排除在正式材料之外。但今晚的异常已经影响十几个人。删掉自己的那一条,只会让下一次同样的问题看起来像第一次。
他在四个错因栏下面加了一项:
【原因待核。】
写完又停了一下,把“待核”前面的个人编号划掉。现在不知道问题归谁,先把它写成个人错误同样是一种提前归因。
值日班长从前排走过来:“穆老师让先收截图。带姓名还是不带?”
卓澄把自己的页面切到不含姓名和排名的视图:“先收题号、时间、进度和提示类型。个人信息单独放,别发群文件。”
“这样要建两份表。”
“对。”
“锁楼前来不及。”
“先收故障事实,名单明天补。”
班长没有马上答应。他的手机上已经积了十几条私聊,每个人都在问自己的成绩会不会算。卓澄从草稿本上撕下一页,画了四列,递过去:“让他们只填看到的内容,不能确认的留空。”
前排有人听见,抱怨一句:“留空以后谁记得?”
“所以才要留原截图。”
卓澄把第一张去掉个人信息的页面放进群文件。文件名只有题号、时间和提示代码。几秒后,后面跟上第二张、第三张。方祁在第四张后面打了个问号,又删掉,改成自己的进度数字。
值班老师再次敲门。这次他把钥匙串举起来,明确说十点十五分必须断电,不能因为训练系统故障占用整层楼。班长把尚未填完的纸分给各排,要求每个人把自己的草稿带走,明早再交。
登记开始后,教室里的混乱反而暴露出更多缺口。临时表只有四列,很快暴露出不够用:同一个人可能提交过两次,两次停点不同;有人只保存了代码,没有截取提示;还有人的家长端已经出现分数变化,学生端却仍停在旧页面。
卓澄把表拆成三张。第一张只记系统事实,第二张由本人补交,第三张专门记录已经产生的外部影响。值日班长看着三张纸,问:“外部影响也算故障吗?”
“它不是故障原因,但会决定怎么处理。”
比如家长端推送。比如周榜已经刷新。比如有人为了消掉失败,覆盖了原始代码。系统恢复以后,修正一个测试点并不能自动把这些后果收回。
靠窗第二排的女生突然说,她刚才已经把失败归因为粗心并提交订正。页面不允许撤销原因,只能追加说明。她问追加后会不会显得自己在找借口。卓澄没有替她判断,只让她把第一次选择的时间和后来看见故障提示的时间分开写。
另一名学生的电脑电量只剩百分之六。充电口接触不良,他必须在断电前决定是继续保持页面,还是关机保存本地文件。方祁从书包里翻出移动电源,却发现接口不合。最后他们用讲台旁的老式插座临时供电,值班老师站在门边看着,不允许把插线板再拖过过道。
还有人什么都没保存。页面卡死后,他只记得自己停在百分之七十,却说不清是第一次还是第二次提交。班长想替他写“七十”,卓澄把那一格划回空白:“不确定就别补成确定。”
“空着不就像没做?”
“空着只说明现在没有证据。”
那名学生脸色不太好看,却没有再坚持。他把自己的草稿交上来,纸上至少留着运行时间和手写输出。
十四分钟被切成许多不足一分钟的小段:有人补时间,有人找电源,有人把刚才写下的“粗心”圈起来,旁边添上看见故障提示的时刻。临时表越来越乱,原页面却没有被覆盖。白箱稍后即使恢复,也无法把这些纸上的顺序一起改掉。
就在这时,讨论区自动滚出一条灰色记录。
账号:W17。
【最后一组不是极值问题。构造冲突。】
教室里短暂地静了一下。
方祁先开口:“谁啊?”
没人回答。
W17不像学生实名,也不像教师工号。那条注释没有说谁对,没有替谁免责,只把争议从学生答案推回测试条件。卓澄盯了两秒,把自己刚写下的“个人错误排查”划掉,改成“测试点待核”。
班长问:“这个能当官方结论吗?”
“不能。”卓澄说,“它只是一条未经审核的判断。”
“那要不要截图?”
“要。和原页面放在一起,别单独转发。”
方祁已经把“神秘账号救场”打进班群输入框。卓澄看见后,伸手点了点他的屏幕:“先别发。”
“我又没说是谁。”
“你已经写成救场了。”
方祁看了看那四个字,把整句删掉。
同一时间,明理楼一层的旧机房里,岑序正把白箱旧镜像停在第17题的测试页。
旧机房本来只安排一次设备退役核验。墙边六台机器已经贴上停用标签,显示器背后积了一层薄灰,只有最里面那台因为仍能读取旧镜像,被临时保留到十点半。机箱风扇转速不齐,其中一台每隔十几秒便发出短促的摩擦声,像塑料片擦过金属网。
邢观站在门边,临时授权单夹在登记板上:“只查测试环境。能复现就停。原始日志别动。”
岑序先看授权范围。纸上只写了三个词:测试点副本、只读日志、环境校验。没有正式题库修改,也没有成绩权限。
“复现以后呢?”他问。
“把结果交给我。”
“如果副本有问题?”
“也先交。你没有修正式环境的授权。”
岑序应了一声,把第三组隐藏样本单独复制到隔离区。
他先在纸质清单上写镜像编号、设备编号和复制时间,再截取隔离区容量。旧机房网络与教学楼主网分开,传文件要经过一台只读中转机。每次导出都会在纸质登记卡上留下编号,不能像普通浏览器那样随手覆盖。
第一遍运行,程序返回失败。
岑序没有动输入。他保存运行环境,关闭自动错因标签,再跑第二遍。两条本应互斥的标记被同时写进同一组样本:无论程序走哪一条分支,另一条都会把它判错。
他换了一个最短反例,第三遍结果仍然一样。
“构造冲突。”岑序说。
邢观从另一台退役设备后面走过来:“能证明不是实现问题?”
“只能证明这组样本不能同时成立。”
“学生答案呢?”
“没看。授权里没有。”
这句话让邢观停了一下。他原本想让岑序顺便核对最常见的错误实现,手已经伸向桌边的打印材料,最后没有拿起来。
“按你能证明的写。”
岑序在复核栏里敲下四个字:构造冲突。
浏览器保存时,地址栏下方闪出一个已经失效很久的用户标记。
W17。
他没有继续点确认。设备清单里没有这个账号,临时授权单也只写着“旧镜像测试点副本”。如果以W17保存,系统会把复现动作记到一个无法核实的历史入口下;若退出,刚才三次运行仍在隔离区,但复核栏不会同步给教学端。
岑序先截取页面、运行结果与环境校验值,按顺序编号后转给邢观。
“这个号谁的?”
邢观俯身看了一眼:“早期测试入口。先别关页面。”
“谁能用?”
“以前是教师共用。现在按理已经停了。”
“按理?”
“旧镜像没有全部迁走。”
岑序把窗口切成只读,准备退出时,复核栏里的文字忽然同步到了讨论区。右上角一闪而过“保存成功”,账号仍然显示W17。
“不是我发的。”
“我看见了。”邢观接过鼠标,关闭自动同步,“别撤回,先留证。”
岑序的手已经移到历史记录旁边。听见这句话,他停住。
错误发布需要更正,但现在删除,只会让明天的人看见一个没有来源的结果。邢观让他截取同步前后页面,自己则在纸质授权单上补写“历史入口自动发布,操作人未确认”。两个人都没有把W17填进经手人栏。
机房门外传来巡楼保安的脚步声。十点半前,他们必须结束退役核验;隔离区如果不封存,明天设备断电后数据会被自动清理。岑序把三次运行分别命名为一、二、三,没有把第二次关闭自动标签后的结果覆盖第一遍失败。邢观问为什么留一份无效记录,他只说:“第一遍包含自动标签。以后需要知道它为什么不能当证据。”
邢观没再让他删。
W17自动出现以后,旧机房里的退役核验也被迫改变顺序。原计划是先确认六台设备能否彻底断网,再逐台擦除旧镜像;现在只要有一台仍在向教学端同步,任何清理动作都可能破坏故障现场。
邢观把原来的退役清单翻到背面,临时画出一条新的处理链:停止写入、保留隔离区、导出校验值、确认账号来源。岑序没有沿用他画的箭头,而是在“账号来源”旁边打了一个问号。
“为什么不按这个走?”邢观问。
“来源查不清,前面三步也能做。别让它卡住封存。”
邢观看了眼那枚问号,把箭头改成两条并行线。
最里侧的旧机箱没有联网提示灯,屏幕却每隔几十秒刷新一次。岑序顺着网线查到墙角,发现它接的不是教学主网,而是一只早已停用的交换盒。交换盒上贴着三年前的资产标签,电源线却仍插着。谁都以为旧镜像只在本地运行,实际上它通过一条未清理的旁路保留了同步能力。
他们让电源保持原状。岑序先拍下端口、标签和指示灯状态,再用纸条封住空闲接口。邢观联系信息中心值班人员,得到的答复是:可以停止同步,但必须保留当前会话,等第二天核对历史配置。
这意味着机器不能按原计划断电。退役任务会延期,岑序也必须在离场前补一张设备继续占用说明。临时帮忙原本只到十点十分,现在多出的每一分钟都要落在某个人的纸质记录里。
“你可以先走。”邢观说,“后面的我来。”
岑序没有把这句话当客气。他看了眼临时授权单:“我的操作还没封存。现在走,最后一段会算到你名下。”
“那就算我。”
“不是谁担责任的问题。经手人写错,明天还得重查。”
他把隔离区导出到只读介质。进度很慢,旧接口每传一段就会停几秒。等待时,他拆开压扁的面包袋,发现里面只有早上没吃完的半块。机房不允许饮食,他又原样包回去,放进文件夹外袋。
邢观看见了,没说让他先吃,只把值班室的纸杯放在门外。岑序完成校验后出去喝了两口水,回来时机器仍停在百分之八十三。
导出结束,系统要求填写“问题是否解决”。岑序跳过“是”和“否”,切换到备注页写明:测试点冲突已复现;历史入口同步来源未核;设备暂缓退役。
页面没有“部分完成”选项。他把截图附在纸质清单后,让空着的单选框保持空白。
十点零七分,三楼自习室的白箱页面恢复响应。原来的红色提示缩到右上角,旁边多出灰色状态:
【复核中。】
有人松了口气,有人立刻问榜单是不是要重算。刚才准备删除记录的学生把手从触控板上移开,重新拍了一张带灰色状态的页面。班长在群文件里新建“待核”文件夹,里面暂时只有题号、时间和提示,没有任何人的名字。
卓澄检查上传顺序。最早一张在十点零零分,W17注释出现在十点零一分,恢复响应则是十点零七分。三段事实能对上,原因仍然空着。
手机再次亮起。
【妈妈:还没结束?】
他回了一句:【系统故障,结果待复核。今晚不发曲线。】
对面很快出现“正在输入”,又消失。母亲没有继续追问,却把推荐材料时间表重新发了一遍。卓澄没有打开。
方祁问:“能不能说系统炸了?”
“可以说第17题正在复核。”
“差不多吧。”
“前一句已经归因,后一句只说状态。”
“你连班群都要写说明书。”
卓澄没理他,把自己的完整过程保存,在题解草稿最上方补了一行:
【结果待测试点核验,原始提交保留。】
值班老师开始逐排断电。方祁抱着电脑最后一个退出,临走前把刚才重跑窗口关掉,没有提交。班长将纸质登记页塞进透明文件袋,约好第二天早读前补全名单。卓澄把自己的草稿放在最上面,最底下那一栏仍是空白:责任归属。
恢复响应并没有让所有问题一起消失。两名已经离开的学生收不到新的灰色状态,班长只能逐个发消息,提醒他们不要在家长端补填原因。还有一名学生的失败提醒已经被家长截图发进家庭群,他站在门口给父亲解释“复核中”不等于“我没做错”,越说越乱,最后干脆把手机递给值班老师。值班老师没有替他证明成绩,只重复学校明早会出统一通知。
卓澄听见后,在第三张表里增加一项:已经传播到哪里。这个问题无法靠重跑解决,却决定明天的更正不能只藏在白箱内部。
锁楼铃响起时,班长把三张表按时间顺序装进文件袋。原本写着“未通过名单”的标签被卓澄撕掉,换成“第17题故障材料”。标签贴歪了半厘米,班长想重新撕一张,被他拦下:“能看清就行,别再动原袋。”
方祁背起书包,又回头看了一眼灰色的百分之九十:“你今晚回去还查吗?”
“查题面,不碰正式记录。”
“你妈不是要曲线?”
卓澄把扣在桌上的手机收进口袋:“今晚没有能发的曲线。”
消息发出去以后,母亲那张按半小时切开的时间表仍躺在对话上方。卓澄没有把第17题那一格补成红色,也没有拖进“系统故障”一栏;他让它空着,直到现有材料足够支撑下一句。
下楼时,玻璃榜墙仍停在九点五十七分那一版。有人已经下降,有人已经上升,红色名次隔着大厅玻璃照在每个人鞋面上。值日班长问要不要把榜墙也拍下来,卓澄让他同时拍上墙角时钟,避免明天只剩一张无法确定时间的排名。
三楼最后一盏灯灭掉前,卓澄回头确认教室里没有遗落的纸。第17题的错误没有被解决,却已经从一个人的红色结果,变成十几份不同位置、不同时间、可以相互对照的事实。
旧机房那边,设备继续占用说明刚刚打印完成。岑序逐项核对编号,把“维修完成时间”一栏划线留空,又在旁边注明第二天需继续确认历史入口。邢观盖章时,印泥太干,第一遍只留下半个边框。他没有在原印上反复补盖,而是在旁边重新盖了一枚完整章,两个痕迹都保留。
“明天有人会问为什么有两个章。”邢观说。
“那就让他看说明。”
岑序把印章失败也写进交接备注。邢观笑了一下,没有说他太较真。今晚所有麻烦都来自曾经有人认为某些小痕迹不值得留下。
旧机房里,邢观导出访问摘要。老打印机先吐出半张歪纸,岑序关机重启,用一张背面空白的废表重新打印。末尾并列着两条记录。
同一个账号,七分钟内,两处地址。
打印纸上还带着滚轮压出的浅纹。岑序用直尺沿两条记录向左比对,确认它们调用的是同一枚入口令牌,却来自不同网络段。邢观没有在页首写“重复登录”,因为现有证据无法判断是两个人误用同一入口,还是旧系统自动映射。标题最终只写:同号异地记录。
两处记录之间仍隔着无法解释的七分钟。
一条来自明理楼旧机房。
另一条,来自三楼自习室。