与 30 家公司过招,得到了这章面试心法

发布时间:2019-02-07 20:56:14

作者 | 张小方

本文经授权转载自开源我国

笔者坐标上海,做技能开发,之前有几个月的时刻,底子上都是在面试中度过的。我求职的职位是 Linux 服务器开发,最倾向的职位是服务器开发主程或技能司理。在那几个月的求职进程中,我面试了 30+ 家公司,包含腾讯、百度、阿里的蚂蚁金服和世界支付宝部分、饿了么、爱奇艺、360、携程网、京东、华为、bilibili 与 UCLOUD 等。在这个进程中,考虑了一些面试相关的问题,总结出这篇文章,期望给读者一些启示。

总结下来,技能面试大致有三种景象,下边一一来讲讲。

调查数据结构和算法为主

IT 公司一般都会调查数据结构和算法才干,其间以百度与爱奇艺等为代表,面试官一般是先简略地了解你之前的作业阅历和项目阅历,然后就直接出算法和数据结构的标题,具体涉及到以下内容:

快速排序。调查的当地包含算法进程、均匀算法复杂度、最好和最坏的景象,有人说校招要把算法写出来,我这儿是社招,所以一般描绘一下算法进程即可。二分查找法。一般面试官会要求面试者把算法写出来,或许先结合一个具体场景来发问,需求你联想到要运用该算法,比方求一个数的平方根,接着要你把它具体完结。链表。常见的面试题有要求你写出从一个链表中删去一个节点的算法、单链表倒转、两个链表找相交的部分等,一般需求彻底无误地写出来。完结一些根底的函数。例如 strcpy、memcpy、memmov 与 atoi 这些函数,面试官会要求你用自己的了解和思路去完结。相同,这些一般也需求彻底无误地写出来,并且要确保高效,比方你的完结中有动态分配堆内存,那么这道标题就算答错。链表和完结根底函数的要害点一般在于调查你的代码风格、对边界条件的处理,比方判别指针是否为空,千万不要成心不考虑这种景象,即便你知道也不可,只需你不写,一般面试官就以为你的思路不周详,容错率低;再比方,单链表的倒转,终究的返回值肯定是倒转后的链表头结点,这样才干引证一个链表,这些都是面试官想考虑的要点。

哈希表。对哈希表的细节要求很高,比方哈希表的抵触检测、哈希函数常用完结、算法复杂度;比方百度二面就让我写一个哈希表刺进元素算法,元素类型是恣意类型。AVL 树与 B 树。调查概念与细节,比方会问 MySQL 数据库索引的完结原理,底子上就等于在问你 B 树。 红黑树。这个底子上是必问的数据结构,包含红黑树的概念、均匀算法复杂度、最好最坏情况下的算法复杂度、左右旋转与色彩改换。面试官常见的套路有:你了解 C++ 的 stl 吗?你说了解,ok,stl 的 map 用过吧?用过,ok,那 map 是怎么完结的?红黑树,ok,那什么是红黑树?这样发问,红黑树就开端了。Java 的也相似。

调查操作体系原理等根底技能

这一种以饿了么、bilibli、喜马拉雅、360 与携程等为代表,首要统筹算法与数据结构,但要点放在其它开发技能,比方操作体系原理、网络协议细节与具体的开发库源码等内容。

根底的 C++ 问题

以 C++ 言语为例,这一类常见的问题有:

C++ 的承继体系中 virtual 要害字的效果,如承继联络中析构函数为什么要声明成 virtual 函数,假如不声明为 virtual 会有什么影响、再涉及到父子类时结构与析构函数的履行次序、多重承继时类的成员列表在地址空间的摆放;static 要害字的效果,static_cast、reinterpret_cast 与 dynamic_cast 等几个转化符的运用场景;问得最多的就是虚表的布局,尤其是菱形承继,即 B 和 C 承继 A,D 承继 B 和 C,每个目标的空间结构散布,比方问 D 有几份虚表,D 中 B 和 C 的成员空间排布。别的,假如你应聘的职位运用 C++ 开发,许多公司会问你一些 C++ 11 的东西,或许问 boost 库,底子上都相同。这个你用过就用过,没有用过就说没用过不要装 X,常见的 C++ 11 需求把握的一些技能库我也罗列一下吧:

auto 要害字for-each 循环右值及移动结构函数std::forward、std::movestl 容器新增的 emplace_back() 办法、std::thread 库、std::chrono 库智能指针系列 std::shared_ptr、std::unique_ptr、std::weak_ptr,智能指针的完结原理必定要知道,最好是自己完结过线程库 std::thread线程同步技能库 std::mutex、std::condition_variable、std::lock_guard 等lamda 表达式(Java 中现在也常常调查 lamda 表达式的效果)std::bind、std::function 库网络通讯问题

调查对网络协议的了解和把握程序,比方 TCP/IP 协议栈的层级联络,三次握手和四次挥手的细节,留意我说的是细节,比方 CLOSE_WAIT 和 TIME_WAIT 状况。bilibili 问了这样一个问题,你能够感受一下:

A 与 B 建立了正常衔接后,从未彼此发过数据,这个时分 B 俄然机器重启,问 A 此刻处于 TCP 什么状况?怎么消除服务器程序中的这个状况?

再罗列其它一些常见问题:

万得问过流量拥塞和操控机制腾讯问过 TCP 和 IP 包头常见字段有哪些东方财富网问了堵塞和非堵塞 socket 在 send、recv 函数上的行为表现异步 connect 函数的写法select 函数的用法epoll 与 select 的差异,底子上只需问到 epoll,必问 epoll 的水平形式和边际形式的差异一些 socket 选项的用法,nagle、keepalive、linger 等选项的差异TCP 与 UDP 的差异和适用场景通讯协议怎么规划防止粘包HTTP 协议的 get 和 post 办法的差异,问得比较深的会让你画出 HTTP 协议的格局或许会问到 Windows 完结端口模型(IOCP)总归,网络通讯问题能搞得多清楚就搞多清楚,最起码把 TCP 应用层各种 socket API 的用法细节搞清楚。

操作体系原理

上海黄金交易所和喜马拉雅听书都问了 Linux 下 elf 文件的节结构,映射到进程地址空间后,别离对应哪些段。相关的问题还有全局变量、静态存储在进程地址空间的哪里。饿了么二面问了操作体系的保护形式实形式、中止向量表、Linux 下的 CAS。Linux 体系下或许还会问什么是 daemon 进程,怎么发生 daemo 进程,什么是僵尸进程,僵尸进程怎么发生和消除。

堆和栈的差异,栈的结构、栈的细节一点要搞得特别清楚,由于一些对技能要求比较高的公司会问得比较深化,例如京东的一面是让我先写一个从 1 加到 100 的求和函数,然后让我写出这个函数的汇编代码,Java 开发的同学或许会让你试着去写一点 JVM 的指令。假如你对栈的结构,如函数参数入栈次序、函数局部变量在栈中的布局、栈帧指针和栈顶指针方位不了解的话,这标题就无法答对了。

栈的问题,或许会以常见的函数调用方法来发问,常见的有 __cdecl、__stdcall、__thiscall、__fastcall 的差异,比方像 printf 这样具有不定参数的函数为什么不能运用 __stdcall。

此外还有进程和线程的联络与差异,问得最多的就是线程之间的一些同步技能,如互斥体、信号量、条件变量等,Windows 上还有事情、临界区等,这类问题还能够引申为什么是死锁、怎么防止死锁。这些东西你有必要了解到具体的 API 函数运用的层面上来。这是实践开发作业中编码最常用的东西,假如你连这个都不能娴熟运用,那么你八成不是一个合格的开发者。

进程之间通讯的常用技能也需求把握,Linux 常用的通讯方法有同享内存、匿名和签字管道、socket、音讯行列等等,管道和 socket 是两个有必要深化把握的调查点。

运用过的开源技能

调查运用过的开源技能,比方 Redis 与 MySQL 等项目。开源技能的运用一般不做硬性要求,可是这儿有必要着重一下 Redis,娴熟运用 Redis 乃至研讨过 Redis 源码,现在一般是对做后台开发的技能硬性要求。

依据 Redis 的面试题既能够聊算法与数据结构,也能够聊网络结构等东西。我面试的公司中底子上百分之九十以上都问到了 Redis,仅仅深浅纷歧罢了,比方喜马拉雅问了 Redis 的数据存储结构、rehash,bilibili 问了 Redis 的事务与集群。

调查项目阅历

只问一些做过的事务或许项目阅历,这类公司他们招人其实对技能要求不高,除非是资深及主管级开发。只需你过往的项目与当时应聘职位匹配,能够过来直接上手干活就能够了,当然薪资也就不会给许多。比方游戏公司会关怀你是否有某某类型的游戏开发阅历、股票类公司会关怀你是否有过证券或许交易体系的开发阅历等。

事务开发哪里都能找到,真实注重技能的公司,应该是广大做技能尤其是初中级开发的朋友更为重视的。

不靠谱型公司

面试进程中,其实还会发现一些不靠谱的公司,我遇到的大致有四类:

装 X 忽悠型公司

面试进程冗长繁琐,我面试的有一家公司就是这个姿态,先是一轮长长的电话面试,然后是五轮技能面试,前三轮是刷 leetcode 上的原题,然后后几轮面试官从底子的操作体系中止、GDT、LDT、分表分页机制问到上层高并发海量数据的架构。从外太空聊到内子宫,终究问具体职位做什么时,要么遮遮掩掩要么原型毕露,或许评论薪资时,要么面露难色要么各种画饼,可是实践就给不了多少薪水的。

佛性公司

全程面试官面带微笑,问的问题你答复之后面试官也表明很附和,但终究你就是没通过。我猜想要么公司不是很缺人,想张望一下是否有适宜的人才,要么招聘信息上开的薪资给不到。

老奶奶裹脚布型公司

其特点是面试周期长,往往榜首轮面试告诉你过了,让你回去等上十天半个月后,给你打电话告诉你来第二轮面试。面试要求穿正装,带好各种证件,面试前有必要先查验你的身份证、学历证学位证,乃至是四六级考试证等等,费事备至。即便你一路过关斩将过了终面,薪资也给不了多少。我们都是要养家糊口的,都是忙着找作业,谁有时刻和你耗上十天半个月呢?

不尊重人的公司

我这儿说的不尊重人,不是指的是面试进程中对你人身攻击,而是不依据你的作业年限和阅历随意组织面试官。举个比方,比方你作业十年,你去面试一个技能总监的职位,对方公司组织一个作业不满两年的部分职作业为面试官,这个面试官假如是走过场能够了解,可是非要和你纠结一个如二进制位移、现代编译器要不要在子类析构函数前加 virtual 要害字这些技能细节就没必要了。还有一类就是成心问一些刁钻的问题,或许全场都心猿意马、玩手机、掉以轻心的面试官,比方问你 TCP 协议头有多少个字段,每个字段是干啥的。遇到这一类面试官我的阅历就是要么婉拒,要么直接怼回去。

技能之外的重视点

除了技能上的东西,面试中还有其它方面需求考虑,这些东西有时分或许比你直接面试通过一家公司还重要,由于其间有一些是联络到你整个作业开展的:

榜首,假如你的作业年限不长,尤其是巴望在技能方面有必定的造就,那么你首要考虑的应该是新的单位是否有利于你技能上的生长,而不是把眼光放在三五千的薪酬距离上。另一方面,假如想转行的同学,比方从客户端转服务器,从 C++ 转 Java,那么不要由于薪资俄然变低而回绝这种阵痛,要把目光放久远一点。

第二,一些公司尽管招聘信息上写了最多能给到多少多少,但实践上即便你全程面试下来都很完美,或许终究也会由于在招聘信息范围内提出的薪资要求“太高”而不被选取。

第三,一些底子不想去的公司,假如你有时刻的话,去面试堆集下阅历也不是什么坏事。

第四,面试的时分,一起也是你在调查面试官,一般面试官问你的问题,你能答复出来的在百分之八十左右,这样的公司能够考虑去入职,你进去的话或许才会在技能上有一些提高。假如你全场秒杀面试官的标题,那么一旦你入职,你的技能天花板或许也就在那里了。

第五,面试的时分聊清楚你将来的职位内容,防止进去客串一些不想做的作业。

第六,遇到不会的面试题,不要直接就否定自己,能够尝试着去和面试官沟通一下,或许要求给点提示或许思路。

第七,不要小看书面考试中的一些数学智力标题,仔细作答,试问算法不也是数学智力题吗?

第八,自傲一点,每个人的阅历和阅历都是绝无仅有的,面试的时分,一些特定范畴的问题,答复不出来也不要太介意。

上边这些就是我通过与 30+ 家公司过招,引发的关于面试的考虑,期望对阅览的朋友有所协助。

由于个人阅历才干有限,并且限于篇幅,许多当地也不方便具体打开,读者假如有什么主意或许指导,欢迎沟通讨论。

作者:张小方,资深开发工程师,现在在某大型旅行互联网公司任技能专家,专心于高性能服务器的研讨与开发。