前言
是去美团送外卖了?有配电瓶车吗?
答:亲,有配的哦,开起来贼顺滑。啊呸,说啥了,咱进的是正儿八经的技术部门。
正文
咸鱼的现状
时光回到2017年2月初,当时刚过完年回到上海,此时的我已经毕业一年半了,和大多数咸鱼一样,上班就是CRUD,下班就是看剧、玩游戏(英雄联盟、手游都玩)。
当时我的工资一个月到手就5k出头,但是因为在甲方驻场开发,加上差补餐补有接近8k,还包住。每到周末几个小伙伴一起打牌、一起搞情、一起洗脚,日子过得很是滋润,当时其实挺满足的。
咸鱼的自我救赎
让我萌生想跳槽的根本原因已经忘了,想了很久没想起来,可能是受其他小伙伴的影响吧,有了这种想法后就开始准备起来了。
刚开始只是每天下班后躺在床上看别人的博客学习一些东西,一般是22:30看一小时左右,当时最先看的是线程相关知识,就是类似于:创建线程的几种方式、Future 的使用、线程池的使用,等等这类比较基础的知识。
想跳槽的想法有了之后便一发不可收拾,如果说刚开始每天晚上看1小时只是在试探,那么半个月之后我便全力投入面试准备了。
当时工作上的事情不是很多,每天花个两三个小时基本就能应付了,所以其余的上班时间我都拿来准备面试了。准备面试的方式主要通过看别人的博客、看源码,内容主要是 Java 核心知识和 Java 面试题。
从二月初准备到了三月底,这期间我主要干了以下几件事。
1.看面试题
这期间我看了很多套 Java 面试题,还记得的有:
- Java面试题全集(上)(作者:骆昊)
- 各大公司Java后端开发面试题总结(作者:qinjianhuang)
- 面试心得与总结---BAT、网易、蘑菇街(作者:Xoper.ducky)
- 关于Java面试,你应该准备这些知识点(作者:占小狼)
很重要的一点,看题要带着理解、带着思考去看,将题目与实际开发的内容结合去理解,这样很容易就记下来了,死记硬背效果不好。还有看面试题不能只看一次,需要反复看,就像你高中准备考试那样。看完这些面试题后,我能很自信的在我简历写上了:
- 具有扎实的Java基础,对面向对象编程有深刻的理解,熟练掌握IO流、集合、多线程、反射机制等。
- 对Java虚拟机、垃圾收集机制、CAS乐观锁技术有一定的了解,对Volatile关键字有一定的见解。
对于JVM这听着就高大上的东西,当时我能做的就是带着理解把下面这几道题目背的滚瓜烂熟,在此之前我压根就不知道JVM。
- 介绍下垃圾收集机制(在什么时候,对什么,做了什么)。
- 垃圾收集有哪些算法,各自的特点。
- 类加载的过程。
- 双亲委派模型。
- 有哪些类加载器。
就这5道题目,不能再多了。在当时的面试中无数次被问到,我都能很自信的答出来,帮我在面试官心中加了无数的分,估计面试官还以为我对JVM有所研究,整个人的逼格顿时就上去了。
对于背面试题,我只能说两个字。
2.源码初探
在看完上面的面试题后,已经能应付很多问题了,但是好像还缺了点什么?没错,就是能让你装逼的源码。当时我选择了常用集合的源码,当时我这菜比也只能选这个了:ArrayList、LinkedList、HashMap 等等,基本都是边看源码、边对着别人的博文跟着一行行的学。在学习 Java 集合源码时,对我很有帮助一些文章是:
- zhangshixi 的 Core Java 系列文章
- 五月的仓颉 的 Java集合框架 系列文章
看完这些源码后,我把它们全写到简历里去了,因为这是当时我觉得自己为数不多的亮点了。
- 深入学习过HashMap、ArrayList、LinkedList、ConcurrentHashMap、LinkedHashMap等常用集合的源码。
这些源码的准备也基本全用上了,类似于“ArrayList 和 LinkedList 的区别/比较”这类问题,我都忘了被问过多少次了。
在回答这个问题的时候,我最初的回答比较中规中矩:
1)ArrayList底层基于动态数组实现,LinkedList底层基于链表实现
2)对于随机访问(get/set方法),ArrayList通过index直接定位到数组对应位置的节点,而LinkedList需要从头结点或尾节点开始遍历,直到寻找到目标节点,因此在效率上ArrayList优于LinkedList。
3)对于插入和删除(add/remove方法),ArrayList需要移动目标节点后面的节点(使用System.arraycopy方法移动节点),而LinkedList只需修改目标节点前后节点的next或prev属性即可,因此在效率上LinkedList优于ArrayList。
后面被问多了,就会加一些自己的思考。例如:
当 ArrayList 是顺序插入的时候,由于不需要移动节点,因此在效率上并不会比 LinkedList 差。
自己深挖过(例如看过源码)的知识点被问到时,一定要抓住机会表现,让面试官感受到自己的深度,这些都是加分的点。
3.项目准备
除了技术知识外,项目也是必不可少的一环,但是不需要准备很多,只需要挑2-3个你最牛逼的需求点准备就行了。我当时找了很久,就找了这么几个很 low 的点:
- 定时将百万行级别的文件进行下载、读取数据、插入数据库,并进行一些业务操作。(其实就是NIO读取,多线程都没开,整个处理要一两个小时...)
- 使用多线程处理通过Excel导入的数据。(就开了个线程异步处理...)
- 批量处理通过Excel导入的数据。(好像就是个批量插入数据库...)
第2和第3点其实就是来凑数的,打扰了。
面试过程中主要帮我扛过项目这一关的主要还是第1点,毕竟也是涉及到了百万级别的数据,哈哈。其实当时我对于NIO也是一知半解,也就是看了一些博文,会基本的使用。
还记得当时做这个需求的时候还挺痛苦的,做了好久。但是真正到了需要用的时候。
这也是我很想传达的一点,项目中遇到难题时千万不要总想着退缩,这些解决难题的过程、解决的难题,都会让你快速成长和受用终身。
这些内容就是我开始面试前的全部准备了,从2月初到3月底,差不多准备了1个半月,当时的简历是这么写的。现在看起来有点 low,但是当时已经是我的极限了。
咸鱼修炼出山
准备好了之后就是疯狂投递简历了,各种知名的招聘网站都要去投,也没有什么挑选的说法(唯一可能就是尽量选互联网公司,还有就是像阿里腾讯这种大公司,咱是不敢投的),只要是招2年 Java 的投就完事了。只要能给个面试机会,咱就得谢天谢地了。
很多很多的投递都石沉大海,但庆幸的是在海投之下,还是拿到了不少面试机会,当然大多都是听都没听过的公司。
偶尔收到一些稍微有点名气的公司面试邀请时,心里真的乐开了花,可以对着这封邮件反复看好几遍。
面试之前给自己定了个目标——13k,每次hr问我时我也就讲13k-15k,高了不敢喊,心虚,觉得自己就是个垃圾,根本不值这个钱...
从3月底面试到了4月底,总共面了20来个公司。基本是每天2个面试,上午下午各一个。早上室友还没起床,我就已经出门了。早餐都是在三林东地铁站附近的巴比馒头解决的;午餐就在面试公司的附近找家麦当劳解决。那段时间每天在路上奔波的时间至少四五个小时,但是完全不觉得累,整个人对未来充满了希望。
也多亏了这一个月的面试时光,我走过了上海的很多地方:漕河泾、张江高科、唐镇、人民广场、陆家嘴、中山公园,之前在上海呆了2年去过的地方还没我面试期间去的多。
差点 FirstBlood
第一天下午面了链家网,当时面了两轮技术面,每轮两个人,除了一些技术问题外,问了很多场景题,比如:用户来链家网看房,怎么推荐合适的房子?服务器突然CPU彪高怎么排查?
这些都是我没准备过的问题,当时只能随机应变了。还好我靠着自己的聪明才智(一顿瞎扯)混了过去。现场两轮技术面应该是过了(至少也应该是个备胎),当时通知我总监不在,晚上进行电话面。
我还记得当时出来时心里贼高兴,总监面不就是吹吹牛逼吗,感觉就要起飞了。
总监面一开始也如我所想,就问些:“平时工作之外都干些啥啊?”,“有在学习什么技术吗?”这类的,结果我自己作死提了个在学 ConcurrentHashMap,当时我确实在看这个,但是还是一知半解,结果被问了几个问题就凉了。当时觉得自己是个傻吊,想喂自己吃屎,可能错过了自己最好的机会。
如果当时链家发offer,只要不是侮辱性薪水,我是必去的。其实就算是侮辱性薪水,只要不是太过分,我估计还是会舔着去的...
几次尴尬的经历
面试有时候就跟碰运气一样,运气好点,问的全是会的,运气差点,两句话就被轰出来。
有一次和三个同事去陆家嘴参加招聘会(当时还是蹭的他们的面试邀请),来回两三个小时的车程,面试2分钟就结束了,真是充电5小时,通话2分钟。当时我们还互相调侃说,见识了繁华的陆家嘴(下图就是当时拍摄的),也不枉此行了。从此以后,我再也没参加过招聘会。别问,问就是记仇。
还有一次去面一家地产公司,当时面试官正在小房间里面另一个人,看到我到了就把我也叫进去了,我当时心想:还有这种操作。然后面试官就问了我两个问题:1)ajax 的 a 是什么意思?2)XML 是什么意思?当时我没答上来,然后就被轰出来了。
冥冥中注定
运气总是守恒的,有一些运气不好被秒杀的经历,必然也会有一些运气好拿到 offer 的。现在回想起来,当时能进美团真是冥冥中注定的,有无数次我都已经差点入职其他公司了,但是最终因为各种阴差阳错,最终都擦身而过。
谷米实业:1轮笔试,2轮技术面试。技术负责人比较看重逻辑思维能力,让手写代码,还问一些智力题。给的税后11k,由于五险一金的问题没去。
飞牛网:背靠大润发,当时觉得很高大上,给的税前13k,我当时都在看房子了,最后由于一些原因没去成,具体啥原因我自己也忘了...年纪大了,记忆力差的很。
1药网:创始人是1号店的创始人,当时也很想去的一家,给的税前13k,当时已经接了offer准备去了,结果通知面的部门没有hc了,临时要我去加面另一个部门。
当时加面了两轮,第一轮是部门技术老大面,可能是由于之前已经通过了其他部门的面试,有些问题没答出来,老大也很耐心的引导我,看得出来还是比较喜欢我的。
第二轮的直属上级看起来比较忙,就随意的问了一题。没错,就是那道我还专门水了一篇文章的题目:mybatis 中的 DAO 接口和 XML 文件里的 SQL 是如何建立关系的?
显而易见的,这道题目对于当时的我来说太难了,而且也没法瞎掰,我装模作样的思考了一会后,尴尬的说了不会,老大还安慰我说没关系。尽管加面发挥的一般,但是最终还是给我发了offer(我一度怀疑是不是那个老大对我有什么企图)。不过由于自己觉得在直属上级面时发挥的太差了,最终决定不去。
现在看来自己当时不仅菜,还作死。
幸运女神的眷顾
拒了1药网后,选择已经不多了,就剩2个未面试的:平安医疗和美团,并且上海自己能投的基本都投完了,当时决定如果最后这2个没满意的就到深圳去(都跟父母和深圳的同学打好招呼了)。我不是一个相信运气的人,但是这次幸运女神确实眷顾了我,让我抓住了最后一根稻草。
进美团并不是一帆风顺的,拿到面试资格都费了好大劲,当时自己的简历太普通了,大概率入不了美团hr的法眼,但是我还是厚着脸皮投了很多部门,有些部门还投了很多次。终于,在我的死缠烂打下,有一位善良的hr给了我一次机会,这是我进美团的第一位贵人。
可能有同学有疑问,为什么要重复投一家公司,甚至是同一个部门?
答:每个公司都有很多部门,每个部门的hc数和招人标准都不一样,即便是同个部门,如果hr不同,标准肯定也不一样。重复投相当于是在碰运气,努力让更多的hr看到我们,努力让hr在不同的日子里看到我们,兴许hr今天心情好就给我们个面试机会了。
3月底开始面试的,到面试美团的时候已经4月底了,这面试的时间里,我们不能荒废了学习,还是要持续不断的复习和学习。当时我就在这1个月的时间里学了:AQS、ReentrantLock、MySql 高级教程,而且在面试美团就用上了...,你敢信。
美团1面的小哥是我的第二个贵人,这个老哥贼实在,就对着我简历写的专业技能一个个的问,真的把我写的每一个点都问了...
让我写个冒泡排序,我不仅写了冒泡排序,还跟他讲了快速排序的思路(这是一个加分点)。还问了我很多 Mysql 知识,我把刚学的 Explain 的每个字段都吹了一波(这是另一个加分点)。
咱这么老实的人,写在简历上的都是比较有把握的,因此这个小哥的问题我基本全答上了。不仅过了1面,而且可以确认小哥给我的评价很高(因为后面入职发现我比其他同学的定级高一级)。
美团2面就是主要问项目了,我又把我那蹩脚的项目拿出来讲了一遍,面试官问的很细,把整个项目从头到尾细聊了一遍,如果没准备好可能会扛不住,最后还给出了一些他的建议(其实就是装一波逼)。
还有就是简单的问了几个技术问题:“JDK 动态代理的原理”、“JDK 动态代理为什么只能针对接口”、“ajax 全称是什么”,你敢信,我又被问到了这个,好在上次被问过后,我后面还特地看了一下:ajax 就是 “异步的 JavaScript 和 XML”。
Hr 面就比较简单了,一般是介绍当前的业务,问我对业务是否感兴趣啊,平时有没有在学习等等。对于这些问题,舔就完事了,把握好舔的尺度,不要舔的过于浮夸一般都莫得问题。
不过也会有一些送命题,例如:能接受的底线薪资,如果低于该薪资会放弃本公司的机会。
我当时是这么回答的:“底线薪资:无,由于对贵公司的前景比较看好及相信贵公司会给出一个合理的薪资,本人将考虑贵公司给出的任何薪资”。现在回头来看这个回答,舔的还算凑合,有一些细节在里面。
就这样,我不可思议的拿到了美团的offer,薪水也超过了我的预期。
进大厂的诀窍
经过这几年的摸爬滚打,我发现进大厂确实有一些诀窍,对于和我一样背景一般的同学,只要你抓住了诀窍,进大厂不是梦。
1)一定要提前准备,至少准备个一个月,网上的面试题多看看,对于那些高频题目,带着理解去学习,实在不能理解的就背下来,大家高考的时候不都是背过来的。
2)大厂通常有很多部门,每个部门的hc数和招人标准都不一样,即便是同个部门,如果hr不同,标准肯定也不一样,重复投简历可以增大我们拿到面试机会的概率。同理,重复面试不同的部门,也可以增大我们进大厂的概率。
3)大厂经常会布局新业务,新业务需要快速启动入场,hc通常会有很多,因此招人的标准会稍微降低,这个时候是个绝佳的机会。我当时进的就是个新的业务部门。
写在最后
可能有人会觉得我进入美团太幸运了,是小概率事件,不值得参考。
答:进入美团确实有运气成分,我自己也是这么觉得的。但是在大厂混了几年后,我发现这真不是小概率事件,很多人都是这么过来的,好多同学都是面了N次才进的大厂。
有时候,选择比努力更加重要,机遇比奋斗更加重要。但是,机会只留给有准备的人。我们只有时刻准备着,才能在机会到来的时候,去抓住它。
我很幸运的是,当我准备好的时候,机会来了。从此以后,我变成了一个相信运气的人。
我相信,越努力,越幸运。