17期Java:985物理专业,跨考失败,一线大厂offer(含面试心得)
注:985物理专业,跨考失败,经过4个月培训,拿到一线互联网大厂offer,月薪20k,饭补2k,房补1k,15薪。一次优秀的逆袭!
1.1. 前言
我是Java17期成员,是一个跨专业小白,努力了5个月,入职某互联网大厂。前4个月在王道武汉校区学习,结课后,写好简历就开始海投,投了不下100家。第一个星期主要是试水,面试小型公司和初创公司(100人以内,拿到天使轮融资)。比较幸运的是,很快拿到第一个12k的offer。拿到第一份offer之后,内心会踏实不少。第一次面试需要一点点勇气,面试之前对自己的技术水平不自信,勇敢迈出第一步吧,无论结果好坏自己都没有吃亏。第二个星期以及往后,我都在面试中型公司(200至500人,拿到A轮或者B轮融资)、上市公司,乃至大厂。从开始求职到最终确定经过了1个月时间,我得到15家不同公司的面试邀请,总共参加20场面试,获得6个offer。
找工作可谓一鼓作气,结课后马上写简历给老师修改,去到求职地,尽快投简历,参加面试。千万别让自己闲着,你不抓紧时间,很容易就遗忘知识,而且对代码越来越生疏。一开始无所谓公司大与小,重要的是争取面试机会。第一次面试不用太紧张,成就成,不成就下一家。面试了三四家公司,对面试流程和高频问题比较熟悉了。这时候遇到心仪的offer,可以见好就收,没有收到offer也别灰心丧气,要对之前的面试复盘,解决掉暴露出来的知识盲点弱点,因为很大概率在下一次面试再次遇到,千万别抱侥幸心理。求职过程是面试——补漏——面试——补漏——面试...如此循环。求职需要耐心,但耐心是有限的,趁着精神疲惫之前,迎难而上吧。
1.2. 面试心得
前期注重实力,保持良好心态:找工作过程中,继续巩固好自己的技术栈,然后保持一个积极的心态。收获offer说明你的能力得到肯定,人家公司刚好需要人;面试结果不如人意,说明你还有进步的空间。其实到最后大家都会找到工作的,唯一的区别就是公司的方向、规模、待遇方面。也别在意人家拿到了牛X的offer,人家曾经也很努力,不然哪来的学历背景加成,哪来的扎实技术?好多之前一直没有面试的人,可能突然某一天就收到好几个面试邀请;好多之前一直没有offer的人,可能某一天突然就收到好几个offer。我去王道之前什么都不会,现在拿到offer了。所以不断提升自己综合实力才是关键,不是有句话叫,临河羡鱼,不如归家织网。与其羡慕别人,不如定下心来,认真学习。那些高频面试题,很多有答案,如果只是走马观花看一遍,其实下一次看到重复的题目,还是答不上来。我的做法是,把面试题整理到文档中,可以复制粘贴,但别忘了按照自己的逻辑和表达习惯,调整句子的顺序,争取背一背,就像大学时期背马原。熟读成诵,记多了,才会说。同时还能总结一下回答问题的逻辑、层次、深度等技巧,避免语无伦次。整理完之后,试着不看答案,凭记忆回答。
面试过程:能不能获得offer,全靠面试表现。每一场面试大家都要尽力展现出更优秀的一面。技术面被问到不会的,很正常,没有人是什么都会的。你可以说“不好意思,这块内容我不太擅长”,如果你发散思维想到了相关的东西,告诉面试官“虽然我不擅长xxx,但我对xxx有一定的理解”,此时如果面试官有兴趣你就讲讲。我在面试过程中,尽可能保持有条理,有步骤地去表达。在回答自己不熟悉的问题,其实很容易思路走偏,越说越懵,甚至脑子一片空白。这时候我会尽量放慢节奏,速度回忆相关的知识点,嘴上讲着前半句,其实脑子里就想到后半句。不管回答得正不正确,都一定要自圆其说,所谓自圆其说,就是你的最后结论要兜得住你一开始提出的看法或观点。笔试有标准答案,教书也不得有半分含糊,但面试没有那么严格地苛求标准正确。关于项目,不熟悉的部分少说一点,熟悉的部分就多说一些,并趁机转移话题。我在一次技术面中,很明显地说错一个关于synchronized的知识点,当时我还没有意识到自己是错的,认为自己是对的,以至于面试官问我真的是那样吗?我都振振有词地说当然是了,因为吧啦吧啦,一副自信满满的样子。后来我特意查了一下,才意识到我是错的。然而我还是收到了这间公司的offer。当然是因为我大部分问题答得还行,复习时都刚好看到,所以面试得好不好,要靠平时的学习。
1.3. 学习重点以及技术栈
我参加的是社招,社招的岗位很多,不同类型的公司的有各自的看重点。外包公司需要能马上干活的人,他们问很多项目细节和开发过程的问题。中小型公司既问项目也问基础,中规中矩。大厂比较看重基础,会考察算法题目,同时结合项目提问基本的问题,比方说,你的简历项目涉及高并发,那就提问多线程环境下发生死锁怎么办(死锁的四个必要条件),如何保证线程安全。虽然公司很多,类型也不同,但首先明确,硬实力是决定性因素。在没有实力之前去面对一切,结果往往会不如人意。王道的学习内容很多,踏踏实实去学,该敲代码还是要敲,没有那么多的捷径。实力不够的时候,即使是高手的捷径,于你而言也是蜀道。
Java后端的技术栈,从王道的课程体系就看得出来,Java SE,Java EE,Spring,微服务,以及贯穿项目始终的Mysql数据库。每一部分细分下去,内容不少。我从不劝珍惜王道的美好学习时光,因为劝人干嘛干嘛的人,很可能自己未必珍惜过:(。我建议还是记笔记,勤记忆。离开王道,面试之前,要捡起SE阶段的基础知识,顺便深化项目的一些技术要点。
不是万事俱备再去面试,而是一边面试一边提升,顺便拿offer。以上是过程和心态,下面简单说一说面试的考核知识点,不多,都是提炼出来的。参加过面试的人对此应该很耳熟,如果你在王道学习,不妨利用空闲时间加深对这些知识的理解。
1.3.1. Java SE:
1. Java虚拟机:Java运行时数据区(Java内存模型),类加载机制(包括双亲委派模型),垃圾回收机制。了解一些java虚拟机调优。毕竟这是你和面试官之间的常见共同话题。
2. 数据结构:黑大帅教你手写ArrayList,二叉树及其遍历(例如层序遍历),HashMap底层原理(数组+链表以及红黑树优化)。哪些集合是线程安全,哪些不安全等等。
3. 算法:二分查找(等于目标值的元素,小于目标值的最后一个元素,大于目标值的第一个元素等等),递归以及递归的优化(动态规划),同时要学习那八大排序(冒泡,选择,归并,快速排序,插入排序等),最好记住代码,而不只是思想。我当初花了很大时间去理解快排,一遍记不住,就默写两遍、三遍,四遍,它们是算法的基本功,我觉得leetcode上各种各样的算法题,在不经意间透露着二分法,排序算法的影子。黑大帅布置的算法作业题,比较经典,我建议你把解题的代码的记在脑海中:)。
4. Java的锁机制,例如synchronized关键字是怎么用的。这块内容水很深,我没有很明白。
5. 多线程:怎么创建一个线程,手动实现可复用的线程池(笔试遇到过),线程池的底层原理和执行流程(问了不下两次),会写自定义注解等。注解这块内容,在后面的框架会经常用到。
1.3.2. Java EE
1. 数据库索引优化:sql语句是基础,数据库的四种隔离级别必须背下来,比较重要的是数据库索引优化。索引是帮助Mysql高效获取数据的有序的数据结构,默认使用B+树。面试时会被问:在实践中使用过哪些数据库优化技术?Mysql索引使用什么数据结构?B+树相对于B树而言有什么特点和优势?使用索引有哪些注意事项?
2. TCP/IP协议:Java EE阶段,松哥会讲Http请求和响应报文,Tomcat服务器,Servlet,这些内容其实偏重于应用层。建议自己花时间,去熟悉TCP三次握手建立连接,四次挥手释放连接,TCP拥塞控制,TCP和UDP的区别等,这里有些是计算机网络或者SE阶段的内容
1.3.3. Spring阶段
1. Spring相关:简单介绍一下Spring控制反转和依赖注入,Spring AOP,Spring事务的实现原理(涉及到jdk动态代理和cglib代理,代理模式)和事务的7大传播属性,
2. 设计模式:你在实践中用过哪些设计模式?有的笔试题要求手写单例模式(会多少种就写多少种)。同时背一下6大设计原则(开闭原则,单一职责原则,里式替换原则等等)。
再强调一下,Spring的内容是吃饭家伙,它很重要。市面上九成的公司都使用Spring框架。当前web应用开发的主流语言是Java,已连续两年位列TOIBE编程语言排行榜第一。除了易维护的语言,还要称心好用的框架。对于Java而言,最热门,占有率最高的莫过于Spring Boot(56%)以及Spring MVC(43%)。是Spring框架让Java语言在十几年来一直保持生命力。对于从事Java开发的程序员而言,掌握Spring框架是理所当然的事。
1.3.4. 微服务阶段
这个阶段的面试题可难可易。往容易的问,考察你的知识广度,往难的问,考察知识深度。我的建议是尽量全都学会:
1. Redis缓存中间件的5种数据结构,缓存雪崩,缓存穿透,缓存击穿现象
2. RocketMQ如何实现分布式事务,或者更宏观一些,分布式事务的实现方案
其实还有不少内容,这些都在薛老师提供的笔记中,薛老师什么都给你准备齐全了。我在面试中被问得不多,毕竟我找的还是初级程序员岗位,但是了解这些知识没有坏处,以后往高处走应该用得上。
1.4. 最后
最后来个小总结,在王道大部分的时间我都过得很充实,比在大学有用得多。偶尔有焦虑,有彷徨,最终你都会挺过去的,要对自己有信心。我经历过保研失败,考研失败,找的工作也没前途,现在,它们全都过去了。遇到难题不要害怕,不要心急,最后都有解决的做法,每道坎儿会很快过去的。祝每一位朋友,考研也好,工作也好,最后都如愿以偿,我习惯说“得偿所愿”,祝大家得偿所愿!