因为公司原因,最近想换工作,第一目标就是字节,9月份找朋友内推的上海教育部门,朋友让我多准备准备,过了两周才开始一面。

附上新鲜的一二三四五面面经。

写在前面
面试字节一定要提前复习,能提前多久就提前多久。尤其是算法,绝对是重中之重,因为我已经刷了 3 年 LeetCode 了,所以算法没怎么复习,三次面试一共 6 题也全写出来了,基本上都是原题。
然后就是数据库、网络、消息中间件、架构等等。校招的话架构可以不用太深入,稍微了解就行了。社招的话一定要注重自己的深度和广度。

我的情况
工作 3 年多。
1 年 C 语言开发,3 年 Go 后端开发。
曾就职于 BiliBili,目前在一家创业公司。

一面(视频面试)
Go 语言
GMP 调度模型,很多面试官都会问这个,一定要好好复习,要讲出亮点,讲出其他同学讲不出的东西。
Context 的用法,接着问了几个 follow up,不过都不是很难。
语言问的比较基础,并没有很深入的扣细节。
操作系统&计算机网络
select 和 epoll。(很常规的问题,也算是必考题了)
HTTP 和 HTTPS 的区别。
TCP 拥塞控制。
数据库
问了用过哪几种数据库。尽量回答自己熟悉的,以免踩坑。
Mysql 用的是什么数据结构,可以具体说说吗。
大库 DDL 怎么做比较好。和面试官纠结了好久,感觉这部分答的比较一般。
中间件
用过哪些中间件。答了用的比较多的是 kafka 和 rabbitmq。
rabbitmq 的工作原理。我只是用过,但是没有具体研究过,凉凉。。。
kafka 的工作原理,如何保证顺序等。这个研究的比较深,答的也比较好。

算法

206. 反转链表

15. 三数之和

      耗时一小时五分钟,总体聊的比较顺利,小哥人也很好,比较专业,不过一面完全没有问项目上的东西,当天晚上 hr 就约了二面。

二面(视频面试)

二面是部门老大,语速很快,问题切换也超级的快

Go 语言

Go 的垃圾回收是怎么实现的,好在哪里,不好在哪里。
 

操作系统&计算机网络

详细描述一下 HTTPS 的加密过程,需要几次通信。这个看过,但是没有仔细复习,凉凉。
三次握手和四次挥手,说一下 time_wait。
 

数据库
Mysql 的幻读是怎么个情况,Mysql 是如何避免的。
架构
设计一个海量的评论系统。这部分一共聊了近 20 分钟,被问到头秃。社招的小伙伴一定要好好准备。
算法

面试题 02.05. 链表求和

76. 最小覆盖子串

耗时一小时不到,架构聊的有点差,但是后面靠算法扳回一点,大佬让我后面再好好准备一下基础和架构,听这意思是过了。第二天 hr 小姐姐约了三面。

三面(视频面试)
三面是这边的技术 VP。一来先自我介绍,一面二面好像都没有自我介绍。。。
自我介绍之后让我讲一个最得意的项目,讲了一个以前在 B 站做的项目,大佬表示一般般,然后开始问一些基础,这个级别的大佬已经不是很 care 语言了,所以都没有问 Go 相关的知识。

操作系统&计算机网络
用过哪些锁,自旋锁和互斥锁有什么区别。(同学们锁一定好好复习,也是必考点之一)
用过哪些分布式锁。答了 mysql,redis, zookeeper 分别聊了一下优缺点。
redis setnx + expire 有什么缺点,如何优化。因为之前自己用过,所以答上来了,但是好像不是面试官想要的最优解。
打开一个 URL 的过程。(这个也是必考点,基本上每个人都会,所以尽量说点其他人不知道的,一定要有自己的思考,让面试官眼前一亮,而不是觉得你在背书)
这部分答的比较顺利,中间基本上没有什么停顿和思考。

数据库
B 树 和 B+ 树的区别,为什么 mysql 要用 B+ 树,mongodb 要用 B 树。
redis 的跳表知道吗,为什么不用红黑树。我回答了因为红黑树实现比跳表复杂。但是面试官不是很满意,后来查了一下是有这部分原因的。
redis 集群是怎么实现的,说一下一致性 hash。
基本上都是比较基础的东西,都能答上来。

架构&设计
设计一个微信朋友圈系统,列出主要的表结构,只需要实现一些基础的功能,比如聊天列表等。写出一些数据结构,然后和面试官讨论了一下,很快就过了。
这部分的话最好提前练习一下,抓住其中的重点,解答之前先问清楚需求。

算法

1.670.最大交换

2.把一个方程式设计成树以及很多的 follow up (这题应该也是原题)

耗时一个小时,聊的比较顺利,感觉字节面试时间卡的都比较准,基本上都是一小时左右。

四面(视频面试)
四面好像是交叉面,整体下来也不是特别难,基本上都答出来了。和三面一样,也是先过一遍简历,问一下项目中的问题,再开始相同的套路。

Go 语言
Go 的逃逸分析了解过吗,能不能写一个。
操作系统&计算机网络
问了进程的调度,因为大学有深入研究过时间片轮转算法,所以着重讲了一下。
数据库
Mysql 集群如何保证数据的一致性。分别回答了弱一致性和强一致性。
架构&设计
类似于设计一个长链接转短链接,不过需要考虑高并发,回答了分库分表。
算法

四面基础聊的不是特别多,稍微答到一点就立马切换到下一题了,架构聊的多一点,总体聊的还算比较顺利,不得不说字节的面试基本上都是一个套路,每个系列都会问一下,但是问的都不是特别深。
本来以为四面就结束了,第二天换了一个 hr 告知还有五面,于是约了下周五面,中间和 hr 也聊了很多,hr 先问了一下我的情况,然后告诉我一些注意事项。hr 说面试官可能会问一下工作领域相关的问题,问的问题会比较开放,让我好好准备一下。

五面(视频面试)
五面好像是北京那边的大佬,我以为就是谈谈心,聊聊人生规划的,然而依旧是技术面。先简单问了一下项目,然后直接开始聊架构设计。

架构&设计
Mysql 集群在保证强一致性的情况下,如何保证高并发。聊了好多种方法,但是面试官都不是很满意,中间磕磕绊绊的。最后问可不可以用缓存,我前面提到了使用 redis 中间做一层,但是面试官说用 memcache。。。
设计一个海量日志写入系统。这部分之前没有接触过,答的不是很好,面试官也不是特别的满意。
感觉五面有点凉,一共才聊了 30 多分钟,不过架构部分也确实是我的薄弱项,确实需要花时间好好的提高一下,之后需要好好的学习一下。

后续
后来问 hr 情况,hr 说还在讨论,让我等等。然后就没有然后了,下次再战吧。

复习建议
重要性的话和工作经历有关系。校招应该更看中算法,建议同学们多刷题,社招的话可能会更注重架构把。大家还是需要根据自己的情况去复习。

基础:数据库和网络一定要重点复习,千万不要觉得简单的东西可以不复习,有时候面试官并不想难你,只是想象征性的过一下而已。有时候你觉得的简单的问题,其他人肯定也简单,想要突破重围,那就要说出自己的亮点,说出自己的特色,但是这部分不是很好说,需要多花点时间去研究。
开发语言:语言的话主要还是平时的积累,多看源码,要知道对应语言的一些特性和比较常用或者有特色的标准库。比如 Go 的 GMP 模型,垃圾回收,channel 都是必考点,最好去读一下源码。
数据库:最重要的肯定是 Mysql,Mysql中比较重要的就是隔离级别和索引,一定一定要弄懂。然后就是 redis,也是经常会问的一个东西。
中间件:这个也是必问的一个环节,尽量要多了解一些,但是一定要说自己会的,至少知道运行原理和特点。比较重要的中间件有:memcache、kafka。
架构设计:有实战最好,没有实战多学习一些开源的架构,尤其是日志系统、评论系统、聊天室相关的内容,经常会考到。
项目:好好准备一个有亮点的项目,很多面试官喜欢让你说一个印象最深的项目,这时候就是你的表演时刻了。
其他:分布式、Docker、微服务也是经常会问的东西,也要好好准备。
算法:把最重要的算法给忘记了,能刷多少刷多少,主要是学方法,而不是去完成某个题目。
总结
从投递简历到五面,大概经历了半个多月,基本上是隔一天面一次,都是在晚上 19 点以后,说明字节晚上的下班时间。。。
五次面试都是视频面试,体验很好,面试官和 hr 也都很效率和专业。一二面偏基础和算法,对项目和工程问的不是很多。三面和四面的话会增加项目和架构上面的东西,不过算法依旧是跑不掉的。前面四面我的算法回答的很好,基本上都是稍微调试一下就过了。基础回答的也比较顺利,设计题也还好。五面架构聊的很差,可能是导致失败的最大原因吧。

最后感谢大家看到这里,希望对同学们的面试有所帮助,再次感谢!

总结所有的面试题目都不是一成不变的,特别是像一线大厂,上面的面试题只是
给大家一个借鉴作用,最主要的是给自己增加知识的储备,有备无患。最后给大
家分享Spring系列的学习笔记和面试题,包含spring面试题、spring cloud面试
题、spring boot面试题、spring教程笔记、spring boot教程笔记、最新阿里巴
巴开发手册(63页PDF总结)、2022年Java面试手册。一共整理了1184页PDF文档
。私信博主(777)领取,祝大家更上一层楼!!!