逆风而行!从考研失败到收获到自己满意的后端开发Offer,分享一下自己的经历!

3,692 阅读11分钟

大家好,我是Guide哥,这篇文章是一位读者的投稿。这篇文章分享了他从确定Java后端方向 -> 考研 -> 考研失败->准备春招 -> 收货自己满意的offer 的心路历程。

Guide哥:建议好好看看,作者分享的内容很棒!相关阅读:《V2.0 版本的 《JavaGuide面试突击版》来啦!带着它的在线阅读版本来啦!》

个人情况

我本科是某双非一本,大学四年也没做过太多有成就的事情。和很多在校生一样,我也经历过很迷茫的时间段,倒腾过单片机。

当时还出于对黑客的崇拜,折腾过一个月的网络安全。反正什么都去接触一点,以此来消磨我无聊的时间,不过后面谈了女朋友就不无聊了,哈哈。

Guide 哥:竟然有女朋友!

唯一感觉有收获的应该就是呆过 ACM 训练营,无奈自己太菜,拿的奖项都很小,蓝桥杯省一等奖这种水平。从大三开始,给自己明确了目标,还是老实实学习一个领域的技术吧。当时从知乎上查看了有很多方向,前端,后端,大数据,人工智能。根据我自己的兴趣(好就业)给自己明确了 Java 后端开发的方向。

考研

当时出于想继续学习提升自己的目的,选择了考研。这个地方想说一点就是,到大三了一定要规划好自己将来要做什么考研,就业,考公务员等等,坚定自己的信心和决心!。不要像我一样,在考研开始到结束的期间总会在某个时间段会心态上波动,觉得一整年的考研可能因此错过很多的机会,比如秋招。万一最后没考上研,就很尴尬了,毕业即失业?

尤其是自己考研期间复习不理想的时候,胡思乱想的东西就会越来越多。经常会找同学,朋友以及考上研的学长谈心来调节自己的心态。这个地方特别想感谢我的女朋友,在我每次心态爆炸,迷茫想放弃的时候,都愿意花自己的时间陪我出去散心,虽然她也在备战考研。有机会的话,还是建议能找几个比较自律的研友,可以互联督促约束。

Guide 哥:此处@一下这位老哥的女朋友。

这一切都过来的时候,才会觉得自己当初的想法比较幼稚,天无绝人之路。既然选择了远方,便只顾风雨兼程。专心做好一件事就行,只要自己保持上进心,相信未来一定会越来越好,一切美好都将与你环环相扣。

好在我最后还是坚持的走完了考研的旅程,虽然结果不那么的美好,但是我觉得一切都是值得的,至少我的计算机基础,高数,英语在这一年里都得到了很大的提高。

准备春招

我从考研结束之后,就开始着手准备春招的内容,复习以前做过的项目和学习过的技术栈。由于时间比较紧,任务比较重。这个时候,我觉得可以面向面经来学习准备,我花了一个上午的时间去牛客网刷面经,

最终按照不同的模块整理了一份不重复的面试常见问题,接着一切的学习任务都围绕着这个面试题来展开复习,查阅相关的书籍资料。

总结了一下,需要准备的内容也就是:

  1. 算法
  2. 项目
  3. 牛客网总结的常见面试知识点的复习。

算法的话,我的时间比较紧,复习的主要是 《剑指 offer》 + leetcode 的 top100。刚开始可以按分专题模块来刷,后面就可以随机练习。

项目的话,我觉得如果有机会能接触到真实的项目是非常好的,因为这一块当你面试的时候针对某些细节你可以自信的和面试官聊很多,如果要是自己包装的话,可能聊起来会觉得很虚。不过也没有关系,即使是自己跟着网课学习的或者找的开源项目,我觉得首先得保证能完全吃透这个项目的细节,细到数据库的表各个字段的含义,项目中哪些功能在哪一个模块实现,为什么这样实现,有没有更好的实现方式了。这些我觉得都是你需要思考的问题,因为面试中会出现各种不同的情况,面对不同的面试官,问的问题也是千奇百怪的。

关于项目经历,我再补充一下,避免大家踩坑。

不管是网课的项目,还是开源的项目。你能发现,别人也能发现,怎么才能避免雷同,体现自己的特色,项目中真正具有你的思考在里面。我有如下建议送给你:

  1. 可以替换其中的相关技术栈(比如 kafka 换成 RocketMQ),同时还需要准备自己选型这个技术栈的理由,一定要能够自圆其说。
  2. 可以自己在这个项目的基础之上添加一些额外的功能。这些内容都算是你自己写的,也是自己思考的点,面试的时候可以自信的和面试官介绍。对于项目介绍的部分,我觉得可以主动突出自己的亮点和难点。比如常见的考察 JVM 相关的问题,可以通过"自己创造难点,遇到的问题"来将这个问题主动出来,将主动权握在自己的手中。比如我当时为了说明项目中解决的问题,在项目的读写分离部分是通过 MyBatis 的数据源的动态切换,这一模块中使用了 Threadlocal 来进行隔离,因此抛出由于团队人员在开发过程中忘记 remove,最终导致项目上线后定期出现的 oom 问题,你可以聊你的解决方案以及定位问题的方法,接着面试官还有可能会考察 ThreadLocal 相关的问题,沿着这一条链路下来,可以思考着面试中面试官可能会问的这些问题,提前做好准备,让自己能够更有信心得去准备面试。对于面试,一定需要记住提早开始面起来,不要像我一样"等待一切都准备好"再投简历开始面试,这样会错过很多的机会。面了 2-3 家之后就慢慢培养出感觉来,从一开始自我介绍都结结巴巴,到最后把握面试的过程,这个阶段是需要练习的,可以刚开始投递自己最不想去的公司,当成自己练习的过程。

好在自己准备的还算充分,感觉比较幸运的是在这个疫情笼罩加上互联网寒冬时期,各大互联网公司裁员的情况下,经历了几个月的反复准备让自己拿了一些的 offer,最终也获得了自己比较满意的 offer。面经部分,个人觉得 SHEIN 这家公司问的比较全面,涵盖了常见的题目。如下,仅供参考学习。

SHEIN 面经分享

SHEIN 是一家成立于 2008 年的快时尚出口跨境电商互联网公司,集商品设计、仓储供应链、互联网研发以及线上运营于一体。

一面(45min 左右)

  1. 自我介绍
  2. 详细的聊了 TCP 三次握手四次挥手,以及各个环节可能会出现的相关问题。
  3. 有没有做过 MySQL 调优,MySQL 的一些优化方法,还问到了 MySQL 选错索引的问题,整条 MySQL 执行会经过哪些过程。
  4. HashMap 和 ConcurrentHashMap 1.7 和 1.8 的变化。hash 扩容为什么要扩大两倍,扩大 3 倍为什么不行。
  5. 本地缓存 GuavaCache 和 Redis 的区别,为什么项目中采用了多级缓存的设计
  6. 介绍常见的设计模式(这一块,我觉得结合 jdk 或者 spring 相关源码,或者自己的项目使用的设计模式聊比较好)
  7. 为什么要使用 SpringBoot,他能带来哪些好处。
  8. 线程池你在项目中怎么使用的,线程池内部原理的流程是什么样的。
  9. 阻塞队列有没有看过底层是怎么实现的
  10. synchronize 和 ReentrantLock 的区别,需要先介绍各自的底层实现。
  11. 有没有什么想问他的。

二面(1h 左右)

二面问了挺久,总共一个半小时,基本围绕着简历来问,

  1. 问了一些 Java 基础,HashMap,HashSet,重写了 hashCode 方法需不需要重写 equal 方法,如何解决哈希冲突的等等.
  2. B+树,InnoDB 与 MyIsam 的区别,还问了事务隔离级别读提交与可重复读的的一些区别.
  3. 接下来又问了 Java 并发知识点,Synchronized 与 ReentrantLock 区别,可见性的问题,CAS,问到 Unsafe 是什么,原子类等等.
  4. JVM 问的比较多,程序计数器的作用,虚拟机栈里面的栈帧存放着什么,本地方法栈又是干什么用的,新生代与老年代,垃圾回收算法,垃圾收集器等等问题。
  5. Spring 问了 IOC 和 AOP,这一块问的相对较少.
  6. 问了很多基础之后才开始问项目,项目从第一个开始问,问的很细,难点在哪,怎么解决,点赞后站内信的通知异步是怎么实现的等等,问完第一个项目接着问第二个项目。
  7. 问了 netty 如何使用的,nio 相关问题,最后问到 Linux 的 io ,select,epoll 这些。
  8. HashMap 存储了 50w 的数据,给出最快速给遍历方法
  9. 有没有什么想问他的。

三面(25min 左右)

三面问的技术问题就相对少了,主要问了跳表,Java 并发的知识点,Linux 的基础命令,Git 的常规问题,JVM 的回收算法介绍了下,还问了让我来介绍 Git 给不懂 Git 的人听,你会怎么跟他介绍。

四面 ( CTO 面 时间很短,不到 5 分钟)

大概就随便和我聊了下,为什么想来南京,有没有参加秋招,本科期间代码量怎么样,我当时都还没开始聊起来,他就说大概就这些了。 感觉有点虚,毕竟问的时间那么短,当时我还问了之前认识的一个老哥,他也面了 CTO 面,他也是 5 分钟左右,总体感觉 CTO 挺幽默的。

五面 HR 面

主要介绍了公司的情况,薪酬待遇,问能不能提前去实习等等一些问题。

总体感觉 shein 的面试效率还是很高的,基本一天一面。 HR 的态度非常好,中间由于一些事情耽误,还鸽了一次技术面试,HR 根据我的时间以及面试官的时间帮我额外安排了一次面试。对这家公司的映像非常好。 值得一提的是感觉现在互联网上的资料太过于多,各大线上架构师等培训机构的出现,间接的促进了面试难度在逐年加大,有些问题不能不理解的单单去记忆背诵,以此来期望面试通过,这个方法肯定行不通。 记得比较深刻的是有一场面试,我间接提了好几嘴自己对于 HashMap,ConcurrentHashMap 比较熟悉,面试官都不买账。包括后续问我对 Java 那一块比较熟悉除了集合部分(衰)。对于 JVM 的考察也不再是考察背诵垃圾回收算法以及常见的垃圾收集器,而是问为什么要按这个比例设定,如果不这样会导致什么问题等等。对于常见的排序和二叉树的时间复杂度被问到后,面试官希望你能够给他推导出来。所以,希望准备面试的小伙伴,

写在最后

还是要准备扎实的基础,不要靠直接背诵面试题这种方式来应付面试,方能以不变应万变。最后,吃水不忘挖井人,非常感谢 Guide 哥的帮助,Guide 哥的公众号和 github 在我学习 Java 的道路上包括后续的准备面试的过程中对我的帮助都非常大。

Guide 哥:这个彩虹屁 🌈 很喜欢,哈哈!

本文使用 mdnice 排版