个人背景与学习历程

我的学校相对较为普通,属于一所二本院校,最初是土木专业,后转至计算机专业。在大三之前,我主要学习C语言开发,并在课堂上接触过Java,对其的理解并不深入。仅在课程设计中使用Java FX完成了一个小项目,项目涉及爬虫、MySQL和网络编程等技术。

在大三上学期,我听说Java后端岗位的需求很大,找工作的机会较多,因此决定专注于Java后端的学习。

经过近一年的学习,我掌握了Java后端的许多常用知识点,并在简历上列出了两个项目,其中一个已上线,另一个是跟随视频教程制作的,虽不算正式项目,却经过简单修改后加到了简历上。

在笔试方面,由于我没有给予足够重视,且学校背景较为普通,最终只有OPPO的笔试通过,获得了面试机会。

技术面试初体验

一面:

  1. 开场的自我介绍,适当突出个人优势。
  2. 面试官夸奖我看起来很精神,我感到困惑。接着询问我平时如何安排学习时间,项目是与谁合作完成的。
  3. 开始深入讨论项目,要求我阐述整体业务、技术架构及个人负责的部分。
  4. 询问使用的Java版本及Java 8中的新特性。
  5. 讨论多线程优化的理由及其好处。
  6. 询问线程的创建方式及推荐的方式,问及原因。
  7. Java线程的状态类型。
  8. 讨论如何实现变量的可见性(使用volatile关键字)。
  9. 讨论volatile的特点,是否能保证原子性。
  10. 询问synchronized与ReentrantLock的区别及选择标准。
  11. 讨论多级缓存的实现及添加本地缓存的原因及性能提升。
  12. 探讨Redis的数据类型及String的应用场景,比较使用String与Hash存储对象数据的优缺点。
  13. 如何确保缓存与数据库的一致性。
  14. 分析Redis缓存穿透、缓存击穿及缓存雪崩的区别和解决方案。
  15. 询问我是否想在深圳工作以及对加班的看法。
  16. 最后,给我提问的机会,询问我在公司后可能的工作内容和表现。

面试官态度友好,耐心解释我不理解的问题,整体表现不错。虽然有些问题回答得不够好,但我认为一面还是有一定难度,尤其是关于并发和Redis的部分。

二面:

  1. 自我介绍。
  2. 深入讨论项目的整体业务、技术架构及工作分配。
  3. 讨论数据库表设计思路。
  4. 询问项目的部署情况及上线后的日常访问量。
  5. 讨论使用线程池的理由,问及项目中是使用内置线程池还是自创的。
  6. 深入探讨线程池的原理及饱和策略。
  7. 询问项目开发中的SQL优化经历。
  8. 讨论如何识别慢SQL(MySQL慢查询日志的使用)。
  9. 如何分析SQL性能(使用EXPLAIN命令)。
  10. 讨论项目中如何使用索引及对联合索引的了解。
  11. Java多态的优势。
  12. String为什么是不可变的。
  13. 询问我在校期间的代码数量。
  14. 最后,给我提问的机会。

虽然我与面试官的交流还算顺畅,但最终还是未能通过面试。看到结果时,我感到十分失落,心中充满疑惑。也许我对结果的期望过高,导致失望也随之增大。这一年确实是相当困难。

反思与总结

回顾整场面试,我意识到自己在以下方面可能存在不足:

  1. 对项目经历的细节描述不够清晰,可能让面试官怀疑真实性。
  2. 八股文的回答过于生硬,未能将知识内化。
  3. 对性能优化的问题回答简略,未能深入。

接下来的寒假,我将认真准备,进一步完善简历,强化笔试题的练习,以期在明年的春招中获得理想的工作机会。