面试前到底该不该刷题
在讨论该不该刷题这个问题之前,首先咱们来看看,到底为什么会有那么多人在面试前会去刷题。
这个问题的答案其实很简单,大部分情况下,都是因为面试者在面试前心里没底,因此有不少人会选择去刷刷题,来提高自己的自信。而且,基本上所有刷题的人,内心多多少少都有侥幸心理,以期在面试的时候,可以刚好被问到刷过的题,然后获得入职的资格。
不可否认的是,确实有那么一些人,是真的依靠刷题而获得了入职的机会。世界这么大,总会有幸运的人的。但是,面试并不是你大学时的考试,考前临时抱佛脚一下,说不定就混过去了。
面试和你大学时的考试,有一个最本质的区别,那就是大学时的考试,你混及格了,也就过去了。但是面试不一样,面试混过去了,你还是要去上班的,这件事情还远远没有结束。虽说只要面试混过去了,试用期被Fire的可能性很小,但是,如果你入职以后没有达到面试时你的水平的话,你的Leader通常情况下会觉得招你进来是一件很失败的事情。面试时最好只表现你80%的能力,剩下的20%是留着到了公司以后给大家惊喜用的。
现在网上有非常多的面试题目,从应届生到N年工作经验的面试题都有,而且只要稍微知名点的公司,在网上基本上也都能找到一大堆的面试题。很多人刷题,就是把这些文章上面的题目一道一道都过一遍,期待在面试中被问到。
刚才说了,面试前刷题是一件很愚蠢的事情,最好给自己留有余地。面试和高考不同,高考时你发挥120%的潜力多考了几十分是很好的,但是面试时你要是发挥了120%的潜力,很可能只能高兴一时,等进了公司以后,你就可能会处在一个尴尬的境地,因为你很可能会成为那个被招错的人。
相信大家很多人身边都出现过这种人,招进来以后才发现,这个人真的很烂。这种人就算能过了试用期,最终的下场,一般都是会被公司慢慢抛弃的。可能并不是这些人不够优秀,而是他通过一些手段,得到了一个高于他原本能力的职位或薪水,因此才显得会很烂。
更可怕的是,当你只是记住和理解了这些题的答案之后,当面试官顺着这道题稍微深入的探究你的时候,你很可能会答不上来。这样就会让面试官觉得,你对于很多问题的研究不够深入,反而会烙下不好的印象。至少对于程序员来说,大部分公司的面试官,尤其是大公司的面试官,宁可选择一个在某个小问题上,比自己研究得还深入的人,也不会选择只会答一些面试题,但随便一深入问下去就回答不上来的人。
因此,还是那句话,不建议大家在面试前刷题。请记住,面试不是考试。
如果你想学习Java工程化、高性能及分布式、高性能、深入浅出。性能调优、Spring,MyBatis,Netty源码分析和大数据等知识点。Java大神交流群 群号为:656039503
注:加群要求
1、具有1-5工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加。
2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加。
3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加。
4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。
5.阿里Java高级大牛直播讲解知识点,分享知识,多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!
面试前如何准备
既然不建议大家在面试前刷题,那么肯定会有小伙伴儿要问,难道面试前就应该什么都不做吗?
当然不是!
以个人的经验来看,在面试前,通常只需要做一件事,而且我也一直都是这么做的。那就是在一个适合思考的时刻,去思考和总结自己所经历的过去以及所掌握的技术,要总结到精髓,并且挖掘出自己至少一个亮点。
这个所谓适合思考的时刻,可以是你回家坐公车的时候,也可以是走去吃饭的路上,也可以是大便的时候,也可以是洗澡的时候等等。
一个人经历过一年,甚至更久的工作之后,总会经历大大小小的事情。每一次面试之前的总结,不光是为了面试,更是为了让你在跳槽之前认清自己,并且清楚自己所需要的提升到底在哪,这才是跳槽真正的意义所在。
很多人跳槽都是盲目的,并且每次跳槽之后都感觉不是很满意。其实有一个很重要的原因,就是你没有在面试之前认真的总结自己,你不了解自己现在到底优势在哪,劣势在哪,你需要弥补哪方面的空缺。以至于在跳槽时,除了薪资待遇以外,很少考虑到自己的职业发展问题。就算考虑了,但是由于没有好好总结自己的经历和技术,也很可能会选择了一个自认为正确但实际上却是错误的方向。
然而,趁着面试,这绝对是你总结自己的最好时机。
在面试当中,要适当的把面试官带进你熟悉的世界,然后在你不熟悉的世界果断的告诉面试官“不好意思,我不会”。而你要做的,就是把你熟悉的世界好好总结,让面试官更加清晰的感受这个世界。这样不仅可以帮助你在面试过程当中顺利的通过,展现自己的亮点,而且还可以帮助你更加清晰自己的职业发展。
而且,事实上在你总结自己的时候,你通常会碰到一些长时间被遗忘掉了的问题,这些问题,是可以临时抱佛脚去复习一下的。而那些与你的经历和技术体系关系不大的面试题,临时去刷其实毫无意义,还不如一句“不好意思,我不会”更加实在。
可能有的小伙伴儿会说,“总结我的经历和技术倒是可以,但是我做的项目和我会的技术都很平庸,实在找不到亮点怎么办?”
那LZ只想告诉你,这样就更好办了。既然你都知道了你没有亮点,也就是知道了你自己欠缺什么,那么下次跳槽就努力给自己制造亮点,弥补自己的欠缺就行了。
例如,你可以找一个大数据的工作,这样你以后就多了一个大数据的技术标签,这算是你的亮点。或者你也可以找一个有高并发的项目去做,这样你以后就有了高并发项目的经历,这也算是你的亮点。
总而言之,在每次跳槽和面试的时候,不断总结自己,深度挖掘自己的亮点,比你去刷那些无聊的面试题,要有价值的多。这样不仅可以帮助你的现在,还可以帮助你的未来。
1,面试都问什么?
这个是让我最头疼的一个问题,也是群里的猿友们问的最多的一个问题。
说实话,我只能隐约想起并发、JVM、分布式、TCP/IP协议这些个关键字,具体的问题真的是几乎都没记住。而且就算我记住了,也告诉你了,你也背会了,但我觉得,在面试中,你被问到一模一样问题的可能性依然很小。
甚至,就算你运气好被问到了,你也照着背下来了,也不一定就能对你的面试起到正面的作用,因为面试官万一多问一句,你可能就露馅了,那还不如干脆点说不会更好。
我参加的是阿里的社招面试,而社招不同于校招,问题的范围其实是很随机的。因为能参加一些比较知名的互联网公司社招的人,70%以上都会有个3-5年的经验。这倒不是说一两年经验的同学没有机会进这些公司,而是因为这种公司,大部分情况下只招一些比较资深的开发和应届生,而不招那些处于中间阶段的人。而1-2年经验的同学,往往就刚好处于这个尴尬的阶段。
对于能有3-5年经验的这部分人中,每个人的经历又都不同,所擅长的点也不一样,因此这就会导致每个人的问题和范围都不太一样。
很少说有哪个知名的互联网公司,比如BAT、京东、360、搜狐、网易等这些公司,其社招面试还有固定的问题和模式,让你可以像应届生面试一样,在面试前靠临时抱佛脚度过这一关。
大部分公司在社招的时候,不光是阿里,其它公司也都一样(因为我在一年多前也参加过很多其它知名互联网公司的面试,详情见《记录2015年年初跳槽的经历!》),基本上都分为两个阶段的提问。
第一个阶段是主语言本身以及它的高级特性,第二个阶段是讲述自己的项目,并在中间穿插着问题。
所以,我不妨就这两个阶段,谈谈社招面试的准备,而不是去把阿里面试的过程背一遍。说实话,我也确实记不住,所以不要再问我阿里面试都会问哪些问题了,你看看上面那个连接里的文章,也会发现,我里面也基本上没有写具体的问题,原因是一样的,真的记不住啊。(就是因为记忆力的问题,导致我从小偏科,文科成绩一直堪忧,-_-)
2,社招面试如何准备
我会分为四个部分来谈论这个问题,由于我本身是Java出身,因此关于主语言的问题,都是与Java相关,其它语言的同学可以选择性忽略。此外,面试的时候一般面试官的问题都是环环相扣,逐渐深入的,这点在下面大家可以更明显的感受出来。
1、主语言本身以及它的高级特性。
主语言当然就是你平日里拿来赚钱的家伙。不要告诉我你没有主语言,你会N多种语言,或者是你精通N多种语言,你要非这么说的话,你可以来杭州试试,我保证不打死你,最多打残。
我的主语言很显然是Java,那么对于Java来说,它的语言本身以及它的高级特性,都有哪些比较容易在面试中问到呢?
一般情况下,主要有以下知识点很容易被问到。(PS:以下所列举的,都是一些Java相对而言比较高级一点的知识点,因为这里谈的是社招,而不是校招)
1)Java的数据结构相关的类实现原理,比如LinkedList,ArrayList,HashMap,TreeMap这一类的。以下简单模拟一个数据结构的连环炮。
你肯定回答说,不是有序的。那面试官就会继续问你,有没有有顺序的Map实现类?
你如果这个时候说不知道的话,那这个问题就到此结束了。如果你说有TreeMap和LinkedHashMap。
那么面试官接下来就可能会问你,TreeMap和LinkedHashMap是如何保证它的顺序的?
如果你回答不上来,那么到此为止。如果你依然回答上来了,那么面试官还会继续问你,你觉得它们两个哪个的有序实现比较好?
如果你依然可以回答的话,那么面试官会继续问你,你觉得还有没有比它更好或者更高效的实现方式?
如果你还能说出来的话,那么就你所说的实现方式肯定依然可以问你很多问题。
以上就是一个面试官一步一步提问的例子。所以,如果你了解的不多,千万不要敷衍,因为可能下一个问题你就暴露了,还不如直接说不会,把这个问题结束掉,赶紧切换到你熟悉的领域。
2)Java并发包当中的类,它们都有哪些作用,以及它们的实现原理,这些类就是java.concurrent包下面的。与上面一样,咱们也简单的模拟一个并发包的连环炮。
比如面试官可能会先问你,如果想实现所有的线程一起等待某个事件的发生,当某个事件发生时,所有线程一起开始往下执行的话,有什么好的办法吗?
这个时候你可能会说可以用栅栏(Java的并发包中的CyclicBarrier),那么面试官就会继续问你,你知道它的实现原理吗?
如果你继续回答的话,面试官可能会继续问你,你还知道其它的实现方式吗?
如果你还能说出很多种实现方式的话,那么继续问你,你觉得这些方式里哪个方式更好?
如果你说出来某一个方式比较好的话,面试官依然可以继续问你,那如果让你来写的话,你觉得还有比它更好的实现方式吗?
如果你这个时候依然可以说出来你自己更好的实现方式,那么面试官肯定还会揪着这个继续问你。
为什么说面试的时候要引导面试官,原因就在这了。因为面试官的提问很多时候都是有迹可循的,你如果抓住了他的轨迹,能够猜到他下面很可能会问什么,那你在回答的时候就可以往你想要谈的方向去说。这样面试时就会显得更加从容,更加的游刃有余。
3)IO包和NIO包中的内容。这部分里面NIO会是重点,IO包大部分都会比较熟悉,因此可能会直接略过,直接问你NIO的内容。
IO包和NIO包的内容相对来说不是很多,首先NIO模型要熟悉,特别是其中的selector一定要非常清楚它的职责和实现原理。其实NIO的核心是IO线程池,一定要记住这个关键点。有的时候,面试官可能也会问你IO包的设计模式(装饰器模式),为什么要这样设计?
有的面试官还会问你有没有更好的设计,这个时候如果你不知道请果断说自己现在的水平有限,想不出来更好的设计,千万不要信口开河,随意YY。
4)Java的虚拟机的内容。这部分主要包括三部分,GC、类加载机制,以及内存。
一个GC部分简单的连环炮。
面试官可以先问你什么时候一个对象会被GC?
接着继续问你为什么要在这种时候对象才会被GC?
接着继续问你GC策略都有哪些分类?
你如果说出来了,继续问你这些策略分别都有什么优劣势?都适用于什么场景?
你继续说出来了以后,给你举个实际的场景,让你选择一个GC策略?
你如果选出来了,继续问你,为什么要选择这个策略?
下面是关于类加载机制的简单连环炮。
首先肯定是先问你Java的类加载器都有哪些?
回答了这些以后,可能会问你每个类加载器都加载哪些类?
说完以后,可能会问你这些类加载之间的父子关系是怎样的?
你在回答的时候可能会提到双亲委派模型,那么可以继续问你什么是双亲委派模型?
你解释完了以后,可能会继续问你,为什么Java的类加载器要使用双亲委派模型?
你回答完以后,可能会继续问你如何自定义自己的类加载器,自己的类加载器和Java自带的类加载器关系如何处理?
再来一个关于内存的连环炮。
首先肯定就是问你内存分为哪几部分,这些部分分别都存储哪些数据?
然后继续问你一个对象从创建到销毁都是怎么在这些部分里存活和转移的?
接着可能会问你,内存的哪些部分会参与GC的回收?
完事以后,可能还会问你Java的内存模型是怎么设计的?
你回答了以后,还会继续问你为什么要这么设计?
问完以后,还可能会让你结合内存模型的设计谈谈volatile关键字的作用?
你在谈的时候,肯定会提到可见性,那么接着可见性这三个字,还可以继续问你并发的内容。
基本上Java语言本身以及语言稍微高级点的内容就是以上部分,如果你能把以上四部分了解的非常透彻,那基本上Java这部分就没啥问题了,因为光以上的内容就够你跟面试官聊很久了。你聊这些聊得久了,自然问你其它问题的时间就会短点。
你从我写这些问题的过程也应该能感受出来,很多时候,面试官都是顺着一条线一路问下去的,如果你觉得这条线你不熟悉的话,就要及时拐弯,引导面试官去问其它方面的问题。千万不要一直往下深入,直到自己跳不出来为止,那就尴了个尬了。
2、讲述自己的项目,并在中间穿插着问题
这一部分是面试过程中必问,也是聊得最久的一个阶段。除非你前面的语言部分非常扎实,扎实到面试官问了一两个小时,依旧没有探出你对语言本身的了解到底有多深。否则的话,你一定逃不过自己的项目这一关,而且一般情况下聊得时间不会太短。
这一部分内容,一般的模式就是你自己去讲你做过的项目,然后面试官会冷不丁的让你去解释其中某一部分,比如让你解释当时为什么要这么做,或者问你现在觉得有没有更好的办法。而这些穿插的问题,大部分与你的项目所用到的技术有关。而你需要做的,就是充分、再充分的去总结自己做过的项目(尤其是最近的一两个项目),挖掘出一个甚至N个亮点,以备于到时候可以让面试官产生眼前一亮的感觉。如果你能达到这种效果的话,基本上离你成功就不远了。
3、额外的加分项
上面两个阶段基本上是必问的,还有一些加分项。这些加分项中,有些内容面试官也会问你(比如TCP/IP协议、算法),但更多的是会先问你了解不了解,你了解的话再继续聊,不了解的话就直接略过了,不至于因为这种问题而直接把你打入地狱。
下面我列举一下这些加分项,如果可以的话,这些加分项还是要争取一下的。
1、计算机系统原理。
2、网络通信协议(TCP/IP,HTTP等)。
3、数据结构与算法。
4、著名开源项目的源码。
5、你自己有很棒的开源项目。
6、你的个人博客。
7、待评论区补充。
这几项当中,对于前1-3项,如果你之前就比较了解,只是由于时间问题忘记了的话,还是可以临时抱佛脚一下的。至于后面4-6项,就需要你日常的积累了,不是一时半会儿能做到的。如果你平日里没有积累,那么后面这三个加分项只能抛弃了。
4、与你职位相关的内容
其实这最后一项是对前面三项的补充,你应该尽量去主攻和你面试的职位相关的内容。比如你面试一个实时计算的职位,那么你的算法最好要厉害,对于著名的实时计算开源项目要熟悉,最好阅读过源码,而且还要对分布式系统有一定的见解。
因此,这个第4部分没有具体的内容,只是提醒你,如果你很明确自己的面试职位,最好在面试前准备的时候,尽量朝职位的需求方向靠拢,这样成功的可能性更大。
对于Java程序猿学习的建议 我想在下篇文章给大家分享 大家可以点击关注我持续为你分享干货
这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?
本来我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容甚至是一些书籍。这一部分的内容,同样适用于一些希望转行到Java的同学。请期待下篇文章 也可以加群交流:656039503 java大神交流群