“喂,大哥。”
“小晨,在忙吗?”林枫的声音听起来有些疲惫,背景音里有隐约的机器轰鸣声,他应该还在工地。
“刚忙完一点事。怎么了?昨天打电话我没接着。”
“没啥大事,就是大娘这两天又念叨你了,问我你工作找得咋样,怕你压力大。”林枫顿了顿,“我跟你嫂子商量了,这个月的房贷,我们先帮你垫上点,你别硬扛。”
林晨心里一暖,但立刻拒绝:“不用,大哥。我手里还有,能周转。你们也不容易。”
“跟哥还客气啥!”林枫语气加重了些,“我知道你要强,但现在是特殊时期。大娘那边我帮你安抚着,你就安心找工作。对了,你上次说让小浩去学点技术,我跟他提了,这小子……有点犹豫,嫌学厨师又累又没面子,还想在厂里混着。你有空再跟他说道说道,你的话他可能听得进去。”
“好,我知道了。等我这边稍微稳定点,我好好跟他聊聊。”林晨应承下来。侄儿林浩才二十出头,在工厂流水线上确实看不到未来,学门手艺是条实在的路。这也提醒了他,自己的困境不仅仅是自己的,还牵连着家人的关切和期望。
挂断电话,书房重新陷入了死寂。
林晨机械地坐回电脑前,右手食指在F5键上悬停良久,最终还是按了下去。页面转了一圈,收件箱依旧空空如也。那种等待审判的焦灼感,像是一根细细的钢丝,勒得他太阳穴隐隐作痛。他知道,在hR的后台系统里,自己或许只是几十个待处理的UId之一,但在他这里,这就是全家人的生计。
翌日清晨七点半,手机在床头柜上发出的沉闷震动,像是一道惊雷,将林晨从浅眠中猛地拽起。
他几乎是条件反射般抓过手机,屏幕的冷光映出他布满血丝的眼。
发件人:迅付通招聘组。
主题:关于您应聘p7高级开发工程师职位的线上技术测评通知。
林晨屏住呼吸点开邮件,每一个字都读得极慢。邮件告知他已通过初筛,邀请他在48小时内完成线上测评。测评限时120分钟,一旦开启便进入倒计时,内容涵盖了算法、数据结构与系统设计三大板块。
“终于来了。”林晨低声自语,手指因用力而微微发白。
猎头Kevin昨天的话在脑海中反复回响:“林工,这岗位的竞争已经白热化了,至少有十几个候选人进了这轮,不少是刚从大厂出来的‘卷王’。”
林晨深吸一口气,胸腔里翻涌着一种久违的、即将踏入战场的战栗感。他很清楚,对于一个35岁的架构师来说,系统设计是他的护城河,但那该死的、纯粹考验脑力反应速度的算法题,却是他最容易折戟的雷区。
他赤脚走到窗边。窗外,深圳的清晨依旧笼罩在灰蒙蒙的雾气中,远处的写字楼群在晨曦中若隐若现,像是一座座沉默的丰碑。
但他觉得,书房里的空气似乎比昨天清新了许多。那种由于长期失业而产生的腐朽感被一扫而空,取而代之的是一种冷冽的临战感。
他再次摸到了战场的大门。这一次,他绝不打算在门前倒下。
妻子苏婉已经送儿子乐乐去幼儿园了,桌上留着温好的粥和包子。他匆匆吃完,将碗筷洗净,然后回到书房——现在也是他的临时作战室。
电脑开机,他先没有点开测评链接,而是强迫自己静坐了几分钟。他环顾这间小小的书房,书架上除了少数技术书籍,大多是他过去十年做跨境电商时积累的各种产品目录、物流手册和早已过时的平台运营指南。墙壁有些泛黄,窗外的天空是鹏城典型的灰白色,远处南山科技园那些玻璃幕墙大厦在朦胧中闪着冷光。
“不能再输了。”他低声自语,点开了链接。
浏览器跳转到一个简洁的测评平台界面,需要开启摄像头和屏幕共享。他按要求调整好角度,确保整个屏幕和上半身都在监控范围内。点击“开始测评”按钮的瞬间,倒计时120分钟开始跳动。
第一部分:算法题。两道,限时45分钟。
第一题是常见的字符串处理变形。题目描述不长,但条件嵌套有点绕。林晨迅速在脑中构建模型,手指敲击键盘,在代码编辑区写下思路注释。刚开始写核心逻辑函数时,他感到手指有些僵硬,思维也不如年轻时那般丝滑。一个边界条件的处理,他竟犹豫了几秒,下意识地想翻看过去的代码库,随即意识到这是闭卷考试。他自嘲地笑了笑,稳住心神,凭借记忆和逻辑推演,一步步将代码补充完整。运行测试用例,前几个过了,最后一个超时。
“时间复杂度高了。”他皱眉,盯着代码。这是典型的“手生”表现——知道问题在哪,但优化方案不能第一时间蹦出来。他花了宝贵的五分钟重新梳理,将一层循环优化掉,再次提交,通过。时间已经耗去二十多分钟。
第二题是动态规划。看到题目的刹那,林晨心里咯噔一下。dp,他当年求职时的强项,也是工作后锈蚀最厉害的技能之一。业务代码写多了,这种纯粹的算法肌肉确实会退化。他尝试定义状态,写出转移方程,却总觉得哪里不对劲。时间一分一秒流逝,额头渗出细汗。倒计时提示音轻轻“滴”了一声,将他从僵局中惊醒。
“不能卡死在这里。”他果断决定,先确保有解。他放弃最优解,用了一个记忆化搜索的暴力思路,虽然效率低,但能保证正确性。代码写完后,测试用例只通过了60%,大部分因为超时被拒。他无奈提交,知道这部分得分恐怕不会高。
第一部分结束,他靠向椅背,短暂地闭了闭眼。挫败感像细小的藤蔓缠绕上来。十年业务开发,让他对数据库设计、接口优化、系统扛并发如数家珍,但面对这些纯粹的算法竞技,他感到了明显的力不从心。这就是市场现实,对35岁以上的程序员,不仅要求经验,还要求你保持如应届生般锋利的算法能力。
休息了三十秒,他进入第二部分:数据结构。两道题,限时35分钟。
第一题是实现一个支持特定操作的队列变体。这次感觉好了很多。数据结构是基础中的基础,就像木匠熟悉刨凿锯斧,哪怕多年不打造复杂家具,工具的手感还在。他清晰地记得各种结构的特性和实现细节,代码写得流畅起来。设计、实现、测试,一气呵成,全部通过。
第二题是关于树结构的遍历与信息统计。他同样较快地完成了核心代码,但在处理一个递归返回值时, initially 犯了个小错误,导致某个分支情况漏算。测试用例报错后,他迅速定位问题,修正,再次通过。这部分的完成时间比规定时限提前了几分钟。
信心回来了一些。他喝了一口早已凉掉的水,看向最后一部分:系统设计。一道大题,限时40分钟。
题目场景是:设计一个支持海量商户实时交易风控的系统。需要阐述整体架构、核心组件(数据采集、规则引擎、模型计算、决策执行等)、存储选型、缓存策略、可能的技术挑战与解决方案。
看到这个题目,林晨的眼睛亮了。这不是他过去十年每天都在间接打交道的东西吗?跨境电商平台的防欺诈、反刷单、支付风险监控,虽然业务细节不同,但核心思想和架构模式何其相似!那些深夜排查线上问题、设计应对峰值流量方案、与风控团队扯皮数据口径的日子,此刻都化成了清晰的脉络。
他活动了一下手指,开始在答题区(一个富文本编辑器,可以画简单框图)奋笔疾书。他没有追求最新最炫的术语堆砌,而是从最基本的“高可用、可扩展、低延迟”要求出发,分层展开:
接入层用负载均衡集群分散流量;数据采集考虑异步消息队列(Kafka)缓冲,避免冲垮处理系统;规则引擎部分,他区分了“硬规则”(实时、简单逻辑)和“软模型”(近实时、复杂AI模型),并给出了可能的部署策略;存储方面,针对不同的数据特性(流水、特征、模型参数、决策结果)推荐了不同的数据库(时序数据库、关系型、KV存储等);缓存用Redis集群,并考虑了热点数据和一致性策略;挑战部分,他重点写了数据延迟与计算延迟的权衡、规则/模型的动态更新与生效、系统监控与降级方案……
他画了几个简单的模块框图,用文字补充细节。思路如泉涌,甚至考虑了一些细枝末节,比如监控埋点设计和灾备切换流程。这不再是考试,更像是一次工作复盘和方案评审。当他写下最后一个句号时,时间还剩五分钟。
他快速从头到尾检查了一遍,修正了两处笔误,然后提交。
整个测评界面变成“已完成”状态。120分钟的倒计时停止在最后几秒。林晨长长地吐出一口气,仿佛刚跑完一场马拉松,精神高度集中后的疲惫感缓缓袭来,但心底却有一种扎实的满足感。算法部分可能拖了后腿,但系统设计,他觉得自己发挥出了应有的水平。
关闭浏览器,他站起来活动了一下僵硬的脖颈。