关于那段刷题的日子
广州十月的晚上,依然有一股褪不去的闷热。宿舍的空调发出那种老旧机器特有的嗡嗡声,室友在床下戴着耳机打无畏契约,键盘敲得劈啪作响。我把视线从他的屏幕上收回来,重新盯住我自己面前的这块15.6寸的显示器。
屏幕上是LeetCode的暗黑模式界面,左边是一长串英文和数学符号混杂的题目描述,右边是我刚刚敲下的一段C++代码。最底下,刺眼的红色字体写着四个大字:Wrong Answer。
我叫苏增烨,大四,软件工程专业。就读于广州商学院——一个标准的民办三本。
在如今这个连985本硕都在哀嚎“寒冬”的秋招季,顶着这样一个学校背景去找开发的工作,听起来有点像是在裸奔。我其实很早就认清了这个现实。大一大二的时候,我也迷茫过,但后来觉得,既然学校牌子拿不出手,总得找点别的东西填补简历。于是我开始死磕GPA,绩点刷到了专业第一;去参加蓝桥杯、中国高校计算机大赛,也拿了几个省一和国三。
我曾经以为,这些能证明我至少是个“可用之才”。直到上个月,我把精心排版过的简历投向那些互联网公司,然后看着它们像石沉大海一样,连个水花都没溅起来。HR的筛选系统是冰冷的,第一道学历过滤网就能把我的简历筛掉百分之八十。偶尔有几家公司大发慈悲给了笔试机会,紧接着就是几道地狱难度的算法题教我做人。
痛定思痛,我把那些花里胡哨的开源项目和比赛证书先放到了一边,老老实实地打开了LeetCode的Hot 100题单。
找工作嘛,规矩就是规矩。你得先证明你会做题,人家才会给你机会去拧螺丝。
现在的状态,基本上是每天雷打不动地刷3到5道题。听起来不多,但对于我这种算法底子一般的人来说,这已经是脑力负荷的极限了。我不喜欢那种“一天狂刷20题”的爽文叙事,那不真实。一道中等难度的题,从读懂题意,到构思思路,再到写代码、调试边界条件,最后看题解优化,一个小时打底是常态。
今天下午卡我最久的是第42题,接雨水。这题太经典了,经典到面试官只要一提起,你脑子里就得条件反射出“单调栈”或者“双指针”。
我当时在图书馆,盯着那个柱状图看了半天。我知道要用双指针,左边维护一个最大高度,右边维护一个最大高度,然后取小的那个减去当前高度。逻辑在脑子里是很顺的,但一落到代码上,指尖就像生了锈。
while (left < right) {
if (height[left] < height[right]) {
if (height[left] >= left_max) left_max = height[left];
else ans += left_max - height[left];
left++;
} else {
// ...
}
}
这段代码我来来回回改了三遍。第一遍,忘了更新最大高度,结果算出来的雨水体积大得离谱,仿佛接的不是雨水,是太平洋。第二遍,left++和right--的位置放错了,直接陷入死循环,浏览器页面卡死,风扇狂转。
看着强制刷新后恢复的页面,我没觉得烦躁,反而靠在椅背上没忍住笑了一声。
是真的觉得有点好笑。这就好像你跟人吹嘘自己能造火箭,结果出门连共享单车的锁都扫不开。这种低级错误在刷题的过程中每天都在上演。有时候是数组越界,有时候是把 == 写成了 =,还有时候是变量名 i 和 j 嵌套循环时写串了。每次看到这种弱智Bug,我都只能在心里默默骂自己一句“苏增烨你真是个傻逼”,然后平静地把代码改过来,再次点击提交。
看到那一抹绿色的“Accepted”和“击败了95%的用户”时,多多少少还是有一点多巴胺分泌的。虽然我知道,这不过是因为我用了题解里最优的思路,而不是我真的有多聪明。
刷题刷久了,人会产生一种很奇妙的抽离感。
我经常会在夜里看着这些二叉树、链表、动态规划的状态转移方程发呆,脑子里忍不住去想一个问题:这东西,和我真正要去做的工作,到底有多大关系?
大三的时候,我为了打比赛,和几个同学一起做过一个校园二手交易平台。那个项目虽然是个典型的CRUD(增删改查)系统,但在这个过程中,我真真切切地体会到了什么是“工程实践”。
我记得为了解决图片上传过慢的问题,我去研究了对象存储OSS和前端直传;为了防止恶意刷单,我学着在Spring Boot里加了Redis分布式锁;有一次后端服务在线上崩溃了,我半夜两点连上那台便宜的腾讯云服务器,在一堆乱码一样的日志里排查,最后发现是因为数据库连接池配置得太小,连接被打满了。
那个时候我觉得,编程是一件很脚踏实地的事情。它关乎于权衡,关乎于阅读晦涩的官方文档,关乎于怎么把不同的组件像搭积木一样拼凑起来,让一个系统稳健地跑下去。如果在实际开发中,我需要对一个集合进行排序,我会毫不犹豫地调用 .sort()。如果需要查找,我会用现成的哈希表。
我绝对不会,也完全没有必要,自己手写一个快速排序,或者去手搓一个红黑树。
但现在的校招规则不是这样的。面试官不会问你当时是怎么排查出连接池泄漏的,他们只会递给你一张白纸,或者给你一个在线协作的链接,说:“苏同学,我看你简历上写了熟悉基本数据结构,那我们先来手写一个LRU缓存机制吧。注意,要在O(1)的时间复杂度内完成。”
这就产生了一种巨大的割裂感。
就好像你应聘的是一个去工地砌