面经【转载】
前言
最近半年内前前后后也面试了几家公司,有成功的,也有失败的,不过大部分以失败结束;打算把最近面试的一些经验写成一篇文章(当然最近也一直有这个打算),希望能以此文章为转折点,给自己一个警醒,也是给大家一些面试方法的经验吧,当然最希望的,是希望大家从我的面试过程中学到一些东西,能避免我犯过的错误,走过的弯路。大片即将开始,请各位备好瓜子花生和卫生纸(不要想歪了,我是怕你们中途万一想去WC),那么废话不多说,开始吧。在开始之前,为了保护公司和我个人的的隐私,我会把公司的具体名称省略掉,换做某个行业的某个规模的企业,敬请谅解。
面试整体总结
既然前面已经跟大家废话那么多了,那我现在还是给我最近的面试来做一个整体的总结吧,我们写记叙文也要有一个点睛之笔,所以我也希望为我的最近的面试打一个分,当然评分的标准可能每个人都会不同,所以我觉得以A,B,C,D来给自己评分,这点比较适合,也希望各位看官看完这篇文章以后,能给我打一个客观的分数(当然不一定要和我给我自己打的分数一样,哈哈),然后希望各位看官在看完这篇文章以后,给自己打一个分,看看自己位于什么位置,需要哪些要提高的地方。
- A:完美
- B:优秀
- C:及格
- D:不及格
以一个整体的表现来说,首先我给我自己的标准是:不及格。那么问题来了,评价一个面试者是否及格,优秀,除了面试官对你的主观评价以外(个人倾向),还有一些客观的东西,一般大家都会有一个想法,那就是:面试官实际上他怎么想,我不关心,因为每个人的想法都不同,你不能够改变别人,但是你可以改变你自己。稍后我会提到这点,其实想着改变你自己的客观的一些东西,并没有错,但是实际上,面试是一个“”沟通“”的过程,你不是商品,你也不是在谈一场买卖,而是面试官去了解你,以及对你的能力有一个正确判断的一种方式。
那么,评判一个面试者是否优秀,是否是面试官想要的人,其实可以从2个大的方面去评判。第一个方面是从面试者本身来看面试官,另一个是从面试官来看面试者。首先要明白前面说的两点,就是要学会换位思考。也就是我前面所说的那句话:你不能改变别人,但是你可以改变自己;但是,如果你改变了自己,你也不一定能改变别人,如果你想改变别人,那就必须要改变自己。大家是不是觉得有点点绕?尤其是最后一句,其实这句话总结起来,就只有一句话:要想改变别人,必须换位思考;因为你是在和人沟通,而不是解决一些程序代码上的BUG。
大家不要小看面试,有些人可能会有这样的观点:我平常在公司里面,在小组里面,都是特别6的人,所以我会以同样的观点来看外面人的,废话不多说,先放一张图,让你们见识见识;顺便也给这2家公司打个广告,我一般用App找工作,因为这样随时随地可以查阅公司和面试的一些情况,而且不容易被现在的公司发现。我推荐给大家2个App:一个是近年来比较火爆的BOSS直聘,另一个是猎聘。这2种找工作的方式各有优缺点,稍后我会详细给大家介绍,先放两张图:
好了,这是我随便找的一个职位信息,仅仅以Java为例(因为Java的从业者人数,是国内最多的,所以我觉得比较有代表性),大家能否感到一丝寒意呢?如果你在看完我上面发的这张图之后,还能对自己保持信心,那可能有2种情况:第一种情况你本身就很6,之前的工作经历和学习经历的话,能够轻松在竞争当中脱颖而出,这种人我没啥好说的,右上角,因为这篇文章是给迷茫的人看的,你已经很厉害了,从我这里学不到东西。另一种人,就是我说的那种:不知天高地厚,一定要实现自己梦想的人,或者换句话说就是:无知者无畏,甚至找工作的时候抱着侥幸心理,以为自己内瞒天过海。好了,如果你是一个对自己的能力有一个清醒认识的人,那么恭喜你,这篇文章继续看下去吧,希望我能帮到你。、
我们再回到之前所说的:A,B,C,D四个等级。其实我想说的是,你处于哪一个等级,其实和这几个维度有关系,我画一张图你就知道了,下面的雷达图你可以在这里去生成它,给自己一个客观的评价,要知道,你并不是发挥出你自己的能力就行了,你可是在跟其他人竞争,那么,其实我们可以这么理解,一个人能不能面试成功,不仅仅是他能100%发挥出自己的水平,而且还和他所处的环境有关系,这个环境可不是你面试的时候面对面试官的环境,大家面试听得最多的一句话应该就是:你回去等通知吧,有消息会通知你。其实这句话有2层含义:第一个意思就是,你不适合我们,第二个意思就是,你部分适合我们,但是我们要等等,看看有没有比你更合适的候选人。那么这句话的含义,其实就包括了我下面雷达图中所说的一个重点,你不是在一个人面对面试官,而是面对着千千万万的竞争者。
面试需要注意的地方
上面的说得差不多了(至少我是这么认为的,如果大家觉得有要补充的地方,我可以加上去,谢谢) ,那么开始本节的重点:面试需要注意哪些地方呢?我个人认为面试应该注意这大块,也许一些小的细节,就可以暴露出你的缺点;在这里我还要说一点,是个人都会有缺点,但是面试的时候一定要扬长避短,这不仅仅是考验你“”撒谎“”的能力,更是体现一个人情商综合能力的一个表现,如果你能把你的缺点让面试官听成你的优点,那么我认为,不说100%过,至少你在面试官当中的印象会好很多,大家都知道公司其实不仅仅是写代码,我们还要面对各种各样的人情世故,撕逼都是常有的事情,所以面试官看一个人,不仅仅是他的技术,还有他的为人何处理各种应急事件的能力。
面试要注意的地方主要分为三块:
- 面试前
- 面试中
- 面试后
那么我按顺序来描述一下吧,首先是面试前;面试前需要我们做哪些工作呢?首先第一,就是“”海选公司“”,既然公司可以从浩如烟海的人群当中筛选简历,那作为求职者来说,我认为也要选择自己合适的公司,首先不说成功率了信心会得到提升,最重要的一点是:起码你是一个对自己未来负责的人。这点非常重要,如果一个人连自己想进什么公司都不知道,那么他必然在下家公司也不会很长久。这里又开始打广告了,开始提到的2个找工作的App,一个是BOSS直聘,一个是猎聘。工欲善其事,必先利其器。我们选择一款适合自己的App和找工作的方式,对自己在找工作的路上的发展,是有着莫大的好处的。那么这2种APP应该如何选择呢?什么样的人适合什么样的APP呢?我个人的看法是:如果说你是一个对未来模糊不清的人,而且技术很一般的候选人,我建议用猎聘。如果你是一个技术很过硬的人,不需要别人指引你前进方向的人,我建议用BOSS直聘。如果你用的是BOSS直聘,那么我这一段内容你可以直接跳过,因为此内容仅适合迷茫中的人。那么用猎聘,是不是说,我开放简历就行了呢?我直接告诉你,开放简历之后,会让你的电话呗打爆,而且很多的猎头都是推荐的同一个职位,根本没有利用价值;我曾经开放过2天的简历,后来又关掉了,知道什么原因吗?因为至少有10个猎头给我推荐一家公司,并且在我面过之后,还有猎头找到我,给我推荐这家公司。所以这个问题并不是一个找工作的问题,而是你去海选猎头(你的经纪人,合作伙伴)的问题,其实抽象起来就是:你不需要很多的朋友,但是你至少要有一个知心朋友。猎头的作用,并不是给你推荐工作,而是帮你找到工作,如果说只是推荐工作,那我完全可以省去猎头这个环节直接去BOSS直聘上面找。
跟猎头的合作,其实也是一个双向的;很多的求职者,觉得猎头找上门来,就是为自己服务的,表现得像一个大爷一样,好像你给人家给钱了,必须要人家给你最优质的服务一样。不管是对谁,你对别人的态度,决定了别人对你的态度。我就拿我来说,我只要找到一个靠谱的猎头,一般说话都会比较有礼貌,如果说我对面试流程,或者公司不太了解的,我都会去问猎头要一份公司的资料;并且如果有需要的话,我还会主动问猎头要一份这家公司的面试辅导,毕竟猎头不是对你一个人服务,也许他推过的这家公司,其他有候选人也进过这家公司,说不定那些面试题之前有人踩过坑。
既然猎头这边说完了,那么回到之前的问题:海选公司。那么什么样的公司才是适合你自己的呢?我这里分为几种。
- 本身比较厉害的那种,谋求高薪发展。
- 自己不太厉害,想出去见识,但是又怕自己能力不够。
- 自己比较迷茫,不知道以自己的水平能达到什么程度,想去外面试试,观望一下,有合适的就跳。
个人的说完了,现在说一说公司需要什么样的人,我暂且把公司分为以下类型。
- 是个人都要了,能写代码就行,这种公司一般有2种情况,第一种是外包,另一种是本身招的是初级程序员,如果是外包,那我就不说了,相信踩过坑的人深有体会;如果说是初级程序员,现在公司这种人越招越少了,为什么呢,招一个毕业生就行了,如果你做了几年,还是一个初级的水平,那估计谁也不愿意要。
- 需要和行业知识或者软件的一些业务相吻合的人,比如蚂蚁金服会看一些和互联网金融相关的,拼多多会注重电商相关的,如果是数据处理部门的话,会招一些大数据相关的人才,你的过往的工作经历的契合度,决定了公司最终能不能看上你的一个重要指标。
那么,回到上面的问题,对于一个求职者来说,海选公司,什么样的公司才是契合度高的呢?我个人觉得有这么几点:你是否做过类似的东西,如果你没有做过类似的东西,你是否接触过相关的东西,如果你没有接触过相关的东西,你是否能够快速上手,把自己之前未做过的东西,快速变成你自己知识体系的一部分。这句话还有一个层面上的意思,就是你是否有没有快速学习的能力和适应变化的能力,我个人认为好的面试官,不仅仅是看你之前做过了什么,还会看你将来能做什么。
这里又发掘出了一个问题:什么东西是你的核心竞争力?什么是你比别人更加厉害的地方?抛开面试准备不说,把你的心扉敞开,自己问一下你自己,是不是真的有比别人强得多的地方。我相信每个人都有自己的答案,我这里分享一个小小的故事给大家听,希望能给大家启发:就来说一个学英语的故事吧,如果你英语好,这段也可以跳过,因为这其实是我的真实故事。记得上初一的时候,我的英语成绩在全班是名列前茅的,很多的没有我英语成绩好的,经常来向我请教问题,他们请教什么什么呢?你猜?我告诉你,没有一个是请教我具体问题的,他们只是在请教我同一个问题:“为什么我的英语不好,而你的英语那么好,为什么我费尽了九牛二虎之力,也记不住一个单词,考试的时候总是不及格?“。我其实当时就跟他们说,基础很重要,如果你学英语,连基本的音标都读不好,那何谈基础好呢,如果你基础不好,怎么才能学得更好呢?他们不相信,总是觉得我有什么与众不同的秘密法宝。有一次上英语课,老师让我朗读一篇课文,我于是流利得读了出来,然后读完了之后,全班都开始笑了起来,我心想,难道是我读得好?正当我美滋滋的时候,其中一位同学发话了:你有个单词读错了,然后我坚持自己的意见,说就是这么读的,班上的人又是一阵哄笑。然后老师只说了一句话:赞同我的读法的请举手,没有一个人举手,不赞头我读法的请举手,然后班上除了我之外都举手了;老师沉默了片刻,只说了一句话:真理,永远掌握在只少数人的手中。我分享的这个故事,希望大家深思,不管是做事,学习,做人,都要深思;我比别人究竟差在哪里?我和别人比,核心竞争力在哪里?自己去思考,希望你看完这篇文章之后,能给我一个答案。
好了,回到正题;面试前除了进行公司的海选以外,在海选公司当中,我们还要了解到这个公司是做什么的;比如我看中了A,B公司,那么这2家公司的一些基本的对外展示的一些情况,我觉得还是很有必要去了解一下的,不管你最终是不是在这家公司工作,这起码可以体现你这个人在做事情当中的态度。要记住这么一句话:这个世界上只有父母为你的过去负责,除了你之外,没有人为你的未来负责,所以现在就要努力,努力再努力。了解公司是做什么的,可以通过一些具体的途径,比如去一些招聘点评网站上去寻找关于这家公司的一些客观的评价,也可以去了解一下公司的业务流程,去主动跑一下整个业务,甚至可以下载APP去体验一下公司的整个业务的运作流程,这些东西都会在的与面试官的交流当中,起到意想不到的作用。其实这里还要跟大家提一点,海选公司,不仅仅是自己主动去选择他们公司,如果你身边有一个靠谱的猎头,也可以让他帮你推荐一下,有时候如果你自己不清楚自己的方向的话。因为猎头接触过的面试者,绝对比你接触的面试官要多,这点是毋庸置疑的。
如果当你选择好了一家公司做为自己的猎物的话,那么久可以进入我们下一个环节了,就是可以开始准备面试了。套用孙子兵法36计,你可以选择适合你自己的方式。说到这里,大家会不会想:36计,走位上计!我知道大家想笑,其实这没什么好笑的,走为上计也是面试技巧之一,稍后我会和大家说道具体的一些技巧。首先第一点:知己知彼,百战百胜。说到这里,我们可以回到前面的议题,你可以去了解他们公司的情况,这叫知彼,知道你自己的情况,这叫知己,有些面试者可能会笑,我还不知道我自己吗?我每天工作都很顺利,领导分配给我的问题,我都能及时快速解决,我还不知道我自己水平啊,肯定66666.。好吧,如果你是这种心态的话,我给你一个建议,你可以找个没人的地方,从网上随便下载一套面试题,然后打开手机的录音功能,把这些题目在没人打扰的情况下说完。然后给你一个最亲近的朋友(不是同事,这里我可要提醒下你),让他告诉你听完之后的真实感受,我敢打赌,能听完了,绝对是真爱,你可以托付终生给他了。当然托付终身肯定是一句玩笑话,其实这里可以隐身出另一层意思,引用苏轼写过的一首诗就是:横看成岭侧成峰,远近高低各不同。不识庐山真面目,只缘身在此山中。其实真正了解你的不是你自己,而是你周围的人。所以知道自己所处的一个位置是很重要的,又回到了我文章开头说的一句话:无知者无畏,希望大家不要成为这种人;水平差,能力差,不可怕,可怕的是自己还不知道自己水平差,能力差,如果自以为是,那么最终的结果肯定是不会去奋斗,觉得自己“还可以”,最终沦为信息时代的一个被抛弃的牺牲品。那么问题回到了,我怎么才能知道自己处于一个什么水平呢?其实告诉大家一个很简单的检验方式,就是可以测一下自己对知识的一个掌握的深度,这个比程度更高一个基本,之前在某个群里面和一位大牛聊天,他说的一句话我觉得很对,跟大家来分享一下:用到的JDK类,是不是都能理解清楚,使用细节点是否能理解,简单的就是HashMap算法实现等等,1.8又做了哪些改进,这些都是平时用的多,但是很少有人去深究这些细节,连最常用的JDK的API接口都不能说清楚,估计写代码也理解不够深入。其实说简单一点,如果你想知道自己处在一个什么水平,可以用一些有深度的东西去测试自己的能力,如果仅仅是像工作一样,每天就写一些CURD的东西,那也很难测出一个人的真实水平,为什么面试问原理?就是原理的一个深入程度能看出你对代码的一个理解能力。
另外要提到的一个就是“走为上计”,有些人可能不太理解,他们认为逃避就意味着失败,实际真的是这样的吗?先来看看一段对话吧,下面的对话就是我和某公司的内推员之间的对话,我之前其实是很想去的,也就是我们所说的“无知者无畏”,大家可以看到了后面的对话可能不太明白,我为什么要逃避,其实我开始也说到了,一个人不懂,能力不达到,真的不可怕,可怕的是,你对自己没有一个正确的认识,对自己的水平没有一个正确的评估。走为上计,并不是为了放弃,而是为了今后更好的去面试这样有挑战性的大公司。永远记住这么一句话:你的机会是有限的,不要拿你自己当实验品,你也不是小白鼠,你不可能在短时间内连续面试同一家公司2次,至少,半年是一个周期。
下面我们再来看看下面一段对话,这是我和某位HR之间的对话,公司名称我省略了,大家请看下面的图,第一次别人已经告知了我面试失败的原因,从这个时间段开始,其实就应该努力的准备一下自己比较欠缺的的部分,毕竟人家已经指出了你的不足之处。
下面的一些对话,就有点点儿不自量力了,其实面试就像谈恋爱,不是你一厢情愿就可以成功的。大家今后面试的话,多对自己的客观能力有一个估计,少对公司抱有一些自己主观性的看法,这样说话才能少出漏洞,下面这张图我自己到最后也放弃了,其实想要提醒大家的就是,你面试过的记录,在人家的系统里面都有留存的,对于你会什么,不会什么,系统里都有一个客观的评价,如果你想再次面试人家公司,至少你上次不会的东西一定要搞懂,否则就是浪费双方的时间了。所以,走为上计,是正确评估自己的能力后采取的对自己的一种保护的方式,而并不是所谓的懦弱和无能的一种体现。
面试准备
需要注意的地方还有很多东西没有写,不过我觉得大体上也差不多了。现在进入下一个环节:面试准备。我这里分两个方面去说你应该怎么准备。着两个方面分别是你的口才方面和你的基础知识方面,这2方面缺一不可,相辅相成。很多面试者不理解,我基础知识掌握得确实可以,有句话不是说得好吗,有真本事,我还怕找不到好工作?这种想法是要不得的,稍后我会结合一些具体的例子来跟大家详细解释一下,为什么口才和你掌握的基础知识同样重要。我面试的职位是Java高级(资深)工程师一职,那么对于一个合格的Java工程师来说,需要掌握哪些技能呢?我前面在面试之前自己画了一份思维导图,目的就是为了复习知识点用,希望能给大家带来一些帮助吧,项目经验这块我删掉了,因为每个人的项目经验会不同,而且考虑到了隐私的问题。下面的思维导图建议大家也可以自己按照自己的理解来画,不一定要按照我的方式去理解。
看了上面的思维导图,你是不是有种书到用时方恨少感觉呢?你面试还会保持100%的信心吗?我想你会给出你自己的答案,毕竟每个人情况不同。下面我就面试来跟大家详细讲解一下上面说到的知识点,究竟该怎么准备面试。我会按照从上到下的顺序来跟大家讲解一下,讲解完知识点以后,会跟大家聊一下做过的项目,该怎么复习。因为面试题实在的太多,而且这家公司问到的面试题,可能下家公司不一定能问到,所以我会取其精华来说。
我面试的职位是Java高级(资深)工程师一职,所以面试经验都会围绕Java来说。首先在准备面试的知识点之前,你可以先在脑海里把所有的自己会的知识点大致的框框过一下,分为:精通,熟悉,略懂,不懂这四个等级,这样有助于你阅读我后面的文章内容。首先是Java基础,这应该不用我多说了.
第一个需要你掌握的就是面向对象的三大特性:封装,继承,多态。如果面试官问到你这个问题(这个问题一般高级程序员不会问到,因为太基础了),你能够把这3个特性回答出来,也只能证明你掌握了50%的面向对象的基本特性。因为面向对象还有五大基本原则,你刚刚所答到的是特性,而非原则,原则是面向设计的,而特性是面向细节的。这5大原则分别是:单一职责原则,开放封闭原则,替换原则,依赖原则,接口分离原则。具体的解释请移步这篇文章。有些人说,这些知识点平常都知道,就是没总结过,也没必要去把这些东西了解,我想提醒你的是,面试只有1个小时,它的难度绝对比你工作要搞N个百分比,所以必须要认真准备,如果这个人对自己的未来都不负责,他怎么会对公司,会对自己的未来的工作负责?
第二个知识点是Java当中的反射,被问到的频率会比较高,至少是30%几率会被问到。JAVA反射3大块地方会问得比较多:一个是反射这个包当中的一些常用的类,以及方法。第二个是这些方法怎么使用(牵扯到了项目当中的具体使用场景),第三个就是反射的原理。首先第一个问题是JAVA当中反射的常用类到底有哪些。首先我推荐一点学习方法,很多人碰到这个问题之后,首先想到的是百度,但是这样学习的话,往往是缺少实践的,导致的结果就是记忆不深刻。我推荐的方法是从反射的作用来入手去准备这个问题,也就是:什么时候用反射?这个问题我相信就算你没有深入研究过原理,只有照葫芦画瓢都可以解释出来;我来说下我的想法,首先我们用到的比较多的是把Object类型(所有对象类的超类)里面的真实类型的内容取出来,这些内容包括:字段,方法以及他们的具体值,反射其实可以这么理解:我不知道你长什么样子,但是我只知道你爸爸长什么样子,这样层层递归,直到你的没有你的爸爸(即上帝视角),而反射恰恰是一个相反的一个递推过程,通过上帝(Object超类)来获取到目前的你的一个基本的信息,前面的话是我对反射的一个大致的解释,大家当做参考就好。那么通过反射,可以从Object类推导出当前真正实例的一些基本可用信息,比如Field,Method,Annotation。于是我们会想这么一个问题:既然我是想拿到相关的信息,那么这些工具类,对于当前被反射的对象来说,肯定有getter方法和setter方法。但是因为有些方法或者字段是private的,所以有当我去想这个问题的时候,肯定要做一层区分。所以我可以得到如下有用的信息:如果这个方法或者字段是非私有的,那么我可以直接获得它,否则我需要把它设置为“可访问的”。具体的一些细节不在本文的讨论范围之内,感兴趣的可以自己去百度。反射当中还有一个比较重点的方法就是method.Invoke方法,如果你不仅仅是想拿到当前对象的一些属性;首先如果是复习的话,你必须要了解invoke方法的各个参数的作用,并且要了解到什么样的方法才内被invoke调用,具体的可以移步这篇文章。如果问到反射的原理的话,那么这个invoke方法肯定会是重头戏,比如你能回答出静态方法和非静态方法在使用invoke的时候的区别,比如说invoke方法的底层实现,当然,如果你能结合JVM的原理来回答一下这个问题,我相信面试官一定会有一种眼前一亮的感觉,因为面试是作文题,而不是选择题,出的题目很简单,能给到多少分,全靠你自己的对代码的嗅觉。
在开始第三点以前,请你回到刚才的思维导图,再给自己对每个知识点评分,哪些是精通的,哪些是熟悉的,哪些是没接触过的。如果有一些知识点没有接触过的话,那如果面试问到了,你该如何作答呢?有些人可能想临时突击一下,毕竟这些知识点可能是作为职业要求必须掌握的一些技能,比如Dubbo,Zookeeper.等分布式框架。我的建议就是,如果你之前从来没在工作中接触过这些东西,那我的建议就是:可以直接跳过,面试的时候如果问到了,你就说不会,任何面试官都可以接受你不会,但是如果你说你会,那就一定要拿出个会的样子,我记得有一次面试某家互联网金融公司的时候,我说到了解决并发的问题,然后说解决并发可以用zookeeper的分布式锁,但是我从来都没用过zookeeper,也就不可能知道分布式锁的一些原理,他总共围绕这个问题问了我2,3个小问题,其中有些问题我还是随便作答的,我想说,这样肯定是负分的,不能为了一次面试通过,抱有侥幸心理,也不能为了通过面试,不择手段。会就是会,不会就是不会,如果实在达不到人家的要求,那就再继续努力,这不是能力的问题,而是态度的问题。
因为上面的知识点有很多,我再列举一个常见的知识点,一般搞Java开发,Spring那套东西,你肯定是100%要懂的,那么围绕Spring可以提出很多问题,比如有几个比较经典的大问题我跟大家分享一下,也是我面试当中碰到的最常见的问题,希望能给大家一点启发。第一个,问到得最多的问题,不是其他的,而是Spring事物相关的问题,我面试了3,4家公司,其中只有一家公司没有问到这个问题,而且有2家公司第一个面试题就是问到了Spring相关的问题,首先这里我需要做一个自我检讨,我都没有回答出来,给出的理由就是自己没在实际的工作当中用过,其实这不是理由,因为已经3次问到了同一个问题,我三次在同一个地方跌倒,所以这不是借口,也不是我的能力有问题,而是我的态度有问题,所以之前面试过的一些题目,经验,大家要及时总结。Spring的事物主要会问到这么几个地方:一个是Spring事物的隔离级别,默认隔离级别,或者是事物的一些原理,实现方式,回滚原理底层实现,还有spring事物的传播机制等问题,这个问题是高频问题,大家一定要掌握。另外一个呗问到过的问题,就是spring 的生命周期,以及bean的加载的方式和整个流程,或者是spring mvc的加载流程。具体的一些细节大家可以去网上搜,我觉得这种问题的一个复习方式就是你一定要首先把整个架构给理清楚,然后最好是在纸上画一幅图,把它们之间的结构关系理清楚,最后再来根据结构与结构之间的关系来深入细节,而且面试也不会问到太多细节的东西,面试官一般只看思路。
有句话说得好:台上一分钟,台下十年功。这句话说的意思,可不是你真的要为面试准备很久,这句话的意思是只要功夫深铁杵磨成针。意思就是除了一些基本的东西要明白,你还要准备一些有深度的东西,这样你才能真正在面试的时候占据主动。我曾经写过这么一篇博客,没想到大家反映很热烈,不过大多都是给我点反对的,这里我接受大家的反对。不过我觉得这篇文章虽然有毒,不适合所有的人,不过我还是想说一句,你的深度决定了你的高度,你的高度,决定了你的基础的深度。很多人对算法,数据结构,数学这些基础课程不屑一顾,这里每个人都有每个人的理解,不过我觉得算法好的人,一定在对架构的宏观把控方面强于那些仅仅依靠踩坑和直觉来做事的,在编程的世界里,没有一个组件是可以独立的,所有的组件和它的关联的组件其实都是有着直接或者间接的联系的。程序的实际的意义并不仅仅是“码农”写出来的代码,它更像是一堆可以组合成各种不同形状的积木,我觉得可以把程序和《我的世界》进行一个类比。那问题来了,深度怎么提高呢?就是我前面说到的方法,如果你是一个不满足仅仅写CRUD或者是在别人的框架上做研发的程序员,那就要尝试学好算法,打好数学基础。最重要的是,你要形成一个良好的逻辑习惯,这和吃东西一样,为什么有些人是胖子?难道是他不运动,我见过的胖子很多都很热爱运动,但是只是他们的饮食习惯不好而已,我相信,只要你能把你的思维习惯训练好,一样可以成为有深度,可以担当重任的程序员,而且这并不是靠你1,2天突击就能提高的,这是一个长期的过程,慢慢来不要急,这也是一个从量变到质变的过程。
既然知识方面已经准备就绪,那是不是可以去面试了呢?此言差矣!为什么这么说,因为你还不会表达你学过的东西。不信?你可以找一个朋友,最好是做过IT的,技术还过得去的。你叫他准备一些你认为简单的面试题,然后给你做一个线下面试,我相信,很多人都不一定能答得很好,就像我开头说的:面试实际上要比你的工作难很多,因为面试不仅仅是你要懂,还有要别人能听懂,听得舒服,这样你的成功几率才会大大增加。那么怎么才能把一个东西说出来,甚至说得比较好呢?这需要很强的归纳总结的能力,一场面试顶多顶多就1个小时,不会再长了,一场面试能问到你的问题,顶多10几个,你算一下,一个小时60分钟,除去自我介绍和介绍项目的时间,也就45分钟左右,也就是说,在你和面试官交流的时间,其实每个问题不超过5分钟。如果我现在叫你把spring的生命周期用5分钟来介绍一下,并且流畅,逻辑清楚,你能否很好的办到呢?我相信至少80%的人心里都会有答案,具体的我就不多说了。我建议在面试前,一定要训练,训练自己的口才,有些人说话说的少,这不是贬低俺们程序员,做程序员的,一般都跟电脑打交道,跟人说话的几率自然就少,所以就需要不断锤炼自己的口才,我的建议是,如果你暂时说不清楚,你可以先在纸上画一下,然后慢慢跟着纸上的思路走,也许你第一次能完全说清楚spring的生命周期,用了30分钟,第二次呢,第三次呢,总有一天,你会达到面试的要求,这是一个训练的过程,如果旁边实在没人,可以对着镜子训练(我就这么训练过,效果还不错),而且重要的是要录音,然后反复推敲自己说过的话是否正确,只有你做好了准备,你才能有更大的成功把握。面试官不会管你是否准备过,他只知道一件事情:你会,还是不会。如果你不会,那么就可以结束了。
面试开始
现在是正题才刚刚开始,大家备好瓜子花生拉~~~不过在面试开始以前,就是面试开始前的几个小时,我建议你最好用思维导图再把自己会的知识点过一遍,这样会让你的思路更加清晰。那么面试之前几个小时要准备什么呢?大家不要笑,以我的经验会给你这些建议:首先是闹钟,其次是一个百度地图或者高德地图,第三点事你要准备一瓶矿泉水。有些人可能会问了,我准备矿泉水做什么?如果你是个程序员,你一定会懂程序员其实是一个沉默寡言的群体,没事的话不会主动跟同事说太多话,所以如果你过了第一轮面试的话,到达第二轮的时候,你已经说了一个小时了,有些面试官不会 给你准备水,所以如果到达第二轮面试的时候,你的声带必然处于一个疲劳状态,这会严重影响面试的效果;所以,不管你能否进到第二轮,我都建议你带一瓶水,这真的是起到意想不到的作用。还是那句话,如果你自己都不对自己负责,别人怎么会放心把工作交给你?
滴滴滴,面试开始了!首先我还是对面试的整个流程做一个简单的归纳,面试的流程主要分为以下方面,这些步骤对于任何一个面试官来说,都是一样的,也就是说,这是一个通用的流程。
- 自我介绍
- 介绍你的过往的项目经验
- Java的一些基础知识点和高级知识点
- 你对面试官提问
那么我就分别来跟大家说一下各个步骤需要注意什么,以及应对各种突发事件的情况,一般来说,面试官第一轮面试你的时候,实际上是第二轮,第一轮是筛选简历,如果当你坐在面试官的面前,那恭喜你,你已经到了第二轮。一般来说,自我介绍最好是简单,突出重点,还有一个比较重要的地方,就是为你之后的一些话,埋下伏笔。有些面试官会很轻松的告诉你,我们做一个沟通,而不是面试。其实我认为面试就是面试,不存在沟通之说,如果你有地方说漏了,那也意味着你基本上没戏了。那自我介绍应该怎么介绍你自己呢?这其实是一道短作文题,其实网上都可以搜索到相对应的一些范文,我这里主要还是围绕重点来说,其实面试官从你的自我介绍当中,要听出亮点,当然这个亮点一定不能夸大,亮点可以装饰,但是不能夸大,因为面试官可能会在后面对你的提问中问到自我介绍当中他比较感兴趣的地方,如果你不能很好的给出一个解释的话,那估计你就被PASS掉了。那么什么东西才是你的亮点呢?我个人认为:亮点,就是你解决的一个最难的问题的一种思路,或者说面试官其实最想知道的是,你的上限在哪里?这个不是你临时想的,而是你之前就应该准备好的。比如一个号的亮点可以是:研究过一些底层的源码实现,比如Hashmap或者是重构过spring的一些东西,不过有一点要注意,这些东西你一定都要会,才能说。否则你开始在自我介绍里面说过了,如果面试官是正好对这块比较熟悉,那他就会认为你是一个不诚实的人,那你基本上就会被PASS掉了。
第二点就是介绍你过往的一些项目,因为我已经毕业很久了,对于校招的一些东西,不是很了解,所以本文还是以社招为主,如果是社招的话,首先就是你的项目经验,尤其是最近半年做过的项目,这里我不得不跟大家啰嗦一句,很多人项目做完了,就摆到一边去了,从来不回头看一下,哪怕是面试之前都不去看一下,对自己还是信心满满,如果你真的是这样的人,那我觉得你还是回家吧,没必要再面了。为什么说,对自己的项目熟悉,至少,你要对你做过的,尤其是最近做过的东西熟悉。有些人可能会说,我很熟悉啊,你看我天天忙死了,会不熟悉?好,很好,拿出你的项目,之前3个月,4个月做的项目,如果你这几个月没看过的话,如果你没有在方法上有加注释的习惯,如果你的命名平常不规范,我保证你想不起来这些类是做什么用的!为什么面试需要准备,就是因为人有遗忘性,正所谓猴子摘包谷,捡了芝麻丢了西瓜,这也是很多面试者的一个通病。那么回到项目经验的介绍,这个步骤会比前面的步骤时间长一些,但是也不会太长,很多面试者在介绍的时候,长篇大论。把里面的业务逻辑都讲得一清二楚,其实这样有2点不好:第一突出不了重点,第二会压缩后面面试的时间,这对面试者来说是非常不利的。所以语言必须简练,而且要突出重点,项目的一些业务逻辑可以抽象一下,如果这个业务是一些web项目的 通用业务,那可以一笔带过,并解释一下架构的重点,比如我做过了3个项目,这3个项目肯定不是3份架构,架构有重用性,那么这个时候,可能在架构方面,你就只要介绍一个就行了;最重要的是,你要把你在架构中应用到的一些你比较擅长的知识点,去跟面试官说一下,那样好为面试管问Java基础的问题做好准备。
第三点,也就是最重要的一个环节:面试官问你的一些相关的技术知识,这里有2种情况:第一种情况是面试官他自己会准备一些面试题,然后会把这些面试题按照优先级来问,由浅入深。如果你在中间一个点断裂的话,那么后面的它也不会再问了。这些面试题往往都是环环相扣的,大家复习的时候也可以按照这个思路来进行面试前的复习。还有一点,就是我刚才说的,根据你的项目方面的经验,来具体问一些知识点,比如我再和面试官的交流当中,提到了Spring Aop,那么面试官可能会问一些Aop相关的知识点。面试介绍知识点,一定要切合面试官的问题来说,不要长篇大论,把自己复习到的东西都说一遍,抓住重点就好。还有一个就是面试的时候,如果面试官反问你一些问题的话,你要有充分的准备,比如面试官问到我一个问题,就是synchronized和可重入锁的区别在哪?这个问题是怎么提出的?首先我再介绍的时候说了一句,这2者完全一样(实际上不一样,但是只是相似),所以如果面试官知道这个问题的结果,那么它就会问你这个问题,让你骑虎难下,所以说话的时候,前后逻辑必须保持一致,如果你对这个知识点模棱两可,那么还是管住嘴比较好一点。面试官也许会在一个问题上不停追问你,比如我之前有一个问题,就被问倒了,就是叫我设计一个QPS高的接口(因为我对这块不熟悉,所以随便作答的,结果被面试官问倒了),并且这个接口是不考虑服务器因素的,我回答:可以用锁,那么面试官可能会说,锁就是一种等待机制,只有等待旧的释放了以后,新的才能进去;我又回答,可以用HashMap,面试官觉得这个回答不靠谱,我又说可以用分段锁,那就是ConcurrentHashMap,那么这个问题就被绕回去了,分段锁其实也还是用的悲观锁,和我之前说的答案是一样 的,从一个问题的回答当中,不仅仅可以看出面试者的知识掌握程度,也可以看出一个面试者对一个问题逻辑分析并且解决问题的思路;切记,别给自己埋地雷。
其实在第三步走完之后,面试官对你的能力就会有一个客观的认识了,你是否通过,我相信每位面试官心里已有答案了;最后一个问题是,你有什么可以问我的?如果面试效果太差,那这个部分不管你怎么努力,都是徒劳的了,问完这个问题后,面试官一般有两种答案,如果是电话面试的话,他会告诉你面试结束,这种情况是100%PASS掉了,还有一种情况是等通知,这种情况被PASS的几率我认为是70%,具体的和文章开头提到的几个因素有关系,比如面试者的整体情况等。如果他叫你等一下,有很大的几率是你进入下一轮面试了,因为如果是2轮面试分开的话,HR也会主动去约下一轮面试。这个环节其实是展现你自己的时候,一些烂大街的问题,我觉得还是不要问了,比如交不交五险一金,周六加班不?加班有工资不?没工资有调休不?其实这些问题更应该和HR沟通,而且一般的正规公司这些东西肯定少不了。那么什么样的问题,才是一个好问题呢?首先我觉得,你可以结合你所了解的他们公司的一些具体的业务场景去问一些问题,如果是第二轮面试而且你觉得通过的把握比较大,我认为还可以打探一下他们部门是做什么的,有什么具体业务,其实面试本身也是一个双向的选择,只是他们先选择你,然后才轮到你选择他们的一个过程。比如你可以反问面试官,那你觉得设计一个高QPS的接口,需要做哪些工作呢?我觉得这就是一好问题,如果你没能通过面试,那么学习点东西,绝对对你未来有好处。
面试结束
好了,到这个时候面试就结束了;现在有两种情况摆在你的面前:第一种是面试失败,第二种就是面试成功;我会分情况来跟大家详细讲解一下碰到这2种情况后你究竟该做什么?不管你是否面试成功,我个人认为都必须有一个平常心,不以物喜,不以己悲。虽然说这句话说得容易,但是实际上做起来非常难。如果你面试的公司是一家你比较心仪的公司,但是最终的结果还是失败了,这种落差会造成很大的打击。还有一种情况是你面了很多次,但是一次也没有成功,你就会怀疑是不是全世界都把你抛弃了,再也找不到工作了,其实这种心态是要不得的,面试永远只是人生的一个选择题而已,这道选择题没有对错之分。每个答案都可以活出不一样的人生。还有一点就是,要加强抗压能力,在这个世界上,不是事事都顺利的,都依着你的。我之前在长沙工作的时候,我们开发部门的老大,做管理的,然后有件事情没办好,被炒鱿鱼了。后来大家猜他做什么去了?后来我才从其他同事当中听到,他去做了电话客服,一个月只能拿几千块的工资,而它以前在我们部门是老大,工资都是一万多,而且还有年底分红。人生大起大落是正常现象,我们不能改变其他的,只能把自己的内心练就强大,不仅仅要调整好心态,还需要总结面试的差距,哪些地方不懂,要搞懂。哪些地方要学习,就要给自己制定一个计划,计划的目的并不是空头支票,而是让自己更好的在未来的变化当中不迷失方向;只有做好了上面说的2点,你的面试的失败的教训,才是有价值的。
如果你收到了公司的offer,那么首先恭喜你面试成功了,这个时候就开始要挑选公司了。这里也分为2种不同的情况:第一种是你刚刚收到第一家offer,还有一种情况是你收到了多家offer然后再这些offer中进行挑选。我也会分情况来跟大家描述一下。首先如果你不是一个能力特别突出的人的话,经过了很多次失败,然后才拿到了offer,这种情况下的话,如果你是处于一个在职状态中的话,我建议你可以先答应HR,只要价格是在你接受的区间内的话,因为这次的offer不一定要接受,它可以成为你下一次面试的一个参考和提价的一个依据。然后就是问一下具体是做什么的,分配到哪一个项目小组,有些HR或者面试官会给你打圆场,说他不能决定是在哪一个组,如果哪个组缺人,就去哪个组,这个时候你就要小心了,因为这种情况下的话,你不一定去做你想做的事情。还有一种可能性,就是有可能还有一轮面试,这种情况下,不要急着提离职,说不定人家还在研究你适不适合呢!如果你收到了多个offer,那怎么处理比较好呢?实话说,我这半年一共收到过2个offer,但是都不是连续的,所以我觉得这个问题留给其他大牛会更加合适,不过如果是我来选择的话,我会根据以下几点去考虑。
- 这家公司是做什么的,我在这些部门里面的职责是什么
- 这家公司是否适合我的职业发展
- 钱是否给够了
- 加班是否严重
这些综合指标进行对比,我相信你一定有你自己的答案,上面的排序是我按重要到不重要进行排序,就我个人来说,更看重发展,为什么?因为程序员是一个吃青春饭的职业,如果你想长久干下去,那么求发展一定是你的首要目标,相信我,钱永远挣不完的。
各大公司面经
那么我面试了几家公司,我会把面试题都给大家介绍一遍,详细的解答大家去网上搜比看我这篇文章更好,我这篇文章主要的还是介绍面试的方法而并非知识点本身。下面开始介绍吧吧。题目大多数都很简单,基本上都是那种能说多少就说多少的题目,全看自己的发挥,有些题目也记得不太清楚了,可能不能面面俱到,请谅解。另外面经仅仅限于技术,不包括问到的业务。其中问到的题目不分先后顺序,因为有些问题时间隔得比较久,所以我也记不太清了,有想起来的会随时补充。
某教育公司A
- 介绍一下SpringMvc和SpringBoot的区别。
- spring boot 加载原理
- 数据库范式有哪些,具体原理和概念。
- redis为什么是单线程的?请说出底层原理。
- 请说出HashMap的原理及其底层实现。
- ArrayList和 LinkedList的区别。
- 什么是IOC?Spring IOC原理及其具体实现。
- 如果有一个非常长的数组,其中有一个左括号,在数组的右边有一个右括号进行匹配,如果匹配成功,那么继续。如果匹配不成功,就记录下来。求第一次匹配不成功的数组的下标,如果匹配不成功,也继续,直到整个数组遍历完毕,求:有多少对括号不匹配。
- 什么是工厂模式,工厂模式的具体应用场景是什么?
某互联网金融公司A
- Java反射相关的内容(问了个底朝天)
- jvm相关(内存模型,GC,分代算法)
- hashmap底层原理
- hashmap和ConcurrentHahmap区别(分段锁具体实现原理)
- 怎么才能设计一个高QPS的接口(这个问题比较经典,希望大家多花时间去想想,可以体现一个人的深度)。
- 秒杀怎么设计。
- spring加载原理。
- volatile原理,锁原理。
- ArrayList和LinkedList区别
- spring 事物相关问题(总之复习就好,不要别人问到什么就总结什么,全面点好,这个问题频率高)
- redis缓存实时更新问题。
- 分布式锁
- 队列相关问题。
- 线程池相关问题(主要是问到了ThreadPoolExecutor)。
某O2O公司
- RPC相关概念及其原理
- RPC HTTP,Socket区别
- HTTP三次握手。
- Spring事物相关问题(烂大街了,自己去百度吧)
- 聚集索引和非聚集索引
- 多列索引和单列索引的问题。
- 数据库ACID相关问题
- JVM调优(不仅仅是原理,还有一些具体的参数,命令,要回答出怎么用)
- 锁,乐观锁,悲观锁,synchronized原理,锁方法和锁对象的区别,锁静态和锁非静态的区别。
- mysql乐观锁,悲观锁的实现机制。
- mybatis怎么实现乐观锁,悲观锁
- redis sortedSet底层实现及其原理。
- 数据库设计相关问题:如果有两张表的是多对多的关系,怎么处理比较合适?
某互联网金融公司B
- spring事物相关问题。
- redis数据结构有哪些,介绍一下,以及他们的用法。
- synchronzied和可重入锁的区别。
- 线程池相关问题,主要围绕threadPollExecutor几个参数的用法及其实际应用场景来提问。
- mysql默认隔离级别repeated read,介绍一下这个隔离级别相关的一些知识点。
- 乐观锁,悲观锁等。
后记
写到这里,我相信大家已经对面试不陌生了,其实一些小的技巧,我觉得大家应该也要学会;至少,你必须要懂一点,程序不是人生,它只是人生的一部分。所以要多学会与人沟通,还有一点比较重要的就是,不要寄希望某一次面试能改变自己,还是那句话,有多大能力,发多大光,做多少事情,那样自己拿钱才心安理得,如果大家觉得我还有地方需要补充的,可以留言,谢谢各位,希望各位过一个快乐的圣诞节!Merry Christmas!
PS:因为自己写这篇文章也花费了很多的心血,可以说是自己出道以来写得最好的一篇文章,所以自然希望别人的肯定,我把我的文章发到某个QQ群里面,希望大家能给我一些中肯的建议,于是有个人说:这个是你写的吗?是的。你工作几年。4年。最后又去了哪里呢?我沉默了...别人不会因为你的弱小而去帮助你,也不会因为你的强大而去鼓励你,因为你是在个给自己找工作,就像我的偶像保利尼奥说过的一句话:“人们总是会评价你的。有些人会说,保利尼奥现在踢得好是沾巴萨体系的光。有些人会说,他在中国踢得好只是因为中国水平太差。但我不需要证明什么。我不是为了黑子们踢球,我是为了我的队友们踢球”。同样,我们也不是为了别人而去找工作,也不是为了证明自己比别人强,我们每个人都是在为了自己的未来而努力,加油!