加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

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

发布时间:2019-03-05 03:21:34 所属栏目:建站 来源:编辑部的故事
导读:笔者坐标上海,做技术开发,之前有几个月的时间,基本上都是在面试中度过的。我求职的职位是 Linux 服务器开发,最倾向的职位是服务器开发主程或技术经理。在那几个月的求职过程中,我面试了 30+ 家公司,包括腾讯、百度、阿里的蚂蚁金服和国际支付宝部门
副标题[/!--empirenews.page--]

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

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

总结下来,技术面试大致有三种情形,下边一一来讲讲。

一、考察数据结构和算法为主

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 的用法细节搞清楚。

操作系统原理

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读