清晰版链接
面经
我从4月份才开始真正的投递公司,就有点晚了。有些公司都是赶在尾声投递的。所以我是看到c++关键字就试者投递了一下。
腾讯 后台开发 (第一次正式面试)
第一次投递,还没来的及看面经看看都有什么题目。刚投递,腾讯来了面试邀请我发送冲突延迟1天,结果下午直接来电话面试。
一面 (挂了)
- c++ 虚函数? 大概把虚函数表,有继承的情况,基础多个父类部分有虚函数的情况简单说了一下
- tcp 的三次握手 4次挥手流程?\ 4次挥手的最后一次客户端发送(ACK=1)之后等待2个最长报文时间描述错了。\ 面试官问我确认吗?我回答:刚学计网这边有点记错了
- STL了解多吗?\ 平时用过一些
- 简单说一下set和map底层是什么实现的?\ 使用自平衡二叉树
- 你确定是平衡二叉树吗?\ 我感觉是吧, 我没有太过仔细看里面的实现(是在是太紧张了, 脑子空白, 当时就凭着记忆回忆了数据结构学的所有的树, 回答了我觉得最合理的一棵树. 后面回想可能是面试官希望听到具体的红黑树而不是泛泛的平衡二叉树)
- 你是没有了解过STL的实现吗?(知道我没有准备或者很菜, 有点不开心了) \ 不好意思, 我平时这边可能欠缺注意.
- 那要是你实现一个链表你会怎么实现?\ 用双向链表吧, 牺牲一点空间换一点性能吧.
- 你平时c++都看过什么书\ 我看的c++的书可能比较少一点, 看到一些实现类的东西多吧.
- 行吧, 那我就到这里了.你有什么要问我的吗?\ 那个您觉得我这次有什么不足的地方要加强吗?\ 你这个基础知识不够啊,有很多都是基础的,你答不上来很影响的.
反思
确实是我自己的问题, 我没有做好准备就开始浪费他们的时间. 痛定思痛, 专心准备几天
字节 系统工程 (第二次面试)
初生牛犊不怕虎, 投了一个不知道的岗位. 因为其他位置要求了一些很具体的要求, 我没有达到. 只剩下这个相对吻合.
一开始简单讲了一下项目,觉得没有特别之处,就开始问基础知识了
- struct 关键字的size判断\ 看机器, 和字节对齐要求.比如我的是64位机器那么int long 是32位.\
- 64位机器, long 是32位吗?\ 我记得是这样的, c语言的这些保留字混乱, 在int, long, long在平台不一定, long long 一定是最长的. 我记得我试的时候在我的平台和编译器上是32位.
- 那你的机器是32位的吧. 那你说这个对齐. 为啥要这么对齐, 以8位对齐和3、5对齐有什么区别呢?\ 8位对齐的话位便宜的最小单位是8, 同样3、5对齐就是3和5. 8位的话对于常用的指针和int等类型来说浪费较大. 对齐位小了,效率又低. 比如3, 5 位这种非2的幂对齐则会对性能有影响。因为现在计算机体系的寻址位移导致2的幂次寻址快。
- 后面就是一个简单的算法题:在无序数组中找到按序左右差最小的两个数 归并排序排序加线性扫描(其实在最后一次合并的时候可以直接扫描出来不用真的合并,当时太急着给答案没想到)
被转岗,简历没通过。面试过程很轻松和舒适,我都不知道是怎么挂的。
smartX(最难受的一次面试)
一家做存储的公司,但是我看要求上没有太多,所以我去试试了。
面试官个人情绪很重。
一面挂了
- 项目经历,我看你这些项目都没啥意义,你这个存储项目还是比较近期做的是吧,先考考你基础知识。
- 你了解VFS吗?open操作是怎么做的。\ 是要站在什么角度去思考这个问题,是要考虑定时器终端吗(一开始我没有反应过来VFS是虚拟文件系统)
- 不用粒度那么细,就是考虑VFS就行\ VFS我没有了解(我们学校新换的教材,是OSTEP,没有讲虚拟文件系统,而是一个真实的文件系统。我后来才想起来虚拟文件系统的缩写是这个VFS)
- 你们不学操作系统吗,你不是计科吗?那我问你IPC中哪个最快。 信号量,或者共享内存吧(这边真的是记不清楚了,忘记信号量是怎么实现的了。 明显面试官已经不耐烦了)
- 进程,线程,协程的区别? 进程线程很简单,但是我协程说的少,我就知道c++要支持协程了,协程比线程更轻量。
- 问了一个网络链路的问题,具体也忘记了好像是同一子网下已知ip通信的问题,感觉考的是arp。\ 被质问这不是网络书第二章的内容吗,你为啥都没学,那后面网络也不用问你了。\ 虽然解释了,现在的教材是自顶向下,第二章是应用层http啥的,但是面试官已经被我的不专业搞得不开心了。
- 你都是怎么学习的,你最近不是再做一个单机KV吗,你看了什么。\ 我整理了目前主流的数据库索引方式,比如b+树,还有一些内存数据库的索引有:跳表、哈希、平衡二叉树。(我发现我说自平衡二叉树,好多人都只会以为我要表达的是AVL这种平衡深度的树,其实红黑树也是的啊是黑色平衡以后这边我会强调是红黑的)\ 还有最近在看Redis分析的文章,在看一下我需要的点。
- 那你是一篇paper都没读过吗,你没有度过paper你的高度就只会在那个写《XXX剖析XXX》的水平,而且还有可能会被误导。\ 嗯,因为我确实是没有想过看他们的储时paper,我在官网看了官网的文章。
- 官网文章是给使用者看的,你看这些没有意义。那你随便讲一下你最近阅读过的paper。 我最近可能没怎么看过paper(我是真的没想起来,因为我以为问的是那种顶会很出名的那种)我看过一个人改良了传统的hash map成为了内存友好型。并且分析了和谷歌提供的map空间利用率。在他的future work里面提到了他已经有想法把利用率提高到87.5%
- 好,你说hash map的内存友好,hash map为啥内存不友好。\ 这个不友好是相对而言的吧,你和红黑树比肯定快,但是消耗空间。
- hash怎么就比红黑树消耗空间了,hash就是一个计算的再存储,你同样要存储相同的数据,树还有指针索引的浪费,为啥hash内存不友好。\ 我不太清楚,我以为是红黑的分配是动态的,而hash不太一样,hash map 要指定大小,为了冲突降低或者雪崩效应,hash要分配的空间要大于自己暂时需要的大小。
- 真的是这样吗,你都没有好好了解。hash确实在一些场景内存不友好,但不是你说的。
- 后面就是我问他咋学习,咋看paper学习。面试官虽然十分不耐烦,语气声音已经不正常了,但是依旧非常详细的给我解答并且告诉我看paper的重要性。因为这是一个项目开始的纲领,虽然实现和这个paper会差的很远,但是你这样才会知道为什么这么做,还有方向
反思
这次面试直接自闭,感觉就很废物。啥都不会,但是也托这次面试的福,我再后面两天刷了一下raft一致性的初始论文、MapReduce、GFS的论文,发现其实这种paper其实也就是一种正式的博客。只不过很权威性。而且这些技术博客的语言已经很简单了,就是思想比较难而已。
这次面试很痛苦,但是收获也多。
深信服 (三轮技术面,已拿offer)
一面
简单聊项目,聊了聊面试过程中遇到的难处。和重新设计会怎么操作。
- c++ 虚函数
- tcp 三次握手、四次挥手
- 一道智力题
还有一些比较基础给忘记了
二面
问项目经历,和校园经历
- 你们的并发操作是什么实现的 我写的线程池,一单一个线程休息了,用消费者锁从任务队列取一个任务做。把cpu的一些核隔离起来,让cpu不能把任务安排过去,然后把程序绑定过去。
- 这个项目做的时候有遇到什么坑吗?\ 我是写线程池和负责http报文解析和构造的人,我有一个队友在写socket任务的时候在一个地方忘记释放文件描述符了,造成了每次运行能承载的量是不一定的,很诡异的问题。我后来发现文件描述符的问题之后,帮他改释放了。同时修改了系统配置,把文件描述符的上限开到了100k,因为我电脑笔记本的一级缓存只有256k,100k足够用。
- 我现在有足够用的服务器,如果想要承受600m并发数的访问,你要修改那些配置。\ 我觉得首先就是哪个文件描述符的数量,然后把后面的保留端口全部打开,因为一共有65535个端口,而后面被保留了很多全部打开,每个端口分配一定的线程让乘积大于等于600m就可以。
int (*a[8])(int)
是什么 函数指针数组,参数int、返回int、这个系列有八个函数可以用偏移或者[]访问到。- 给了一个更复杂的式子,其实也是一个函数只不过已知其地址位0x1000000。要求是如何跳转到这个地址上。\
首先想到的是CSAPP里面的缓存区溢出攻击。被反驳,因为段错误。后面才想到其实可以定义一个二维指针,指向的地址是
0x1000000
。然后用这个指针就可以使用这个函数了。 - 后面又考了两个智力题
三面
被鸽了30分钟,然后对方在家里面试我。
- 看了你的简历,没有很多的科研经历。你做过什么吗,我看你在导师那里做了一些东西。\ 我balabala说了一堆,概括了一下核心:其实是一个非对称加密的密钥分配的一个改进。
- 那其实也不是很复杂的东西,我是说那种开源的东西...又聊了为啥校园生活没有经历ACM啊等等。
- 聊了很多项目理解啥的
- 做了两个题,简单题被卡了20分钟很尬尴。然后一个稍微难一点的题3分钟A了
- 最后我问了面试表现,面试官说你这个第一天确实很失望,但还好第二题做回来了。
后记
我以为挂了,因为简单题没搞出来。但是没想到一天后收到了offer,都没有什么HR面。深信服反馈也挺快的。
阿里(一面,在流程)
- 成绩咋样,讲述项目。
- 几个基本知识
- 一道算法题目就是一个子集树。(中间写了一些不必要的临时变量)我给删了,所以稍微耽误了时间。
- 我问他我的表现中有什么不满意的吗?\ 面试官说我写代码思路乱乱的?没懂什么意思。
腾讯(被捞,刚一面)
第一次被三个人同时面试,他们换人的时候说了一句“我没什么问题了,那我来。”吓得我以为人格分裂,解释清楚了之后后面的面试流程就比较轻松
项目经历
这里切换了一次人,两个人轮流提问,我基本没有停过
真的很详细。包括我说的一个细节:我们的解数独用的算法是我们稍微在BFS上优化了,加入随机模型更好触发平均性能。
对面一下子来兴趣了。
你这个算法是有数学整明还是什么。
不是数学整明,而是在解的分布上,大致遵循正态分布在整个解空间中,所以我建立的随机算法也是准寻一个正态分布。所以我们就是这样做的。
那为啥不直接从中间找。
直接从中间找其实有点类似与深度学习过程中的过拟合,把正态分布过拟合成了中间为100%概率。这样虽然在这个区间内有良好的性能,但是对于最差情况就很糟糕了。加入随机性就是希望降低最差情况的影响。在最后的40G数据量测试下都能保证较好的性能
你说的这个编译器里面的闭包特性是你预计要实现的是吗
用我对维基百科的了解讲了一下闭包的概念。实现思路就是一个匿名函数,然后把定义这个匿名函数的函数的局部变量设置为调用处的内部匿名变量。使得在被调用的词法作用域内值被记录达到一种保存状态的效果。
还有一些细节给忘记了。
操作系统、网络和c++基础
这里切换了1次人,问了很多。基本我没停过,一个面试官想问题,另一个在想。
压力挺大的,也挺紧张。还好有人格分裂乌龙。导致气氛相对缓和。