NLP 转后端开发,顺利拿到字节实习 offer!!
分享一位学弟的面经分享,写的很棒,希望能对你有参考价值!
下面是正文(文中的我并非 Guide 本人)。
简单介绍一下我的基本情况,上海双非本 + 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 的棋盘,每个格子有 RB@ 三个状态,R 表示红色,B 表示蓝色,@ 表示此路不通。机器人从左上角走到右下角,每次只有上下左右四个方向选择,相同颜色之间没有代价,跨越不同颜色代价为 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 以及知识星球内部的 《Java 面试指北》在我整个备战的过程中起了很大作用,是我的指路明灯。
写在最后
由于从本科开始就一直做算法 NLP 相关的工作,对后端开发了解甚少,加上时间紧迫,我不得不采取一种囫囵吞枣的方式进行学习。对我而言,在不到三个月的时间里,从 Java 的入门阶段到通过日常实习面试实在付出了太多,每天早 7 晚 11 的作息时间对身体也产生了一些伤害,如果时间允许,我更希望节奏慢下来,把每个知识点都学扎实、学透彻。
本篇面经实际上没有太多东西可以分享给大家,因为笔者实际上也只是一个才学了不到三个月 Java 的新手小白。如果说文章里有什么是值得大家参考的话,我希望是面对目标绝对坚持的毅力以及面对困难永不退缩的决心,是它们支撑着我逐渐越过一个又一个的“不可能”。
·········· END ··············
👉 如果本文对你有帮助的话,欢迎 点赞&在看&分享 ,这对我继续分享&创作优质文章非常重要。非常感谢!