笔者坐标上海,作技术开发,以前有几个月的时间,基本上都是在面试中度过的。我求职的职位是 Linux 服务器开发,最倾向的职位是服务器开发主程或技术经理。在那几个月的求职过程当中,我面试了 30+ 家公司,包括腾讯、百度、阿里的蚂蚁金服和国际支付宝部门、饿了么、爱奇艺、360、携程网、京东、华为、bilibili 与 UCLOUD 等。在这个过程当中,思考了一些面试相关的问题,总结出这篇文章,但愿给读者一些启发。面试
总结下来,技术面试大体有三种情形,下边一一来说讲。算法
IT 公司通常都会考察数据结构和算法能力,其中以百度与爱奇艺等为表明,面试官通常是先简单地了解你以前的工做经历和项目经验,而后就直接出算法和数据结构的题目,具体涉及到如下内容:数据库
链表和实现基础函数的关键点通常在于考察你的代码风格、对边界条件的处理,好比判断指针是否为空,千万不要故意不考虑这种情形,即便你知道也不行,只要你不写,通常面试官就认为你的思路不周详,容错率低;再好比,单链表的倒转,最后的返回值确定是倒转后的链表头结点,这样才能引用一个链表,这些都是面试官想考虑的重点。服务器
这一种以饿了么、bilibli、喜马拉雅、360 与携程等为表明,主要兼顾算法与数据结构,但重点放在其它开发技术,好比操做系统原理、网络协议细节与具体的开发库源码等内容。网络
基础的 C++ 问题数据结构
以 C++ 语言为例,这一类常见的问题有:架构
另外,若是你应聘的职位使用 C++ 开发,不少公司会问你一些 C++ 11 的东西,或者问 boost 库,基本上都同样。这个你用过就用过,没有用过就说没用过不要装 X,常见的 C++ 11 须要掌握的一些技术库我也列举一下吧:并发
网络通讯问题框架
考察对网络协议的理解和掌握程序,好比 TCP/IP 协议栈的层级关系,三次握手和四次挥手的细节,注意我说的是细节,好比 CLOSE_WAIT 和 TIME_WAIT 状态。bilibili 问了这样一个问题,你能够感觉一下:异步
A 与 B 创建了正常链接后,从未相互发过数据,这个时候 B 忽然机器重启,问 A 此时处于 TCP 什么状态?如何消除服务器程序中的这个状态?
再罗列其它一些常见问题:
总之,网络通讯问题能搞得多清楚就搞多清楚,最起码把 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+ 家公司过招,引起的关于面试的思考,但愿对阅读的朋友有所帮助。
由于我的经验能力有限,并且限于篇幅,不少地方也不便详细展开,读者若是有什么想法或者指教,欢迎交流探讨。
张小方,资深开发工程师,目前在某大型旅游互联网公司任技术专家,专一于高性能服务器的研究与开发。
本文系做者投稿文章,欢迎投稿。投稿要求见:
https://my.oschina.net/editorial-story/blog/1814725
可参考已发布文章: