虽然我是毕业,但是我大学真是“混”过来的。
17年夏天毕业后,我在一家创业公司工作了半年(增删改查),后跳槽到一家互联网金融公司工作2年(负责一个电话销售系统,没有丝毫新内容)。毕业这两年半,我一直都没有人带我,只能靠自己一点点摸索学习。
是的,我除了学校还算亮点之外,其他经历都很一般,工作项目也很平常,各种新鲜技术全靠自学。大学全享受生活了,毕业后就要补落下的坑,我现在每天至少自学两小时。
今年年初,我成功拿下小米(base26k)、百度(base25k)、快手(base25k)、阿里的offer(不方便透露薪酬)。最后,我选择了阿里,这是我一直以来的目标。
下面我给大家分享一下我的“面试经”,希望对想进大厂的你有所帮助。
我的大厂面试经验
为什么面试成功,我总结了如下几点:
1、有明确的目标,有压力才会有动力。保持学习的习惯,每天至少学习两小时,每两个月最少看一本书。你想要三年入大厂,就要三年学习足够的知识,所以让自己疯狂起来吧。2、要有精益求精的态度。你可以想象,如果支付宝因为bug停服1分钟会造成多大影响?如果是你写的,那面临的将是五雷轰顶。抱着这种敬畏的态度,不仅要知道API的用处,更要知道它是如何实现的。毕竟是人写的,会有各种问题,了解原理才能避免或者及时更改错误。3、对技术和项目深入挖掘。面试官很喜欢问项目的架构、技术的深度和广度。为什么?我们需要保证一个系统健康、高效、可动态扩展(就比如支付宝,不能出bug,必须支持动态扩容等等)。那就需要你了解项目架构,学习如何设计项目;需要你深入了解源码实现和设计理念,知道哪种方式效率最好,你写的代码是否会出现bug,是否可以动态扩展……另外说一点,为什么要看源码?
看源码可以了解实现原理,让你对框架的使用更得心应手(我以前不知道aop怎么用,看完源码之后就彻底懂了);其次可以避免一些使用上的错误(比如JDK提供的几种默认实现线程池,他有可能造成OOM,因为采用的无限队列存储任务);再者,我们可以学习优秀的设计理念,将来应用到自己的代码中。
可能你会想问,那么多框架都要看吗?那是不可能的!其实框架的设计几乎都雷同,我们只要针对2-3种框架进行深入研究,学明白其中的道道,那么再给你一个新的技术,你也会很快上手,并且结合项目进行学习(最终的目的不就是为公司挣钱嘛,所以用到啥学啥,谁也不可能都学会都学精,别有压力)。
我说了这么多,不知道你是否对自己有了全新的定位,在学习上有了明确的标准?如果你符合我说的,那么恭喜你已经或者即将成功。如果感觉到压力,那更要祝贺你,因为以后就是你蜕变的过程,请享受它!
面试必考知识点
下面,我给你们分享一下今年我面试的主要知识点:
1、Java基础,其中包括线程池(创建线程池的参数有哪些,分别可以取什么值,为什么不推荐使用JDK提供的默认实现线程池)、锁(主要是AQS,如何进队出队,一定要看透,必问)、synchronize、集合(set、list、map所有的集合都要知道,ConcurrentHashMap不一定问,问了就要将源码全部屡清楚,包括cas、volatile特性)、多线程我倒是没有遇到问的,但是以防万一还是要学习的。这些都是必须掌握的!!!其实不管你去不去大厂,如果想要在技术行业上一直向上走,就必须要掌握这些重要的知识点,要不为啥让你当teamleader呢。2、JVM:如果有小伙伴没有系统学习过JVM的话,我推荐大家去看《深入理解Java虚拟机》这本书,我就是看了这本书对JVM有了一定了解,基本上P6+是够用了。核心包括JVM的内存结构,垃圾回收算法和垃圾回收器,线上问题排查思路及命令,类加载过程,双亲委派模式等。最好能够梳理成知识树,将内容一次性完整的输出给面试官,这样我认为才是合格的。这也不仅仅是为了应付面试,在哪家公司你都要用到这些内容,这会帮助你更深入的理解Java,不懂的话,为啥让你当teamleader?3、Mysql(因为我用的是mysql):主要就是innodb搜索引擎,因为其他的不太常用,考察的也少。包括为什么采用B+tree作为索引数据类型,创建索引需要注考虑的内容,如何优化sql,ACID是什么,事务隔离级别以及如何解决的脏读、幻读、不可重复读(结合MVCC和锁就可以解释清楚),innodb的锁,这一点在《Java高级架构师》中mysql一节有详细的讲解,我推荐大家去看《innodb存储引擎》这本书,里面非常详细的介绍了上述内容,会让你有一个全新的升华(不过第一次读可能会蒙,我自己看了有4、5遍,每一遍都有不同的认知)。4、中间件:可能有redis,mq,kafka,es等等,这就是结合具体项目具体说了。比如redis用作分布式锁,先暂停一下,你思考面试官会问什么内容呢?为什么选用redis做分布式锁,和zk有什么不同;redis分布式锁如何实现的;redis分布式锁和zk分布式锁有什么问题,有没有解决方案(对于客户端长时间GC导致的key过期,目前没有太好解决方案)。再比如mq,你们用的是哪种,如何保证消息不丢失不重复消费,集群如何设计从而达到灾备。以上内容不管你是否参与了设计,或者系统的实现是否进行了考虑,你都需要自己进行了解并结合项目进行思考(可以看书学习方案,再结合项目,这样理解更深刻)。这一点很重要也是必备条件!!!5、算法:大厂面试%会考,我的学习过程:看一本数据结构的书,对数据结构和算法有牢固的基础和认知;买一些算法视频教程,那都是大神的总结和经典算法的讲解,可以将书本的内容得以结合;LeetCode刷题,刷上个道,基本上你就出师了。我觉得更重要的是总结,当你学多了之后可能会总结算法题无非就几种分析思路。(这里说一下面试,有的公司会直接找一道算法题,这个相对基础了;有的会结合业务场景进行实现,这样的比较难,而且不仅考察算法,也考察你对java代码的掌握和编写。当然,这两种都要求手写完整实现)6、框架源码:今年面试就遇到一个问框架的,然后就把spring、springMvc和mybatis的源码一怼就够了。源码面试我虽然没有遇到,但大家还要准备,不仅是应对面试,更可以学到很多知识。具体的课程可以看《Java高级架构师》中的Spring、SpringMVC和Mybatis课程,讲得非常好。补充一点,也是最重要的一点——简历!简历必须排版整齐,能够让面试官迅速找到重要信息(年龄,学历,工作经历,掌握的核心技能),具体工作经历需要写明项目含义、个人负责内容及成绩(如果负责内容比较简单,可以写在项目中遇到什么问题,如何解决的或者学习到了什么,目的就是让面试官感觉你有能力)。总之,必须能够让面试官迅速准确地获取你的信息,才有机会进行后面的流程。
啰里啰嗦,说了一堆。希望看到这篇文章的小伙伴能够用心体会上面的内容,如果你都做到了,就真的不远了。