经历了两个星期的阿里云polarDB组面试结束了,我的最后一面是第四面,全程48分钟,全部是coding,跪得非常惨烈。
很不甘心,因为研究生阶段的科研做的都是相关内容,而且前三面问的都是扩展性的问题,难度很大但是我答得还不错,挂在了四面实在觉得前功尽弃。
但是其实也只能怪自己实力不行,挂在编程题上说明数据结构部分还是有欠缺。
但是还是好难过啊,本以为能够去polarDB谈笑风生,结果又被打到谷底,0 offer(s) 0 job(s)。刚刚传来噩耗,女朋友的阿里转正也可能没过,雪上加霜……
一面 - 1小时20分钟
聊了40分钟项目相关的实现,40分钟两道编程题。因为我的研究方向就是分布式数据库,所以一面二面三面都没有问常规知识(牛客C++面试宝典里的那些)。
介绍一个你最想跟人介绍的项目吧。
那你做的这个内存池是静态大小的吗?所以是一个object store的感觉?(是的)
那内存池要扩容的话怎么做?
hugepage 跟普通 page 比,优势是什么?
L1 L2 L3 cache access / Memory access 各是多少毫秒?
你们怎么测的 NUMA memory latency?
说说 cache coherence protocol 是什么?
你们做的这个确定性的数据库是什么特点?(这里聊具体细节,可以看出面试官的功力很深)
说说在头条的经历吧(同样聊具体细节)
编程题1 - 请实现 uint32_t IPtoInt(const string IP) ,函数可以将IP字符串(如 “127.0.0.1” )转换到一个 uint32_t 中去(值为 0xef000001)。(细节:要处理各种异常)
编程题2 - 给定一个 CAS (compare and swap) 函数的签名 int CAS(void* location, void old, void* new),请实现一个无锁的链表。
二面 - 1小时2分钟
离一面过了两天。全程都在聊项目,没有编程,是我感觉压力最大的一次面试。面试官往下钻得非常深,而且很多问题都是看你有什么思考。
你们的分布式系统是如何接受事务请求的呢?
那你觉得怎样可以让整个系统可以均匀地进行服务,分配资源?
不说分布式系统吧,一台单机上你要怎么让多核心能够均衡的协调资源呢?
你是如何理解消息传递机制的?
Go里面有原生的消息传递机制对吧,那要是你需要在C++里实现一个,你觉得难度大吗,你会怎么做?
看过相关消息传递机制的源码吗?
你做了很多内存相关的内容,解决内存的争用有哪些方式?
能说说内存的段页式管理吗?
内存的段页式管理是为了解决什么问题?
那非线性地址映射能带来什么好处?
你学习的操作系统的知识,平时会有用到嘛?
用过 C++11 对吧,C++11 的 memory order 了解吗?
有去了解过通用的内存池技术吗,是看过源码还是读过文档?
你们用RCU的方式去回收内存,在实践中还是很少的,你们为什么选用 RCU ?
在网络方面你做过相关的工作吗,有去实践过相关的实现吗?还是只是用过库代码?
在存储方向你有做过哪些研究,有过哪些尝试呢?
你之后的职业规划是怎样的呢?
三面 - 1小时8分钟
离二面过了三天。同样,全程都在聊项目,但是没有二面难,具体聊的什么我没有记下来。
四面 - 48分钟
离三面过了一个星期。我不知道这一面的面试官是不是交叉的P9,他只说了他是阿里云的。
这一面全都是coding,别的全都没问。我估计是因为二面三面没有编程,所以四面补一下。我应该是牛客网上第一个阿里四面全是编程的吧,也是第一个挂在四面编程题上的吧。
编程题1 - 请实现 void print_uint32_t(uint32_T) ,函数可以将一个 uint32_t 打印到屏幕上。如 0 打印成 0,15 打印成 F,255 打印成 FF。
这道题很基础了,我花了15分钟完成。
编程题2 - 给你提供一个 pair<int, int> 的数组,请将他们插入到数据结构 TREAP 中(下面有解释)。
面试官一开始说“你听说过TREAP这个结构吗?”的时候,我的心里简直是崩溃的,这都啥啥啥?
TREAP 是一种二叉树,每个节点有两个值 a 和 b, 要满足所有的 a 按照二叉搜索树的顺序排列,所有的 b 按照最小堆的顺序排列。面试官说插入的过程中二叉搜索树可以不平衡。
面对新的数据结构不知所措,我接连说了好几种思路面试官都说不对,最后我想出来一个思路 “先按照堆的方式进行插入,然后不符合搜索条件的再去旋转调整”(应该是这样说的),然后面试官说“这样是可以,但是太麻烦了,有没有简单一点的呢,你再想想”……最后22分钟过去了,我也没给出思路,面试官就给下一道题了。
编程题3 - 你觉得C里面的函数指针有什么用呢?(答:可以实现多态)那你用C的函数指针实现一个多态吧。
我最后说的思路是类似C++,弄一个虚表存在对象的首地址上,也没来得及写代码。后来巨佬跟我说,应该是在struct里加一个type类型和大小,然后进行强制类型转换。
最后面试官问我,“你平时写C写的多吗”,“大学期间的代码行数有多少啊”,然后就说“我这边没什么要问的了”。自我感觉过于惨烈,我也就没问他问题。
Anyway,秋招还是要继续,科研还是要继续,生活还是要继续……