我是如何一步步拿到大厂offer的
个人经验分享
大家好我是走码,我本科专业是和计算机基本无关的专业,最多相关的可能就是学过c语言,后来考研转到计算机技术,在今年的秋招中拿到阿里,百度,腾讯,携程,滴滴等互联网大厂的后端岗位offer,从非985非科班到如今多家大厂,一路走来也积累了不少失败和成功的经验,后面将和大家分享我的30场面经,希望能帮到你。
基础准备,分而治之
秋招会着重考察你的基础知识,面试中如果你的基础知识不好,那你将经不住面试官的拷打,而且笔试也很考察基础代码和算法能力。秋招考察知识的范围很广且很深,所以对于基础知识,我建议分块学习,我划分为以下几方面进行准备:
c++基础(看你使用的语言)
由于我是做c++开发的,所以我给出的是一些c++上的经验。但不管是什么语言,都要做到掌握和熟练的程度。c++我这里推荐《c++ primer plus(第六版)》,这里面涵盖了很多c++的基础语法和c++11新特性,平时遇到不太懂的知识可以来这里找到答案,相当于是一本字典,还可以跟着里面的代码练习。同时,还有很多其他的总结的c++基础pdf,基本是以问答的形式整理的,这里我推荐《InterviewGuide第四版By阿秀》,里面有将近100道c++基础问题,也是面试常问的问题,并且这本书里不仅仅是c++基础,以下我提到的板块都有涉及,建议全文背诵。其作者阿秀现就职于字节,十分优秀,他的公众号是拓拔阿秀。
再具体一些,c++基础又可以大概分为几类:c++关键字,c++内存管理分配,c++指针和智能指针,c++对象特性(封装继承多态),STL使用和底层原理,c++多线程相关,此外还有一些特性和模板。
如果你发现常见的大部分问题你都知道怎么回答,那就差不多了。
算法
算法是重中之重,是面试和笔试必考察的项目。像很多大厂会在面试时问算法,并且难度有简单,中等和困难的水平,像字节就喜欢问中等及以上的算法题。练习算法的平台主要有三个,leetcode(力扣),nowcoder(牛客),acmer(赛码网),其中前两个是比较主要的,不管是面试和笔试都会有原题,赛码网我主要是用来熟悉acm模式还有熟悉一些题型。
算法一般要刷多少算比较靠谱,一般大佬都是400-500起步,我的leetcode大概刷300题,然后还有一些专题像剑指offer,现在出到第二版了,里面大概是60多道题,很多题都很经典,剑指offer可以在牛客刷,建议先快速过一轮,然后再回来复习一轮。同时刷题最好不要盲目的刷,最好按算法类型来刷,我的刷题顺序和一些经典题大概是:
dfs类,包括二叉树的和图的,包括回溯,全排列,N皇后,子集
dp类,动态规划,像基础的,股票,背包,硬币,机器人路径,递增子序列和鸡蛋掉落这些
栈类,包括最小栈这类题目,接雨水,最大矩形
双指针类,像无重复字符的最长子串,删除有序数组中的重复项
贪心类,剪绳子,分发糖果,种花问题
归并排序类,合并K个升序链表,排序链表
二分类,搜索旋转数组,在排序数组中查找元素的第一个和最后一个位置
滑动窗口, 最小覆盖子串,长度最小的子数组
并查集,婴儿名字
字典树,单词频率
拓扑排序,课程表,课程表2
而且现在leetcode可以建立收藏文件夹,大家可以在做题的时候分类和记录想法,这是我的收藏夹,同时我还收集了数组,序列,二叉树等常见问题。
算法方面我也推荐一些优秀博主,代码随想录和lubuladong,特别是代码随想录的回溯模板写的特别好,很清晰。
计算机网络
如果是做后端,计算机网络是必问的知识,所以网络方面要重点看。这里我推荐几本书,《UNIX网络编程卷1,卷2》、《TCP/IP详解卷1》、《图解HTTP》和由小林coding编写的《图解网络》,这里我也得吹一下小林,不仅图解网络写的很好,图解系统也是一样厉害,最近还出了数据库方面的。
面试中网络常问的一些问题包括TCP挥手握手过程和状态,TCP一些机制和异常处理,HTTP和HTTPS包括区别和一些字段,IO模式包括epoll这类IO多路复用,OSI七层以及各层的协议及其原理应用,还有一些网络编程的实现和线程池等等等等。
数据库
数据库也是面试的重点,笔试选择题经常考数据库,笔试编程题偶尔会考sql语句。这里主要有三个数据库:
关系型数据库mysql
mysql的学习可以分为概念,基础语法使用和底层实现三个内容进行学习:
概念的话可以参考一些教材,像本科用的《数据库系统概论(第五版)》,里面的基本概念需要了解,这里就不多说了。
对于数据库的使用,可以参考《mysql必知必会》,里面基本就教你怎么使用,可以作为sql语句的一个字典。
还有就是mysql各种底层的实现,包括存索引、锁、MVVC,日志等,这里我推荐《mysql是怎能样运行的-从根上理解mysql》,这本书用很通俗的图文解释了mysql各种底层实现,看完面试基本没问题了,我记得滴滴的场景题有一道让我设计了一个数据存储,从底层的索引开始,因为刚好看了这些所以问题不大。
最后可能还有就是一些场景业务相关的了,包括分布式主从,还有和下面redis做缓存时的一些设计,这些我会在后面和大家分享。
键值对数据库redis
redis是很多大厂都在用,也会在面试中问的。也是可以分为基础语法使用,底层,应用这三方面。
基础语法和底层原理推荐看《Redis设计与实现》,里面还介绍了集群下的一些设置。像redis常问的一些问题,如redis应用场景,数据结构,集群模式,mysql双写一致,做消息队列,一般会结合场景业务来提问,这里我推荐个博主,对双写一致性和redis做消息队列都有很详细的解释,水滴与银弹,他的文章都写得很好。
文档型数据库mongoDB
其实mongoDB问的不是很多,可能是我没怎么用或者没在项目写,我只在写爬虫时用过mongoDB,而且看的一些网络教程和《深入学习MongoDB》
中间件
中间件是比较贴近实际业务的一些问题,很多大厂都喜欢问。问的最多的就是消息队列组件,像RocketMQ,Kafka,RabbitMQ,ActiveMQ,面试官一般喜欢问这些组件的区别和作用,消费场景,高可用性的实现,集群的设计,我一般就是看一些文章,这里我推荐三太子敖丙和水滴与银弹的文章,他们总结的非常好。
操作系统
操作系统也是面试考察的重点,特别是腾讯,很喜欢问的很基础很深入。我学习操作系统分为几大块,IO,CPU,内存,进程和线程(特别是进程间通信和多线程通信),编译原理,还有linux的文件和权限等内容。这里我也是一点点内容,一本本书去看的,遇到不会的,就去翻书查找。这里我推荐《UNIX环境高级编程》(APUE,这本被称为神书,主要是概念和应用),还有小林的《图解系统》,不得不说小林真是yyds,还有权威的《深入理解操作系统 第三版》。如果都看完吃透面试基本无敌了。
设计模式
设计模式是衡量编码水平的一个重要因素,设计模式写得好往往会让系统易理解且容易维护。面试官一般就会问你都知道哪些设计模式,设计模式的原则,重点常问的像
单例模式,工厂模式,装饰模式,观察者模式,适配模式,组合模式
我的经验是上面这些问的频率由多到少。然后设计模式的学习,我推荐一个非常好的网站,这里面给出了所有设计模式,多种语言下的实现和生动的图文说明,还有不同设计模式之间的对比。此外还有一个视频教程,是李建忠老师的设计模式,讲解十分清晰,并且边教边写,很好理解,我初学的时候就是看的他的视频。
场景题
场景题一般分为以下几种,
海量数据但内存小的情况做一些排序,过滤,去重,查找,统计频次等操作,这个很喜欢问
分布式服务的设计,包括主从和哨兵设计保证高可用,还有不同一致性的分析
淘汰策略设计,一般就是LRU,LFU等
对于海量数据记住几个关键词,分治,hash切片,布隆过滤器,堆,字典树,合并。像海量ip统计频次,可以先根据hash策略分为几个文件,然后可以考虑使用哈希表或者字典树,哈希表的话又设计ip转int用来减少内存占用,字典树可以减少重复字符的占用空间,每个文件统计完毕后在合并。像判断是否存在这种可以使用布隆过滤器,那这时候又会深入问布隆过滤器的底层原理。关于布隆我还总结在了一片博客文章,对哈希和布隆都有详细解释
简历项目,提前准备
你有实力确实不错,不过也要能在简历上很好体现。一般简历有以下几方面内容,姓名,联系方式,教育经历,掌握的技能和知识,项目和实习,个人评价(这个可要可不要)。这里我把我的简历模板拿出来,可以参考下。
有的人可能会说没有项目没有实习,那可以自己准备一个,做后端就准备个服务器项目,做前端就准备个页面系统。后端的服务器项目github上很多很多
tinywebserver
对于一些第三方的框架和库也可以拿来用用,像一些brpc、grpc啥的都可以运用在项目里
所以即使没有经历也没关系,我很多项目也是自己准备的,像之前接触Unity,所以结合服务器做了个局域网联机小游戏,还有导师做过的项目也可以拿来说说。所以平时可能要注意积累,做某些事都是为了最后秋招做准备,并且准备的越早越好,我2020年9月份就开始写简历,写完之后找朋友圈的大佬们帮忙看看,然后去牛客网找大佬帮忙看看,就这样一点点优化。同时每次面试后也要总结问题,看看简历有没有问题,及时改一下。
那对于投简历的时间,以前都说秋招金9银10,现在说金8银9都有点晚了,提前批在6月份就有些开始了,对于我来说,秋招应该从3月份的实习就开始了,所以把握好时间,越早越好,越到后面越难。
然后每个公司的一些秋招信息可以在官网去看看,或者公众号:应届生职前菌,这个主要是互联网的,如果是国企的,可以看公众号:国企应届生招聘网
做好笔试,才有机会
简历这一关通过后,就是第二关笔试。不同厂的笔试内容不太一样,平台也不太一样,但是题型基本就是选择题,填空题和编程题,不一定都有,像大厂一般上来直接就是2-5道编程题,时长也在1个小时-2个半小时不等。选择题的话建议多去牛客上刷刷选择题,很多都是原题;编程题的话一般会在两个平台上做,要么牛客,要么赛码网,模式有两种模式,这个很重要!!!!!!!!!!
很多人刷多了力扣以为笔试也全是力扣那样写的,其实不一定,编程题有核心模式和ACM模式,核心模式就是平时你刷力扣的那种,代码框中预设代码已经指定好类名、方法名、参数名,请勿修改或重新命名,直接返回值即可。但是ACM模式是需要自己处理输入输出的,所以有些第一次笔试的就在输入输出上耗费了大半时间,对于ACM模式的练习可以去赛码网上做做题,上面都是ACM模式,不过像牛客和力扣其实也是有ACM模式,需要自己选择一下,然后知道怎么测试用例。
还有个小tips,c++的万能头文件很好用
#include <bits/stdc++.h>
笔试有时看缘分,有些很简单,有些很难,遇到难的a不了的,试着直接return 0或者return 1,这也许能帮你骗点分,有奇效。就算不会你也要把代码写完,因为就算a不了,如果面试官面试看你的笔试,发现你交白卷,这就不好说了。
面试技巧,归纳总结
如果你前两关都通过了,恭喜你,接下来就是面试官的拷打环节了。互联网的技术面有2-4面不等,一般厂越大,面的越多。再加上HR面,大概就是3-5面总共。
大部分面试官一上来会让你做自我介绍,这里你可以先写个稿子,可以围绕着简历或者是你比较擅长的知识和项目来介绍,一般1分钟。然后面试官就会开始真正的拷打了,基础知识,算法题,场景题,智力题都会问到,我感觉基础问的多的就是网络TCP和HTTP,操作系统内存,多线程和锁,数据库。如果问到你会的就自信回答,如果问到不会的,不要紧张,如果实在不会,可以问问面试官细节,或者让他给点提示,或者你就往你会的知识上扯。
然后问项目的话,你简历上写的项目你一定都要提前准备好,考虑面试官可能会问的问题。
面试结束时可能会有反问环节,我这里建议可以问2-3三个问题,
- 首先了解整个校招流程,加入这面通过了后面是怎么安排,还有几面;
- 我面试部门的一些业务和技术栈情况;
- 对我今天的面试有什么评价或者建议吗(这个看情况问,有些面试官也不一定会说,因为这个能比较直接了解面试官对你的评价和面试结果)
面试完后我建议进行复盘记录,下次遇到相同的问题你就不会不懂了。这个我专门记录在一个笔记本上,大概有30场面试,后面我会做个面经分享,记得关注我。
把握机会,知己知彼
我的建议就是多面试,试错机会多一些。所以我从实习就开始投简历开始面试,光是我记录在本子上的就有30场左右,有一些比较简单的我就没记录,所以我面的场次在40场左右。提前熟悉下面试的环境和面试官会问的问题,所谓知己知彼,百战百胜。
刚开始面试的时候,基本是一问三不知的状态,并且十分紧张,写代码题都有点脑袋嗡嗡的,后来面的多了,面试就基本不会紧张,甚至还觉得兴奋,能和面试官交流分享经验。我看有些人觉得自己不太行就不投,当然这也有一定道理,因为会有面试记录,如果你面的很差,下一个HR看到负面的评价,他可能就不会让你面试。但是我建议还是多去试试,而且提前批很重要,虽然提前批基本是大神乱杀,但是很多公司能免笔试,这是很重要的,而且面试难度会相对简单些。最好不要等到7,8月再去准备,那时候真的晚了。
说在最后
总结了这么多,其实都很感谢我上面提到的博主,也很感谢一些一起笔试的大佬,他们都很优秀。最后就是几句励志名言吧~
当你没有选择的时候,努力很重要;当你有选择的时候,选择很重要。
少说多做,先做后说。
希望能给那些想进大厂但是非科班且学校和基础不太好的人一些帮助。