分享

耗时三月上岸字节跳动后端实习!面经分享

nettman 2023-1-30 20:10:34 发表于 经验分享 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 2016



2022 年我做了一个对我而言非常重大的决定,那就是从算法方向转到后端开发。截至2022 年 10 月份,我已经收到了字节跳动、百度等公司日常实习的 offer。写下这篇面经分享,也算是对这一阶段的总结。

简单介绍一下我的基本情况,上海双非本 + 985 硕,目前在读研二。本科 + 研究生大部分时间都在搞算法, NLP 相关,今年终于认识到了理想和现实的差距,遂在 5 月份下定决心转后端开发。之后处理一些事情,暑假 7 月底的时候正式开始学习 Java,历时三个月, 9 月底开始投日常实习,10 月 17 结束。面试过的公司包括: B站,蔚来,百度以及字节,B 站挂在二面,其他均拿到日常实习的 Offer,最终选择了字节跳动。

从以上我的基本情况大家能看出,我的战线比较短。但是在这些时间里,我的作息基本上都是早 7 晚 11,很辛苦。

这篇文章首先分享我的面试经历,后面的部分与大家分享我的学习经验。

面经部分
下面的部分总结了面试过程中被问到的知识点(还记得的部分),以及我个人的一些心得体会,供大家参考。

百度
百度给我的面试体验还是蛮好的,是我面试的所有公司中唯一一家对八股考察非常详细的。一面是非常详细的八股面试,涉及到 Java 基础知识、数据库、spring、jvm、多线程、场景设计等等,基本上准备的都被问过了,但是整体来说难度不高,知识面比较广但是不会深挖。二面来说区别就非常大了,注重实践能力的考查,而且会深入到底层原理。

面试之前会有自我介绍的环节,包括项目介绍。百度两面对我的项目提问都不多,可能是我介绍项目的时候就比较详细的原因。

接下来的部分是知识点整理:

百度一面(1h+):
  • 常用 GC 算法,常用的垃圾收集器, G1 了解吗
  • 场景题: cpu 打满且频繁 full GC,怎么解决?
  • 有 jvm 调优的经验吗?实际工作中遇到过内存相关的问题吗?用过哪些堆栈工具调试?
  • Mysql 索引,数据结构为什么使用 B+ 树
  • 索引覆盖了解吗
  • 索引失效的场景
  • 简单描述一下数据库的四种隔离级别以及对应的三种相关问题
  • MVCC + 锁 保证隔离性
  • 造成幻读的原因了解吗,快照读、当前读。
  • 数据库自增 ID 和 UUID 对比
  • HashMap 源码,数据结构,如何避免哈希冲突,对比 HashTable
  • HashMap 源码中,计算 hash 值为什么有一个 高 16 位 和 低 16 位异或的过程?
  • 为什么重写 equals 还要重写 hashCode,不重写会有什么问题
  • ConcurrentHashMap 底层实现,扩容问题。
  • 如果让你自己实现哈希表,你会考虑什么问题?
  • 场景题:亿级别黑名单、短链接,你考虑使用什么数据结构?布隆过滤器、前缀树。其中布隆过滤器问了基本的原理和实现方式
  • Java 引用类型,强软弱虚
  • Java 是引用传递还是值传递
  • Object 类你了解哪些方法
  • 接口和抽象类的区别
  • 线程池核心参数,以及工作原理
  • ReentrantLock 对比 sync 锁
  • lockInterruptibly()、acquire()、tryAcquire() 方法
  • CAS 机制了解吗,存在什么问题
  • 对象锁和类锁的区别
  • 如果让你自己实现阻塞队列,如何实现?阻塞唤醒这一部分,如何实现?
  • ThreadLocal ,Volatile
  • 看你项目中用到了 Netty,简单介绍下吧。这里还有个 问题是问到 Netty 和 SpringBoot 整合的,但我一直都没理解她想问什么
  • 粘包拆包问题,Netty 解决粘包拆包的 Decoder
  • Spring 事务了解吗,Spring 事务的注解不生效,是什么原因
  • 算法题: 手写快速排序,时间复杂度,稳定性整理感觉不错,基本都答上来了,按照 Guide 哥星球里的内容,认真准备就好。


百度二面(45 min):
  • 看你项目中用了一致性哈希做负载均衡,简单介绍一下
  • 项目中 CompletableFuture 如何使用的
  • 算法题:给定一个字符串,找到其中最长回文串
  • 计网和组成原理学过吧,你认为哪个掌握的好? 我选了计网。这一部分问的很深入,我没来得及记录,以下部分只是一些零散片段,但是整体问的时候是有逻辑的。
  • OSI 七层模型
  • TCP 三次握手,四次挥手整个过程包括状态的转换。为什么是三次握手、四次挥手。发送 Fin ,实际的意义代表什么?(发送方没有数据要发送了,可以断开连接)
  • 四次挥手,为什么等待 2 MSL
  • 流量控制、拥塞控制
  • 后面关于网络就更深入了,TCP 底层是怎么实现的,如果让你用 Java 模拟 TCP 的过程,做一个仿真,你有什么想法。大学学习计网的时候,协议栈之类的了解过吗(这部分我都不懂,认栽了)
  • 看你项目中用到了 Spring,自动装配的过程了解吗。
  • Spring 启动类的注解,介绍一下
  • 因为我项目中用到了,所以被提问了 Spring 二次开发常用的扩展点,还涉及到了 Bean 的生命周期。 BeanPostProcessor,在你项目中如何使用的
  • Spring 中你常用哪些注解? Autowired 实现原理
  • 计网仿真 TCP 以及后面深入的部分我不懂, Autowired 实现原理 没说清除,其余的都答上来了。


字节跳动
在我整个的面试过程中,字节给我的体验是最好的。一面二面的面试官都非常好,面试的问题、要求都说的很清楚,需要注意的点都提前告诉了我,甚至二面的面试官会提醒我,"在回答问题的时候这边会有敲键盘的声音,是我在记录,不要影响你回答问题。"对于初次求职面试,体验感拉满。

除此之外,字节的面试和百度思路不一样。百度是从八股出发,引出一些实际场景遇到的问题。字节几乎没有八股,是从项目出发,结合工程经验,主要考察思考的过程,关键点答出来之后,结果对错可能不是很重要(这里是我主观臆断的)。

字节一面(1h):
  • 自我介绍,项目部分主要介绍了 rpc 项目,后续的问题都是基于这个项目
  • rpc 远程调用的整个流程
  • 项目中的 SPI 机制,介绍一下原理以及你做了哪些改进
  • 项目中用到了负载均衡算法,详细介绍一下
  • 一致性哈希的原理,虚拟结点
  • 项目中的序列化方案,为什么序列化,你都了解哪些常用的序列化方法。
  • 你项目中使用了 Kyro 序列化,优点你提到了,缺点了解吗
  • 通信协议是你自己设计的,假如后面需要变更,比如添加新的字段,你项目中如何处理的?
  • 服务的灰度发布介绍一下,如何实现的?
  • Zookeeper 作为注册中心,假如崩溃了怎么办?这里开始连环问了
  • 你提到了 Zookeeper 的一致性,它是如何保证的?
  • ZAB 协议,选举的过程,这里问的很详细
  • Zookeeper 是强一致性吗?
  • 网络分区了解吗,CAP 理论
  • Zookeeper 如何应对网络分区的,脑裂问题了解吗,如何解决?
  • 假如我同一时间有大量服务发布,你提到了 Zookeeper 只有主节点负责写, 怎么解决?假如主节点崩溃了,新选举出的主节点仍然没办法面对我的大流量,也崩溃了,如何解决?
  • MQ 的原理,你知道哪些 MQ,各自有什么特点,什么时候需要用 MQ
  • 你刚才提到了服务端保护机制,如何实现的?这里我答了限制连接数以及接口限流,基于责任链模式。之后问了用到的令牌桶以外的常用限流算法。
  • 算法题:链表反转,你知道的所有实现方式。这里我写了递归和非递归两种。


整个面试的过程中大脑都是高速思考的,甚至从面试官的问题中得到了好多启发,是背八股掌握不到的,体验非常好。面试的问题几乎都答上来了,有一些不太熟悉的在面试官的提醒下也都回忆起来了(这点非常 nice,其他面试不会就直接过了,而字节会认真引导你,看你究竟掌握到什么程度)。事后 hr 小姐姐还告诉我面评非常好,鼓励我认真准备二面。

字节二面(1h):
字节二面的经历比较魔幻了, 面试官在伦敦有时差,因此是晚上九点开始面试的,由于面试官比较忙,整个面试过程比较简单,自我介绍 + 项目介绍之后简单提问了几个问题(没有印象深刻的技术问题,这里就不重复整理了),沟通了一下实习时间,直接做算法题了。

算法题:有一个 n * n 的棋盘,每个格子有三个状态,R 表示红*** 表示蓝色,X 表示此路不通。机器人从左上角走到右下角,每次只有上下左右四个方向选择,相同颜色之间没有代价,跨越不同颜色代价为 1,求解机器人从左上角走到右下角,最少的代价。
这里我用回溯求解的,很快就写出来了,思路也没问题。但是复杂度计算卡住了,在面试官多次且反复的提示下,算出来了。 最后提问环节面试官跟我说后续优化可以加一些剪枝操作

二面没有遇到难度比较大的问题,大部分时间都被我卡在了算时间复杂度(很菜勿喷)....

B 站
综合来说,B 站面试给我的体验是非常差的,一面的时候我感觉还没进行比较深入的交流,问了一些八股,很快就结束了。二面上来之后,问了你觉得自己项目有什么亮点吗,然后就来了一道 Hard 算法,又结束了.......

B 站一面(30 min)
  • Rpc 远程调用的流程
  • 一致性哈希算法详细介绍
  • 为什么选用 Zookeeper 作为注册中心,注册中心作用是什么
  • 动态代理
  • Redis 在你项目中如何使用的,穿透、雪崩、击穿了解吗
  • 你项目中用的是 RabbitMQ,为什么,和其他 MQ 对比如何?
  • RabbitMQ 的原理
  • 你项目中的 灰度发布、分组管理如何实现的
  • 无算法题

之后在我以为他准备深入提问的时候,面试官告诉我面试结束了,整个过程不到 30 min,而且没有算法题。

B 站二面(30 min)
  • 简单介绍下你的项目,是工程项目、学校项目还是自己学习的
  • 你认为项目中有什么亮点?
  • 算法题:K 个有序数组,输出最终排序后的数组 (K merge)。

B 站是我第一个走面试流程的公司,二面在字节一面的前一天。B 站二面是我第一次在面试过程中写算法题,结果就遇到个这,当时心态是崩掉的。因为第一次确实有些紧张,思路不清晰。虽然是** Hard 难度吧,但是事后觉得也没有很难,做不出来还是大多归因于自己。但是复盘的过程中,我发现在面试的过程中,虽然太紧张了没实现出来,我把两种解题思路都思考到了,并且面试官提问时间复杂度,在提示下也求解出来了(很菜勿喷),整体表现自我感觉也算可圈可点吧。

给大家的经验就是,平时刷题的时候时间复杂度求解一定要重视!

备战部分
下面是我从七月底写出第一行 Java HelloWorld 直到现在的大致时间表:

  • 七月底,正式开始投入时间学 Java,在师兄、师姐的推荐下选择了 JavaGuide 作为主线的学习资料,之后加入了知识星球,认真阅读了关于学习路线的内容。
  • 七月份用了一周多的时间熟悉 Java 语法。前期主要跟随 小码哥恋上数据结构课程,一边复习算法数据结构,一遍熟悉 Java 语法。
  • 八月份开始,选择了 Guide 哥推荐的千峰商城项目作为入门,大概用了两周时间,全程跟随视频敲完代码,收获非常大。这一过程中,恋上数据结构这门课程是同步学习的,基本就是早晚做项目,下午学算法。
  • 多线程、Jvm 方面的知识,我选择了马士兵的课程。这两部分是同时学习的,理解为主。选择马士兵课程的原因之一,是因为马老师讲课是以面试为导向的,一边理解一边掌握八股文了,效率比较高,总共耗时两周左右。
  • 网络 IO部分的知识 以及 Zookeeper、MQ 等中间件,这三部分是一起学习的,参考的资料包括马士兵课程、稀土掘金的 Zookeeper 课程、慕课网的MQ课程以及尚硅谷的一些资料,耗时大概一周左右吧。
  • 以上打基础大概花费了一个月的时间。
  • 九月份返校之后,开始着手准备简历上的项目,花了一些时间在 Guide 哥的知识星球里翻看优秀开源项目介绍,选择了Guide 哥的手写 Rpc 项目以及星球推荐的 IM 项目。
  • 有了基础之后,项目做起来还是比较快的,加上有源码可以参考,各自用了一周就基本实现完成了。这里总共耗时两周。
  • 后面的时间里,我针对这两个项目做了深入研究。在极客时间和稀土掘金里,我分别找到了 rpc 和 IM 的相关课程。由于都是文字的形式,加上自己实现过基本功能,读起来非常快,快速整理出了课程内作者对于项目深入思考的部分,之后融合到自己的项目中。这里我认为是非常关键的一步,在面试的时候我能够顶住面试官的连环问,和这些课程中的相关内容以及思考题的深度是分不开的。在这一过程中,我还有幸加了几个作者大大的微信,不停地和作者交流自己的思考,甚至发现了课程中的一些小瑕疵。非常幸运他们都很有耐心,给予了我很多指导,尤其是 crossoverJie 大佬,几乎是有问必答,甚至在我面试之前,还给予了我很大鼓励(相当感动)。
  • 大概到九月中旬,我就开始整理简历并且投递了,之后一边复习八股,一边完善项目。
  • 九月底,我的项目已经基本整理完成了。我花了一周的时间系统梳理八股文,制作了很长的脑图帮助我回忆知识点。
  • 十月份,国庆节的假期里,我保持着每天15+题的速度,快速找回了算法题的手感。由于时间真的太仓促了,时间复杂度这一块我没有重视,后面也付出了惨痛的代价。提醒各位读者,算法复杂度的计算一定要重视起来。
  • 最终功夫不负有心人,我收获了百度、蔚来以及字节的日常实习 offer。JavaGuide 以及星球内部的面试指北在我整个备战的过程中起了很大作用,是我的指路明灯。

写在最后
由于从本科开始就一直做算法 NLP 相关的工作,对后端开发了解甚少,加上时间紧迫,我不得不采取一种囫囵吞枣的方式进行学习。对我而言,在不到三个月的时间里,从  Java 的入门阶段到通过日常实习面试实在付出了太多,每天早 7 晚 11 的作息时间对身体也产生了一些伤害,如果时间允许,我更希望节奏慢下来,把每个知识点都学扎实、学透彻。

本篇面经实际上没有太多东西可以分享给大家,因为笔者实际上也只是一个才学了不到三个月 Java 的新手小白。如果说文章里有什么是值得大家参考的话,我希望是面对目标绝对坚持的毅力以及面对困难永不退缩的决心,是它们支撑着我逐渐越过一个又一个的“不可能”。


Ps.
推荐一个面向秋招后端和算法同学(其他同学想进来瞅瞅也欢迎,群内还有多个社招大厂ssp大佬)的高质量交流环境,大佬云集并且一直在保持活跃。这里不多说了,感兴趣的同学可以传送进去看看~



如果你失业或者正在求职,可加微w3aboutyun,朋友圈会分享内推,面试方面的内容,也可拉入求职面试群。


加微信w3aboutyun,可拉入技术爱好者群

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条