面试相关总结

女爷i 2022-01-07 01:47 377阅读 0赞

只要方法得当,准备面试第一不难,第**二用的时间也不会太多**。

别让人感觉你只会山寨别人的代码

框架是重点,但别让人感觉你只会山寨别人的代码!在面试前,我会阅读简历以查看候选人在框架方面的项目经验,在候选人的项目介绍的环节,我也会着重关注候选人最近的框架经验,目前比较热门的是SSM。

不过,一般工作在5年内的候选人,大多仅仅是能“山寨”别人的代码,也就是说能在现有框架的基础上,照着别人写的流程,扩展出新的功能模块。比如要写个股票挂单的功能模块,是会模仿现有的下单流程,然后从前端到后端再到数据库,依样画葫芦写一遍,最多把功能相关的代码点改掉。

其实我们每个人都这样过来的,但在面试时,如果你仅仅表现出这样的能力,就和大多数人的水平差不多了,在这点就没法体现出你的优势了

我们知道,如果单纯使用SSM框架,大多数项目都会有痛点。比如数据库性能差,或者业务模块比较复杂,并发量比较高,用Spring MVC里的Controller无法满足跳转的需求。所以我一般还会主动问:你除了依照现有框架写业务代码时,还做了哪些改动?

我听到的回答有:增加了Redis缓存,以避免频繁调用一些不变的数据。或者,在MyBitas的xml里,select语句where条件有isnull,即这个值有就增加一个where条件,对此,会对任何一个where增加一个不带isnull的查询条件,以免该语句当传入参数都是null时,做全表扫描。或者,干脆说,后端异步返回的数据量很大,时间很长,我在项目里就调大了异步返回的最大时间,或者对返回信息做了压缩处理,以增加网络传输性能。

对于这个问题,我不在乎听到什么回答,我只关心回答符不符逻辑。一般只要答对,我就会给出“在框架层面有自己的体会,有一定的了解”,否则,我就只会给出“只能在项目经理带领下编写框架代码,对框架本身了解不多”。

其实,在准备面试时,归纳框架里的要点并不难,我就不信所有人在做项目时一点积累也没,只要你说出来,可以说,这方面你就碾压了将近7成的竞争者。

单机版够用?适当了解些分布式

别单纯看单机版的框架,适当了解些分布式!此外,在描述项目里框架技术时,最好你再带些分布式的技术。下面我列些大家可以准备的分布式技术。

![Image 1][]

1、反向代理方面,nginx的基本配置,比如如何通过lua语言设置规则,如何设置session粘滞。如果可以,再看些nginx的底层,比如协议,集群设置,失效转移等。

2、远程**调用dubbo方面**,可以看下dubbo和zookeeper整合的知识点,再深一步,了解下dubbo底层的传输协议和序列化方式。

3、消**息队列方面**,可以看下kafka或任意一种组件的使用方式,简单点可以看下配置,工作组的设置,再深入点,可以看下Kafka集群,持久化的方式,以及发送消息是用长连接还是短拦截。

以上仅仅是用3个组件举例,大家还可以看下Redis缓存,日志框架,MyCAT分库分表等。准备的方式有两大类,第一是要会说怎么用,这比较简单,能通过配置文件搭建成一个功能模块即可,第二是可以适当读些底层代码,以此了解下协议,集群和失效转移之类的高级知识点。

如果能在面试中侃侃而谈分布式组件的底层,那么得到的评价就会比较好了,比如“深入了解框架底层”,或“框架经验丰富”,这样就算去面试架构师也行了,更何况是高级开发。

别就知道增删改查,得了解性能优化

数据库方面,别就知道增删改查,得了解性能优化!在实际项目里,大多数程序员用到的可能仅仅是增删改查,当我们用Mybatis时,这个情况更普遍。不过如果你面试时也这样表现,估计你的能力就和其它竞争者差不多了。

这方面,你可以准备如下的技能:

1、SQL高级方面,比如group by, having,左连接,子查询(带in),行转列等高级用法。

2、建表方面,你可以考虑下,你项目是用三范式还是反范式,理由是什么?

3、尤其是优化,你可以准备下如何通过执行计划查看SQL语句改进点的方式,或者其它能改善SQL性能的方式(比如建索引等)。

4、如果你感觉有能力,还可以准备些MySQL集群,MyCAT分库分表的技能。比如通过LVS+Keepalived实现MySQL负载均衡,MyCAT的配置方式。同样,如果可以,也看些相关的底层代码。

哪怕你在前三点表现一般,那么至少也能超越将近一般的候选人,尤其当你在SQL优化方面表现非常好,那么你在面试高级开发时,数据库层面一定是达标的,如果你连第四点也回答非常好,那么恭喜你,你在数据库方面的能力甚至达到了初级架构的级别。

围绕数据结构和性能优化准备面试题

Java核心方面,围绕数据结构和性能优化准备面试题!Java核心这块,网上的面试题很多,不过在此之外,大家还应当着重关注集合(即数据结构)和多线程并发这两块,在此基础上,大家可以准备些设计模式和虚拟机的说辞。

下面列些我一般会问的部分问题:

String a = “123”; String b = “123”; a==b的结果是什么? 这包含了内存,String存储方式等诸多知识点。

HashMap里的hashcode方法和equal方法什么时候需要重写?如果不重写会有什么后果?对此大家可以进一步了解HashMap(甚至ConcurrentHashMap)的底层实现。

ArrayList和LinkedList底层实现有什么差别?它们各自适用于哪些场合?对此大家也可以了解下相关底层代码。

volatile关键字有什么作用?由此展开,大家可以了解下线程内存和堆内存的差别。

CompletableFuture,这个是JDK1.8里的新特性,通过它怎么实现多线程并发控制?

JVM里,new出来的对象是在哪个区?再深入一下,问下如何查看和优化JVM虚拟机内存。

Java的静态代理和动态代理有什么差别?最好结合底层代码来说。

通过上述的问题点,我其实不仅仅停留在“会用”级别,比如我不会问如何在ArrayList里放元素。大家可以看到,上述问题包含了“多线程并发”,“JVM优化”,“数据结构对象底层代码”等细节,大家也可以举一反三,通过看一些高级知识,多准备些其它类似面试题。

我们知道,目前Java开发是以Web框架为主,那么为什么还要问Java核心知识点呢?我这个是有切身体会的。

之前在我团队里,我见过两个人,一个是就会干活,具体表现是会用Java核心基本的API,而且也没有深入了解的意愿(估计不知道该怎么深入了解),另一位平时专门会看些Java并发,虚拟机等的高级知识。过了半年以后,后者的能力快速升级到高级开发,由于对JAVA核心知识点了解很透彻,所以看一些分布式组件的底层实现没什么大问题。 而前者,一直在重复劳动,能力也只一直停留在“会干活”的层面。

而在现实的面试中,如果不熟悉Java核心知识点,估计升高级开发都难,更别说是面试架构师级别的岗位了

至少了解如何看日志排查问题

Linux方面,至少了解如何看日志排查问题!如果候选人能证明自己有“排查问题”和“解决问题”的能力,这绝对是个加分项,但怎么证明?

目前大多数的互联网项目,都是部署在Linux上,也就是说,日志都是在Linux,下面归纳些实际的Linux操作。

1、能通过less命令打开文件,通过Shift+G到达文件底部,再通过?+关键字的方式来根据关键来搜索信息。

2、能通过grep的方式查关键字,具体用法是, grep 关键字 文件名,如果要两次在结果里查找的话,就用grep 关键字1 文件名 | 关键字2 —color。最后—color是高亮关键字。

3、能通过vi来编辑文件。

4、能通过chmod来设置文件的权限。

当然,还有更多更实用的Linux命令,但在实际面试过程中,不少候选人连一条linux命令也不知道。还是这句话,你哪怕知道些很基本的,也比一般人强了。

通读一段底层代码,作为加分项

如何证明自己对一个知识点非常了解?莫过于能通过底层代码来说明。我在和不少工作经验在5年之内的程序员沟通时,不少人认为这很难?确实,如果要通过阅读底层代码了解分布式组件,那难度不小,但如果如下部分的底层代码,并不难懂。

1、ArrayList,LinkedList的底层代码里,包含着基于数组和链表的实现方式,如果大家能以此讲清楚扩容,“通过枚举器遍历“等方式,绝对能证明自己。

2、HashMap直接对应着Hash表这个数据结构,在HashMap的底层代码里,包含着hashcode的put,get等的操作,甚至在ConcurrentHashMap里,还包含着Lock的逻辑。我相信,如果大家在面试中,看看而言ConcurrentHashMap,再结合在纸上边说边画,那一定能征服面试官。

3、可以看下静态代理和动态代理的实现方式,再深入一下,可以看下Spring AOP里的实现代码。

4、或许Spirng IOC和MVC的底层实现代码比较难看懂,但大家可以说些关键的类,根据关键流程说下它们的实现方式。

其实准备的底层代码未必要多,而且也不限于在哪个方面,比如集合里基于红黑树的TreeSet,基于NIO的开源框架,甚至分布式组件的Dubbo,都可以准备。而且准备时未必要背出所有的底层(事实上很难做到),你只要能结合一些重要的类和方法,讲清楚思路即可(比如讲清楚HashMap如何通过hashCode快速定位)。

那么在面试时,如何找到个好机会说出你准备好的上述底层代码?在面试时,总会被问到集合,Spring MVC框架等相关知识点,你在回答时,顺便说一句,“我还了解这块的底层实现”,那么面试官一定会追问,那么你就可以说出来了。

不要小看这个对候选人的帮助,一旦你讲了,只要意思到位,那么最少能得到个“肯积极专业“的评价,如果描述很清楚,那么评价就会升级到“熟悉Java核心技能(或Spring MVC),且基本功扎实”。要知道,面试中,很少有人能讲清楚底层代码,所以你抛出了这个话题,哪怕最后没达到预期效果,面试官也不会由此对你降低评价。所以说,准备这块绝对是“有百利而无一害”的挣钱买卖。

把上述技能嵌入到你做过的项目里

一切的一切,把上述技能嵌入到你做过的项目里!在面试过程中,我经常会听到一些比较遗憾的回答,比如候选人对SQL优化技能讲得头头是道,但最后得知,这是他平时自学时掌握的,并没用在实际项目里。

当然这总比不说要好,所以我会写下“在平时自学过SQL优化技能”,但如果在项目里实践过,那么我就会写下“有实际数据库SQL优化的技能”。大家可以对比下两者的差别,一个是偏重理论,一个是直接能干活了。其实,很多场景里,我就不信在实际项目里一定没有实践过SQL优化技能。

从这个案例中,我想告诉大家的是,你之前费了千辛万苦(其实方法方向得到,也不用费太大精力)准备的很多技能和说辞,最后应该落实到你的实际项目里。

比如你有过在Linux日志里查询关键字排查问题的经验,在描述时你可以带一句,在之前的项目里我就这样干的。又如,你通过看底层代码,了解了TreeSet和HashSet的差别以及它们的适用范围,那么你就可以回想下你之前做的项目,是否有个场景仅仅适用于TreeSet?如果有,那么你就可以适当描述下项目的需求,然后说,通过读底层代码,我了解了两者的差别,而且在这个实际需求里,我就用了TreeSet,而且我还专门做了对比性试验,发现用TreeSet比HashSet要高xx个百分点。

请记得,“实践经验”一定比“理论经验”值钱,而且大多数你知道的理论上的经验,一定在你的项目里用过。所以,如果你仅仅让面试官感觉你只有“理论经验”,那就太亏了。

小结:本文更多讲述的准备面试的方法

本文给出的面试题并不多,但本文并没有打算给出太多的面试题。从本文里,大家更多看到的是面试官发现的诸多候选人的痛点。

本文的用意是让大家别再重蹈别人的覆辙,这还不算,本文还给出了不少准备面试的方法。你的能力或许比别人出众,但如果你准备面试的方式和别人差不多,或者就拿你在项目里干的活来说事,而没有归纳出你在项目中的亮点,那么面试官还真的会看扁你。

扩展阅读

作者:程序员之言
链接:https://www.jianshu.com/p/a5e0a487a077

亡羊补牢,面试时如果发现回答不好,该怎么办?

大家在面试时,哪怕准备再充分,也不都可能一帆风顺。请记住:面试回答不好是很正常的,尤其在你刚开始面试的时候。

  1. 所以你一定要有良好的心态:面试成了最好,不成的话面试官是免费给你一次锻炼的机会,而且免费告诉了你一些[面试题][Link 2],你也是赚的。但如果你一方面被在面试中表现不好,同时另一方面什么都不做,那么我可以说,哪怕面试十次也不会提高,而且即使你进了公司,你的薪资待遇也是被严重低估的。
  2. 在本文里,就将结合本人面试官的经验,告诉大家一些可以操作的做法。

一、坦诚相对,说明你的擅长点,让面试官给次机会

  1. 我遇到过个别候选人,他技术点知道一点,并非什么都不知道,属于可上可下的。比如项目是要[SSM框架][SSM],但他在这方面只有学习经验,没商用项目经验,但他JDK,数据库可以,他就直说,SSM不行,但亮出他的长处,比如举例说明他学习能力很强,或者很能吃苦,沟通能力可以,然后表达出强烈想入职的愿望,我一般都会给出“技术可以(或技术勉强可以),能参加后继面试”的评语。
  2. 大家在面试的时候,回答问题好坏自己能估计出来,如果太差,属于一问三不知的,即使说这种话也没用,但如果你感觉回答的时候并非一无是处,就可以找机会说出这种话。

我列出一些可以作为补救的因素。** **

二、通过展示你以前的亮点,让面试官相信你的潜力和能力

  1. 如果你属于工作经验少于3年的,面试官其实对你不会要求太苛刻,其实更会关心你的学习能力,工作责任心,承受压力的情况,责任心,稳定性,刚才提到的补救措施你一定要有证据说明,你得用事实讲话,毕竟空口无凭。
  2. 下面我举出一些我面试过程中听到的别人说出的一些亮点,大家可以举一反三灵活掌握。
  3. 1 我虽然对您刚才说到的[SSM技术][SSM 1]了解不深入(事实上他是还是会在项目经理搭建好框架的基础上开发,还能知道一点,如果一点也不知道,说了也没用),但我对MVC框架了解过,我以前做过的项目是用Jsp+Servlet3.0+JDBC实现的,也单独用过Spring的框架,所以我很快能上手。(我会适当问他JSP+servlet+JDBCMVC的流程,如果他能说上来,我就会在评语上写“了解基本的SSM,了解MVC框架,知道MVC的开发方式”,但如果他不额外说明,或许我就会写,“只会在项目经理搭建好的基础上了解SSM,不了解框架细节”,这样即使他通过我的技术面试,后继的项目经理看到评语也不会对他有太多的好感)
  4. 2 最近的项目里我没用到SSM,最近的项目我是在做前台,这个是在一年前用到的(这个有些危险了,最好是在半年前用过这个技术或者相关类似技术,不过话说回来,你即使最近没用SSM,但在简历上说用过,只要你能回答出基本问题,我也没法核实),但我对SSM框架了解很深,我知道SpringMVC的底层实现,感觉[SpringMVC][Spring_MVC]有一定的缺陷,也在商业项目里搭建过SSM,所以我能很快上手。(这样我会细问他提到的SSH的底层细节,如果他确实对底层细节了解不错,那么我会写上“最近一年没用过SSM,但对SSM底层有一定的了解”,否则的话,我仅仅会写“最近没用过SSMSSM的项目经验仅限于一年前”,大家可以比对一下两个评语之间的差别)。
  5. 3 (我是为一个保险项目招人)我没有 SSM方面的经验,以前都是用Jsp+servlet3.0+JDBC这套模式开发的,(这是大实话,不过如果他面试前好好准备的话,不该说出这种话出来),但我以前做过保险相关的项目,客户是XX,实现了保险项目里的XX流程,而且我知道一些背景的业务。(这样我会把决定权交给二面的经理,否则的话,我将直接写“不了解SSH,没法通过面试”)。
  6. 4 我对Java技术了解一般,(确实一般,只会用语法,不会融会贯通),这是因为我在上个项目里压力很大,需要直接和客户交流,我需要直接和客户交流,直接了解需求,自己开发,自己测试,最后打个Jar包给客户,所以我感觉我的综合能力很强。(我会关于这方面问点细节问题,比如怎么打jar包,测试的时候怎么做的,如果确实能说上来,我会在评语上写“Java能力一般,但知道整个开发的流程,能独立地完成某个模块的任务”,否则我只会写“Java能力很一般,不了解一些深入的知识点”)。
  7. 5 虽然我没有商业[项目的经验][Link 3](是个应届毕业生,简历上的项目被我问出是毕业设计或者是课程设计项目,但他如果直接把这些技术写成在读书时在外面公司里做的,我是没法核实的),但我自学能力比较强,我学习的时候走了不少弯路,但我现在很了解JDBCSpring IOC的底层实现,我知道最近热门的一些技术,所以你们公司的一些技术我能很快上手。(我会在评语上写,“没商业项目经验,但学习能力很强,请后继面试官斟酌”,这总比“没商业项目经验,不建议通过面试”的评语要好)

三、记下所有的面试题,回家后准备好,迎接下次面试

  1. 当你感觉你成功应聘这个岗位的希望有些渺茫时,你需要做如下的事情:
  2. 1 记录下所有的技术面试题,回家查资料,为下次同样问题做准备。
  3. 请记住,这里一定请触类旁通,比如被问倒了Java多线程方面的知识点,那么最好把相关Java高并发的知识点都看下。
  4. 2 找出没成功的原因,比如这个岗位需要有[项目经验][Link 4]的,你所描述的项目经验最终被认为是非商业项目,那你就要更新项目描述,下次说的时候让你的项目听起来更像商业商业项目,如果是因为你其中针对项目框架数据库等问题没回答好从而让面试官认为这个不是商业项目,你就得去找一个真实的项目,看看这些技术在项目里是怎么实现的。
  5. 不要说一些没什么工作经验的,即使一些工作经验5年以上的资深者,在刚开始换工作的几家面试公司里,未必能回答好,因为他即使做了很多准备,也不知道当前面试会问些什么,所以面试前你要做好“不成功”的准备,成了最好,一旦没成,积累经验,下次你就成了。

四、你发现你基础差,不知道怎么应对面试时的对策

  1. 我大概在20166月辅导过一个人面试,他上海一个非著名学校计算机系研究生刚毕业,虽然有硕士学历,虽然有4年工作经验,但是读研前不是做计算机的方面的工作,是电脑销售之类的工作,我第一次给他做模拟面试的时候,他的Java技能估计还不如平均水平,不了解Java内存管理,多线程,集合,数据库方面仅仅会用最基本的,(你想,读研3年,一年要写论文,其实也就2年学习,而且学的仅仅是课本上的基本语法,没Java工作经验的,能好到哪里去?能写出一个能成功运行的SSM代码就不错了)。
  2. 我给他的建议是:
  3. 1 用最多一周时间,恶补Java,数据库等各方面知识点,不知道的硬背,尽可能多了解一些细节。
  4. 2 自己从网上找一个或多个SSM的项目,不论是商用的还是学习的都行,如果找不到,出钱到淘宝之类的地方买一个,找到后先配置运行通过,然后逐一看Spring,Mytibas的做法,这个工作需要在1周内完成,加上第一点的工作,最多在10天内完成。
  5. 3 更新简历,把第二点学到的项目写到简历里。
  6. 4 准备一些亮点,比如自己搭建过SSM,数据库方面知道索引,知道SQL调优,知道[Java内存][Java]管理等等,亮点越多越好。
  7. 10天后再找他面试,他也很争气,至少能像模像样说出项目经验和一些基本技能,我再对他说,你去了解一下测试,设计数据表,需求调研的实施要点,同时到网上多找些面试题准备一下,给你2天时间。
  8. 2天以后我看他大致可以,让他去面试,刚开始找些小公司练手,他去了3家面试,第一家大概有一半问题没回答上,第二家在框架,数据库高级应用,Java复杂知识方面没答好,第三家回答就不错(因为该问的他都知道了),要了工资8千(信心不足,要少了),当场就成了。
  9. 一个0基础的人都能这样,只要你做好充分的准备,也一定能成。

简历方面: 简历要点

[Image 1]:

发表评论

表情:
评论列表 (有 0 条评论,377人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JVM方面相关面试总结

    Java虚拟机有了解么?先讲讲它的内存模型吧。 Java虚拟机规范中将Java运行时数据分为六种。 1.程序计数器:是一个数据结构,用于保存当前正常执行的程序的内存地址

    相关 面试相关总结

      只要方法得当,准备面试第一不难,第二用的时间也不会太多。 别让人感觉你只会山寨别人的代码 框架是重点,但别让人感觉你只会山寨别人的代码!在面试前,我会阅读简历以查看候