返回

从农村娃到城市码农变形之痛

首页
关灯
护眼
字体:
第37章 结束培训
    寒风裹着细雪粒子拍打着出租屋的铁皮屋顶,发出细碎的噼啪声。屏幕蓝光映着墙角的行李箱,里面还粘着去年从老家带来的稻壳。谭明盯着屏幕上的报错信息,喉结随着吞咽浓茶的动作上下滚动——这已经是今晚第七次事务回滚失败。冻僵的手指摩挲着鼠标,恍惚看见代码行间浮出金黄的稻穗——那些在SSH框架里疯长的字符,终究比田垄间的稗草更驯服。



    谭明掀开泡面碗,腾起的热气在显示器屏幕上糊出白雾。泡面汤里浮着的葱花让他想起老家晒谷场边野生的荠菜,父亲总说那些野菜是老天爷给穷人的馈赠。此刻这些“馈赠”在泡面汤水里载沉载浮,像极了在Tomcat服务器里挣扎的数据库连接池。



    “他哥的!”许建突然踹开铁门,军大衣肩头积着雪,活像扛了两袋水泥。他甩出塑料袋里的光碟,封面上用马克笔潦草地写着“毕设救命大礼包”,油性笔的印子浸透了垫在底下的盗版《阿凡达》海报。“老赵给的私货,说是给我们留下的‘核武器’。”



    “你的图书管理系统要是再吞库存......”谭明话说一半就被机箱的轰鸣打断。老式长城电源突然发出拖拉机启动般的声响,惊得窗台上觅食的麻雀扑棱棱飞走。



    “吞就吞!大不了学你老家粮仓,用竹篾席子圈块地当缓存。”谭明扒拉着许建的代码,突然怪叫,“我日!你用观察者模式监控借阅状态?这他妈比我们村会计打算盘还精细!”



    谭明把冻僵的手伸到机箱散热口烘烤,恍惚看见父亲佝偻着背在松树林割胶的模样。那些从刀口渗出的松脂,和此刻在Eclipse里流淌的代码何其相似——都是需要精准把控的粘稠液体。“你看这个。”他点开借阅日志,“每次用户续借,系统都会触发三次冗余查询,像我爹说的‘三刀见脂’?”



    许建凑近屏幕,镜片反光里密密麻麻的SQL语句如蛛网蔓延。“你这事务隔离级别设成REPEATABLE_READ,跟咱在机房抢键盘有啥区别?”谭明突然拍大腿,“要我说就该上乐观锁!就跟当年偷朱启安的《陆小凤传奇》似的——谁先摸到书谁看,看完再放回去!”



    两人爆发出一阵大笑,惊醒了隔壁早睡的两个装修大哥。墙体传来“咚咚“的抗议声,混着窗外呼啸的北风,竟与机箱风扇的嗡鸣形成诡异和弦。谭明摸出枕头下的诺基亚,屏保照片里2007年的桂江泛着铜绿色的光,那时他们还不知道外键约束会像拴牛的麻绳般令人窒息。



    “还记得黄老师教的第一个死锁吗?“许建突然用改锥戳了戳主板,“唐启明那傻缺同时开八个QQ窗口砍价,直接把数据库干趴了。现在想想,那场景跟赶集时抢购化肥的老乡们一模一样。“



    谭明在Spring配置文件中又加了个tx:advice,忽然想起母亲在腌酸菜时总要分层撒盐。事务传播行为设为REQUIRED,就像必须压实的腌菜缸——每一层菜叶都得浸透咸涩的汁水,才能熬过漫长寒冬。当他在BaseDaoImpl加上最后一个@Autowired注解时,窗外的雪粒子突然密集起来,打在生锈的防盗网上如同撒落的稻种。



    凌晨四点的出租房像座冰窖。许建把谭明的被子裹在身上,活像只进入冬眠的熊。“你看这个Hibernate二级缓存,“他用冻得发红的手指戳着屏幕,”像不像咱老家的地窖?白菜土豆扔进去能保鲜,可要是混进颗烂红薯......”话音未落,系统果然抛出个LazyInitializationException,活脱脱一颗腐烂的土豆在数字地窖里发霉。



    谭明灌下最后一口浓茶,苦味勾出记忆里中药的涩。他甩甩头,把出错的bean配置拖进回收站,又颤抖着还原——这动作让他想起小时候打碎饭碗后,蹲在地上捡拾饭的惶恐。机箱突然发出垂死般的嗡鸣,徐小军去年送的“超频三“散热器终究扛不住连续48小时的高负荷运转。



    “等等!”许建突然夺过鼠标,“你把JDBC连接池的maxActive设成50?这要搁我们村鱼塘,早他妈翻塘了!”他麻利地改成20,又调整了validationQuery,“得留点余地,就跟插秧要留排水沟似的。”



    奇迹般,Tomcat服务器启动进度条开始缓慢爬行。谭明盯着控制台瀑布般刷新的日志,每一行日志都如被插得笔直的秧苗,每一株间距都精确如像素。当“Server startup in 45872 ms“的字样浮现时,火车的鸣笛声恰好从窗外传来。



    “成了!”两人击掌的瞬间,老式CRT显示器突然闪烁,将他们的影子投在起皮的墙纸上。那些随光影晃动的轮廓,与去年在机房通宵时被日光灯拉长的身影悄然重叠。



    谭明打开项目文档,在“致谢“栏郑重敲下:“感谢许家村的鱼塘和谭家坳的稻田“。光标在句末闪烁,如同晒谷场上惊起的蜻蜓,在2008年的风雪里寻找落脚点。



    答辩前夜,谭明开始写答辩PPT。当“借阅记录”模块的流程图完成后,谭明突然想起——那年北鼎瀑布前,他们用树枝在沙滩画的战术图,早被山泉水冲刷成模糊的虚线。



    “紧张不紧张,明天就是毕业答辩了。我估计我的心跳要超过120了。”许建夸张的说道。机箱风扇的声音伴随着雪粒子的沙沙声,谭明仿佛听见自己十八岁的心跳,正在穿透2008年末的风雪。



    教室的空调调到暖风模式,叶片上下翻动着。谭明站在投影幕布前打开PPT,开始介绍自己的项目。主考官梁主任扶了扶眼镜问道:“为什么用Hibernate二级缓存?”



    “就像晒稻谷要翻三遍。”他脱口而出,手里攥着遥控器,手心都出汗了。“第一次晾表皮水分,第二次透芯,第三次......”突然惊觉在说家乡土法,冷汗顺着脊椎滑落。



    穿粉色羽绒服的女考官却笑了:“有点意思,接着说。”谭明望向窗外,汽车正载着车顶的冰块流向远方。他深吸口气,把数据库连接池比作灌溉渠,事务回滚说成“割掉发霉的稻穗”。当说到用JSP标签库防止SQL注入时,突然想起母亲筛米时扬起的秕谷。



    当天晚上,谭明在培训学校重构毕业设计时发现个隐藏bug——当输入“稻谷”时,系统会检索出所有农业类书籍。月光爬上代码,他忽然笑出声,给这个bug添加了注释:这不是错误,是播种时的意外收获。——谭明 2008.12.31



    晚上九点,机房的显示器同时黑屏。整座城市在雪地里重启,而某个图书管理系统的借阅记录里,悄悄多了本《杂交水稻栽培技术》。



    理论考试那日,雪花在答题卡上融成蓝墨水。谭明在卷子背面画了棵二叉树——左子树是“稻田”,右子树是“代码”,根节点处写着“2007.3-2008.12”。监考老师经过时,他正盯着第23题发呆:“简述MVC模式与三层架构的区别”,题干里的“层”字让他想起老家腌菜的陶缸,一层盐一层菜,码得整整齐齐。



    交卷铃响时,许建用指甲在桌面刻下“Hello World”,许建把橡皮屑摆成“404”。谭明把稿纸折成纸船,用它载着橡皮屑丢进走廊尽头的垃圾桶。雪停了,阳光微微刺破云层,机房外的冰棱开始滴水,像无数个倒计时的秒表。



    成绩是在3天后公布的,所有通过理论考试和答辩的同学需要参与下周的模拟面试。当黄启强念到“谭明”时,一只麻雀撞上“月薪过万”的灯牌,惊落满地碎雪。



    下课时,陈佳红和沈小宁走廊里一闪而过,谭明憋见沈小宁发梢沾着的雪粒像未加载完成的像素点。谭明把《J2EE实战》放进包里,快速走到门口,却没有看到她们两个的身影……