百度、滴滴OC,却挂了字节

ly_liyi
发布于 2022-10-20 15:36
浏览
0收藏

你好,我是阿秀。

鉴于很多学弟学妹都会选择通过实习转正的方式上岸秋招,这就不得不提一下两个公司了,一个是字节,一个是阿里。

字节应该知道的会多一些,这个公司敢启用新人,会给新人很多机会,这个新人不仅仅是指一些入职的正式员工也包括实习生,在字节一个小组正职只有三四个,实习生却有七八个的场景也属于是常规操作,但因为字节转正率比较高,所以字节实习面试和校招面试难度基本一样,即使稍微简单点也不会容易到哪里去。

还有一个公司就是阿里,阿里每年秋招上岸的有一大半都是通过实习转正的形式,通过校招面试上岸的也有,但实习转正上岸的更多,在蚂蚁阿里云这些大BU下更是如此。

上周一个师妹第二次面了字节实习岗,面完后找我私聊,我看了下她的面经,问得都挺深的,而且师妹也总结了的面试心得,我觉得非常不错。

这位师妹也已经拿到百度和滴滴的口头实习offer了,属于那种有保底offer的人了。

百度、滴滴OC,却挂了字节-鸿蒙开发者社区

其实她之前也有个字节实习岗已经oc了,但这位师妹给拒了,这次是重新来战实习岗!

今天分享一下她发在​​学习圈​​里的这份面经&总结:

以下是师妹面经,其中的“本人”指代的是这位师妹:


1、前言

本人在某985研一在读,科班出身,并不是应届生,所以投的都是一些日常实习,这次的目标是C++开发/后端开发/基础架构。

这篇面经给秀哥看过,秀哥觉得挺有用,因此分享到​秀哥的学习圈​中,如果有什么问题欢迎批评指正。

在自己投简历前,也找秀哥帮忙看过简历,十分感谢秀哥以过来人的身份帮忙review简历,真的很多问题自己是看不出来的!

先说一说投这个岗的缘由,我的技术栈是C++,准备的方向偏后端,本来想投后端的。

岗位是C++的,部门应该属于基础架构部门,但是我的经历其实跟岗位不太match(语言是match的),是经过同学内推的,正好同学也说不强制有存储相关的经历。

最初知道我要面的是这个,而不是业务的后端岗位的时候,我是想拒绝的,因为我怕太难面,考太多底层的东西。

我想了想今后有想转鸡架(基础架构)的可能性,也考虑到鸡架岗面试难度不一定比业务岗难。因此选择接受面试。

注:无论是什么语言栈的,如果手头有RPC项目的,可以参考一面对RPC项目的问法,问的还是比较有水平、有深度的

2、流程&面经&答案&总结

1、总体流程

  • 2022.7.1 投递简历(内推),下周一邮件约面(2022.7.4)
  • 2022.7.8 17:00 一面
  • 2022.7.14 17:00 二面(2个工作日内)
  • 2022.7.20 11:43 感谢信(4个工作日内)

2、一面(65min)

面试官是校友,看到我的简历上的毕业年份愣了一下,觉得不应该是个非应届的过来...

自我介绍

做字节的舔狗,我真的非常想去字节啊啊啊啊啊

八股/项目(50min)

问我简历的内容,其实还行。

主要环节是,智能指针痛彻心扉的一番拷打(这块好像说了20min左右),一致性哈希拷打,RPC拷打。

  • 用过C++11吗?
  • 用过
  • 知道 unique_ptr 吗?
  • 知道,是独占所有权的智能指针
  • 怎么实现独占所有权?怎么转移所有权?
  • b = a; 怎么实现?b = move(a); 怎么实现?
  • 就是说了移动构造函数/移动赋值运算符的流程
  • 知道 shared_ptr 吗?
  • 知道,是共享所有权的智能指针
  • 怎么实现的共享所有权?
  • 引用计数
  • 引用计数和管理的内存地址怎么实现的?是同一块内存空间吗?
  • 都在堆区
  • make_shared 会放在同一个空间
  • 引用计数和管理的内存是相生相依的吗?
  • 没搞懂,最后就问了这两个是同时创建的吗?
  • 其实不是,传入 new xxx 的构造函数就不是
  • 同样问了 shared_ptr 的 b = a; 怎么实现?b = move(a); 怎么实现?
  • 同样说了下拷贝构造函数/拷贝赋值运算符、移动构造函数/移动赋值运算符的流程
  • (想问点分布式存储相关的)知道raft吗?
  • 只了解是个分布式共识算法,没了解具体内容(论文都没看,我可不敢说我了解了)
  • 看我没有相关经历,那就挖一挖简历吧
  • 知道一致性哈希吗?
  • 顺便提了一嘴自己的RPC实现了这个东西
  • 解释一致性哈希是什么,然后开始深挖一致性哈希,怎么减少这种数据的移动,分桶结果改变的
  • 然后开始引出虚拟节点
  • 互斥锁,信号量使用的场景区别
  • 一个线程互斥,另一个线程同步
  • 互斥锁,读写锁,自旋锁的区别
  • 八股文,只说了自旋锁,就没让继续说了
  • 怎么实现自旋锁
  • 说了原子操作,test and set指令(tsl)
  • RPC的实现流程?
  • 八股文
  • 怎么在同一个端口,发布多个服务?
  • 就说说自己咋实现的
  • 怎么实现的超时?
  • socket设置,recv超时
  • 然后开始问重试机制,如果需要我实现应该怎么实现?
  • 最大重试次数,计数
  • 如果同时发出很多个RPC请求,这个qps上不去,咋办?
  • 不知道,想了一会说,也不能总是创建很多个线程吧
  • 然后就说可能得用I/O多路复用了
  • RPC调用的同步和异步,和之前说的同步和异步,是一个意思吗?
  • socket的同步阻塞,是收到数据前,一直阻塞,等着
  • 这个是在得到调用结果前,是否可以继续做下面的事情
  • 那我继续问,如果同一个RPC调用,按照你之前的重试机制实现,如果前一个请求(涉及到写,非幂等,比如文件创建)是成功的(但是做的太久,设置的超时太短,以为超时失败了),后面重试的请求失败了(显示文件已创建),应该怎么解决?
  • 想了很久,说同一个请求的数据包都是通过请求id关联的,
  • 那么每个请求,都单独开个线程去等(因为重试的次数本就不多),然后请求到的结果,放入哈希表,当然,也放到队列里面
  • 通过请求id,索引哈希表,看看有没有最近的成功请求结果,如果有,之后的失败请求,就没必要记录了
  • 那么,根据这个实现,如果第一次的请求是响应成功的,但是由于网络原因失败,应该怎么办?
  • 不懂了,之后没继续深挖
  • 那么就说webserver吧(简历的项目名称不是webserver,不过被一眼看出,老面试官了)。你知道I/O多路复用机制,除了epoll,还有啥吗?
  • select,poll,原理差不多,没让说具体原理
  • ET和LT的区别?
  • 八股文
  • ET和LT哪个性能更好?
  • 一般认为ET更好,毕竟可以从内核中少拷贝就绪文件描述符
  • 但是,ET伴随着使用非阻塞socket,要一次性读完、写完数据,也就是说可能进行的 read 或者 write系统调用会更多
  • 至于是否真的更好,目前没有定论,需要在更多的环境、场景下去测试

算法题(10min)

直接就在飞书上了,ACM模式

排序链表(LeetCode 148)

  • 让选择一种比较擅长的实现,选择了最简单的递归版归并排序,不过今天当天写过,所以bug free了
  • 然后讨论了 new 了新节点,没释放的问题(这个习惯在工程实现上确实不好),修改了下代码

反问

  • 目前在做的工作,编程语言,技术栈
  • 文件系统,C++
  • 平时会用什么库,或者什么其他技术栈
  • 有一些自研的,也有RPC(字节自己的RPC,百度brpc),也用类似muduo的这种网络库
  • 涉及到数据库(存储引擎)吗
  • 没有,这个是数据库的组做的
  • 我的表现有什么需要改进的?什么时候能知道结果?
  • 还行,挺好的
  • 几天之内,可以问hr

总结

总体而言,聊的很愉快,虽然中间确实有部分问题不会回答,也回答不够好,比如项目中的一致性哈希,了解不太熟,下次还得再练练,其他还好。

3、二面(50min)

二面面试官比较年轻,也还好,不会给人很严肃的感觉,没回答上的问题,也没有关系

自我介绍

继续舔狗就完事了,说到「字节跳动是我非常尊敬和仰慕的公司」,当然其实我每次面字节都会说这句话,面试官笑了(有一丢丢的小尴尬,但我真的很想去字节啊啊啊,原谅孩子吧)

八股/项目(25min)

  • 用的是C++11吗?(固定开场了这是?)
  • 用过
  • C++11新特性有啥?
  • 八股文
  • 解释什么是左值,什么是右值,move 是干啥的(超高频了)
  • 什么时候用到右值,移动构造函数/移动赋值运算符函数的流程
  • 八股文
  • 说了一半,面试官明白意思了,没让再往下说
  • 虚拟内存和物理内存的差别,为什么要用虚拟内存?
  • 八股文
  • (麻了,一直问还有吗)
  • 虚拟内存有哪些部分?
  • 八股文
  • 内核区、用户区
  • 用户区有代码段、数据段、堆栈段(中间还有个文件映射区)
  • 虚拟内存的查询流程
  • 说了下二级页表查询
  • C++ 的 new 运算符流程
  • 八股文
  • operator new
  • 调用构造函数
  • malloc 函数返回的地址是什么地址
  • 虚拟地址
  • malloc 返回什么样的地址,如果分配10字节。
  • 说了下 malloc ,在分配空间小于128k使用 brk 系统调用,将堆区顶部上推
  • 实际上不是每次都调用,会维护内存池,把一堆空闲块,用链表链接起来
  • 面试官追问,如果链表太长咋办?
  • 我就把C++ allocator的二级空间配置器的原理搬过来了(维护不同块长度的空闲链表)
  • 这个链表的并发访问,除了加锁还有啥方法吗
  • 说了下原子操作(也不知道对不对)
  • 了解thread local吗?(听过名字,没了解具体原理,寄)
  • 【动态链接库】和【静态链接库】的区别?
  • 我本来想先说【动态链接】和【静态链接】的区别的,我就试图先说这个,想杀点时间
  • 但是,又问静态库 .a 和动态库 .so 有啥不同。麻了,没回答上,回去好好看
  • 然后又追问,怎么查看使用到的动态链接库?麻了,忘了,滚去复习(寄)
  • C++一般用啥编译工具?
  • make、cmake
  • 有什么工具,能查看编译后可执行文件的函数?
  • objdump
  • 其他想不到了,失忆了(寄)
  • 你用到了protobuf,知道protobuf是怎么存的吗?(指的是底层怎么进行的序列化)
  • 不知道,只知道序列化后是二进制的
  • 用protobuf的好处
  • 八股文
  • 看过什么开源库(关于存储的)
  • 我可不敢说leveldb,省的被怼死
  • 就说没看过
  • 了解mysql吗?(面试官很无奈,其他啥也不知道,mysql总知道吧)
  • 了解
  • mysql存储引擎,用的什么数据结构?
  • B+树
  • B+树怎么查询的?
  • 八股文
  • 失算了,本来想等着面试官问点更深的东西,看来我应该主动说点mysql(innodb/myisam)对B+树的具体实现
  • 为什么用B+树,不用B树?
  • 八股文

算法题(25min)

飞书,ACM模式

重排链表(需要最优解,LeetCode 143)

  • 明明很简单,但是写的有点磕绊,面试官说中途接个电话,暂时消除了紧张感,然后快速把代码框架敲出来
  • 中间写了个bug,在debug,结果发现前面没问题,就是后面合并出了问题
  • 有惊无险,写出来了

反问

  • 如果有幸通过面试,需要提前了解什么?
  • 不需要,可以看看存储相关的开源库,对实习生要求不高
  • 面试过程中更看重候选人哪些能力?(接着来问的,既然说对实习生要求不高嘛)
  • 基础、跟存储相关经历
  • 怎么培养实习生,会让刚来的实习生干啥?
  • (内容略)
  • 最后说,如果没有基础,进来之后会有点痛苦
  • 感觉面试官略微有点劝退,可能是在暗示我过不了?
  • 我的表现有什么需要改进的地方?
  • 表现还可以,对存储不够了解,得讨论一下是否能通过,之后可以问hr结果(加粗的地方也是最终面评内容,hr说不便透露具体内容)
  • 我这块有点失误了,应该得更虚心点,解释投这个岗的原因(因为面试官觉得投这个岗,要对存储有所了解),但是我就说了个确实(好糟糕的回答),不过可能再咋说也改变不了啥结果
  • 总之就是,通过的概率不如上次高,怕是要收到感谢信了

总结

总体而言这次表现的不算理想,问到了一些知识盲区,也在表达技巧上出了点小失误。

虽然确实没有存储相关的经历,但是总体来说,面试体验还不错。

面试难度较为友好,面试过程中,不会因为我没有这方面的经历而刻意刁难我。

3、后记

其实这已经是我第二次面试字节了,去年就面过一次,那时候我刚大四毕业,确定读研后不想浪费这个暑假就去面了一次,结果就....

今年年总体而言,比去年的表现好点,没有出现口吃的情况,表达也较流畅,算法题顺利解出。

内推我的同学也觉得我的表现大概率能过二面,但是他也没想到,hc确实没了,觉得很离谱,面评给了个「没有存储经历」的理由拒绝(对校招生这样要求也情有可原,对日常实习生也是这个要求,就离谱了,应该被冲kpi了),因为去年他面这个岗的时候,也是跟我差不多,没有相关经历的。

可能这会在hc收缩的情况下,想面进来的难度都会相应提升,特别是这种底层部门,需要可能掌握的比较深才行,如果是一个常规的后端研发岗,应该不会问的这么难喝深。

有一说一,我真的尽力了,我已经掌握的各种各样的技巧也用上了。

只能说,虽然我不少同学都进来了,我也心心念念一年多,还是跟去年一样的结果,二面仍然是我不可逾越的门槛。

虽然我的实力确实尚且也达不到校招要求,可能确实跟这家公司也没啥缘分吧。

收拾一下心情,重新上路就是。


本文转载自公众号拓跋阿秀

已于2022-10-24 18:31:30修改
收藏
回复
举报
回复
    相关推荐