笔者坐标上海,做技术开发,之前有几个月的时间,基本上都是在面试中度过的。我求职的职位是 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::move
- stl 容器新增的 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 的用法细节搞清楚。
操作系统原理
(编辑:ASP站长网)
|