敲下这行字的时候,屏幕右下角的时间刚好跳到凌晨两点半。
宿舍里的灯早就熄了,只有我的显示器还亮着,屏幕的冷光打在桌面的机械键盘上,键帽的边缘泛着微弱的反光。我用的是一把红轴,敲击起来声音不大,但在这样安静的深夜里,哪怕是再轻微的触底声,也显得有些突兀。背后传来室友均匀的呼吸声,偶尔夹杂着几句含糊不清的梦话,翻个身,床板发出轻微的吱呀声,随后又归于平静。空调的运转声在深夜里被无限放大,像是一台老旧的服务器在机房里不知疲倦地轰鸣。空气里混杂着一点没干透的衣服的潮味和廉价空气清新剂的味道,这是大学男生宿舍特有的气味。
大学快要结束了,大四下学期的课表空得只剩下毕业设计。很多人在这个时候会感到一种即将步入社会的焦虑,或者对过去四年青春的不舍。但我看着屏幕上闪烁的光标,脑海里浮现的,却只有关于孤独这件事。
孤独并不是一种突然来袭的情绪,它更像是一种常态,或者说,是我这四年生活的底色。
在广州商学院这样一个民办三本院校里,选择一种按部就班甚至有些严苛的生活方式,本身就意味着主动走向边缘。大一刚入学的时候,我也曾试图去融入那种热闹的集体生活。跟着室友一起在宿舍打游戏到半夜,一起在深夜去校外的小摊吃那种油腻的炒粉,一起在早八的课堂上坐在后排低头刷手机。
但那种热闹过后,往往是一种更深的虚无感。我记得有一次通宵打完游戏,天已经蒙蒙亮了,我走到阳台上去洗脸。看着洗手台上方那面边缘已经有些氧化的塑料镜子,里面那个自己熬得通红的眼睛,我突然觉得挺没意思的。我知道自己高考没考好,来到这里已经是退无可退。如果在这个环境里继续随波逐流,四年后我可能连一份最基础的CRUD开发工作都找不到,也许只能去外包公司做着毫无技术含量的搬砖活,或者干脆转行。
后来我不再强求自己去合群。我开始频繁地去图书馆,坐在顶楼靠窗的那个位置。广州的天气总是闷热而潮湿,即便是秋天,空气里也总是黏糊糊的。窗外的榕树叶子绿得发亮,我就坐在那里看书、写代码,从早晨待到闭馆。那把木质的椅子很硬,坐久了腰椎会隐隐作痛,但我很少站起来走动。
很多人问我,GPA 4.02是怎么考出来的。其实没有什么特别的方法,也没有什么天赋异禀。它只是一串由无数个独处的物理时间堆砌出来的数据。当别人在峡谷里开黑的时候,我在看《深入理解计算机系统》,对着里面晦涩的汇编代码发呆,试图弄懂虚拟内存的映射机制;当别人在周末睡到中午的时候,我在LeetCode上推导动态规划的边界条件,在草稿纸上画满状态转移的树形图。
这种错位感,在拿到两次国家奖学金的时候达到了顶峰。辅导员在台上念到我的名字,台下响起稀稀拉拉的掌声。我走上去领过那个红色的证书,封皮的绒面质感有些粗糙,拿在手里沉甸甸的,但我的心里并没有多少波澜。走下台的时候,我看着台下那些低头玩手机的面孔,清楚地知道,这个奖项并不能抹平所谓“三本”和名校之间的鸿沟。在互联网大厂HR的自动化筛选系统里,第一学历的标签依然是一道难以逾越的高墙,很多时候简历甚至到不了用人部门的leader手里。这个国奖,它只是我一个人在暗处默默发力的证明,是对我这几千个小时独处的一种物质补偿。回到宿舍,我把证书塞进抽屉的最底层,和一堆废弃的草稿纸混在一起,然后打开电脑,继续看没看完的Kubernetes官方文档。
比起人际交往中的微妙和复杂,我更喜欢和代码打交道。代码是诚实的,你输入什么,它就输出什么。哪怕它报错,也是有迹可循的。只要你愿意花时间去翻源码,去查日志,总能找到原因。但人不是这样,很多时候你付出了善意,得到的回馈却是不可预知的。
技术上的成长,往往是由无数个崩溃的深夜和极其低级的错误喂出来的。前段时间在重构一个后端的微服务项目,用Go语言写了一个高并发的日志收集模块。在本地测试的时候一切正常,接口响应时间都在几毫秒以内。但一部署到服务器上,只要用JMeter把并发量压上来,内存占用就会以一种诡异的曲线飙升,最后直接OOM把进程杀掉。
那个周末我没有踏出宿舍一步。外卖小哥把饭盒放在门外,我出去拿的时候,走廊里空无一人,只有尽头的窗户透进来一点惨白的天光。我端着那盒已经变凉的隆江猪脚饭,机械地咀嚼着,眼睛死死盯着屏幕上的Grafana监控面板。
我用pprof把程序的堆栈信息抓取下来,生成了一张复杂的火焰图。排查的过程是枯燥的,甚至有些让人烦躁。我顺着火焰图一层层往下找,从HTTP请求的处理逻辑,一直追踪到深层的Goroutine调度。我甚至怀疑是Go底层的垃圾回收机制出了问题,去翻了半天GC的源码。
最后发现,其实是一个极其愚蠢的低级错误。在一个处理网络I/O的协程里,我用Context来控制超时,但在逻辑分支的某个边缘场景下,忘记了调用cancel()。这就导致每一次超时请求都会留下一个永远无法结束的Goroutine,并发量一上来,底层的资源一直被占用,内存自然就爆了。
加上那行简单的defer cancel()之后,重新编译,打包,推送到Docker镜像仓库,重启容器。看着监控面板上的内存曲线在压测下终于平稳地变成一条直线,那一刻,房间里依然只有我一个人,只有机箱风扇转动的声音。没有人可以分享这种细微的成就感,我也觉得没有必要分享。技术上的每一次踩坑和爬坑,都是一场极其私人的修行。你自己在泥潭里挣扎,最后自己把自己拔出来。
类似的踩坑经历还有很多。大三上学期自己搭了一个类似校内论坛的全栈项目,部署在阿里云那台便宜的学生机上。初期自己点着玩没什么感觉,后来稍微造了一点假数据进去,列表页的接口就开始严重超时。查了半天服务器的网络和带宽,最后发现是MySQL的慢查询。用EXPLAIN一看,执行计划里的type是ALL,走的是全表扫描。因为在按时间倒序分页查询的时候,没有建立合适的联合索引。加上索引的那一瞬间,查询时间从两秒降到了十几毫秒。这种从迟钝到丝滑的转变,带来的多巴胺分泌,比打赢一场游戏要持久得多。
那几次拿到国二的竞赛也是一样。虽然报名的时候是团队比赛,但很多时候,核心的代码、数据库的设计、甚至最后答辩的PPT,往往只能由一个人来推进。并不是队友不努力,而是当技术栈的深度和对项目的要求出现偏差时,沟通的成本往往会大于自己动手实现的成本。我懒得去解释为什么这里要用Redis做一层缓存防击穿,懒得去说明为什么消息队列要保证幂等性,也懒得去教他们怎么用Git解决分支冲突。我只想把东西做出来,按时交付。
去外地参加决赛的时候,我们坐在高铁上。窗外的风景飞速倒退,他们在讨论等会儿去吃什么当地的美食,去哪个景点打卡。而我还在笔记本上修改答辩的PPT,连着手机热点,确认演示环境的接口能不能正常调通,生怕现场的网络环境会导致演示翻车。我并不觉得他们做错了什么,大学生活本来就应该有很多种形态,享受生活也是一种能力。我只是觉得,我们虽然坐在同一列车厢里,但驶向的却是完全不同的终点。
答辩结束,成绩公布。拿到全国二等奖的时候,大家在会场外合影。闪光灯亮起的那一瞬间,我看着镜头,努力挤出一个笑容,心里却有一种不真实感。这些奖项,这些绩点,像是我在这个并不算优秀的平台里,给自己强行穿上的一层铠甲。这层铠甲让我看起来很坚硬,让我有底气去投递那些大厂的简历,但也把我包裹得严严实实,隔绝了外界的温度。
每天晚上从实验室走回宿舍的那段路,是我一天中最放松的时间。
校园里的路灯有些昏暗,飞虫在光晕里不知疲倦地绕着圈。偶尔会有骑着电动车的情侣从身边经过,留下一点细碎的笑声和风吹过树叶的沙沙声。我会去全家便利店买一瓶无糖的三得利乌龙茶,从冰柜里拿出来的时候,瓶身上的冷凝水在手里湿漉漉的,贴在脸上有一种冰凉的刺痛感。
走在空旷的操场边,我会想,这种长期的独处,到底给我带来了什么。它让我失去了一些所谓的青春回忆,我的大学没有通宵的KTV,没有轰轰烈烈的恋爱,没有那种可以勾肩搭背在深夜街头游荡、喝得烂醉的兄弟。我的回忆里只有无穷无尽的文档、报错信息、终端里滚动的日志,和永远也刷不完的算法题。
但它给了我一种近乎冷酷的清醒。我清楚地知道自己处于什么样的位置,知道自己手里的牌并不算好,没有名校的光环,没有丰富的校友资源。所以我更不敢有任何的懈怠。孤独在这里,不再是一个贬义词,而是一种自我保护的过滤机制。它帮我屏蔽掉了那些无效的社交和无意义的内耗,让我能够把所有的精力,都聚焦在如何让自己变得更强一点这件事情上。
在没有光环的学校里,想要往上走,就只能自己成为光源。而发光的过程,注定是寂静且痛苦的。
大四的