第16章 危机初现,代码出现乱码
凌晨三点十七分,显示器上的代码突然开始扭曲。
不是卡顿,也不是崩溃,而是字符自己变了形。原本整齐的函数名成了乱码堆叠的怪物,括号错位,分号漂移,连注释都变成了一串看不懂的符号。陈默盯着屏幕,手指悬在键盘上方没动。
“许文远。”他喊了一声。
“在呢。”许文远头都没抬,正趴着改UI界面,“我这边快好了,你那边卡了?”
“不是卡。”陈默敲了两下回车,页面直接跳转到报错日志,“整个前端模块炸了。”
李锐从工位上弹起来冲过来,鞋底在地板上蹭出一声响。“我刚测完商户端流程,一切正常啊!”
“十分钟前还正常。”陈默调出版本控制记录,光标停在最新一次提交时间:**03:12:46**。
提交人:张伟。
“张伟?”许文远皱眉,“那个新来的?说是从外包公司跳槽过来的那个?”
“是他。”陈默点开变更详情,脸色沉了下去,“他删了核心依赖包。”
办公室瞬间安静。
李锐声音发干:“哪个包?”
“common-utils。”陈默吐出三个字,像在嚼一块铁片。
许文远猛地站起来:“那可是全局工具库!加密、校验、时间戳处理全在里面!他怎么能……”
“他说他看着名字像废弃文件。”李锐翻着聊天记录,“刚才群里问了一句‘这个文件夹三个月没更新是不是可以清了’,没人回他,他就……点了删除。”
陈默闭了下眼。
他知道这种心态——新人进项目组,想表现,又怕说错话。没人搭理,干脆自己动手。结果一通操作猛如虎,系统当场变豆腐。
“现在咋办?”李锐搓着手,“重装依赖?”
“不行。”许文远摇头,“他不是用命令行删的,是直接在服务器后台把物理文件拖进了回收站。现在连恢复入口都没了。”
陈默已经打开备份系统。
进度条显示:**上次完整备份—— 12小时前**。
他们昨天中午刚做了架构调整,这十二小时里改了三百多个文件。要是回滚,等于白干一天。
“还有没有临时存档?”陈默问。
“我这儿有。”许文远摸出移动硬盘,“昨晚十点我导过一份,说是防万一。”
“用这个。”陈默把位置让出来,“先把环境搭起来。”
许文远插上硬盘开始还原数据,李锐在一旁不停刷新监控面板。“订单接口还在跑,但用户注册流程断了,已经有商户打电话来问怎么回事。”
“先挂公告。”陈默掏出手机登录后台,“系统维护中,预计两小时内恢复。”
他刚点发送,手机震动了一下。
林国栋的消息:**陆子鸣今天见了红杉资本的人,谈的是本地生活赛道战略布局。**
陈默没回。
他知道这意味着什么——对方已经开始融资,准备大规模烧钱进场。而他们这边,却因为一个程序员的手滑,差点让平台瘫痪。
这不是巧合,是Timing(时机)上的碾压。
但他现在顾不上这些。
“好了!”许文远一声喊,“基础框架回来了!”
陈默立刻接手,一行行核对代码结构。有些函数调用路径断了,变量引用丢失,还得手动修复。
“得加个钩子。”许文远蹲在旁边看,“以后谁提交代码,必须经过自动检测,删核心包直接拦截。”
“不止是技术层面。”陈默一边修一边说,“是流程问题。”
“你是说……立规矩?”李锐问。
“以前在大厂,新人上线代码要三级审批,我们嫌麻烦没搞。”陈默敲下一段补丁脚本,“但现在不一样了。有人盯着我们犯错,而且巴不得我们多错几次。”
许文远点头:“确实,现在每崩一次,都是给对手递刀。”
陈默把修复后的代码推到测试环境,刷新页面。
登录框出来了。
他输入测试账号,点击进入。
商户管理页加载成功。
“基础功能通了。”李锐松了口气,“要不要通知商户?”
“再等等。”陈默没放松,“等所有模块跑一遍。”
他打开调度算法模块,运行模拟订单流。
第一笔测试单顺利派发。
第二笔卡住,提示“无法解析配送距离”。
陈默追查下去,发现是地理编码服务没初始化。再查原因,原来是common-utils里的坐标转换函数没被正确加载。
“还是漏了东西。”他低声说。
许文远凑近看:“会不会是配置文件没同步?”
“有可能。”陈默切换到部署脚本目录,“我们之前为了加快开发速度,允许本地直连生产数据库。谁知道哪台机器改了配置,就会污染全局。”
“这太危险了。”李锐听得心惊,“相当于每个人都能拿着钥匙乱开门。”
“所以不能再这么干。”陈默新建了一个文档,标题打上:**代码提交与发布规范V1.0**
第一条写着:**所有代码变更必须通过Git提交,禁止任何形式的服务器后台手动操作。**
第二条:**核心模块修改需双人审核,未经批准不得合并至主分支。**
第三条:**每日零点自动备份,关键节点增加临时快照。**
“再加上一条。”许文远指着屏幕,“新成员入职前三天,只开放只读权限,熟悉结构后再逐步授权。”
“加进去。”陈默点头,“明天晨会就宣布。”
李锐看着那份文档,忽然觉得有点陌生。
以前他们讲究“快”,追求“敏捷”,恨不得一天上线三个功能。现在却要一层层设防,像在给自己修围墙。
“感觉像是……变老了。”他嘀咕。
“不是变老。”陈默关掉编辑器,“是长大了。”
许文远笑了一声:“说得跟创业感悟似的。”
“我说真的。”陈默靠在椅子上,“以前我们可以输,输了重来。现在不行,一次致命失误,就能被人按在地上摩擦。”
办公室陷入短暂沉默。
窗外城市依旧灯火通明,对面鸣膳集团的大楼依然亮着灯。
但他们知道,真正的战场不在那里。
而在每一行代码的背后,在每一次点击提交的瞬间。
“对了。”许文远忽然想起什么,“张伟还在会议室等着呢。”
“让他进来。”陈默说。
不到一分钟,张伟推门进来,手里捏着笔记本,额头冒汗。
“陈哥……我真不知道那文件这么重要,我看三个月没动过,以为是垃圾……”
“我不是要骂你。”陈默打断他,“我要你知道,你现在写的每一行代码,都可能影响几千人吃饭、几万人赚钱。”
张伟低着头,手指抠着本子边角。
“下次不确定的东西,宁可不动。”陈默声音不重,但每个字都清楚,“问,不会让你显得蠢。乱动,才会。”
“我知道错了。”张伟嗓音发紧,“我能做点什么补救吗?”
“能。”陈默打开任务系统,指派给他一个新工单,“把common-utils里所有公共方法梳理一遍,写成文档,明天上午十点前交。”
“就……这事?”
“这事不小。”许文远接话,“以后新人培训材料就靠它了。”
张伟点点头,抱着本子走出去,背影有点僵。
李锐看着关门的动作,小声说:“他会不会扛不住走了?”
“会走的人,早就走了。”陈默重新打开监控面板,“留下来的人,才值得信任。”
系统运行趋于平稳,异常请求归零,订单队列恢复正常流动。
陈默站起身,活动了下肩膀。
“接下来重点不是修bug。”他说,“是怎么不让bug有机会出现。”
许文远伸了个懒腰:“那你得给我们配个AI审查员。”
“不用AI。”陈默坐回去,“人盯人,最有效。”
他打开团队协作工具,在群公告里贴上了刚制定的规范文档。
【全员必读】
1.所有代码变更必须经Git提交;
2.核心模块修改需双人审核;
3.每日零点自动备份;
4.新成员前三天仅限只读权限。
末尾加了一句:**规则不是束缚,是保护。**
消息发出后,陆续有人回复“收到”。
陈默盯着屏幕,直到最后一个确认反馈跳出。
他深吸一口气,准备继续调试剩余模块。
就在这时,李锐突然叫了一声。
“不对劲!”
陈默立刻抬头。
“你看这里。”李锐指着数据库日志,“刚刚有一条记录,用户ID为空,但下单时间是……三分钟前。”
许文远迅速切屏:“我们不是刚恢复系统吗?这时候谁在下单?”
陈默放大那条数据。
设备指纹异常,IP地址归属地模糊,更奇怪的是,订单内容是一串无意义的菜品组合:**米饭×7,矿泉水×13,甜品拼盘×0**。
数量为零的订单,居然完成了支付流程模拟。

