一、自我介绍
先来个自我介绍吧,本硕都是材料专业,还依稀记得当初考研就是为了有个更好的平台,以后想要读博的,可当自己进入研究生阶段后,发现事实却并非像自己想象的那种剧情发展的。对方向的不感兴趣(组里第一个这个方向,老板啥也不懂),尝试了一学期,无果,遂放弃!
期间接触了编程,决定转向互联网了。毕竟向我们这种偏基础学科的硕士出来其实挺尴尬的,高不成低不就的,认识的很多都转行了(大多数去了房地产,采购、销售、供应链之类的,很少说有转互联网做开发的)。
我个人编程语言水平可能就只是停留在写 HelloWord 的水平上,虽说学了小半年的 Python,但说实话没学到什么,若不是今年 2 月底打算学 Java 的话,可能现在还在为工作焦虑!
因为我开始的比较晚了,8月中旬才开始投简历。整个到签约为止,期间面试了 7 家(阿里电话一面、南京的一家公司,也是电面(开始预约面试的时候没听清楚是哪家公司,后面没好意思问)、ThoughtWorks、赛迪信息、华为、浪潮以及中兴),其中拿到了赛迪信息、中兴以及浪潮等offer。
女朋友在重庆这边,而且我也想呆在重庆,所以就签了中兴,毕竟中兴给的工资在重庆真的算是很不错的啦,属于中上水平,但如果相对于其他的一线城市还是一般。下面就自己的整个学习过程介绍一下吧,可能是比较典型的,毕竟我真的是零基础转的。
二、学习历程
从聊天记录上看,加峰哥的时间是2018年11月25日,当时就已经把我拉进了大数据学习群,不过去年那时候我一直学的是 Python。直到今年的 2 月20 号,稳不住了,看到群里很多都是根据峰哥的路径拿到了大厂 offer,特别是看到佳佳的经历,几个月转行,自学 Java拿到了百度、Keep 等大厂 offer,心想我是不是也可以呢?
从 2 月底便拉开了学习 Java 的序幕。从 Java SE -> 项目 -> 多线程 -> JVM 的打法路线。Java SE 就是看的慕课网的三个基础视频,看完也就大概知道了基本的语法,然后就直接找峰哥刚项目了,也不知道哪来的勇气。
其实刷基础视频的时候有很多都一知半解的,自己那个时候啥都不知道,经常纠结到需要彻底弄懂不,峰哥也跟我说别让这个影响自己的学习流程,不会的先跳过,很多其实后面就会弄懂的,事实确实也是这样的。
还有就是学习 Java SE 的时候最好能与峰哥的面经结合起来一起看,学到什么地方,看到面经上有的及时整理到博客里,一定及时整理!这个时候时间差不多是 3 月底 4 月初了。
后面自己越学其实心里越觉得是无底洞,什么多线程啊,JVM 是啥并不知道,而且老板还一直催我进度,每次开组会都被痛批,常担心自己能不能毕业,能不能顺利找到工作,真是那段时间感觉自己都快抑郁了。一遇到烦心事就会找峰哥诉苦,真是峰哥都没觉得我烦,耐心解答,真的是非常感谢峰哥!
烦心事是有,但是也不能让其一直影响自己的进度,可以先休息一小段时间,理清主次,循序渐进。
后面峰哥给了我一个传智的 Java 基础视频,让我看看里面的多线程和 JVM。不得不说看视频是真的慢,但是的确讲的通俗易懂。看完这个视频大概花了接近两个月吧,好吧那会自己的效率确实也不高,主要还是那段时间被老板逼的很,白天做实验,晚上有时还要做,苦逼的很。
看完这个视频差不多就到 6 月份了,看完立马又开始写博客,根据面试题来记录常见的知识点,虽然很功利性,但是确实是一条捷径。我自己不仅仅看了峰哥的面经,网上自己也找了其他的面经综合在一起,这样也更全面!峰哥的面经是主线,其他的搭配在一起效果更佳。
对了我自己在多线程和 JVM 这两块看了两本书(当然没看完,只是重点看了几章),多线程就是《Java 并发编程的艺术》,JVM 是《深入理解 Java 虚拟机》。第一次看可能会觉得有难度,特别是 JVM 这块,基本上又都是纯理论方面的,第一次没看懂再看一次,着重看重点的几章,其他的可以适当了解,要分清主次,你是为了找工作而学习的(虽然有点急功近利),而不是要深入的完全研究透彻,以后工作了多的是机会的!
第一个项目刚完后,心里没底,一直想自己动手搭搭 SSM 的框架之类的,毕竟自己只是懂得大致的技术栈的原理,对于里面的细节实现实在是不清楚。事实证明面试的时候,面试官问的实现细节很少很少,具体的面试过程会在后面提及。
6 月份开始后,自己没有急着刚项目,而是对于前面学的知识,Java SE、多线程以及 JVM 等进行一个复习,其实也就是看面经(看面经最好还是一开始看到哪就把那一块的面经给吸收了,后面也可以多复习复习),然后整理到自己的博客里,便于自己后期的复习。
有次看集合源码的时候,有个地方不懂,问了下峰哥。确实也是如峰哥所说的那样,不要为了看源码而看源码,记住它的原理流程就行。比如 HashMap,一般问的多的也就是它的执行逻辑,比如 put() 方法具体的执行顺序,先干什么后干什么等等,也会随着问你扩容之类的,有些会问到 HashMap 的多线程,也就是 ConcurrentHashMap,JDK1.7 和 1.8 是有区别的。
后面也基本上就进入了暑假了,今年暑假我们老板破天荒的给我们放了4周的假期,按以往都只有两周,真是这4周对我来说太宝贵了!有了全心全意为秋招备战的时间,不用担心动不动就被老板找,做实验之类的杂事了。
暑假的几周大部分时间都是在刷算法,没错,暑假才开始刷算法,6月底也就大概看看剑指offer,没有动手敲过,只是理解其思想,进入暑假才开始动手敲。我是先从排序查找算法开始动手敲的,然后再动手做剑指 offer 的题目,时间太有限了,那本书没有敲完,好吧,只敲了一半多点。
算法这一块,千万不要学我, 真的,有时间得尽早的刷,我是没办法,开始的太晚了。可以先刷剑指offer这本书,还有时间的话可以刷刷 LeetCode 上的题目!这样基本上笔试和面试手撕算法基本上是问题不大的。
很多公司其实早就开始了提前批,但是我总怀疑自己的能力迟迟没有投递简历。直到 8 月中旬的时候将项目二学的差不多的时候,才慢慢开始投递。总共投递的简历不少于110份吧,我记录的就有90多份,还有很多没有及时记录下来的,还有很多在大街、51job等网站直接投的。我当时心里想的就是我要多积攒面试经验,我投100份,如果有十分之一能进面试我就满足了,实在不行我就投200,300份。总会有拿到 offer 的。
三、面试过程
一、阿里一面
阿里一面是电话面,不得不说阿里的效率真的高,记得8月中旬不到8月20号内推的,不到一周就约了面试,佩服佩服。当时面试的时候面试官开的扩音,根本听不清说的什么,有时候要问几遍,尴尬,以后如果有听不清的一定得及时提醒面试官吧,不然本来面试自己就很紧张,加上听不清导致最终效果会差很多的。
1.Zookeeper 的一些原理,介绍一下 Zookeeper,主要还是涉及 ZAB 协议2. Zookeeper 的选举机制3.RabbitMQ 在项目里的使用场景4.结合 Dubbo 和 Zookeeper 一起5.JVM 的类加载机制6.Memcached 的缓存机制
还有一些当时没有及时记录下来,忘记了。基本上就是围绕你的简历来提问的!所以简历上有什么内容一定一定一定得非常熟悉!
二、南京的某企业
打电话的时候在自习室,急着插耳塞走出去没听清前面自己的介绍,后面没好意思问,就不知道具体是哪家公司。
1.简历上的两个项目的技术栈是有点出入的,问自己在使用上有过什么比较之类的;2.模块怎么拆分的?比如你项目里面用到了 Dubbo,你做的模块哪些服务是依赖了别人的 Dubbo 服务的?3.消息队列主要是传递什么消息的?4.try…catch…会对应多个 catch 块的使用场景5.常见的注解使用6.常见的集合类型,怎么实现的?问源码,主要讲了 HashMap7.Java的什么版本,JDK1.7 与 1.8 的区别?8.String 的常用方法9.你有什么想问的?
三、ThoughtWorks
笔试:跟牛客网里面的一模一样,无人机的路线规划,这个没有标准答案,主要还是让面试官知道你的优化的过程。笔试完后会让你拿你的结果找面试官去谈你的答案,笔试也会让你写出代码来,我没写出来,很大可能也是因为这个所以才挂的。跟面试官交谈后等了一会就是无领导小组讨论,会有5个左右的面试官在周围走来走去观察你的情况,当时讨论的是一个项目占有率越来越低,想开发另一个项目,从原项目里选取相关人员调到新项目里。
四、赛迪信息
真正意义上的线下专业面试,之前 ThoughtWorks 感觉也不算是专业面试。这是最想去的几家公司之一,是中冶赛迪(钢铁设计院)旗下的专门做信息化智能化方面的公司,业务之一是做智能制造方向,跟我的专业有很大的契合度,后面签中兴的原因是该公司流程太慢了,都面了一两周了还没有消息,私信 hr 也没人回,而且中兴也发了签约通知(现在我们学校是网签,发起签约通知后只有 48h 的考虑时间),最终没办法只能签中兴。
一面技术:
- 面向对象的三大特性是什么?
- 重写和重载的区别?
- 同一个文件里面可不可以有两个 public 类,这个当然是不可以的啦~
- 基础数据类型以及相应的占多少字节?
- stringbuilder 和 stringbuffer的区别?
- 类的一个加载机制(加载->验证->准备->解析->初始化,我真的就只是说了这个,也没有简单的对其介绍,当时心里还想的要不要再简单介绍一下的,看面试官没说,我就没管了)
- 双亲委托模型
- HashMap 与 TreeMap 的差别?
- 讲述一下快排
- ZAB 协议
- 消息同步是怎么同步的?(忘了😂)
- 有一个 SQL 查询很慢,怎么去排查?(不知道,尴尬)
- 联合索引了解过没?(不懂)
- 数据库的隔离级别?
- Redis 的数据类型支持
- 数据的备份模式?(不了解)
- Solr 的倒排索引
- Memecached 和 Redis 的区别?
- Redis 持久化方式?
- 一致性 Hash
- 多线程,线程池的创建方式。
- 如果都满了怎么整?(不知道)
- sleep 和 wait 的区别?
- 架构这方面有没有设计,数据库设计?(大概说了一下数据库的设计)
赛迪一面结束刚下楼梯,就打电话让我回去进行二面,二面 hr 也说了她这里不怎么刷人,问了下我期望的薪资,保守说了 8k,hr 笑了笑说期望的有点偏低,问是哪的人?为什么想呆在重庆……后面通过了会有一个测评链接,一般都不会刷人。但是过了一段时间hr先公布了一批人(做测评的),我没在名单里面,心里慌了,总在想是不是自己笔试的时候没做好(笔试成绩是71分,过了70才能有后面的面试,所以我是刚刚过了笔试),隔了几天又出来了名单,这才安下心来。
五、华为一面只记得这么些,面试过程中被劝退,他丫的。
- 先自我介绍一下
- 介绍一下你的项目
- 你说到项目主要负责微信商城订单模块,那 session 是怎么管理的。
- 用到了 Dubbo 和 Zookeeper,说一下 Zookeeper 的选举机制
- SpringMVC 讲一下请求的过程
- Memcached 是怎么实现的?
- 多线程相关
- 讲一下GC
- 手撕算法:给一个字符串,再输入一个字母,输出最近的离这个字母的数组。比如:[loveleetecode] e 输出:[3,2,1,0,1,0,0,1,0,1,2,1]。
六、浪潮6个应聘者,3个hr,群面?开始分别进行自我介绍,然后从我开始进行技术面试:
- JAVA中,类的组成(当时听不懂啥问题,尴尬)
- 8种基本数据类型(应该是答出来了的,但是当时面试官只说我答出7种)
- Dubbo 和 Zookeeper 的区别(当时很懵,后面面试官说了,Dubbo的底层 xxxx 也可以作为注册中心)
- Redis 和 MQ的区别(答的不好,后面面试官纠正了)
- 你都用了哪些数据库 (自然是 MySQL了,当时还以为会继续追问的,并没有)
- 介绍一下 Zookeeper。
只记得这么多了,我被问的时间比较长,然后最后面试官的结论是不是很熟悉底层的知识。
七、中兴一面:
- 先做个自我介绍
- 数据库三大范式?
- SQL 查询语句,年龄段之间的人数统计
- JAVA多态实现需要的条件?(我只回答道继承,还有方法的重写,还需要有父类的引用指向子类对象(丫的,不知道怎么说后面两点,其实是知道的))
- JAVA 线程启动,有哪些方式?
- 另一个hr,问有发表论文吗?是学硕还是专硕?
- 你还有什么问题吗?
流程走的贼快,面试过程也超快,一面不到10分钟,二面也就10来分钟,一面当一个 hr 说我这边没什么问题了看另一个 hr 的时候,我就在想不会这么快吧,果真另一个 hr 就问了有没有发表论文是专硕学硕?就没了,就没了,整个 9 分钟多一点,出来还以为必挂,哪知道最后竟然走完了全程……
二面 hr 面:基本上没有问任何的技术问题,拿到简历就问了一下用 Redis 是干嘛的,就没了,其他就是关于加班看法,期望工资之类的。
四、总结
1.明确目的,规划好路线。秋招自己想往哪个方向发展,前端?后端?还是其他方向。确定好大的方向后规划好自己的学习路线。对于初学者来说,最好是有前辈带着复习,因为很多时候自己一个人闷着学习,经常会被自己带偏的。
2.给自己设定一个 deadline。每一个模块学习的时间设定一个大概的 deadline,这样更容易把控好学习的节奏。比如学习 Java SE,看完基础视频大概要多久,每天要学习的内容是什么,还需要自己及时总结,能写到博客里是最好的,便于后期的回顾。
3.简历里面所写的内容一定要非常熟悉。你写的有哪些技术栈,它的基本原理以及相应的应用场景等等都要非常熟悉。
4.最后一点,也是最重要的,转行要趁早,早就是优势!
--end--