十五:跳槽涨薪的陷阱
新公司入职的第一个月,阿水又回到了那种熟悉的状态——坐在工位上,对着不熟悉的代码,假装自己看得懂。办公室比上一家大,工位也宽敞一些。他的座位靠走廊,旁边是一扇落地窗,窗外的视野能看到隔壁楼的天台。天台上有几台空调外机,嗡嗡地转着,铁皮外壳被太阳晒得发白。带他的人叫老曹,三十五六岁,说话慢,做事也慢。他给了阿水一份代码,说:“你先看看这个模块,下周有个需求要改这里。”阿水打开那份代码。上千行的文件,各种类之间的调用关系像一张网。他从第一行开始读,读到第二十行的时候已经不确定一个变量的值是从哪传进来的。他又读了一遍,还是没看懂。他把代码关掉了。然后重新打开,从中间部分开始读——找一个看起来像入口的方法,从那里往下追。追了几层调用之后,他发现自己在同一个地方绕了两圈。他坐在那里,手指放在键盘上,屏幕上开着那堆他没完全看明白的代码。他能感觉到空调的风吹在自己的后颈上,凉凉的,带着一股机房特有的气味——电路板散热的气味和灰尘混在一起的气味。他花了三天时间才把那个模块的流程大致理清楚。第四天开始改需求——一个很简单的改动,加一个字段的校验逻辑。他改好了,提交了,老曹审查之后退回了一次,说“这里的异常没处理”,他又改了一次,再提交,这次过了。阿水知道这个“还行”是什么意思——不是“你做得很好”,是“勉强能用,没出大问题”。他接受了这个评价。在这个行业里,“还行”已经是一个能让你继续干下去的评价了。这一次跳槽比第一次更熟练。简历上多了一年的经验——项目描述写得比以前更像那么回事了,技术栈那一行也多了几个词。面试之前他花了三天时间背题——跟上一次一样,从网上搜最新的面试题,打印出来,背到能流畅地说出来为止。面试的时候,面试官问了一个问题:“你遇到过最复杂的技术问题是什么?”阿水已经准备好了这个问题的答案。他从上一个项目里挑了一个真实发生过的问题——线上环境偶发性的查询超时——然后把它说得比实际情况复杂得多。“排查了很久,最后发现是数据库索引失效导致的。因为数据量增长之后,原来的索引分布不合理,查询计划走了全表扫描。”他说的时候还加了一个细节:“当时的解决方案是重建索引,同时优化了查询语句,加了覆盖索引。”这套话他提前准备过,背过两遍。说出来的时候很流畅,像是真的经历过一样。但事实是——那个问题当时是他隔壁组的同事解决的,他只是听说,知道个大概。阿水拿到了offer。薪资比原来高了百分之二十五。他坐在新公司的工位上,打开新的开发环境,配置新的项目代码。流程跟上一次一样——找hr领电脑、配网络权限、加公司群、看文档、熟悉项目。一切都很顺利,很熟练。他不是第一次做这件事了。但他在配置环境的时候,注意到了一件事:他旁边工位上坐着一个看起来跟他差不多大的人,正在调试一段代码。那个人打开了一个源码文件——不是项目代码,是框架的源码。他在读Spring的源码。阿水看了一眼,把视线移回来了。他从来没有读过任何框架的源码。他知道那些框架是怎么用的,用过很多次了——配置、注解、调用——但他从来不知道那些框架内部是怎么工作的。他觉得那不属于“会用”的范畴。能用,就够了。那个人看起来也没有多厉害——戴着黑框眼镜,穿一件灰色的卫衣,喝一口咖啡,敲几行字,翻几页源码。动作不快,但很稳。像是一个在认真做事的人。阿水转回自己的屏幕,继续配置环境。他没有去读源码。他打开了项目文档,开始看自己接下来要改的那个模块。这一年里,他的工作方式已经形成了固定的模式:接到需求,找到对应的代码位置,照着现有的写法改,改完跑一下测试,没问题就提交。他不设计架构——架构是别人搭好的,他在上面加东西就行了。他不做复杂的技术决策——遇到不确定的地方就问老员工,老员工说怎么改他就怎么改。他做的所有事情,都是在别人铺好的路上走路。不需要开山,不需要铺路,只需要跟着走,不掉队就行。一次是线上环境的内存泄漏。系统运行两天之后开始变慢,三天之后基本不可用。重启之后恢复正常,再过两天又变慢。运维的人查了监控,发现内存占用在持续增长,没有回落。这个问题被分配给了另一个同事。阿水看到那个同事花了一天时间排查——打了堆转储,分析内存中的对象分布,找到了一个没有被正确释放的缓存。那个同事修好之后,在群里发了一段简短的说明:“XX缓存没有设置过期时间,数据持续累积导致内存溢出。已添加淘汰策略。”阿水看完了那段说明。他大致知道那个同事做了什么——堆转储、内存分析、对象分布——这些词他都听过,但具体怎么操作,他不确定。他没有问。他觉得这个问题不是他该关心的范围。他的工作是写业务代码,不是处理这种底层问题。他继续做自己的需求。那个内存泄漏的问题被修好了,系统恢复正常。没有人再提起这件事。但他心里有一个声音,很轻的,像一根针掉在地上那么轻——它说:如果这个问题分给你,你解决不了。他没有回应那个声音。他把注意力集中在屏幕上当前正在改的那个页面上。页面上有一个表格的样式不对,他要花点时间调一下css。这个他会。第一次是培训完的那家小公司,待了十三个月。第二次跳到一家中等规模的,待了十一个月。第三次跳到一家更大一点的,已经待了将近一年。薪资也从最初的数字,翻了一番。他算过一次:三年前的自己和现在的自己相比,每个月到手的数字翻了一倍。对于他来说——C市县城出身的人,曾经在工厂干了两个多月就跑掉的人,曾经在别人家沙发上睡了半年的人——这个数字已经远远超过了他刚毕业时能想象的最高点。他甚至觉得这个数字有些不太真实。他不认为自己真的“值”这个价。每次发工资的那天,他打开银行的app,看到那个数字,心里都会闪过一个念头:这个月又混过去了。然后他把app关掉,继续上班。他不敢停下来想。一旦停下来,他就会开始想那些他不想面对的问题——架构设计,他不会。框架源码,他没读过。复杂性能问题,他解决不了。分布式系统,他只听说过概念。数据库优化,他只会加索引——加了没用就不知道怎么办了。他在面试时说的那些“项目经验”,每一段都有水分。那些“主导”、“负责”、“设计”的动词,背后的事实是:别人主导,别人负责,别人设计。他只是在那个项目里写过代码——写过那些不复杂的、跟着别人的设计走的业务代码。如果把那些水分挤掉,他的真实能力大概只相当于一两年的初级开发。但他的简历上写着“三年经验”,他拿的薪资也是“三年经验”的水平。他知道这是一层包装纸。纸下面的东西没有那么好看。但只要包装纸没破,就不会有人拆开来看。一个说:“我最近在看Kafka的源码,想把消息投递的那块逻辑吃透。”另一个说:“我在看那本《高性能MySQL》,之前项目上遇到过几次慢查询,感觉这块得补一补。”两个人聊了大概十分钟——聊的是他们最近在读什么书、在研究什么技术、在尝试什么新的优化方案。语气很平常,像在聊周末做了什么。阿水站在饮水机前面,手里的杯子已经接满了,但他没有马上走。他站在那儿,听完了那十分钟的对话。两个人口中说出来的词——Kafka源码、索引优化、分布式事务——他都知道,但都是知道名字,不知道里面到底是什么。他端着水杯走回工位的时候,脑子里有一种说不清楚的感觉。不是焦虑,是一种更平的东西——像是一面湖水,表面是平的,但你知道湖底很深,而你站在湖面上,脚够不到底。他坐下来,打开屏幕。桌面上有几个文件夹——项目代码、需求文档、技术资料。技术资料那个文件夹里装的是一些他收藏的博客文章和教程链接,大部分打开过一次之后就再也没看过。他把那个文件夹点开,滚动了一下,看到那些标题:《Spring Boot 原理深度解析》、《MySQL 千万级数据查询优化实战》、《Redis 核心数据结构与使用场景》。每一个标题都让他觉得“应该看一看”,但每一次他都点了叉。不是因为不想学。是因为那些文章一打开,看了几段就出现了一些不太懂的概念,他就关掉了。那些概念他要去查,查了又要花时间,时间花出去了又不确定自己能不能真的搞懂。这个路径在他脑子里形成了一个循环,每次走到同一个地方就停住了。没有人的时候,茶水间里只有空调的低鸣声。窗外是秋天的太阳,和隔壁公司玻璃窗反射过来的光。空气中漂浮着被阳光照亮的细小灰尘,它们缓缓地上下浮动,像是在空气中游泳。跟他在同一家公司、同一年入职的几个人,在两年之后,各自的方向已经变得不一样了。一个人用了大量业余时间啃完了某个中间件的源码,开始能在团队里做一些底层问题的排查。另一个人把数据库这块啃得比较深,慢查询优化、分表分库、读写分离——这些东西他都能讲清楚。第三个人没什么专攻的方向,但做事扎实,每一行代码都写得很稳,交出去的东西很少被打回来。这三个人有一个共同点:他们在同一个地方待了两年,没有跳。阿水看着他们,再看自己。三年三家公司。他没有任何一个方向比别人深。他做的事情,换一个人来做,不需要太多适应时间。他写的代码,放到任何一个初级开发手里,也能写出来。他像一块在水面上漂着的木头,没有扎进水里。风往哪吹,他就往哪漂。速度看起来不慢,但他从来没有在水面以下待过。他开始注意到一个以前没想过的问题:跳槽涨的只是薪资,不是能力。每一次跳槽,薪资确实涨了。但能力呢?他在上一家公司做的事情,和在这一家公司做的事情,本质上是同一级别的事——换一个项目,换一个业务领域,但技术复杂度没有变化。他只是在不同的地方,用同样的水平,做着同样的事。他把这个过程叫做“经验的横向复制”——把同一个级别的工作经验,拿到不同的公司去复制一份。每一份复制都让简历上多一行字,但能力没有往上走一层。而他的那些没跳槽的同事,在同一个地方扎了三年,已经往深处走了两层。他停在原地,薪资翻了一倍。别人往前走了,薪资涨得没他快,但他们手里有他拿不出来的东西——一个能说得出口的技术方向,一种能独立解决复杂问题的能力。他不知道哪个选择是对的。但他知道,如果三年后他来面试现在的自己,他可能不会要自己。有一天晚上,他加班到九点多。办公室里的人已经走光了,只剩下最后一排还亮着一盏灯。那是那个在读Spring源码的同事。他还在。阿水收拾东西准备走的时候,路过那盏灯。那个同事戴着耳机,屏幕上的代码页面分成两半——左边是源码,右边是他在写的测试代码。他的表情是专注的,不是那种被工作压着的专注,是那种真的在钻研什么的时候才会有的表情。那盏灯下的人没有注意到他。屏幕的光照在那个人脸上,蓝白色的,很安静。阿水转身走进了电梯。电梯门关上之后,楼层数字一格一格地往下跳。他看着那些数字,脑子里浮现出一个画面——一个人在一个地方待了三年,同一个方向,同一套技术栈,同一台电脑。三年之后,那个人成了一个在这个方向上能独当一面的人。而他自己,三年三家公司,每一家都是新环境、新项目、新同事。每一次都在重新适应,重新熟悉,重新走一遍“从陌生到勉强能干活”的过程。他走了三个起点。别人在一个起点上待了三年,已经跑过了三公里的路。他走出写字楼的时候,外面的风是凉的。街上的车已经不多了,路灯把路面照成橘黄色。他站在门口,风把他的头发吹乱了一些。他拉了一下外套的拉链,往地铁站的方向走。地铁站里人不多。末班车还有一会儿。他站在站台上,看着轨道尽头那个黑洞洞的方向。风从隧道里吹出来,带着一种地铁特有的气味——铁轨的金属味和电流的焦味混在一起的气味。一个人站在跑步机上。他的腿在动,他的呼吸在加快,他的额头上在出汗。从外面看,他确实在跑。但如果有人把他的跑步机电源拔掉,他就会发现——他一直在原地。他跑了三年,速度不慢,姿势也像那么回事。但跑步机的电源插头插在一个浅薄的位置上。他看起来在跑,但其实没有前进过。他知道他不是唯一站在跑步机上的人。这个行业里有很多人都在跑步机上跑着——在不同的公司之间跳来跳去,薪资涨了,头衔变了,但能做的东西没有变。大家跑得很卖力,但没有人停下来问自己:我到底往前走了没有?地铁来了。车门打开,车厢里空荡荡的,只有零星几个人坐着。他走进去,找了个靠门的位子坐下。列车启动了,窗外的隧道壁开始向后移动——黑色的混凝土墙,每隔一段有一盏昏黄的灯,灯与灯之间的黑暗段落,像某种固定的节奏。三年了。他的工资翻了一倍,他换了三家公司,他在不同的写字楼里坐过三张不同的工位。他学会了怎么包装简历,怎么在面试时流畅地说出自己并没有真正做过的事情,怎么在技术上“够用就行”。他也学会了一件事:那些真正的差距,纸面上看不出来。纸面上,他有三年经验,熟悉主流技术栈,参与过多个项目。纸面上,他看起来跟任何一个三年经验的开发差不多。但纸面下的东西——架构能力、源码理解、复杂问题排查的经验、系统设计的能力——他没有。这些东西不是靠跳槽能跳出来的。它们是靠时间、靠专注、靠在一件事情上反复打磨才能沉淀出来的。他有的只是三份不同的工作经历,和三段重复的、没有深度的代码经验。列车报站的声音响起来。下一站是他要下车的站。他站起来,走到车门前面。车门打开,站台上的冷风灌进来,吹在他的脸上。他走出车厢,沿着站台往出口的方向走。通道里很安静,只有他自己的脚步声和远处另一个人的脚步声,在不同的节奏里交错着。他在这个行业里听到过很多次。有人跟他说过要在某个方向深耕,但每一次他都选择了另一条路——那条看起来更快、更轻松的路。三年之后,他确实走得更快了,但他看了看脚下,发现自己还在表层。地面上的人看他,觉得跑得挺快。只有他自己知道,脚下的土很浅,踩下去就是硬底。他在搬砖。不是比喻——是真的搬砖。把一块砖从A搬到B,再从B搬到C,再从C搬到A。搬来搬去,砖还是那块砖,他的手上多了一层老茧,但他的技术没有多一层深度。别人在积累。他在重复。重复同一级别的事情,在不同的公司里。他把这个区别想得很清楚,就在那个安静的、只有脚步声的通道里。他没有停下来,没有靠墙站一会儿。他继续往前走,因为出口就在前面,能看见那个亮着白光的出口了。他走出去。外面的风比地铁站里凉一些。街道上空荡荡的,路灯的光在地面上铺开,像一层薄薄的金色糖浆。远处的路口有一辆车在等红灯,尾灯亮着红色的光,在夜色里格外显眼。他走在人行道上。口袋里的手机震了一下。他掏出来看了一眼——是银行发来的工资到账通知。那行数字,三年前他觉得遥不可及的数字。他知道这个数字是跑步机上的数字。它看起来很漂亮,但它没有让他离任何地方更近。