背景

这位求职者拥有2年的硕士学位,来自一个较为冷门的本科专业,完全是通过死记硬背来转行进入计算机行业,基础相对薄弱。

历程

在2022年10月,他开始了自学Java技术栈,跟随B站的黑马和尚硅谷视频学习并实践编程。经过不懈努力,他在除夕夜前后完成了Spring Cloud的学习。此后,他开始研究各大公司的面试经验,并在牛客网上看到推荐的Guide哥的JavaGuide,随后加入了知识星球并进行了自我介绍。接下来,他开始背诵面试常见问题,从2023年1月到3月间进行断断续续的学习,同时参与了Guide哥的RPC项目和黑马点评项目,之后便开始大规模投递简历,最终取得了令人满意的结果。

经验

  1. 八股文的学习必须结合项目实践,项目内的各项知识点都应进行头脑风暴。面试大佬的答案都是在项目和比赛中锤炼出来的,光靠背诵是无法掌握的。
  2. 尽快开始投递简历,不要犹豫,先从小公司的实习岗位入手,逐渐晋升到大厂的实习和秋招。当HR询问时,要展现出自己具备的各项能力。一天之内面试5家公司的经历,让他在忙碌中收获了多个offer。
  3. 一定要对面试进行录音或录屏!面试后进行复盘,分析自己的表达和逻辑,查漏补缺。身边很多人面试后不复盘,而你如果能够复盘,就已经超越了大多数人。
  4. 在刷题方面,通过大量面试,他发现力扣上的题目大部分都已做过,陌生的题目几乎没有。力扣的Hot 100题目应牢记于心。
  5. 面试时的心态很重要,需表现出与公司价值观相符的态度。例如,面试阿里时要自信(不要过度道歉),面试华为时则要展现出能抗压的形象。如何调整心态,唯有多加练习与面试。
  6. 若有机试环节,务必要取得优异的成绩,用任何方法都可以(你懂的)。

总结一下:

  1. 一份优质的简历:实习和项目经历需经得起考验,条理清晰且逻辑合理。
  2. 随时保持思考,展现出自己的见解(ps:我有个奇怪的想法,面试官得让觉得你有想法)。
  3. 面试时要保持清晰的思路,避免全是死记硬背的内容,要表现出兴趣、心态和自信。
  4. 学会输出,进行多次练习。

面经

以下是面试经历:(几乎所有公司我都面试过,部分录音懒得复盘,如果需要可以告诉我,我会再总结)

网易 Java 后端开发(已接到offer,最终选择了此岗位)

一面:(乱序,回忆版)

  1. 自我介绍
  2. 编写一个简单的登录业务(MVC模型)
  3. 实习及项目相关经历(包括一段中型公司的实习)
  4. Spring常见面试问题(如AOP、IOC及常见注解等)
  5. 处理数据库多版本接入的方式
  6. BASE特性及其实现方式
  7. 手撕题:通过前序和中序遍历构造二叉树
  8. Netty的核心组件
  9. Netty的NIO与BIO
  10. Redis的单线程与多线程
  11. 除了MySQL和Redis外,还使用过哪些数据源?你了解Hive吗?
  12. 与面试官讨论俄乌冲突及国际形势……

二面:(乱序)

  1. 自我介绍
  2. 实习及项目相关经历
  3. RPC具备多少Dubbo的功能?如何暴露服务?如果服务挂了怎么办?
  4. 数据库多表查询编写SQL
  5. 如何设计数据库表
  6. 有调试过数据库参数吗?
  7. 网络与操作系统的常规知识
  8. 手撕题:双向链表的反转
  9. Git合并分支的相关细节问题(不会,没合并过)
  10. ZK、DB、Redis锁的选型
  11. 提出反问

美团 Java 后端开发(已接到offer)

一面:(乱序,回忆版)

  1. 自我介绍
  2. 手撕题:验证二叉搜索树
  3. 实习及项目相关经历
  4. HTTP协议的组成、报文格式、头与body的分割、Cookie的携带方式
  5. 计算机网络分层模型
  6. TCP的可靠性保障机制
  7. HTTPS校验的哈希算法
  8. HTTP 2.0与HTTP 1的区别
  9. 什么是队头阻塞?2.0为什么不使用UDP?
  10. 总体问了很多计算机网络的基础知识
  11. 面试中询问自己的亮点可以分享
  12. 提出反问

二面:(乱序,回忆版)

  1. 自我介绍
  2. 手撕题:反转链表
  3. 实习及项目相关经历
  4. 用户态与内核态
  5. RPC过程与这两种状态的关系
  6. 自定义的序列化方式偏向于Json还是Protobuf?这两个序列化有何区别?与自定义序列化的性能差异如何解决?如何处理分包与粘包?如何进行注册与注销?讲述SPI实现及依赖倒置?动态桩的定义?客户端是否能指定调用IP?
  7. 简单八股问题
  8. 闲聊及实习时长
  9. 提出反问

B站 安卓开发 一面未通过

  1. 自我介绍
  2. 手撕题:LRU、二叉树层序遍历、单例模式
  3. 实习及项目相关经历
  4. HashMap、ConcurrentHashMap的底层实现
  5. 讲解红黑树的原理
  6. static与final关键字结合JVM的理解
  7. 讲解JMM
  8. 垃圾回收及死亡对象的判断方法,具体讲解可达性分析
  9. 线程与进程、进程的通信方式、线程状态、上下文切换、死锁及其解决方案、wait与sleep、多线程相关知识及安全问题、两种锁的区别和底层实现
  10. 内存管理
  11. Java设计模式
  12. Java代理
  13. IO模型
  14. 提出反问

面试体验非常愉快,面试官全程充满笑容,自我介绍结束后还夸赞我的表现,尽管我对安卓并没有什么了解。

Wind Java 后端开发 一面未通过(这是我最早的面试,当时复习不够)

  1. 自我介绍
  2. 线程池相关(最大线程数与核心线程数相等的问题)
  3. 解决循环依赖注入的方案
  4. Spring Boot常用注解
  5. @Resource与@Autowired的区别
  6. ${字符串替换符}与#{占位符预编译处理}的区别
  7. Linux常用命令
  8. Redis数据结构SDS的优化
  9. Redis失效如何验证登录
  10. Redis集群相关问题
  11. Redis的ZSET底层实现
  12. 对消息队列及中间件的了解
  13. 线程内存泄漏的问题
  14. MySQL主从数据库设计
  15. 提出反问

MetaApp Java 后端开发 一面未通过(也是比较早的面试)

  1. 自我介绍
  2. ThreadLocal底层实现
  3. AOP与IOC原理及其应用和相关注解
  4. ArrayList与LinkedList的区别
  5. MySQL索引的使用
  6. MySQL的并发问题
  7. MySQL事务的理解
  8. MySQL刷盘原理
  9. Redis的持久化机制
  10. Redis缓存问题
  11. MySQL三大日志
  12. 线程池的理解与创建方法
  13. 手撕算法:打印二叉树指定路径、青蛙跳台阶问题
  14. 程序题:判断两个对象是否相等
  15. 提出反问