java面试难点(java面试中被问到项目中的难点怎么回答)
下面是好好范文网小编收集整理的java面试难点(java面试中被问到项目中的难点怎么回答),仅供参考,欢迎大家阅读!
看到这个问题中的一个回答,又是抄袭我的出的书里内容。
当时我写了篇文字来盘点我原创但被大量抄袭的Java面试文,这里又看到了一个抄袭的案例。
这篇文章的出处是我出的书,《Java web轻量级开发面试教程》,17年出的。我甚至都不用请大家对比我的文章和别人文章的时间,直接能通过这本书就能证明文章的版权。
在Java面试中,可以从如下的文章里看到介绍项目说辞的方法。
在这基础上, 还可以按如下的要点准备项目的难点,即亮点说辞。
先说下可能被大多数求职者写入简历并在面试时当亮点准备,但其实不是亮点的要素。
1 做了很多的业务模块。其实这些都是属于增删改查的操作,可能业务细节有差别,但从框架层面来上看,其实差别不大。业务开发多了,顶多是熟练初级开发和新手初级开发的差别。
2 同时做了前端和后端,或者前端界面很好看,或者在前端引入了多种效果和框架。其实java主要是负责后端,讲具体点就负责从(控制器层)收到请求开始处理的一系列动作。如果求职者有前端开发经验,这是个加分项,但面试官一定不会因为前端做好但后端不熟而录用这位求职者,相反哪怕求职者只熟悉后端开发,前端一点不懂,这也照样有机会应聘成功。
3 实现了一些较为复杂的功能,比如对日期进行特殊处理的能力,或者能实现很复杂的业务逻辑。上文也说了,能处理较为复杂的业务,依然属于开发项目的能力,有这项技能,顶多能证明求职者属于熟练的初级开发。
况且,上述要点在面试中还未必能很好地展示,比如你说你前端界面做的好看,你不大可能当场演示吧,比如你说你做的业务模块数量多,功能复杂,在面试时也未必能很好地说明,但如下给出的亮点,一方面难度不高,对初级开发也适用,另一方面准备起来也不难,面试前只要方法得当,只要花费少量时间就能达到能侃侃而谈的地步。
亮点1,我熟悉项目开发、测试和部署等流程。
其实这个亮点是白送的,只要是做过项目,那一定经历过这个流程,但面试中很少有人能把这当成亮点说。这块你可以说,在这个项目里,我们是用Maven管理项目,用jenkins部署项目,用git来管理代码。我在这个项目里,除了写代码外,还参与了单元测试和联调。我们代码发布时,最终会把java代码打成jar包并部署到linux服务器上。
说实在,不少面试官也不会认为此项亮点有多值钱,但你这样会给面试官留下“有项目测试、部署和管理等方面的综合能力”的印象。而且,我知道有些求职者,尤其是在校应届生,他们在简历上的的项目可能是学习项目,但如果你在项目里加上这个亮点,那么如果面试官不细问,就会认为这是更加值钱的商业项目。
亮点2,我有过数据性能调优方面的经验。
如果你就说,我用过索引和redis缓存,也有数据库调优经验,那么听起来太空洞,而且面试可能会通过问相关的底层细节来确认。要知道redis和数据库底层细节太繁琐,求职者,尤其是初级开发的求职者被问倒的可能性很大,但如果你按如下的方式植入项目后再说,就能最大程度展现该亮点。
1 我们项目在部署后,会对MySQL数据库进行监控,这块的监控软件有CAT、newrelic或Zabbix等,一旦数据库SQL语句执行时间超过5秒(或其它时间),我们就会收到告警邮件。
对于初级开发来说,你甚至不用说监控的细节,因为这不是初级开发的职责范围,你就说这套监控是运维或项目经理搭建的。不过总是先得知道哪些SQL需要调优,才能继续往下说吧,你说出这套说辞,就能让面试官感觉你的数据库调优经验来自项目。
2 你得把分析过程讲出来,遇到长SQL以后,我们会用执行计划(Execute Plan)分析该sql,这里大家可以去了解下执行计划的知识,比如如何运行,其中包含哪些内容。同时,我们会通过日志,去看当时做了什么业务。
3 经过分析,通过看执行计划和看日志后,我们知道了原因,原因最常见的是索引,或者是存在多张大表关联,或者是同类sql太多,对数据库压力太大,没建Redis缓存。
在准备亮点前,需要看下索引和Redis缓存的概念,比如索引的数据结构,哪些情况下该建索引,复合索引是什么,Redis的数据结构是什么?Spring Boot项目是怎么使用Redis缓存的。
但这里,为了增加可信度,你更要结合项目需求说。比如你说,对此我们建了索引,这样就很笼统,但你如果说,经过看执行计划后发现,是因为在从订单明细表里根据用户名去搜索时,对用户名字段没建索引,或者说,在下订单的过程中,需要根据用户ID多次到风控表里去查数据,这块没用缓存,所以导致性能慢。 这样结合业务说,就一定能在潜移默化过程中,向面试官灌输“你调优经验来自项目”的事实。
4 同时再讲下怎么解决的,有始有终。解决方法无非是建索引、建复合索引或引入缓存。
5 你在说好上述整套说辞后,面试官可能会问一些细节,比如索引和Redis的概念等,这块你一定得需要刷八股文来准备。这块如果你心有余力的话,甚至可以准备些值钱技能,比如Redis缓存穿透、Redis缓存的超时时间,或者是Redis持久化技能,或者你还可以再准备,通过Redis集群或MyCAT分库分表组件来提升数据库性能。
其实面试官对性能慢的原因以及解决方法不怎么关注,更关注一整套分析和解决数据库性能问题的步骤和思路。而且上述说辞和准备要点所涉及到的技能初级开发都能准备到位。而且,哪怕简历上的项目是学习项目,或者来自培训班(当然应当尽量让面试官确信是商业项目),照样可以套上上述数据库调优方面的说辞。
亮点3,我有过JVM调优方面的经验。
1 还是先说监控,我们项目在部署后,会对JVM内存进行监控,CAT、newrelic或Zabbix等同样能监控JVM内存,一旦内存用量超过80%,且持续时间超过5分钟,我们就会收到告警邮件。
这里额外说下,为了确保项目的高可用,一般代码是会被部署到多个linux服务器上,比如把spring boot项目打成jar包,再通过jenkins,或干脆手动复制,部署到多个linux服务器上。每台部署项目的服务器,都会部署这套监控系统。
2 再说排查流程。收到告警邮件后,我们会看该服务器的dump文件,其中能看到当时的内存对象,同时会看业务日志,看当时是什么业务导致了内存用量大增。
这里大家可以去看下dump文件的结构,同时可以操作下通过jmat工具打开dump文件的步骤,因为你一旦说了,面试官可能会细问。
3 再结合业务说原因,比如可以说,在导入客户数据的过程中,我们是会从多个文件里读取数据再导入,在导入后,没有关闭IO对象,所以导致内存用量大增。
同样能导致内存用量大增的原因还有,用好HashMap等没有不关掉,或者是缓存Redis数据时没设置超时时间,这就导致缓存对象一直占内存。如果大家要说其它原因,最好也得结合业务说。
亮点4,我有过通过看linux日志分析和解决问题的能力
这个亮点有哪些值钱点呢?大多数初级开发是只会在windows上做业务,不知道项目是部署在linux服务器上,而且缺乏linux的操作经验。这个亮点所涉及的linux技能比较简单,初级开发也能说,但你一旦说出这个亮点,就不仅能进一步证明该项目是商业项目,而且还能说明你有linux开发经验,更不要说你还具有分析和排查问题的能力了。这方面的亮点该怎么说呢?老规矩结合项目说。
1 先说下问题的表现形式。你可以说,在一些下订单的流程中,经常会出现500服务器错误。
2 再说怎么排查。发现问题后,你登录到linux服务器上,用vi命令打开日志文件,再用根据错误关键字和时间,搜索找到上下文,再根据该日志的线程ID去看在该日志文件的其它 日志,如果涉及到其它业务模块,可以用traceID去找。
3 再说下问题原因和怎么解决。原因你怎么说都行,比如价格参数不符规范,或请求类型应该是POST但发GET,往深了说可以说是因高并发导致的问题。怎么解决就一句话的事情,比如发现问题后,我们加了异常处理机制。
4 同时再去看下项目里通过logback输出日志的方式,和linux打开文件搜索关键字等命令,以便面试官细问。
亮点5,我有过通过看底层源码排查问题的能力
对于初级开发,可以说个简单点的,比如在库存盘点的业务流程里,我们是要通过迭代器遍历ArrayList类型的库存信息。在遍历时,我们同时做了修改,所以就导致了“快速失效”的问题。
快速失效的底层源码不难,网上一搜一大堆,而且解决方法也简单,就别边遍历边修改了。
关于底层源码,哪怕是初级开发也可以准备ConcurrentHashMap的,因为其中不仅包含了红黑树等数据结构,还包含了transient和violate等关键字,还包含了线程同步等细节,而且底层源码不难,网上资料很多。
当然面试中可以准备的亮点不止这些,还可以有分布式组件和集群等,不过上文提到的亮点,哪怕是零基础的,准备起来也不难。再啰嗦下,准备时需要注意如下的要点。
1 别单写在简历上,更要按上文给出的思路准备说辞,面试时一定会被问。
2 我知道,哪怕是不少正规项目,也未必能有上述亮点的实践机会,更别提学习项目了。所以在准备时,一方面需要掌握技能,另一方面更得结合项目需求和业务说。
3 得按监控、发现、排查和解决的流程说,同时更要准备相关细节,比如数据库调优方面需要准备Redis和索引等八股文。当然,准备亮点的同时,八股文和算法这类功夫不能少。
4 有时候面试官会质疑,或者细问,比如会问,这么简单的问题为什么你们之前的测试没发现?你或者可以说是在测试环境上发现这个问题的,或者就干脆咬定,是在生产环境上发现。至于为什么之前没测出来,你就说你不知道,毕竟你才是一个初级开发。
或者会问,你说了通过jenkins部署,说了通过new relic监控,你说下细节。或者问些比较深的问题。这些事情其实是资深开发或架构做的,你一个初级开发能知道就不错了,你可以干脆说,这些是我们架构或项目经理做的,面试官听了也就不会再问了。
5 更重要的是,你得会引导。比如你在面试中介绍项目时,你说,在这个项目里,我有过数据库性能调优的经验,有过排查内存性能的经验,有通过看linux日志解决线上问题的经验,有通过看底层源码解决实际问题的经验。这样面试官就会继续问了,你就能借机说出来。
或者你可以在回答到相关问题后再提一句,比如你回答到JPA等数据库问题后,你就说,我除了会用JPA连数据,还解决过数据库性能调优方面的问题,然后面试官问了就再展开。
通过上文给出的步骤,大家能发现其实Java项目的亮点不是来自业务,而是来自技术,而且你有亮点的实践经验不会说,这也没用。
但如果你按上文给出的步骤,把这些亮点写入简历,面试前好好准备,面试时全面抛出。这时哪怕你是零项目经验的,面试官也能认为第一你的项目是商业项目,第二你有资深的项目开发经验,这就达到了你准备和抛出亮点的目的了。
上述技巧和方法其实是我平时辅导Java就业技巧中的一部分,如果大家想进一步了解简历和面试方面的技能,可以向我发起咨询。
而且本人最近还有上海外企IT方面内推的机会。外企内推的要求是,至少有3年的java(或前端等)的开发经验,英语当然最好是好些,但英语绝非时是阻碍性因素。
1 如果是java方面的话,我会用我自己出的书的电子版来帮大家提升能力,这些资料的价格都比咨询的价格要贵。
2 顺带辅导简历和面试,也是java方向。如果你在上海,学历可以,我还可以帮忙内推知名外企和其他公司,并全程辅导面试。