当前位置: 首页 > 科技观察

十年开发面试1000人,总结出这个高薪Java考试秘诀

时间:2023-03-19 14:07:51 科技观察

内容:框架是重点,但不要让人觉得你只会copy别人的代码.不要只看单机版的框架,分布式也要了解数据库,不要只知道增删改查,要了解性能优化Java核心,围绕数据准备面试题结构和性能优化Linux,至少会读日志和排查问题,通读一段底层代码作为加分项。记得记住上面的Embeddingskillsintoyourproject总结:这篇文章更多地描述了准备面试的方法。上周集中面试了几位3~5年工作经验的Java后端应聘者。我的标准其实并不复杂:第一,工作能力,第二,Java基础好,第三,熟悉一些分布式框架。我相信其他公司在招聘初级开发人员时,也应该遵循这个标准。我也知道很多应聘者能力不差,但是在面试的时候没有准备好或者不知道怎么说话。这样的人在加入团队后可能确实达到了预期,但不一定能通过面试。面试官只是根据面试情况来判断。判断,要知道我们平时的工作更多的是面向业务,不可能接触到很多面试必问的算法、数据结构、底层代码等问题。也就是说,面试准备点和平时工作点的匹配度非常低。作为面试官,我只能根据应聘者的回答来决定面试的结果。但是,与他人在一起很方便。所以在这篇文章中,我将通过一些常用的问题来介绍面试准备技巧。大家看完肯定会感叹:只要方法得当,先准备面试不难,其次也不会花太多时间。框架是重点,但不要让人觉得你只是抄别人的代码。面试前,我会阅读简历,查看应聘者在框架中的项目经历。在候选人的项目介绍过程中,我也会着重介绍候选人最近的框架体验,目前比较流行的是SSM。但是,工作5年以内的应聘者,大多只能“复制”别人的代码,也就是说,可以在现有框架的基础上扩展新的功能模块,按照别人写的流程走。比如你要写一个股票挂单的功能模块,你会模仿现有的下单流程,然后从前端到后端再到数据库,用同样的方式写,顶多改一下代码与功能相关的点。其实我们每个人都是这样走过来的,但是在面试的时候,如果你只是表现出这样的能力,那你就和大多数人处于一个水平,你就无法在这一点上表现出你的优势。我们知道如果单纯的使用SSM框架,大部分项目都会有痛点。比如数据库性能差,或者业务模块复杂,并发比较高。使用SpringMVC中的Controller无法满足跳转要求。所以我一般会主动问:除了按照现有的框架写业务代码外,你们还有哪些改动?我听到的答案是:增加Redis缓存,避免频繁调用一些不变的数据。或者,在MyBitas的xml中,select语句的where条件有isnull,即如果value存在,则增加一个where条件。为此,会在任意where处加上一个不带isnull的查询条件,防止传入参数时语句无效,当为null时,进行全表扫描。或者简单的说,后端异步返回的数据量大,时间很长。在项目中,我增加了异步返回的最大时间,或者对返回信息进行了压缩,以提高网络传输性能。对于这个问题,我不在乎我听到的答案是什么,我只在乎这个答案是不是合乎逻辑的。一般只要回答正确,我都会给出“在框架层面有自己的经验,有一定的了解”的面试评价。否则,我只会给出“框架代码只能在项目经理的带领下写,对框架本身了解不多”。其实在准备面试的时候,把框架中的要点总结出来并不难。我不相信每个人在做项目的时候都是一无所有。只要你说出来,可以说你在这方面碾压了近70%的竞争对手。经过。框架学习文档:不要只看单机版的框架,分布式版本的也要了解。另外,在项目中描述框架技术的时候,最好带上一些分布式的技术。下面我列出了一些你可以准备的分布式技术。反向代理方面,nginx的基本配置,比如如何通过lua语言设置规则,如何设置sessionstickiness。有条件的话看看nginx底层,比如协议,集群设置,failover等。在远程调用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";字符串b="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的核心知识,估计很难晋升到高级开发,更别说面试架构师级别的职位了。Java核心知识点学习文档Linux,至少要知道如何看日志排查问题如果考生能证明自己有“发现问题”和“解决问题”的能力,这绝对是加分项,但如何证明呢?现在的互联网项目大部分都是部署在Linux上的,也就是说日志都在Linux上。下面总结一些Linux的实际操作。可以使用less命令打开文件,使用Shift+G到达文件底部,然后使用?+keywords根据key搜索信息。您可以使用grep搜索关键字。具体用法是,grepkeywordfilename,如果你想在结果中搜索两次,使用grepkeyword1filename|关键词2——颜色。最后--color是高亮关键字可以通过vi编辑文件可以通过chmod设置文件权限当然,实用的Linux命令越来越多,但在实际面试过程中,很多考生连Linux命令都不知道。再一次,即使你知道一些非常基本的东西,你也比一般人好。通读一段底层代码,作为加分项,你怎么证明你对一个知识点理解的很好?没有什么比能够通过底层代码来解释它更好的了。和很多有5年以内工作经验的程序员交流的时候,很多人觉得很难?确实,如果想通过阅读底层代码来理解分布式组件,并不容易,但是如果底层代码不难理解。ArrayList和LinkedList的底层代码包含了基于数组和链表的实现方法。如果能把展开、“遍历枚举数”等方法解释清楚,绝对可以证明自己。HashMap直接对应Hash表的数据结构。在HashMap的底层代码中,包含了hashcode的put、get等操作,甚至在ConcurrentHashMap中,也包含了Lock的逻辑。如果面试的时候看一下ConcurrentHashMap,再结合纸上谈兵画画,绝对能征服面试官。可以看看静态代理和动态代理的实现,再深入一点,可以看看SpringAOP中的实现代码。或许SpirngIOC和MVC的底层实现代码比较难看懂,但是可以讲一些关键的类,按照关键流程讲一下它们的实现方法。其实不需要准备很多底层代码,不限于任何方面。比如集合中基于红黑树的TreeSet,基于NIO的开源框架,甚至分布式组件的Dubbo都可以编写。而且准备的时候不需要把底层全部背一遍(其实很难做到),只要能结合一些重要的类和方法,把自己的思路说清楚(比如解释一下HashMap是如何快速实现的)通过hashCode定位)。那么在面试的时候,如何找一个好的机会说出自己准备的上述底层代码呢?面试的时候总会问到集合、SpringMVC框架等相关知识点。当你回答的时候,顺便说一句“我这块的底层实现我还是懂的”,那面试官肯定会问,然后你就说出来了。不要小看这对考生的帮助。一旦说出来,只要意思到位,至少能得到“正面、专业”的评价。如果描述的很清楚,那么评价就会升级为“熟悉Java核心技能(或SpringMVC),基本功扎实”。要知道,在面试中,很少有人能把底层代码解释清楚,所以如果你提出这个话题,即使最后没有达到预期的效果,面试官也不会因此而降低你的评价。所以,准备这块绝对是“百利而无一害”的赚钱生意。请记住将上述技能嵌入到您的项目中。在面试过程中,经常会听到一些令人遗憾的回答。比如候选人讲的SQL优化技巧说的很好,结果我才知道这是他平时自学的时候。掌握了,并没有在实际项目中使用。当然聊胜于无,所以我会写下“平时自学过SQL优化技巧”,但如果在项目中实践过,那我会写下“有实际的数据库SQL优化技巧”.大家可以对比一下两者的区别,一个是理论为主,一个是直接能干活。其实在很多场景下,我不认为SQL优化技巧一定不能在实际项目中实践。从这个案例中,我想告诉大家的是,很多花了不少功夫的技巧和说辞(其实不需要花太多精力从方法中得到)应该在实现你最终的实际项目。比如你有在Linux日志中查询关键词排查问题的经验,你可以在描述中加上一句话,我在之前的项目中就是这样做的。再比如,如果你通过查看底层代码了解了TreeSet和HashSet的区别和适用范围,那么你就可以回忆一下你之前做过的项目。有没有只适用于TreeSet的场景?如果是,那你可以适当的描述下项目的需求,然后说,通过阅读底层代码,我明白了两者的区别,而在这个实际需求中,我使用了TreeSet,我也做了一个对比测试了一下,发现使用TreeSet比HashSet的开销高xx个百分点。请记住,“实践经验”一定比“理论经验”更有价值,而且你所知道的大部分理论经验一定都用在了你的项目中。所以,如果只是让面试官觉得你只有“理论经验”,那就太糟糕了。