6

本文是面试经验总结,功利成分过大,不适合用于技术学习
本文适合像我一样方向不明确,没有牛逼经历的普通学生
本文的大部分观点是我个人的总结,不具有普适性,仅供参考

看了一周249的新剧,觉得我应该给这几个月的划上一个句号。是对自己的总结,也希望能给其他人带来一点点经验吧。

先说一说自己的经历吧。从三月份开始,大厂实习面试全部失败,去了本地某国际知名厂商的云计算销售部门,去干了一个月,觉得离研发有点远,就辞了(后来证明,该公司的名号,还是在校招筛简历的过程中,帮了不少)。此时已经到了六月底了,痛定思痛,自知在机器学习算法方向只懂一点皮毛而已,积累不够。开始给自己定了后台开发的方向。

七月和八月从csapp后半部分开始,自己写了写简单的httpserver,读了muduo源码和书籍,以及若干linux后台的书籍(后面我会列一下)。然后进入九月,正式校招。
战果:

  • b厂内推三次挂,校招同一个部门三次挂

  • a厂集齐5个已回绝

  • t内推去深圳挂,校招不过笔试。

  • 360内推到hr面后挂,校招不给机会。

  • 小米内推一面挂,校招不过笔试

  • 华为提前批offer。

  • 新美大offer

  • 大疆offer

还有若干不过笔试,没有面试机会的以及实习的面试过程,就不列出来了。一开始我就说本文适合普通学生,根本就不是什么成功的经验,其实是我自己失败的总结。如果你才刚上大学或者研究生,请抓紧搞各种比赛和项目。如果你还有几个月就面试了,不妨看一看,兴许有一些有用的地方。

我准备从自我定位、知识储备、面试流程这几个方面谈一谈

自我定位

实习的时候,我尝试面试了机器学习相关的算法岗位,很快我意识到,自己并不擅长算法,只懂一点CNN的皮毛,sigmoid是怎么推出来的,完全不知道。这个时候离校招只有不到三个月时间,我要么从基础开始,过一遍机器学习的理论,要么朝后台方向,自己撸项目,补基础。显然,我觉得自己搞工程项目更容易一点,也更感兴趣一点,于是选择了工程项目(然后后来我简历上的唯一亮点却是关于机器学习的,这给后来的面试带来了不少困扰)。

面试了这么多,我感觉面试官选人的流程一般是:

  1. 过去有没有牛逼的经历(acm等牛逼竞赛,牛逼论文,牛逼实习等等)

  2. 方向是不是对口(过去的项目经历,跟目前的岗位匹配度和深度)

  3. 基础知识(操作系统,网络,算法,相关业务知识)

这三点重要性我认为是按照先后顺序排列,举个极端点的例子:你拿过acm金牌然后去面试后台开发岗位,不清楚TIME_WAIT状态的含义,面试官应该不会刷掉你。但是如果你没有那个奖,然后也没答出来,我想你多半就很危险了。

然而对于大部分人而言,比如我,第一条根本就没有。这个时候,给自己一个定位就很重要了,大部分面试官都会考察到你的基础,但是不排除有部分面试官当你第二条不满足的时候,直接就岗位不符合了,尤其是到了终面,第三条大家都满足了,前面两条就显得非常重要了。

第一条是硬伤,第二条勉强还可以补一补,前端开发、后台开发、算法、机器学习、安卓、ios等等,你一定要选一个方向,针对性地学习,各个公司岗位可能名字不一样,但大的方向就那么几个。可以结合自己的兴趣、理想和以往的经验,综合考虑一下,如果不清楚岗位具体做的事情,可以问问认识的师兄师姐。

知识储备

除开机器学习算法类,研发类的基础知识基本都是差不多的,这里主要以后台为例讲一下,基础知识该怎么去准备。

1.算法和代码基本功

没刷过题的同学,不建议直接去刷leetcode,leetcode现在已经有将近400道题了吧,我们的时间有限,直接刷,有点盲目。我建议从剑指offer开始,至少一遍(可以配套lintcode的阶梯训练),越熟练越好。然后是链表和二叉树,到leetcode选择链表和二叉树的tag,全部刷完。链表和二叉树的题目,面试的概率实在太大,如果这类题目没有答出来,会比较惨。

刷题的时候,不建议一道一道没目的地刷。可以利用好leetcode的tag,分类别来练,比如这周练DFS,有点感觉后,再选下一个主题DP,就跟高考的复习差不多。这里再推荐一下左神的代码课,牛客网上有他每一周的直播视频,讲得很细,也推荐大家买一下他99的课(优惠码AlAMdgS),内容针对性很强,但是感觉讲解没有直播好,我买的时候大部分内容我已经刷过了,算是给左神补个钱了,不亏。

总得来说,面试不会涉及很复杂的数据结构和算法,除非是你自己跟面试官提。如果你上面的基础内容都差不多了,可以去hihocoder,它里面有一个hiho一下,分专题,难度要大一些,像线段树,各种平衡树等。hihocoder就是正规的ACM形式,不给数据,新手刷起来很费时间,感觉用户较少,讨论区也经常找不到有用的信息。

最后说一点就是,平时无所谓,去面试之前,一定要花点时间去练一下白板写代码,毕竟还是会遇上手撕爬虫、手撕TCP分包黏包这类的面试官。简单的一定要写出来,复杂的至少写个大概思路。

2.后台知识

这部分内容,我就列一下我从图书馆借过的书单吧.

  • csapp(时间紧的话,重点后半部分)

  • TCP/IP详解. 卷1(TCP状态图要能画出来)

  • UNIX网络编程. 卷1,卷2 (选重点内容)(以上三本基础,必读

  • Linux多线程服务端编程 陈硕 (muduo源码,很适合学习)

  • Linux高性能服务器编程 (了解,可作参考)

  • Linux内核设计与实现 (书很薄,可用于快速了解linux)

  • 深入Linux内核架构(选择对应的章节,细读。比如文件系统,内存管理)

  • 深入理解Nginx : 模块开发与架构解析 (翻了下目录,看了部分小节)

  • 高性能MySQL (看前面一两章,面试到mysql可保命)

  • SGI STL源码剖析 (重点前三章)

  • effective C++ && more effective C++

  • c++ primer 最新版

  • 深度探索C++对象模型 (以上四本,c++方向越熟越好)

两个月时间,不可能全部看完。我的方法是选一个项目(muduo),学到什么,再去看什么。其次就是去翻面经,针对性地补。

再补充一点,平心而论,C++方向的岗位真心很少,如果时间还早,建议入java。不过,校招不太重要,我后来拿到的offer全部是java岗。java方向的我觉得上面书单里面,除了后面四本,都是适用的。

3.笔试

单独把笔试说一下,因为现在的笔试都变成了在线笔试,简历不出彩的情况下,笔试还是很重要。不过笔试,真是有一种深深的无力感,时间短,范围广,各个公司套路都不太一样,毫无章法可循。不过感谢牛客网提供了一个地方,至少有个地方可以刷一刷。我做了那么多笔试,很惭愧,感觉都是凭概率过的。

我的建议就是,先去牛客网上刷几套公司的题,然后感觉自己哪个方面弱一点,先看看书,然后选择某一个类别的题目针对性训练。尤其是智力题,我觉得是可以刷一刷的,后来我发现有大概率碰上原题。

然后是编程题,这个只能练,多刷leetcode。把我前面说的基础部分搞定过后,可能还不够,很多情况下,笔试的编程题会比面试还难。不过后来我听说大家都是组队的。。我就不多说了(其实是我连组队的人都找不到。。。)

最后说一点,就是校招过程中,会有大量的冲突。你有可能一天遇上三次笔试,这个时候要做出选择。不仅是放弃冲突,如果有连续三场的笔试,我也建议放弃一场,因为人的精力是有限的。根据自身的情况,如果我去连续搞好几场笔试面试,太累了,可能哪一场都搞不好。我现在回想有好几次笔试没过,就是因为精力不够。

面试流程

面试这个东西,真的是天时,地利、人和一个都不能少。运气很重要,实力也很重要。首先,面试是什么?面试是销售你自己的过程。所以你应该主导整个面试流程,而不是等着面试官来问你。为什么会有自我介绍?自我介绍其实就是去讲你会什么,擅长什么,最好顺带讲一下简历里面的重点内容,而不是简单的讲一下名字和学校就完了。如果自我介绍信息量不大,面试官就会从简历里面自己挖一些东西问,由于你简历用词不当等原因,很有可能问到你的死穴。

整个面试下来,像百度、美团等这些大厂面试流程更正规、扎实。美团中规中矩,百度最难(写个多线程计数器让我利用CPU多核下面的 cache Orz...)。腾讯基础考得并不难,项目经历被鄙视。华为面试最水,华为感觉不怎么看面试,看你是不是有一等奖学金,论文这些。大疆不知道什么鬼,有可能是缺人,面了两次,时间都很短。我后面会把我遇到的面试题列一下,供大家参考。

我面试到后面,基本上都能够进入二面或者说是终面。然而在终面或者总监面的过程中,总是因为过去的经历太过薄弱然后挂掉了,也有可能是我不会吹牛,我是觉得真心无解,硬伤。百度内推到终面的时候,问我研究生的研究方向以及成果,我blabla说了一推,明显感觉到面试官不太满意。然后到校招的时候,也是终面,面试官挑我机器学习项目的亮点,讲完了过后,他就问我到底是想做机器学习还是工程研发,觉得我研发项目经验偏弱。Orz...所以我一开始就讲定位,基础都过关了的时候,方向真的太重要了。

再说一点就是,当你觉得面试官觉得对你失去兴趣的时候,这个时候你可以拿着你提前准备好的筹码(前提是你的这个筹码一定要精通),跟他讲你某一个点很熟。比如你熟悉linux内存管理,你熟悉C++多态等等。现在想想,腾讯终面的时候,面试官说我的经历太弱,没有实际的,大型的项目经历,我应该再争取一下,讲一下我的基础,说不定会有转机。

其他

前面说了那么多,都是我自己经验,有一些通用的地方,也有很多我自身的特点。更详细的面试历程,各位可以去网上搜面经,自己多总结。找工作的这几个月,很考验你信心和毅力还有体力。没事多给自己灌灌鸡汤,offer总会有的。

部分面试题目

这里只是一部分面试的内容,有很多我当时没有记下来(比如美团,大疆的我就搞忘记了),不过面试多了,你会发现,题目会有很多重复。

百度运维部(内推):
你的代码行数
最好的一段代码实现经历
linux 子系统模块
最熟悉的数据结构和算法
客户端突然挂掉,然后服务器这边会有什么反应
线程加锁有哪些需要注意的地方

地铁问题:
统计地铁 某一秒的 人数
数据:
时间都到秒级别
进站时间 出站时间 卡ID

然后怎么设计一种结构,可以提供查询 某一秒的 人数, 查第 3 第5秒的人数
方法:
1、用一个数据a[606024]来表示每一秒的变化人数,比如第10秒,进入100人,a[10]+=100,出站20人,a[10]-=20那么最终a[10] = 80。
2、再用另外一个同大小数组b[0] = a[0] b[i] = b[i-1] + a[i] 就是第I秒前的总人数
重点: 考虑每秒变化的人数!

数据库查询慢 会做什么,数据库引擎 inonodb
linux 文件系统 ext2 ext3 inode节点
进程通信的方式
怎么避免死锁
shell 查看CPU 哪些进程的使用
/proc里面的内容和原理,多长时间刷新一次?实际上不是刷新。
sed,awk使用
全局变量初始化 和成员变量的初始化

40亿个 unsigned int 给10w个数 查找是否存在 布隆过滤器
SVM的含义和,优缺点
怎么对用户建模,推荐广告
TCP 启动阶段,做了哪些事情
拥赛控制具体算法
HTTP 协议的字段 cache-control last-modify 这些字段的意义

百度运维部校招:
写一个多线程计数器,比原子操作更快的方式,利用多核CPU的 cache, 定义局部变量, 然后手动合并一下(不会写)
写memcpy 函数, char 字节拷贝效率比较低,然后效率最高的拷贝, 寄存器最多能一次拷几个字节,有没有不经过CPU的拷贝?
两个进程访问同一个页面,怎么弄?
二面:
手写爬虫题:找到所有百度IP,抓百度所有网页,判断所有网页是否相同,再抓取所有百度logo
IP题,题目记不得了,当时用得线段树,没手写出来,讲了思路
推荐系统怎么弄?
运维系统里面,怎么找异常的情况

小米内推:
GET POST区别
C/C++的区别
java与C++的区别
HTTP状态码
ajax原理。
poll与epoll的区别
vfork fork pthread_create 下面都是clone, 它们的区别, 进程结构 task_struct
linux内存管理,分页,页大小,怎么分配连续的内存,kmalloc
线程间同步
进程间通信方式,区别优缺点
linux处理器调度,进程调度,实时进程,非实时进程,实时进程的调度算法
信号量,kill 。发送的信号是 什么? 终止信号能不能忽略, 进程kill之后,资源回收问题
数据库ACID
红黑树
MVC怎么理解?
php与.net平台的区别
数据库建立索引需要注意的地方
jquery 选择器
(就一次面试,面了这么多东西,最后还挂了。。。)

360内推:
一面:
函数对象和普通函数的区别
poll epoll的区别
二叉树遍历、快排、链表遍历,选一个写
线程加锁 需要注意的地方
二面:
树和hash表的区别(速度、修改频率、内存)
进程挂了,怎么办?守护进程
链表有环,不用快慢指针的方法
select 大小限制,是多大?
ping,traceroute,udp
各种协议的原理

华为提前批:
什么是无锁,无锁队列
设计模式相关
为什么要用线程

好未来:
一面:
C++多态原理
菱形继承虚函数表,是调用哪个虚函数
用C语言去实现多态,结构体包含实现继承,函数指针实现虚函数
实现sizeof double 思路: 内存数组,然后相减
二面:
TCP分包粘包,写代码
堆排序,写代码


细胞核s
73 声望7 粉丝