上周密集面试了几位Java后端应聘者,工作经验3到5年。图片来自Pexels我的标准并不复杂,有以下三点:能用。Java基础较好。***熟悉一些分布式框架。我相信其他公司在招聘初级开发人员的时候,也应该按照这个标准来面试。我也知道很多应聘者能力不差,只是面试时没有准备好或者说不出话来。这样的人可能在加入团队工作后确实达到了预期,但不一定能通过面试,面试官只是根据面试情况来判断。要知道我们平时的工作更多的是业务,不可能接触到很多面试必问的算法、数据结构、底层代码等问题。也就是说,面试准备点和平时工作点的匹配度非常低。作为面试官,我只能根据应聘者的回答来决定面试的结果。但是,与他人在一起很方便。所以在这篇文章中,我将通过一些常用的问题来介绍面试准备技巧。看完之后大家肯定会感叹:只要方法得当,准备面试并不难,第二次也不会花太多时间。框架是重点,但不要让人觉得你只是抄别人的代码。面试前,我会阅读简历,查看应聘者在框架中的项目经历。在候选人的项目介绍过程中,我也会着重介绍候选人最近的框架体验,目前比较流行的是SSM。但是,工作5年以内的应聘者,大多只能“复制”别人的代码,也就是说,可以在现有框架的基础上扩展新的功能模块,按照别人写的流程走。比如你要写一个股票挂单的功能模块,你会模仿现有的下单流程,然后从前端到后端再到数据库,用同样的方式写,顶多改一下代码与功能相关的点。其实我们每个人都是这样走过来的,但是在面试的时候,如果你只是表现出这样的能力,那你就和大多数人处于一个水平,你就无法在这一点上表现出你的优势。我们知道大部分项目单纯使用SSM框架都会有痛点。比如数据库性能差,或者业务模块复杂,并发比较高。使用SpringMVC中的Controller无法满足跳转要求。所以我一般会主动问:除了按照现有的框架写业务代码外,你们还有哪些改动?我听到的答案是:增加了Redis缓存,避免频繁调用一些不变的数据。或者,在MyBatis的XML中,Select语句的Where条件有Isnull,即如果值存在,则增加一个Where条件。对此,会在任意Where中加入不带Isnull的查询条件,防止语句在传入参数全为Null时进行全表扫描。或者简单的说,后端异步返回的数据量大,时间很长。在项目中,我增加了异步返回的最大时间,或者对返回信息进行了压缩,以提高网络传输性能。对于这个问题,我不在乎我听到的答案是什么,我只在乎这个答案是不是合乎逻辑的。一般只要回答正确,我都会给出“在框架层面有自己的经验,有一定的了解”的面试评价。否则,我只会给出“框架代码只能在项目经理的带领下写,对框架本身了解不多”。其实在准备面试的时候,把框架中的要点总结出来并不难。我不相信每个人在做项目的时候都是一无所有。只要你说出来,可以说你在这方面碾压了将近70%的竞争对手。不要只看单机版的框架,还要了解分布式版。另外,在描述项目中的框架技术时,最好带上一些分布式的技术。我列举一些你可以准备的分布式技术:在反向代理方面,Nginx的基本配置,比如如何通过Lua语言设置规则,如何设置sessionstickiness。有条件的话看看Nginx的底层,比如协议,集群设置,故障转移等,在远程调用Dubbo方面,可以看看Dubbo和Zookeeper集成的知识点,更进一步了解Dubbo底层传输协议和序列化方式。在消息队列方面,你可以看看Kafka或任何一个组件是如何使用的。为简单起见,您可以查看配置和工作组设置。深入的话可以看看Kafka集群,持久化的方式,长期使用发送消息。连接仍然是短连接。以上只是三个组件的示例。也可以看看Redis缓存、日志框架、MyCAT分库分表等,准备方式有两种:会用的话比较简单,自己搭建成一个功能模块通过配置文件。可以适当阅读一些底层代码,了解协议、集群、故障转移等高级知识点。如果能在面试中讲分布式组件底层,会得到更好的评价,比如“了解框架底层”或者“对框架有经验”,所以即使去面试架构师,它甚至更好。更不用说高级开发了。对于数据库,不要只知道增删改查,还要知道性能优化。在实际项目中,大多数程序员可能只会使用增删改查。当我们使用MyBatis时,这种情况是比较常见的。但是如果你在面试的时候有这样的表现,估计你的能力和其他竞争者差不多。对此,你可以准备以下技巧:SQL的高级方面,如GroupBy、Having、leftjoin、子查询(within)、行到列等高级用法。在建表方面,可以考虑项目是否使用了三种范式或反范式,原因是什么?特别是优化,可以准备如何通过执行计划查看SQL语句的改进点,或者其他可以提高SQL性能的方法(比如建立索引等)。如果你觉得有能力,也可以准备一些MySQL集群、MyCAT分库分表的技巧。比如MySQL的负载均衡就是通过LVS+Keepalived实现的,MyCAT的配置方式。另外,如果可以,请查看一些相关的低级代码。哪怕你前三点表现平平,但至少你可以超过近一半的候选人,尤其是你在SQL优化方面表现非常出色,那你在面试高级开发的时候,数据库水平一定要达标.如果你连第四点都回答的很好,那么恭喜你,你的数据库能力已经达到初级架构的水平了。Java核心,围绕数据结构和性能优化准备面试题Java核心,网上面试题很多,但除此之外,还要重点关注集合(即数据结构)和多线程并发。在此基础上,可以准备一些关于设计模式和虚拟机的花言巧语。下面是我经常问的一些问题:Stringa="123";Stringb="123";a==b的结果是什么?这里面包括内存、String的存储方式等很多知识点。HashMap中的HashCode和Equal方法什么时候需要重写?如果没有,后果是什么?您可以了解更多有关HashMap(甚至是ConcurrentHashMap)的底层实现。ArrayList和LinkedList的底层实现有什么区别?它们适用于哪些场合?您还可以了解底层代码。Volatile关键字有什么作用?从这里就可以理解线程内存和堆内存的区别了。CompletableFuture,这是JDK1.8的新特性,如何通过它实现多线程的并发控制呢?在JVM中,新对象位于哪个区域?再深入一点,问一下如何查看和优化JVM虚拟机的内存。Java的静态代理和动态代理有什么区别?***结合底层代码。通过以上的问题点,我其实并没有仅仅停留在“有用”的层面,比如我不去问ArrayList怎么放元素。可以看到上面的问题包括“多线程并发”、“JVM优化”、“数据结构对象底层代码”等细节。我们知道现在的Java开发主要是基于Web框架的,那为什么要问Java的核心知识呢?我对此有亲身经历。之前在我的团队里遇到过两个人,一个是能干,具体表现是会用Java的核心基础API,而且没有意愿去深入学习(不知道怎么学)moreaboutit),另一个是平时看一些Java并发和虚拟机的进阶知识。半年后,后者的能力迅速升级为高级开发。由于对Java的核心知识点了解的比较透彻,所以看一些分布式组件的底层实现问题不大。而前者则一直在重复劳动,能力仅停留在“能干活”的水平。在真正的面试中,如果不熟悉Java的核心知识,估计很难晋升到高级开发,更别说面试架构师级别的职位了。对于Linux,至少要懂得看日志,排查问题。如果考生能证明自己有“发现问题”和“解决问题”的能力,这绝对是加分项,但如何证明呢?目前大部分互联网项目都部署在Linux上,也就是日志都在Linux上。下面总结一些Linux的实际操作:可以使用Less命令打开文件,使用Shift+G到达文件底部,然后使用?+keywords根据key查找信息。关键字可以用Grep搜索,具体用法是,Grep关键字文件名,如果要在结果中搜索两次,使用Grep关键字1文件名|关键词2——颜色。***--颜色是高亮关键字。该文件可以通过VI进行编辑。可以通过chmod设置文件权限当然,实用的Linux命令越来越多,但在实际面试过程中,很多考生连一条Linux命令都不会。再一次,即使你知道一些非常基本的东西,你也比一般人好。通读一段底层代码,作为加分项,你怎么证明你对一个知识点理解的很好?没有什么比能够通过底层代码来解释它更好的了。和很多有5年以内工作经验的程序员交流的时候,很多人觉得很难?确实,如果想通过阅读底层代码来理解分布式组件,并不容易,但是如果底层代码不难理解:ArrayList和LinkedList的底层代码包含了基于数组和链表的实现方法。如果能把展开、“遍历枚举数”等方法解释清楚,绝对可以证明自己。HashMap直接对应Hash表的数据结构。HashMap的底层代码包括了HashCode的Put、Get等操作,甚至还有ConcurrentHashMap中Lock的逻辑。如果面试的时候看一下ConcurrentHashMap,再结合纸上谈兵画画,绝对能征服面试官。可以看看静态代理和动态代理的实现,再深入一点,可以看看SpringAOP中的实现代码。可能SpringIOC和MVC的底层实现代码比较难懂,但是可以按照关键流程说说一些关键类及其实现方法。其实不需要准备很多底层代码,不限于任何方面。比如集合中基于红黑树的TreeSet,基于NIO的开源框架,甚至分布式组件的Dubbo都可以编写。而且准备的时候不需要把底层全部背一遍(其实很难做到),只要能结合一些重要的类和方法,把自己的思路说清楚(比如解释一下HashMap是如何快速实现的)通过HashCode定位)。那么在面试的时候,如何找一个好的机会说出自己准备的上述底层代码呢?面试的时候总会问到集合、SpringMVC框架等相关知识点。当你回答的时候,顺便说一句“我这块的底层实现我还是懂的”,那面试官肯定会问,然后你就说出来了。不要小看这对考生的帮助。一旦说出来,只要意思到位,至少能得到“正面、专业”的评价。如果描述的很清楚,那么评价就会升级为“熟悉Java核心技能(或SpringMVC),基本功扎实”。要知道,在面试中,很少有人能把底层代码解释清楚,所以如果你提出这个话题,即使hack没有达到预期的效果,面试官也不会因此而降低你的评价。所以,准备这块绝对是“百利而无一害”的赚钱生意。请记住将上述技能嵌入到您的项目中。面试过程中,经常会听到一些令人遗憾的回答,比如应聘者的SQL优化技巧,但是***了解到这是他平时自学时掌握的东西,实际项目中并没有用到。当然聊胜于无,所以我会写“平时自学过SQL优化技巧”,但如果在项目中实践过,那就写“实战数据库SQL优化技巧”。大家可以对比一下两者的区别,一个是理论为主,一个是直接能干活。其实在很多场景下,我不认为SQL优化技巧一定不能在实际项目中实践。从这个案例中,我想告诉你的是,你之前辛辛苦苦准备的很多技巧和说辞(其实不需要花费太多的精力去搞定方法方向)最终应该是在你的实际项目中实现。里面。比如你有在Linux日志中查询关键词排查问题的经验,你可以在描述中加上一句话,我在之前的项目中就是这样做的。再比如,如果你通过查看底层代码了解了TreeSet和HashSet的区别和适用范围,那么你就可以回忆一下之前的项目了。有没有只适用于TreeSet的场景?如果是,那你可以适当的描述下项目的需求,然后说,通过阅读底层代码,我明白了两者的区别,而在这个实际需求中,我使用了TreeSet,我也做了一个对比实验,发现使用TreeSet比HashSet的开销高xx个百分点。请记住,“实践经验”一定比“理论经验”更有价值,而且你所知道的大部分理论经验一定都用在了你的项目中。所以,如果只是让面试官觉得你只有“理论经验”,那就太糟糕了。摘要:本文详细讲述了准备面试的方法。本文给出的面试题不多,但本文无意给出过多的面试题。从这篇文章中,你能看到的更多的是面试官发现的很多应聘者的痛点。这篇文章的目的是为了防止大家重蹈别人的覆辙,所以给出了很多准备面试的方法。你的能力可能比别人强,但是如果你准备面试的方式和别人差不多,或者只是拿你在项目中所做的工作举例而不是总结你在项目中的亮点,那么面试官真的会看不起你。作者:hsm_computer简介:《Java Web轻量级开发面试教程》和《Java核心技术及面试指南》的作者
