作者:敖丙
这个故事很长,从游戏boy到offer收割机,从富士康到百度再到微软,国内知名大厂的offer他都拿了一个遍
正文
国庆节的第一天,自习室里已经没有什么人了。窗外,西安的秋天飘一点点雨,坐在电脑前心情十分平静。想在这个难得的闲暇里,想起记录一下自己这些年的经历,也是给自己留一点以后可以回忆的故事。
个人2014年入学,武汉某大学计科相关专业,学科评估200名开外。
大一上学期一门专业课差点挂科,直接奠定了无法保研的局面,开始浑浑噩噩混了两年。除了高数上下,其他能逃的课基本都用来打英雄联盟了。
16年升大三的暑假,一个偶然的机会看到隔壁院的师兄发在群里的一条实习招聘,是武汉富士康招聘软件测试实习生。
暑期岗位,能签实习证明,有班车来学校接送,一天还有220工资。我觉得这是个很好的机会,起码富士康这个厂也算有些名气,能赚个实习经历还有点工资。
我向师兄报了名,简历里面特别注明了大学C语言92分,班级第二。简历通过的还算顺利,也没有面试,直接就让去了。
当时负责的任务主要是Windows 10 SP1的多国版本测试任务,跟我以为的进去的写代码相差甚远,就是个黑盒测试吧,或者再说直白些,就是点点点的无脑操作没什么技术含量。
不过由于是对接外企,所以任务都是英文下达的,有时候翻译还是得花点功夫,英文能力倒是得到些许锻炼。测试需要自己组装机器,选择各型号的cpu和显卡等配件。因为是第一份实习,我学习的非常认真,直到现在我仍然能够闭上眼睛,清晰完整的回忆出一台整机的拼装全过程。CPU的引脚,内存条的金手指和各式各样的SATA线束是那段时间接触最多的东西。
机器点亮后就开始做DASH(从服务器上下载测试版本的系统并安装),然后是激活系统开始对照着测试用例展开测试。差不多两个星期之后,常规的操作已经比较熟练了,任务也显得逐渐无聊了起来。
由于DASH的过程很漫长,我经常会在三楼到四楼的楼梯口望着窗外的太阳,不知道是哪个有趣的同事在窗台用矿泉水瓶养了一个小叶子,我看着这抹绿色总是很舒服。富士康的生活很规律,八点半到工位,五点半出公司,日复一日的装配着各种方案让我在想,以后我要从事这种枯燥但是轻松的工作吗? 想了想还是写代码做需求比较有意思。由于本科学校不太好找工作,而我自认代码能力还可以,所以我决定通过考研来获得一个更好的教育背景或者说,一个让公司能够看上的背书。
大三暑假正值备考,跟我关系不错的老师给了我一个机会,说有个师兄在美团,想把我的简历推给他。我当然很激动,花了一下午的时间准备了一份简历:xx学校,计算机专业,主语言java,曾经做过xx校园app的后端功能以及一个在线OJ评测网站... ...简历发给了老师,一天,两天,一个星期过去了,老师说那边认为简历还是太单薄了,不能发起面试。
那天我感到一阵失落,我以为起码能有个面试机会,结果却是简历都过不了。我对自己的代码水平还是比较有信心,但恰恰是这种信心带给了我更大的失落。我生气的跟舍友说,以后绝对不去美团,他求我去我都不去。这当然是一个大话,只是孩子心气地不肯承认罢了。
考研历时五个半月,还算顺利地通过了初试复试,来到了西安的一所高校开始了研究生阶段的学习。那时候有同学说,一个叫字节跳动的公司能开很高的工资,不过对算法题的要求很高。这也是我第一次听说字节跳动,研究生的课和本科其实没有太大的区别,至少对我来说都是不怎么听的进去的(当然也有部分非常优秀的课程,这是后话了)。但我在课上发呆的时候,慢慢地却不会再去想我要怎么操作我的英雄站在兵线前面干掉对面的玩家,LOL至今都没时间再玩了,时不时看看比赛倒也对青春有个交代。
研究生阶段无聊的时候,一般我会打开牛客网,在上面做几道题目,看着各种计算机网络和操作系统的知识,总觉得自己永远也学不完了。在浏览讨论贴的过程中,我渐渐发现网友会去做一些算法题的训练,一般在leetcode上。我也随之注册了这个网站,全英文的界面让我觉得很有范。
没多久我就决定要开始我的刷题之路,我仍然记得第一题好像是求两数之和,其实这个题目我在备考时的九度OJ上做过,感觉应该难度不算太大,磨了一些边界之后,当一个绿色的Accept出现在眼前,我觉得这种感觉就像是我用XX√√√完成了一局BO5晋级赛。于是我的生活变得更简单了,能逃的课就在寝室和图书馆刷LEETCODE,不能逃的课就在课上刷LeetCode。我尽量保持在一天6+的题量,有时候会做到10+,我喜欢看到登录界面上的绿点连成一片的样子。不过由于课程作业和考试原因,有时候也会中断好一会
我非常清楚的记得在一个下雪的午后,我完成了在Leetcode上的第一百个Accept,那一题调了两个小时,是LRU置换算法的实现。我激动的发了一条朋友圈,拍下100/1300的标记。我觉得我好像会离字节这样的公司近一点了,在刷题的过程中我也会穿插着学习一些计算机网络的东西,主要是为了应付面试。搜索的资料很杂,大部分来自博客和B站。包括在刷题的过程中我看的算法视频也是在B站搜罗的盗版,主讲人是左程云左神,也是我心目中永远的真神。那一版的视频左神的桌面还是齐天大圣飘着红色披风的背影,后来在北京时期我补上了欠左神的正版课,这也是后话了。
研一暑期我也开始投一些公司的实习,我惊奇的发现,大部分的笔试都拦不住我了,反正基本没有因为笔试挂过的公司,也拿到了一个不错的机会,但因为一些原因未能成功去实习。
后来看着同学们都出去了外面的公司实习,我的心里又开始痒痒了,打开牛客网,翻查着有限的实习信息,看到一个爱奇艺的招聘机会。一轮大概50分钟左右的面试,主要是针对OJ项目,后面问到了Java异常机制,泛型的实现,FutureTask的实现思路,以及一些线程池的问题,线程池这个我没用过所以就说不会。当天晚上八点,面试官问我公司在北京,能不能来实习,我想都没想就说地点绝对不是问题,于是我定了第三天最早的一班高铁,花了一天的时间收拾东西,其实我不是为了带走什么,只是要把它们放在朋友那里。我带走的只有一个背包,里面放了两天的换洗衣物,我的各种证件,一小盒谷维素(改善失眠)和一本深入理解Java虚拟机。我觉得做Java的人,这个东西带在身上就很有安全感,有信仰陪着我,虽然我从来也没有翻开过。房子是在高铁上租的,转租的人是个字节跳动的运营,地点就在人大旁边,离爱创大厦很近。
我还记得当时我的leader在做完新手教程后,就过来帮我搬电脑,带我整理工位,简单的交代了一下之后,就慢慢的开始了开发流程。第一次进入大公司实习,第一次来到首都北京,红绿灯前等待的全部都是清一色年轻的面孔,有那么一个瞬间我恍惚地看到,斑马线变成了律动的音符,而这个城市年轻人的心跳就是它的节拍。我喜欢早上骑着师兄传给我的美利达,再放一首Young For You, 我觉得我就是属于这个时代的年轻的人儿。
作为新人,要学习的东西很多,一般我会十点半以后下班。而且我喜欢前紧后松,所以会把心中的工期排的靠前一点。我惊讶于自己学了一年没学懂的Spring框架在公司捣把捣把竟然就能上手一些项目了,这种学习的速度是我从来没有想过的。周末我也会在公司赶需求或者自我学习,累了就去对面吃一个麦当劳甜筒,有时候也会去咖啡厅坐会。那通常是因为我解决了一个困扰很久的Bug.
虽然在爱奇艺的生活很充实,但是心中还是有一份大厂梦。19年的国庆,整整八天我都呆在公司看着各种字节跳动的面经和算法题,只要有一题我觉得我可能不能100%实现,我都会上Leetcode立马把它AC掉。行内的朋友可能知道这是怎样的痛苦,因为一道题有思路和真正稳稳地实现它,中间的差距实在太大了。
7号的晚上,我坐在电脑前,关上所有的页面,打开Eclipse,花一分钟或者几十秒撸了一发快排测试用例直接写在main里,一把过,我关上了电脑回家。这是我自己的习惯,每逢大战,我都会在最后以一个快排收尾,因为当年就是这个代码断了我的保研路。开发的时候我用的更多的是IDEA,但是写算法题我只用Eclipse, 因为算法题对依赖环境的要求很低,基本上有个JDK就足够。而我是个恋旧的人,所以我把自己最擅长的方面,留给我的老朋友Eclipse。结果并不像过程一般顺利,也不是每个幸运都会眷顾努力。
12号一天两个公司面试,分别在早上10点和晚上7点开始。紫金数码园成为了我永远的痛,我记得他们问的都是比较深入的问题,诸如TCP,UDP能不能绑在同一个端口,Java的线程底层是如何实现的,TCP和IP的详细报文结构,报头,进程切换的上下文到底包括什么,哪些寄存器,CFS算法如何实现的等等。最后我实在烦了,我说我就不会操作系统,他又问了个字符串匹配算法,我给他详细的讲了KMP的实现,然后他让写个树的深度遍历。我火一下子上来了,我觉得你可以挂我,但是不要用这种简单的东西来拖一下面试时间让我体面的离开。我就说:这个东西太简单了,我不想写,你可以问个难点的。他让我写Linux的定时器算法,我想了很久,没想出来,事实上我都没听过这个东西,自己设计了一个类似哈希表的结构希望来存放这些定时任务。他表示摇头,我知道今天就到这里了。现在回想起来,我并没给到面试官足够的尊重,多少年少轻狂了点。直到最近这个月,我开始认真的阅读深入理解Linux内核,才明白当时我到底错在哪(当然时间轮算法是我在第二天就去看了的)。
字节跳动的面试是在晚上,七天的努力好像什么效果也没有,因为我准备的面经基本一点也没被问到。走在中关村大街上,我觉得今天有点格外的冷,只能把耳机的声音调的再大一点,宝石老舅的Disco让我的情绪稍微得到了一些缓和。
细心的朋友可能发现,那天的面试有两场,这个机会说来很巧,我某次跟同学提到我想换个更大的厂,她说百度给她打过电话面试,是个私人号码,她自己已经有公司了所以不想面试。我意识到这是个机会,我直接把号码拨过去,询问对面是不是需要招收实习生,表明了自己的学校和来意,希望对面能安排一个面试机会。答复是肯定的,我特意要求在跟字节同一天,这样子免得我需要频繁请假,所有才有了一天之内字节和百度的两次面试。
来北京的第一个星期我就去拜访过百度大厦,西二旗地铁的一侧静静躺着一个熊掌,当我近距离看到这个标志的时候心中翻起的是澎湃和向往。
不过这次的面试在百度科技园,如果说大厦给我的感觉是大气,那么科技园就是真正的气势恢宏。回字型的无限大标志由七栋大楼构成,K2和K1的连廊接在三楼,直接跨过了一个双向车道。面试的整体过程比较顺利,给我的面试体验也非常好,面试官会针对我简历上的技术栈由浅入深的进行询问,有些原理还会给我讲解。三轮面试一共做了四个题,刚好打在了我的强项上。分别是最短编辑距离,最长回文字符串,变态跳楼梯和树的最长直径。我把这些题全部通关,中间还在百度食堂吃了个饭。面试耗时3个半小时,到我出公司的时候已经是下午两点半了。
我非常感谢百度,不仅仅是因为它给了我实习的机会,更多的是对我这样一个要强的人来说,一天内连续挂掉两家公司的局面可能真的是无法接受的。特别是字节的面试让我觉得毫无还手之力,在这种情况下,熊度就显得格外可亲。
进入百度是一个新的开始,我需要做的事情很多:学习一门新的语言,学习服务器上的开发,学习百度的一些内部工具以及...学习使用Mac。在这些需求里面我直接砍掉了Mac的学习,把重心放在了语言和Linux上,具体的做法是我向Mentor提出把Mac换成ThinkPad。我Mentor奇怪地跟我说:大部分人都是Windows本想换Mac,很少有你这样Mac想换Win的,我就笑笑说我时间不够用。其实很巧的是我的Mentor也是ThinkPad,而他的技术非常强,是我们组绝对的实力担当 ,我觉得我技术路线的尽头应该就是我Mentor的样子。
白天我看公司内部的各种文档,八点半下班以后我会花两个小时看Linux视频,并且做一些笔记,因为我觉得在工作时间看视频总给人一种在偷玩的感觉。
十点的西北旺还是灯火通明,出了科技园会看到旁边的网易,新浪和腾讯北京。我顺着腾讯的大楼先走到马连洼地铁站,回中关村的地铁一共要倒两趟,然后再从苏州街走回人大。通勤时间大概在一小时四十分钟,所以到家一般都是十一点多了,我经常会在楼下的KFC买个吮指原味鸡或者鸡米花,静静地坐着吃完再回去洗澡睡觉。期间我也想过换个住处,但是想了想,现在的房子地段很好,各种生活用品和娱乐都很多,西北旺那片还是有些冷清,还是算了。还有一个原因是我特别喜欢人大,我在任何一个地方租房都喜欢租在学校旁边,校园的景色和人文气息都让我很舒服。
在百度的周末我一般也用来学习,通常是花一天的时间看Linux,另外一天去公司看文档。我看的书是Linux编程手册,这是我一个大牛同学推荐给我的,他初中就开始玩Linux,在社区比较活跃。很难想象我这么一个不爱学习的人能静下心来看一本大部头的书看一下午,最深的原因是,我在北京有个漂亮的女同学,我一般都会喊她陪我在她们学校的自习室看一下午,然后去吃个饭看个电影啥的。如果这我都看不进去的话,那我真的不知道该说对不起谁了。
那段时间可能是我在北京最快乐最回忆的时光,每当地铁报站到了芍药居的时候,我都会有些悸动。我们一起去过中关村的店,后海的店,印象最深的是第一次在万泉河的一家西餐厅。那天她穿黑色的裙子,化了妆,坐在西餐厅的白色桌布前。我直接想到了十年以后,天是那么蓝,花静静躺在路边,我觉得我一定要好好写代码,成为一个厉害的人因为... ...这样规律的日子我过了大概有三个月,也是我在百度呆的大半时间,我每周最大的期待就是周末可以看书的时光,因为去别人学校学习知识当然让人快乐啊。
百度楼下的蛋糕店有很好吃的慕斯蛋糕,有时候我会六点就下班,然后大概一个多小时通勤给同学带一个吃,因为这个蛋糕到六点以后基本上就买不到了。不过很认真的说,我能坚持看Linux很重要的原因也是在字节的面试给我的打击太大了,让我认识到我在Linux这块就是一片空白。并且工作中确实遇到了相关的问题,有一次我做了一个定制化的HDFS上传程序,fork的时候在父进程中没有wait,导致服务器上产生了大量处于僵死状态的进程。这些进程的执行流已经结束了,可是由于父进程未对它们进行最终处理,导致进程号一直被占用,久而久之可能会影响到服务器上其他进程的pid分配。还有我们的HDFS资源比较有限,处理的数据量很大,大家的MR任务和Spark任务都在一个HDFS空间上,细碎的文件很多导致INode被占用的很严重,有时候还有磁盘,却没有足够的INode能分配了,导致任务执行失败等等。
后来这种类似的问题我都在Linux编程手册中找到了对应的知识点,也让我越来越认识到它的重要性。差不多两个月之后,我对Python和服务器上的开发已经有了一点点认识了,也开始接了一个新的项目。这个项目在工作计划上的执行人其实是我Mentor,不过他比较忙,我看了下这个活应该可以做,我就接了下来。项目的具体内容在此不方便多提,但是这个项目让我真正的接触到了很多开发中的交流,合作,踩坑,出坑,设计等等等等。印象最深的是来自Google响应报文里面一个隐式编码的问题,Chunk协议在一些报文中会被使用,用作数据交流格式的标准。Google的响应报文中使用了这种编码,却没有显式地声明出来,我在对报文进行了DOM树构建和重写之后,改变了报文的字符数,而Google用一个16进制的数字声明了这个长度。这个细节直接导致所有被我篡改的报文均不能在浏览器端被正常解析,表现为无限等待的界面。这个Bug我足足改了七天,中间有一天我已经无限接近这个答案了,我把一个疑似表示长度的十六进制数进行了还原,想看看它是否指代长度。坑爹的是在服务器上看到的长度是字节数,中间涉及到编码的问题,而这个16进制数指代的是字符数,中间的差值让我一直不敢确定这个是代表长度(其实就算知道了也不可能改对,因为中文字符的字节数在UTF-8下是不同于字符数的)。在这个开发周期中我熬过最多的夜就是这个时期了,以至于之后的需求性开发我都很轻松的完成,因为我觉得应该没有比这个Bug更加难弄的情况了(中间还有其他的问题,比如URL编码异常,Gzip的隐式刷流,开源库的DOM化缺陷,但是这些慢慢处理就好)。
这期间最让我印象深刻的是在我解决了这个问题之后一天的晚上,隔壁组对接的开发过来问我的经历,工作多久了?经理哈哈大笑,说“怎么样,xx牛*吧”。隔壁的开发说确实很不错,我经理又补了一句“xx是我们的实习生”,隔壁的开发惊讶了说“我以为xx都早工作了”。我全程背对着他们,那一刻我靠在椅子上,他们看不到我嘴角咧起的笑。我很喜欢看程序员生涯记录之类的小说,《疯狂的程序员》里面这样子写道“很多时候,我们开发一个项目,做一个需求,加班,熬夜,干耗,不是为了赶某个工期,或者是任务完成后领导给的拿一笔钱,更重要的是,我们享受这种克服万难,成人所不能的感觉,这种感觉跟钱是不一样的东西”。正是这样子的瞬间,让我在程序的世界里真正的发现了自己。
故事直到这里,好像都跟微软没什么关系,可能有些朋友很想看如何去微软的过程,但是我个人觉得此处实在是乏善可陈,同时这个事情本身也没那么重要了。一月下旬我从北京回湖北过年,没几天就遇到了疫情,在老家被辗转着隔离,家里也有亲人感染,可以说整个二月都是在隔离中度过。心里的压力更多来自对亲人健康的关心,到了二月中旬,情况渐渐好转,基本处于康复期了,恰逢学校群里有人发布微软春季实习生招聘,我就发了简历。二月下旬开始,我在隔离的地方用手机开着热点,抱着公司的ThinkPad开展了新一轮的征程。
实习期间大量的开发任务确实很难抽出时间做这种集中式的复习,这次刷题我的目标很明确,牛客上的剑指Offer和LeetCode148一题不漏全部写完。其实之前已经实现了大概80%,但是剩下的20%无疑是更加麻烦的,中间穿插着各种DP的训练,还是老规矩,AC才算过。刷累的时候会去整理在爱奇艺和百度的项目,它们的需求点,难点和结果。
第二天起来吃完隔离点送过来的早饭就开始写,直接在记事本里面开始进行实现,然后微调了下,过我自己的case,没啥磕绊就完成了。
后面的微软面试一共做了五个题,最后一面的leader说我对边界条件的分析很到位,是她今天面试的所有人里面最全面最准确的,我当她给了个好消息吧。同年的四月,我在师弟的帮助下,再次进行了字节跳动的面试,一下午三面过关斩将,也在不久之后收到了字节跳动的意向书。
坦白来说,这个时期的我心中已经没有了什么波澜,不会特别高兴,也不会再对哪家公司产生特别的展开追逐的那种意愿。一来我已经呆过好几个公司了,那种大公司的憧憬和新鲜感对我而言已经没有那么大的吸引力,同时我也开始认为,一个程序员,他的目光不应该全部放在对哪家公司的追求上。
第一,我们服务于我们具体的业务和相应的技术,具体的业务是比公司这种平台性的东西更加值得讨论的。
第二,追求公司的本质是希望自我的提升,在这种前提下更应该把精力放在如何精进自己的技术水平上,因为公司本身并不能成为一个努力的方向和路线,它只是一个结果。
最后,又是一年的国庆,还是坐在电脑前。闭上眼睛,一路的回忆像浮光般掠过眼前。我喜欢看别人故事的原因是,几千个字的篇幅其实写尽了这个人很长的一段经历,浮浮沉沉,故事中的低潮可能在几行文字中就轻描淡写的过去了,读者喜欢去看走出这个低潮再见阳光的感动,其实对这个人来说,这一段恰恰是最难熬最难经历的一段。我们看着故事中的人,好像自己也会离开这样的谷底。
真实的说,这个故事中应该花大篇幅描述的难过我都略去了。许多面试时候被否定的环节,被问到哑口无言的时刻,一道题一个Bug困整整一个下午的纠结,二月新冠疫情落在家庭的恐慌,隔离时期对于家人的担心,老家甚至没有Wifi的手机热点面试,包括出来实习需要顶住的学业压力。我把这个故事记录下来,是因为我喜欢《疯狂的程序员》里面的绝影,Boss绝,我想成为他那样的程序员,一个执着于代码,纯粹于代码的程序员。
本科期间我有些想做的事情未能完成,大三的时候武汉一个比中兴还低的本地的国企IT公司我都觉得很不错了,而时至今日我已经去过好几家大型互联网公司实习,拿遍了头部互联网的Offer,亦或者去到微软。这些东西其实我在那时候并没想过,但是我也更加没想过绝对到不了今天。
在晚归的中关村大街上,我经常会想到一首歌《奉献》,这是电影[飞驰人生]的主题曲。长路奉献给远方,岁月奉献给季节,我拿什么奉献给你。我们经常提起奉献,却很少真正理解奉献的样子。对啊,到这一步,做到纯粹,更多的是热爱带来的奉献,我不是要执着于哪个Boss,或者执着于哪个公司,我是执着于我所热爱的程序,我所热爱的行业。因为热爱,所以我不计回报,所以我做到比自己更多一点,因为喜欢,所以回忆里更多的是那些奉献与努力的时刻。再回望去年随便收拾了两件衣服就踏上北京的自己,有些面试官听到我这个经历的时候会先大笑一下,然后说这样子是否有些冒进。也有些面试官因为这个性格将我挂掉,但是我已经过了那种因为别人评价感到疑问的阶段。
如果再给我一次机会选择,或者说再给我一百次机会选择,在爱奇艺的那个电话里给的回复也还会是YES。因为年轻,就是有无限的可能,青春就是不设限的。阿里的招聘页面上有句话:If not now, when? If not me, who? 官方给出的翻译是“此时此刻,非我莫属”,我觉得差点意思。时不我待,舍我其谁。
2020年10月3日于西安
链接:https://zhuanlan.zhihu.com/p/266894961
来源:知乎
本站内容未经许可,禁止任何网站及个人进行转载。