在下本是跨专业渣考研的985渣硕一枚,经历研究生两年的学习积累,有幸于2019秋季招聘中拿到几个公司的研发岗offer,包括百度,阿里,腾讯,今日头条,网易,华为等。
我的本科专业是电子信息工程,基本没有接触过计算机专业的课程,只学过c语言,然后在大三的时候接触过java,Android,以及前端开发。这时候我只是一个刚刚入门的菜鸟,还不知道软件开发的水有多深,抱着试一试的态度去应聘了很多公司。结果可想而知,连简历筛选都没有通过。
当年我对游戏开发很有兴趣,特别是对网易游戏情有独钟,但是当我看到网易游戏研发工程师的招聘要求时,我只能望而却步,因为它要求学历至少是985的硕士。
对于即将读研的同学来说,一般有两件事很重要,一件事是选择导师,一件事是选择方向。
而选择方向这件事,我倒是折腾了好久。研一期间我做的最多的事情就是看书了,当时自己的方向还不明确,所以找了很多书来看。当别人都在专研数据挖掘和机器学习时,我还在各种方向之间摇摆不定。
我在读研之前想做游戏开发和Android开发,但我以前也学过JavaWeb开发。于是我在网上了解对应方向的资讯,发现游戏研发的就业面比较窄。
最后,我综合公司的岗位情况,个人兴趣,以及我之前的学习经历等因素,选定了Java开发方向。
于是,我在学校的实训项目中选择了JavaWeb项目,从此也真正意义上地踏上了Java的学习之路。
尽管我的入学成绩是全学院的top3,但是,我发现,作为非科班出身的我,和很多科班同学相比,还是有一定差距的。
于是我痛定思痛,决定好好弥补我的不足,平时一有空就去图书馆找些书来看,不论是操作系统,计算机网络,还是数据库等本科课程,我都会找一些对应的书籍来看,当时不太清楚其实有些课程其实不需要特地去补,以至于我连计算机组成原理,编译原理,软件测试等方面的书都特地找来看,现在想想也是挺逗比的。
此外,我还在各种视频网站上看网课,比亦或是看中国MOOC的计算机基础课程,里面的操作系统,数据库等课程也让我印象深刻。
压力之下,只有努力一条出路。于是,从那时候起,我开始了“留守“实验室的学习生活。为什么要在实验室学习,一是因为学习气氛好,二是因为平时大家也可以互相交流问题。
这样的日子持续了好几个月,所谓世上无难事,只怕有心人。到最后,实验室里每个人都拿到了心仪的实习offer。
离开猪场后我来到了熊厂。部门给我提的需求不算太难,大部分都是一些CURD的工作,但是这次很快就意识到了问题所在,就是我不太熟悉部门的整体技术栈,所以在需要借鉴别人代码时偶尔会看不懂。后来部门又给了新的重构需求,此时的我开始焦虑起来,是不是应该做出一些改变呢。
当然,光看代码和文档还不能解决所有问题,因为这个项目的重点难点不在Web应用,而是在底层技术,这个项目中包含了两套架构,分别是一套OpenStack集群和一套docker集群。为了学习这两块内容,我先是看了很多博客,然后在平台上跑虚拟机和容器来做实践,最后又看了这方面的一些书籍,主要是《OpenStack设计与实现》,《docker技术入门实战》。
研究生期间我有一件事情一直在坚持,那就是做笔记和写博客。
这也意味着,虽然记录的内容很多,但是真正消化吸收的内容很少,脑子里充斥着总是那些零碎的知识点和面试问题,对于完整的知识体系知之甚少。这些问题在春招期间也不断地暴露出来,让我思考了很久。
“具体可靠的学习计划”
所以我觉得,对于秋招这一场苦战,指定计划尤为重要,一旦计划定下来,战略目标清晰,对应的战术制定也会变得清晰,执行力也会随之变强。
至于复习方法,我主要通过看高质量博客,并且结合代码实践的方式巩固这部分知识点,比如今天学习“concurrenthashmap”,我会去找两三篇比较好的博客先看看,主要是源码解读方面的,然后我会把它们进行整合,如果有遗漏的知识点我会再进行补充,有时候我还会自己去看看JDK源码,以便更好地理解博客内容,完成知识整合之后,我就会对应地整理出一篇博客出来,发在我的个人博客上。
在项目之余,我也找一些常用的后端组件来跑一跑demo,以便让我对这些技术有一个直观的了解,比如面试常问的dubbo,zookeeper,消息队列等组件。这些尝试也让我在理解它们的原理时更加得心应手了。
算法题是秋招笔试面试中的重头戏,每个研发同学都免不了经历算法题的摧残,对我这么一个非科班同学来说,更是让人头大。正因为如此,我放弃了刷大量LeetCode题目的方法,选择了更加行之有效的刷题方式。
首先我重新刷了一遍剑指offer,并且对每道题目进行总结,尽量保证每一道题都可以记在脑子里,众所周知剑指offer中的题是面试时非常喜欢考的,所以先搞定这部分题目是最为关键的。
搞定剑指offer之后,当然还要刷LeetCode了,LeetCode题目这么多,怎么选择呢,我没有按照tag刷,也没有按照顺序刷,而是参考当时一个大佬的LeetCode刷题指南来进行刷题的,他把每个类型的题目都做了归纳,每部分只放一些比较经典的题目。所以我前后大概刷了100多道LeetCode的题目,并且在第二遍刷题复习的时候,我也对这些题目做了一份总结。
除了上面两个经典题库,我还着重刷了大厂的历年真题,这部分我主要是通过牛客网的历年真题题库来完成刷题的。说实话,真题是非常重要的,因为公司出的题目不像平时的那些算法题,可能会出得非常奇葩,所以你如果不提前适应的话会比较吃亏。完成这部分题目之后,我对算法题的复习也基本告一段落了。
当我完成所有内容的复习时,提前批已经开始了。终于要上战场了,因为战前准备比较充分,所以我对秋招还是比较乐观的,但事实上,秋招不仅是攻坚战,而且是持久战,要笑到最后,确实也不是那么容易的事情。
首先在Java基础方面,我写了20多篇原创博客,主要是对Java核心技术的解析,比如“Java反射”,“Java序列化和反序列化”,“Java异常体系”等等。
在数据库和缓存方面,我主要学习了MySQL和Redis这两种最常用的数据库。对于Mysql,我从简单的sql开始了解,然后开始了解sql优化,MySQL的存储引擎和索引,事务及锁,还有更复杂的主从复制,分库分表等内容。对于Redis,我也是从简单的api入手,然后去了解每一种数据结构的底层实现原理,接着尝试去学习Redis的持久化方式,以及作为缓存常需要考虑的技术点,当然,也包括Redis的分布式锁实现,以及它的分布式集群方案。
至此,我的知识体系基本构建完成,这也是我在秋招中能够成功闯过那么多面试的原因。
不管前期做了多少准备,到秋招的时候也不能掉以轻心,从七月底第一次面试到9月基本佛系,中间经历了大大小小的面试。
在完成知识体系重建以后,我把重点转向了另外几件事,一是完善和熟悉我的简历,以便在面试中能够比较好地发挥,二是持续刷题,保持对算法题和笔试真题的手感和熟练度,三则是看面经查缺补漏,我一直认为看面经是很重要的一项复习内容。
就这样,我一边继续复习,以便开始了一场接一场的面试接力。
起初,我面了几家小公司练手,接着阿里的提前批接踵而至,我战战兢兢地参加了阿里中间件部门的面试,面难难度还算适中,一共四轮面试,当时我的表现也还不错,问题基本都答上来了。面完不到一周以后我就收到了通过的消息,当时还有点懵。没想到第一个offer这么快就来了。
经历了百度面试的摧残以后,我手写算法的速度也变快了,很多坑也被我填上了。接下来面对腾讯的面试,我也是既激动又担心,腾讯的面试难度比较大,对于操作系统和网络的知识喜欢深挖,问的东西也很有深度,面完前三面以后,第四面拖了3周才进行。当时三面面试官对我的评价比较好,也让我信心爆棚了好久。
在等待腾讯终面的期间,我参加了今日头条的面试,当时有幸拿到了一个白金码,免去笔试,事实证明白金码作用真的很大。头条的面试难度和腾讯差不多,三轮面试,同样需要写各种算法,由于是视频面试,我可以清楚地看到,头条的面试官真的非常高冷啊。面完头条我的第一感觉就是应该挂了吧。没想到最后还是给了offer。
结束这几家大厂的面试之后,我觉得我的秋招已经接近尾声了,不过由于之前投的比较多,所以我又面了几家大公司,如网易,华为,快手等。到9月上旬的时候,我接连收到了bat和头条,网易的意向书,阿里最早,腾讯最晚,每收到一封意向书我都很开心,没想到最后我真的可以集齐bat等大厂的offer。
9月以后,除了偶尔和同学做几场大厂的笔试,我基本就佛系了。直到后来一些外企例如亚马逊,大摩开始笔试面试,我才又重新回到了状态。
截止目前,我基本上把该拒绝的offer都拒绝了,综合各方面因素的考虑,最后应该会签阿里,原因是部门是我自己喜欢的,同时给的评级也比较高。虽然腾讯也给了sp,但是最后还是忍痛割爱啦。至于百度和头条,给的offer并不是很令人满意,所以就没有考虑了。
至此,我的秋招之旅总算圆满结束。
阿里中间件研发面经
蚂蚁金服研发面经
岗位是研发工程师,直接找蚂蚁金服的大佬进行内推。
我参与了阿里巴巴中间件部门的提前批面试,一共经历了四次面试,拿到了口头offer。
然后我也参加了蚂蚁金服中间件部门的面试,经历了三次面试,但是没有走流程,所以面试中止了。
最后我走的是蚂蚁金服财富事业群的流程,经历了四次面试,包括一次交叉面,最终拿到了蚂蚁金服的意向书,评级为A。
阿里的面试体验还是比较好的,至少不要求手写算法,但是非常注重Java基础,中间件部门还会特别安排Java基础笔试。
腾讯研发面经
岗位是后台开发工程师,我没有选择意向事业群。
SNG的部门捞了我的简历,开始了面试,他们的技术栈主要是Java,所以比较有的聊。
一共经历了四次技术面试和一次HR面试,目前正在等待结果。
腾讯的面试一如既往地注重考查网络和操作系统,并且喜欢问Linux底层的一些知识,在这方面我还是有很多不足的。
百度研发面经
百度研发面经整合版
岗位是研发工程师岗位,部门包括百度智能云的三个分部门以及大搜索部门。
百度的提前批面试不走流程,所以可以同时面试好多个部门,所以我参加百度面试的次数大概有12次左右,最终应该是拿了两个部门的offer。
网易研发面经
面试部门是网易云音乐,岗位是Java开发工程师。
网易是唯一一家我去外地面试的公司,也是我最早去实习的老东家。
一共三轮面试,耗时一个下午。
网易的面试比我想象中的要难,面试官会问的问题都比较深,并且会让你写一些结合实践的代码。
今日头条研发面经
岗位是后台研发工程师,地点选择了上海。
我参加的是字节跳动的内推面试,当时找了一个牛友要到了白金码,再次感谢这位头条大佬。
然后就开始了一下午的视频面试,一共三轮技术面试,每一轮都要写代码,问问题的风格有点像腾讯,也喜欢问一些底层知识,让我有点懵逼。
提前批的笔试其实不是很多,我参加了网易,网易游戏,拼多多等公司的笔试,应该都是低分飘过。
1打好数据结构和算法基础
2先易后难,看一些基础的算法书籍,比如《图结算法》,《啊哈算法》等等。
3剑指offer刷起来,两到三遍,做到胸有成竹
4LeetCode刷个200题左右,记得二刷,做好总结。
5到牛客网做公司的历年真题,熟悉题型,保持手感。
剑指offer指南和LeetCode刷题指南可以在我的博客里找到。
我个人也总结了一些面试方面的经验,主要是一些技巧。
1做好自我介绍和项目总结,把握你发言的主动权
2搞清楚简历上的技术点,兵来将挡水来土掩
3注意分点答题,思路清晰,也更容易讲清楚原理。
4压力面下保持冷静,不要回怼面试官
5HR面试注意常用技巧,可以提前准备。
总的来说算是比较全面了,做后端方向的同学可以参考一下。
Java网络编程一直是很重要的一部分内容,其中涉及了socket的使用,以及Java网络编程的IO模型,譬如BIO,NIO,AIO,当然也包括Linux的网络编程模型。
了解这部分知识对于理解网络编程有很多帮助。另外还补充了两个涉及NIO的重要技术:Tomcat和Netty。
从这里开始打开去往JavaWeb世界的大门。什么是J2EE,什么是JavaWeb,以及这个生态中常用的一些技术:Maven,Spring,Tomcat,Junit,log4j等等。
我们不仅要了解怎么使用它们,更要去了解它们为什么出现,其中一些技术的实现原理是什么。
本专栏主要讲解Spring和SpringMVC的实现原理。
Spring是最流行的Java框架之一。
本专栏介绍MySQL的基本知识,比如基本架构,存储引擎,索引原理,主从复制,事务等内容。当然也会讲解一些和sql语句优化有关的知识。
同时本专栏里也介绍了Redis的基本实现原理,包括数据结构,主从复制,集群方案,分布式锁等实现。
在分布式实践方面,我们会讲到负载均衡,缓存,分布式事务,分布式锁,以及Dubbo这样的微服务,也包括消息队列,数据库中间件等等。
《计算机网络:自顶向下》这本从应用层讲到物理层,感觉这种方式学起来更轻松。
《图解算法》《啊哈算法》
这两部书籍非常适合学习算法的入门,前者主要用图解的形式覆盖了大部分常用算法,包括dp,贪心等等,可以作为入门书,后者则把很多常用算法都进行了实现,包括搜索,图,树等一些比较高级的常用算法。
《剑指offer》这本书还是要强烈推荐的,毕竟是面试题经常参考的书籍,当然最好有前面基本的铺垫再看,可能收获更大,这本书在面试之前一般都要嚼烂。如果想看Java版本的代码,可以到我的Github仓库中查看。
《Java编程思想》这本书也是被誉为Java神书的存在了,但是对新手不友好,适合有些基础再看,当然要选择性地看。我当时大概只看了1/3
《Java核心技术卷一》
这本书还是比较适合入门的,当然,这种厚皮书要看完还是很有难度的,不过比起上面那本要简单一些
《深入理解JVM虚拟机》
《Java并发编程艺术》
这本书是国内作者写的Java并发书籍,比上面那一本更简单易懂,适合作为并发编程的入门书籍,当然,学习并发原理之前,还是先把Java的多线程搞懂吧。
《深入JavaWeb技术内幕》
这本书是JavaWeb的集大成之作,涵盖了大部分JavaWeb开发的知识点,不过一本书显然无法把所有细节都讲完,但是作为JavaWeb的入门或者进阶书籍来看的话还是很不错的。
《Redis设计与实现》
该书全面而完整地讲解了Redis的内部运行机制,对Redis的大多数单机功能以及所有多机功能的实现原理进行了介绍。这本书把Redis的基本原理讲的一清二楚,包括数据结构,持久化,集群等内容,有空应该看看。
《大型网站技术架构》
这本淘宝系技术指南还是非常值得推崇的,可以说是把大型网站的现代架构进行了一次简单的总结,内容涵盖了各方面,主要讲的是概念,很适合没接触过架构的同学入门。看完以后你会觉得后端技术原来这么博大精深。
《分布式服务框架原理与实践》
《从Paxos到Zookeeper分布式一致性原理与实践》
《大数据技术原理与应用》
作为大数据方面的一本教材,厦大教授写的这本书还是非常赞的,从最基础的原理方面讲解了Hadoop的生态系统,并且把每个组件的原理都讲得比较清楚,另外也加入了spark,storm等内容,可以说是大数据入门非常好的一本书了。
4segmentfault,有点像国内的StackOverflow,适合交流代码问题的地方。
8知乎
这个就不必多说了。
9简书
10Github
秋招结束以后,我就把主要精力花在做这个公众号上了。当然,剩下要处理的事情还有很多,毕业论文,毕业旅行,还有工作前的知识储备等等。果然,人的一生需要不断的修行,刚刚闯过了一关又马上要迎接下一轮挑战,你不能停下脚步,毕竟大家都在往前走。
希望还在求职路上的各位少侠好好加油,在未来也能够顺利地拿到自己想要的offer!
本文中涉及到的几个链接我汇总在这里,方便大家查看。
2、知乎:www.zhihu.com/people/h2pl(知乎活跃用户,希望未来能成为大V)
黄小斜是跨考软件工程的985硕士,自学Java两年,拿到了BAT等近十家大厂offer,从技术小白成长为阿里工程师。
黄小斜是一个斜杠青年,坚持学习和写作,相信终身学习的力量,希望和更多的程序员交朋友,一起进步和成长!