记录一个java后端开发失业后的历程

java后端面试准备

  • 目的
    • 简历
    • 如何准备数据库方面的面试问题
    • 如何准备项目经验问题
    • 如何应对面试

目的

这是第一次写文章,在年后被裁一直处于一个比较焦虑的状态,找了一个月的工作结果却不太理想,通过写文章作为一个情绪的出口吧,也是对这段时间的做一个比较系统的面试准备的记录,希望能找到一份满意的工作,对一些找工作面试的小伙伴们留下一点经验,能够少走点弯路。一起卷起来吧。说明下下文会有搬运其他地方文章,是我个人在网上收集一些博主的文章后觉得比较有帮助的进行一个整理。

简历

简历是我们找工作能够让招聘者了解到的我们信息的首要途径,写好一份简历的重要性是毋庸置疑的。在java开发岗的简历中,一般可以分为基本信息、掌握技术栈、教育经历、工作经历、项目经历、证书荣誉这几部分,如果是应届生呢可以写一些在校的经历,在校参加的比赛以及获得奖项。

基本信息主要就包括姓名、年龄、院校、联系方式这些了,具体就不再描述了。

作为一个技术岗,简历重要的就是技术栈的掌握以及项目经历这两部分,我们重点进行这两部分的分析。

在技术栈这部分,我们可以根据自己掌握的情况进行描述,自己掌握比较好的话可以写精通,像精通集合、多线程,如果比较没那么自信的写熟悉,了解就尽量不要写了,因为在有些面试官眼里了解就等于不会。还有很重要的一点,就是不会的技术或者不熟的技术最好别写,因为面试官一般是通过你的简历进行提问的。我们书写技术栈是可以分为这几块进行罗列
1、java核心技术:java基础、IO、集合、并发(多线程、线程池)
2、JVM:类加载机制、GC回收、性能调优
3、框架:Spring、SpringMVC、Mybatis、SpringBoot、SpringSecurity、SpringCloud Alibaba、日志框架 等(根据自己情况进行增删)
4、中间件:kafka、RabbitMQ、RocketMQ
5、数据库:mysql、oracle、redis、MongoDB
6、设计模式
7、容器技术:docker、k8s
大概就是以上的这些,我们罗列后可以根据写的技术逐点的进行一个准备。

项目经历这部分是最为重要的一块,一般面试官都会针对这部分进行一个提问看你是真的有项目的经验,再多次面试后发现面试官都会结合某个技术点,然后问你在这个项目中哪里使用到和具体的使用细节和解决方案来对你的项目经验进行一个判断。这部分可以提前准备好对应的说辞来应对。
大致说下如何写项目经历,首先是项目名称以及时间,然后描述下你的项目大致的内容以及用到的技术栈。然后说明下你在项目中负责的内容。项目的业务内容简单概括就行,重点的写你在项目中的亮点,面试官主要想看的是你的亮点,比如你在项目中使用的什么技术或者方案解决的某个难点给公司带来什么收益。可以适当的美化一点,不要太夸张就行。

简历大概就写这么多了。

如何准备数据库方面的面试问题

Java技术面试主要是围绕Java核心、数据库、Spring Boot框架和分布式组件这四个方面来提问,前文也讲述了快速提升这四方面技能的技巧。在此基础上,本文将在数据库层面,给出准备面试说辞的方法。

1 全面准备不偏科,围绕项目说亮点
在相关面试说辞前,先给出准备说辞的技巧。

全面准备事务、索引、调优和缓存分布式组件,别偏重一方面。如果你仅仅把其中一点说得天花乱坠,但其它点没说好,面试官一定会认为你数据库方面能力很差,想靠背题来蒙混过关。
大多开发一般在面试前不准备,所以面试时只能展示增删改查技能,所以你一定得准备调优和分布式组件相关说辞。
药无需贵,对症即可,所以不需要准备其它诸如“MySQL底层”等说辞,就结合项目把本文给出的说辞说好即可,这样你的数据库技能就具备了“项目开发经验”。
2 数据库方面必问的点
如下问题属于必考点,大家别抱有幻想,一定得准备。

说下JDBC有哪些组件?如何用JDBC对象访问数据库?   
事务是什么?事务隔离级别和事务传播机制是什么?
用JPA(或Mybatis)操作数据库会用到哪些对象和注解?
三范式是什么?你建表时会用到什么原则?
左连接、外连接和内连接是什么?
上述问题大家能从网上找到答案,所以这里就不展开了,不过除了上述基本问题外,数据库方面你在面试时大概率还会被问到如下的问题。索引底层数据结构?复合索引和最左匹配原则?如何通过索引优化sql语句?
项目里你用过哪些数据库的调优手段?你排查过哪些数据库问题?
项目里你用过哪些缓存?    
这些问题涉及到性能调优和缓存分布式组件,不过根据我面试的情况,很多候选人基本都不会准备这些问题。而后文就将告诉你详细的准备方式。

3 你有没有用过索引?
这个问题不问便罢,如果遇到,你可以按层次说出如下的说辞。

在项目里,我有用索引优化数据库性能的经验,同时也看过索引的底层结构。(先说明在项目里用过)索引的底层结构是个B+树,大致结构如下图所示,所以它能用较快的性能找到数据。(找张纸画出下图,边画边说,你自己可以想象这番说辞的分量)然后话锋一转再说,索引是需要消耗硬盘空间的,而且遇到大批量数据读写时,重建索引需要消耗代价,所以我们项目组用索引会非常谨慎。(面试官可能就会感兴趣地再问,那你们是在哪些情况下用索引?这正中你下怀)只有当数据表规模很大,超过百万,并且这个需要频繁读该字段,且这个字段空值和重复值不多时,才会对该字段建索引。(这种情况才能最大发挥索引的价值)比如在订单模块里的订单流水表的“订单ID”,符合上述情况,所以会建索引。(以项目举例说明,证明你真的用过)(说到这里别停,继续往下说)建好索引以后,我在写SQL会非常注意,比如orderID='xxx'和orderID like 'abc%'时,才会确保该条sql走索引,像orderID!='xxx'或遇到左值操作比如substr(orderID,3)='xxx'时,不会走索引,所以这种写法我会避免。     说到这里,面试官一般就会认为你具备基本的调优技能了,可能有些面试官还会再深入问,你知不知道“复合索引”?我知道,建复合索引需要考虑最左匹配原则,则(a,b,c)这种复合索引,遇到a=xx and b=xx,会走索引,但遇到b=xx的情况就不会走,同时建复合索引是为了避免因“回表”而导致的性能损耗。这样一来面试官对你的好感又会再增一步。

4 你知不知道事务?
我在项目里用过事务。从理论上讲,事务具有要么全做要么全不做的(acid)特性。

(赶紧落实到项目)在项目里,我们会在Spring的@Service类里通过@Transactional注解来使用事务。(一般都这样用的)同时会非常注意其中的事务隔离级别和事务传播机制参数。(哪怕面试官真深入问,你由于准备过也不怕)(进一步涉及性能调优)在设置隔离级别时,我们不会调太高,比如绝不会用“读未提交”,因为这样的话,多条SQL来的时候会锁表,会导致其它SQL处于等待状态,但不释放连接,从而会导致连接打满,造成数据库崩溃。(当你说出这番话时,面试官就会认为你有解决实际问题的经验)。   

5 项目里你用过哪些调优手段?
你别仅局限于此,你可以先说,我们项目里,(mysql)数据库是部署在linux上,其中一旦遇到执行时间超过10秒的sql,我们会收到邮件并分析问题。

这样一来你更回答了“如何监控以及哪些SQL需要调优”的问题,然后继续往下说。遇到慢SQL后,我会用explain观察执行计划,看时间耗费在哪里,大多数情况下是走了全表扫描,这就需要建索引,有时候两个大表关联也会导致慢sql,这就需要缓存或重构表结构。在个别复杂的sql里,会发现多个子查询执行了多次,这就需要用with语句重构sql。(一般来说,索引,缓存,with重构和重构表能解决大多数问题) 然后你再多说一句,在我们项目里,一方面会尽可能优化单句SQL语句,另一方面还用到了Redis缓存来优化性能,这样就自然地把话题转到更值钱的分布式组件上了。 

6 你有没有用过缓存?
我们项目是用Redis作为缓存,(把Redis融入项目,这样就能证明具有项目经验,不过前提是,你需要把Redis五种基本数据类型和读写方式看熟悉) ,再具体讲,是用Jedis库的lpush和lrange方法来读写Redis的列表对象(用具体的方法进一步证明你用过)。

话锋一转讲需求,证明有使用的必要。比如有个场景,订单模块会经常向风控模块查询公司的风控信息,所以我们把订单ID加前缀作为键,把风控信息存放列表里返回。单纯会用Redis的人不少,所以你还要进一步结合项目背景说明更高级的技能。

在用Redis缓存风控数据时,需要用expire方法设置超时时间为1天左右,否则缓存的数据会一直存在内存里,导致OOM问题。
在设缓存时,会加一个随机时间,比如1天+(60秒内)随机数,这样同一批数据不会同时失效,造成某个时间段里请求全涌向数据库,导致数据库压力过大。
在缓存数据时,更要缓存空值和(出现3次以上的)不存在的风控ID值,这样能避免这些请求穿透缓存涌向数据库,造成数据库压力过大。
项目里是采用了MySQL主从+Redis主从的架构,这样能避免因单点MySQL或Redis失效而导致的问题。
本项目的Redis采用AOF的方式持久化数据(事先了解下AOF和RDB持久化的说辞)。
上述缓存说辞再外带你之前展示的数据库索引,性能调优和事务等方面说辞,甚至能让面试官认为你具备5年所有的开发经验,因为很多高级开发在数据库方面的面试表现,不过如此。

7 大多数初级开发在数据库方面的表现
我最近面试过多位具有3年开发经验的候选人,他们在数据库方面的表现真的很一般。其实大家也可以思考下,如果你不准备,能否比他们回答得更好?

“在Spring Boot里,你怎么连接数据库?”,大多数候选人都能结合JPA注解很好说明。“你有没有用过索引?”大多数候选人能说出通过索引能优化性能,我继续问,“哪些场景下需要建索引?哪些SQL建了索引也无法用到?复合索引用过没?”这些问题不少人就说不上了。事务概念大多知道,但我问“你们项目里,用的事务隔离级别是哪个?为什么?”能答出来的人就比较少了。 Redis方面,大多数人能讲述基本数据结构以及Jedis的相关语法,但“缓存空值防穿透”以及“设置超时时间防OOM”等资深技能,就很少有人能说好了。两厢一比,如果你第一按本文给出的提示通过查资料熟悉范式等概念,第二再结合项目很好地围绕索引、事务、执行计划性能调优和Redis缓存展示技能,那么至少在数据库这方面,你就能比很多人强。当然除了数据库以外,面试更会考Java核心和分布式组件等技能,在本系列的其它文章里,还会给出准备其它方面面试说辞的技巧,敬请关注
转自https://www.cnblogs.com/JavaArchitect/p/14348205.html

如何准备项目经验问题

介绍项目是必不可少的Java面试环节,求职者需要借此证明自己真实Java项目的经验,如果再做的好的话,需要借此展开自己的亮点说辞。

不过之前如果只有学习项目经验,比如是自己跑通一个项目,或者是在培训班里通过一个Spring Boot项目入门Java,那么这些学习项目的开发流程其实和公司里真实Java项目,是有一定差距的。在转行之类需要真实项目的场景里,如果仅仅介绍学习项目里的开发流程和开发细节,那么真可能被认定之前缺乏商业项目经验。由于商业项目是用于挣钱的,而且商业项目正是因为要从客户那边收钱,所以其在确定需求,开发,测试,部署和问题排查等方面,和学习项目存在很大的差异。下文就将详细讲述真实java项目的开发流程,并针对性地说明学习项目和商业项目的差异,这样一些零项目经验想入行或转行的Java求职者,一定能从中获得收益。

1 先说说真实项目的敏捷开发流程和常用的项目管理工具。
学习项目一般是从零跑通一个项目,只要能从前端发请求看到预期的效果,这个项目就算成了,但真实的项目一般会采用敏捷开发模式,哪怕是有些公司的田园敏捷开发模式,一般也是采用“迭代”开发的流程。

比如一个项目从开始做,到真实完成,假设需要半年,包含大概50个功能点,那么就会把这些功能点,均摊到6个开发周期,每个周期大概是一个月,这样每个月发布一次,把本月需要完成的功能点和本月修改掉的bug一起发布上线。具体的,比如一个月有4周,会在第一周的前半周,和产品方或客户方谈好需求,一般这是项目经理主导做的,谈好以后分配任务给诸多程序员,分配任务时一般用jira来记录,当然如果发现bug了,也会用jira来记录bug。开发前,一般会基于git的主分支(master或dev或current)上创建一个新分支,比如202210dev分支,诸多程序员在这个分支上开发,然后约定个开发结束时间,这样到了这个月的第三周结束后,这个开发分支上就包含了本次发布所需要的的代码,然后这个发布版本就会冻结住,冻结的意思是,发布的版本需要稳定,不能随便再向里面提交并合并代码,在此基础上测试人员就开始测试。一旦测试人员测出问题,项目经理会做个评估,如果不影响本次发布,就会在下个周期里修改掉,如果影响很大,那么需要走“解封”流程,解开本次已经冻结住的git分支,修改后再冻结住。这样到了本次迭代周期的发布日,一般是业务量比较少的时间点,比如周末凌晨,运维人员会把从git上拉下待发布的分支,用maven或各种工具打成jar包,然后通过jenkins工具,或干脆手动复制粘贴,放到linux环境上,再用java -jar命令启动,启动后开发和测试人员发现没问题后,本次发布就算成功,然后再开始下个为期一个月的开发周期,这样一直到本项目全部完成。所以求职者如果要证明自己的项目是真实项目,可以从如下若干个角度来准备说辞。1 我们项目是用敏捷开发模式,然后大致叙述下开发周期,同时加一句,我们项目组,会每天开会讨论进度,如果有阻塞性的问题,或者技术问题,得赶紧提出来。2 我们项目组用到了git和maven来管理代码和依赖包,同时看些git拉分支,合并代码和处理冲突的细节,也可以看下用maven打包以及创建公司私有仓库的做法。3 我们项目是用jira来管理任务和bug,真实项目一般都用jira,所以哪怕是零基础的,jira未必要搭建,未必要实践,但需要了解下通过jira创建任务和创建bug的细节。4 我接到开发任务后,一定会在开发分支,比如202210dev分支,在此基础上再创建一个我自己用的任务分支,比如202210dev001,其中001是任务号,在此分支上开发功能点。开发好以后,我会用junit写单元测试案例,也会用postman发请求,这个属于程序员自己要做的测试,当测试通过后,再提交到202210dev001分支上。5 这里请注意,得说下代码review。我在202210dev001分支上的代码,得合并到202210dev这个发布分支,合并前,项目经理会指定其它开发者review我的代码,如果有功能或代码规范的问题,我会修改掉。测试人员如果发现我做的模块有功能问题后,会给我开个bug,一般也是用jira开,我会修,当然我把修改掉bug后的代码合并到发布分支前,依然需要经过code review这个过程。6 我自己做好我的业务模块后,会用junit写测试案例,如果junit不熟悉可以不说,但一定要说用postman发请求测试。在版本发布的时候,我会留守在公司,遇到问题我会排查和解决。

所以零项目经验或通过培训班转行的同学,一定得准备上述说辞,这些点面试官如果不问就算了,如果问,就一定能从多个维度证明自己项目的真实性。

2 在商业项目里,开发者未必是全栈都做,而是只做后端开发,而且后端开发一定要加入很多细节。
在学习项目和培训班项目里,开发者其实是全包的,从前端react到后端spring boot,再到建数据表,这些工作都要做。但在真实项目中,如果你的职责是后端代码,那么其实是无需关注前端的。

而且在项目组里,你其实真未必是从零开始做。比如你入职被分配到一个财务系统里,这个系统一定是开发到一定程度了, 所以你其实是无需参与表设计的工作,也无需参与搭建前端后端框架的事。你的事情其实就是用spring boot开发业务,在上文的基础上,你还可以用如下的说辞证明你做的是商业项目,而不是学习项目。1 我只负责用后端开发,即用spring boot开发控制器,service和repo层,我这个接口是用@requestmapping来匹配前端请求,前端是html页面,我熟悉react,但我没系统做过。2 我开发的api需要用swagger来展示接口,swagger其实不难,大家可以看下。在我开发的api里,要用logback写日志,以便排查线上问题。对应的,我每开发好一个接口后,要用junit来写单元测试案例,这里强烈建议大家学下junit,这不难,而且了解一下其中mock数据的动作。3 我们的环境分测试环境和生产环境,其中生产环境就是对外提供服务的,但我们的代码开发好以后,会部署到测试环境,测试环境也是linux。一般学习项目甚至只在windows上开发,但真实项目一般分测试和生产两个环境。4 我开发的时候,如果需要其它组提供接口,比如支付系统里要调用对账模块的api,那么我会和其它组的人沟通,对应地,对方组开发好以后,会用swagger来展示接口。这里你可以展示在项目开发中必不可少的沟通技能,相比之下在学习项目,一定没这个流程。出于培训效果,培训班项目大多是让学员全栈开发,但事实上,有项目经验的开发者,大多是只从事一个方向的工作,比如java后端。所以如果你是要去找java后端工作,一定得优先证明后端经验,这样哪怕前端说不上也不要紧,但相反,如果两者都会,但后端只能说出学习项目里的一些低层次的技术,那么面试真就可能过不了。

3 在真实项目里,一定会遇到线上问题,你可以说下监控和排查分析线上问题的细节。
真实项目上线后,对应的服务器大概率会有监控组件,比如zabbix。如果遇到慢SQL查询,或者是系统部署所在的服务器,内存或cpu用量过高,zabbix会根据之前的设置,向程序员通过邮件或消息之类的方式告警,而且,根据之前的设置,当系统日志里,5分钟内exception或error关键字出现频率超过10个,zabbix也可以告警。

程序员在收到告警信息后,可以通过vi命令,去观察linux上的系统日志,如果再有必要,可以通过执行计划观察慢查询的sql语句,或者通过dump文件观察OOM问题,当然如果是业务问题,比如是参数不对,那么能根据日志上的告警信息,定位到具体的类和代码行,然后解决。相比之下,在学习项目里,一般日志只是输出到控制台,而不是文件,当接口做好以后,用postman发请求时,是通过控制台的日志排查问题,如果在面试中只表达出这层意思,那么面试官就能轻易确定你只有学习项目经验。对应的,面试中或面试前,Java或其它IT求职者可以怎么准备呢?1 准备些输出日志的方式,比如java项目里是用logback,然后看下怎么用logback输出info,warn或debug级别的日志,这些不难,零项目经验的小白也能轻易看懂。2 就准备些linux上用vi或tail命令观察日志文件的方式,如果有条件,去看下索引等方面的细节,如果再有条件,去看些解决redis或kafka等中间件问题的细节。3 面试时可以说,我们项目上线后是用zabbix监控,监控设置的事情是运维或项目经理做的,但一旦有系统问题,比如慢sql查询,或者日志里大量出现exception,我会收到告警邮件,手机上也能提示。出了问题后,我登到linux,用vi命令观察异常日志,然后解决过业务参数问题,也解决过索引等问题。4 然后再准备些细节,比如索引问题的八股文,或者是vi命令打开搜索文件的方式,甚至redis缓存穿透和kafka消息积累问题的细节,找些资料也能看也能说。当然你说你知道zabbix等组件等配置方式,那就更好了。其实上述细节要准备的点不多,零项目经验哪怕是用个一周也能看熟相关技术,但是否解决过实际问题,绝对是学习项目和商业项目的重要差别。

4 可以说下项目编译打包部署乃至上线之类的话,因为学习项目一定不包含这些。
比如Java项目,一般是用jenkins或pipelines,以流水线的方式完成打包部署上线之类的或,相关技能大家可以看下CI/CD,不过对于零基础的求职者来说,要看熟这块所需要的代价比较大,可能真得用2周甚至更长时间,这似乎有些不值当,所以在面试前倒可以用如下的方式来准备。

1 就熟悉下上文提到的git,maven等工具,以及git的提交,合并,处理冲突等方式。2 大致了解下jenkins工具,看看jenkins长什么样,能干什么,然后就说jenkins是项目经理设置的,代码提交到开发分支或master或dev等主分支后,jenkins脚本能自动从git分支上拉代码,然后用maven或gradle等命令把项目打成jar或war包,然后再做必要的代码扫描,比如用sonar,sonar工具会看代码单元测试覆盖率,以及代码是否有方法过长等不规范,sonar这块如果不想讲也不要紧。然后jenkins会把jar或war包复制粘贴到指定的linux路径里,然后再启动,这样就实现了自动化打包部署的事情了。3 上线之前,你们组会把你们本次上线要用的配置参数,比如决定某个功能是否要运行的参数告诉运维,会把增加字段和增加索引的sql语句告诉运维或dba,当然这些细节你们已经在测试环境上测过。上线时,运维会在全局配置文件上加入你们新加的内容,再具体些可以说在nacos全局配置上加,会在生产数据库上加加入你们的更改。这里如果你面的是比较低级的岗位 ,不要说那么细,就说上线前会提交本次上线的配置和数据库变更文件。4 系统上线后,你作为值班人员,会跑若干个脚本来测试,或者干脆到生产环境的html页面或app上测试,如果没问题最好,如果有问题,赶紧看日志查,如果自己搞不定就找同事或项目经理。不过上线时遇到问题不多,你说没遇到过,你参与过的上线都很顺利,问题也不大。相比之下,如果是培训班项目,顶多实践过在linux上打包部署,但培训班项目没有上线这个过程,如果是自学项目,估计都在windows上跑,上述说辞估计都没听说过。所以如果你准备过上述说辞,哪怕有些点你推说细节说不清,那么大概率能证明你的商业项目经验。5 再说下分布式组件和spring cloud alibaba组件方面,真实项目和学习项目的差异。分布式组件,比如redis或kafka,或者spring cloud alibaba系列的nacos或gateway,这块由于能解决高并发分布式层面的问题,所以非常值钱,这也是架构师面试的必问点,但很多培训班项目或自学项目,仅仅是为了使用而用,所以会不切合场景地使用,这反而会暴露求职者“其实没做过真实项目”的底细,这还比如不说。这块,零项目经验的求职者不用学太深,了解下api和配置文件即可,因为很多3年以下项目经验的java开发,也就会用个api,这方面应当结合业务需求来说。1 比如redis或kaifa,很多培训班会说在低并发下用,这块如果要说,一定要找个业务落脚点,比如某支付系统,并发量要到2000,支付过程中会频繁调用会员名字,所以要用redis,因为支付后要短信通知,所以要用kafka,或者如果要说用过nacos之类的,你就说系统是分布式部署,所以要用。但如果你没准备过业务场景,宁可别说用过组件,或者没必要把相关组件都准备全,准备若个个就行。2 你就去看些api,比如redis是用redisTemplate缓存和读取数据,kafka也有相应的读取和发送方法,这些api你记着一些。面试时就结合业务结合api来说。这里千万记住,如果你单纯去背redis等组件的八股文,面试时说项目没用过,如果你面的是java初级,那问题也不大,毕竟java初级做熟spring boot等框架就行。如果你能结合业务场景和api说你项目你用过,这是零项目经验求职者能做到的最好程度。但有些有经验的面试官,就从应用场景来问,比如你说用过sentinel来限流,面试官就问你是否有限流的需求,你们业务流量多少,从这个角度,一定会问出项目是学习项目。所以分布式或微服务组件这块,虽然值钱,但零项目经验的求职者由于没在项目里开发过,这块别贪,因为过度了反而会露馅。

6 再说下零项目经验求职者java技术层面的上限。
上文也提到了,零项目经验求职者在分布式组件层面的上限,下面再说说在java技术方面其他层面的上限,即过了这个线,你再学的技术,由于无法证明在项目里用过,所以顶多只能证明你看过了解过,与其把精力大量用在这方面,还不如熟悉下上文提到的证明项目真实性等说辞。

1 spring boot框架层面,看熟增删改查,logback,swagger等组件可以看,但别看对应的源码。2 数据库层面,顶多看些单机版外带redis的技能,比如索引,事务,执行计划,单机版redis,这块可以落实到项目里,但redis集群或mysql集群,你可以说你是用项目经理搭建的,但你自己没搭建过,再进一步,比如数据库底层或数据库或缓存集群,别看。3 docker容器部署和k8s,别看。4 上文已经提到,分布式组件或微服务组件,量力而行,重要的是要结合业务讲。5 linux层面,看到能通过vi或tail命令打开和搜索日志文件这个层面就行,像shell脚本可以别看,比shell更复杂的 ,也别看。6 前端,大致了解下vue或react框架或关键步骤即可,不用深入看。7 多说一下,spring boot业务,通过若干个增删改查流程,看熟从控制器到service再到repo操作数据库的流程和关键代码即可,看熟悉以后,再多跑业务就属于重复劳动,没意义。不过事实上,有些培训班为了突出自己项目技术的优势,会讲docker等值钱技术,还是这句话,零项目经验求职者在找工作时,以说清楚项目经验为主,像docker之类的技术,本身确实值钱,但零项目经验的求职者由于无法结合项目证明自己用过,所以过度学没太大意思。

7 总结
初级java求职者,其实不是单纯靠技术找到工作,找工作时更要证明自己的项目经验。有些求职者由于不知道真实项目长什么样,所以在准备面试时会无的放矢,甚至会在无意识的过程中暴露自己零项目经验的事实。

转自https://www.cnblogs.com/JavaArchitect/p/16975759.html

如何应对面试

在这方面我也是经验较少,在网上收集了大佬们的经验学习后感觉很受用,在下面进行搬运。

我可以这样说,哪怕你背了再多java八股文的答案,过面试也能靠运气,因为很多java面试的答案只限于技术理论说辞。但用我本文给出的方法去准备面试,能在不提升技术的前提下,大大提升你java面试的通过率。

或者说,只要事先准备充分,再经过几次面试实践后,遇到一些不是资深的面试官,甚至可以控场,然后过面试。

先说下控场的实践要点。
1自动说出自己匹配该职位的要点,比如项目时长够,所用技术匹配,别等面试官提问。
2 面试前不仅要准备八股文,更要多准备亮点,面试中尽可能地通过抛出亮点来引导面试官提问,尽量压缩面试官的提问空间。
3 语气神态不亢不卑,甚至故意示弱,比如某些问题想下再回答,或故意抛出些小问题,等面试官提问后再澄清。总之别让面试官感觉你事先准备过。
4 抛出诱饵问题后,别立即展开,等面试官提问再展开,这点很重要。如果直接展开,就相当于自说自话。

下面就按面试流程逐渐展开。首先是自我介绍和项目介绍阶段。

1 抛出自己和这个职位的匹配度。

比如可以说,我叫xxx,(省略自我介绍性文字),我之前在java方面有3年(大于等于职位要求)开发经验,有mysql,oracle等项目经验,有nginx,kafka,xxx等的使用经验。总之先亮出你和职位介绍的匹配度,职位要求上有的技术,如果你有,直接说。

2 介绍项目时,别过多介绍需求,大致介绍你做的模块,介绍项目流程和使用的管理方式,尤其要说明项目管理和发布用到的组件和技术。

比如你可以说,这个项目里,我做了xx和xx模块,项目规模是多少人,做了多久。这个项目是用敏捷开发的管理方式,我们每天都有站会。这个项目,我们用jenkins发布,用jira管理bug和进度,用maven+github来管理项目,等等。

3 抛出亮点,但别展开。下面列些哪怕是初级开发也能抛出的亮点。

这个项目里,我解决过了oom问题,有过用redis缓存的经验,解决过redis内存溢出问题,解决过dubbo超时而导致的问题。在项目开发过程中,我还专研过ArrayList和HashMap的底层源码,还看过Spring Boot相关注解的源码。

大家可以对比下,大多数候选人面试java,在项目介绍阶段,是大谈特谈项目需求和功能,这就相当于把提问的控制权交给面试官。但相反,你不仅列出了你和该职位的匹配度,还用项目管理方式证明了你项目的真实性。更重要的是,你还抛出了诸多分布式和解决过的实际问题作为亮点。

这样一来,不少面试官,尤其是资历比较浅的面试官,往往就可能在听到你的说辞后顺带一问,比如顺口问,你们项目是怎么用Redis的,你是怎么解决OOM问题的,这样就相当于进入到你事先准备好的范围。

但是请注意,你在介绍项目时,可以抛出亮点,比如说解决过oom问题,但绝不能展开说怎么解决。原因很简单,你还在介绍项目,如果展开,就相当于条理不清晰。不过你提到的点,如果面试官感兴趣,自然会继续提问,你都不用着急。

介绍好项目经验后,一般面试官会看着你简历,针对你简历上提到的,以及你刚说的点发问。刚也说了,你完全可以在面试前准备好技术和亮点说辞,这样的话你可以大概率把面试官的问题引导带到你准备的范围。

其实很多亮点,比如OOM调优,缓存性能优化,或者多线程使用要点等,java八股文里都有,甚至你都不用自己多准备。但是,在这环节你回答面试官技术提问时,要注意两个要点
第一,主动结合项目需求,说些使用要点证明这个技术你在项目里用过。

第二,在回答好当前提问后多说一句,继续引导面试官提问。

接上文,比如面试官问你,你项目里是怎么用redis的?你可以通过如下层次来说。

1 说需求,应为我们项目经常会查询会员,为了提升性能,所以把会员信息放入缓存。

2 说实现,比如在redis缓存会员信息时,键是什么?值是什么,缓存时用到Jedis的什么方法。

3 如果有,说遇到并解决过的问题。比如可以说,在这个过程中,我还解决过Redis穿透问题。同样抛出点,别展开,原因刚才也说了。

4 这点必须有,再给出引导性说辞。比如说,这个项目里,除了redis缓存,我们还用到了索引来提升性能(引导到索引)。或者,这个项目里,我们用的不是单机版Redis,而是Redis哨兵集群(引导到集群)。

如果不引导,你回答好问题后,面试官大概率会自行发问,这样就有可能问到你不熟悉的点,但你再这样引导一波,后面面试官大概率会继续顺着问。

上文是以Redis举例,其他技术一样准备。你这样一说,不仅能向面试官证明这个技术你有项目经验,而且还能通过基本的用法,进一步证明你用过。同时还能通过说明你解决过的问题进一步展示技能,最后还带引导一波。

这样的话,面试官问的范围大概率会是你简历上提到的技术点,以及你引导的内容。只要你事先准备过相关技术的用法和解决过的问题(这些都能从java八股文里找到答案)。说难听点,你哪怕在之前项目里没用过,或者用得很浅,一样能给面试官留下“项目中掌握该技术”的印象,甚至还能留下“排查解决过xx方面实际问题”的印象。

结合项目问技术之后,面试官一般会从java核心,数据库,框架等方面提问。这方面你更可以通过背八股文来应对。这里,任何一个问题,你照样可以从“项目中的用法”、“解决过的实际问题”和“引导说辞”等方面来说。

比如你被问,hashcode方法为什么要重写?你可以这样回答。

1 解释下原因,原因大家自行去看八股文,不展开。
2 说下你项目里怎么用的,无非是存放键值对,但要结合需求说。
3 说下你知道hashmap源码,但别展开,等面试官继续提问。
4 把后继问题引导到缓存等方面,比如可以这样说,我们项目是用hashmap做缓存,除此之外,我们还引入了redis缓存,以提升数据库访问性能,这样就引导到redis甚至数据库调优方面。或者说,Hashmap是线程不安全的,所以使用起来要小心,这样就引导到了线程方面。

到这里为止,基本上面试官的问题就问完了,如果采用上文给出的方法来准备并实践面试,你会比其他只会背答案的候选人强在哪里呢?
1 人家大概率只会说理论,你能结合项目证明你用过。
2 由于事先准备过,所以能讲述源码、解决过的问题等亮点说辞。
3 由于准备过引导话术,所以虽然可能无法做到百分之一百,但能把很多面试官的问题引导到你准备好的范围。

上文给出的是准备面试和实践面试的方法,但实际操作起来,面试前需要准备的点还是比较多的。或者可以这样说,如果事先不准备,这套面试方法论可以说是无源之水。

如果大家按上文给出的方法准备面试,并加以实践,可以在面试中做到如下的程度。

1 通过自我介绍和介绍项目,全面抛出自己和该职位的匹配度,同时全面抛出自己的技术列表。

2 在项目介绍中,有效地证明自己的商业项目经验,同时可以通过抛出亮点作为诱饵,最大程度地引导面试官后继提问。

但是,面试官问好这些问题后,如果你不加以引导,面试官依然可能自由发问,从而问到你不熟悉的技术点。这里就将着重讲下“引导”相关的技巧。

先讲下Java核心方面的事先准备和引导相关技巧。在java核心方面,哪怕初级开发多少也能准备集合、线程和异常处理等方面的说辞。

集合方面,你可以准备下HashMap的底层代码,尤其是和hashcode的源码,同时也可以准备下ArrayList和快速失效(fast fail)的底层代码,随后可以再进一步看下ConcurrentHashMap的读写并发管理部分的代码,因为其中包含volatile,散列表数据结构和线程并发部分的技能,而且jdk1.7和1.8 ConcurrentHashMap的底层代码实现起来还不同,而且ConcurrentHashMap源码网上都有,还不难,所以你尤其可以通过ConcurrentHashMap来展示实力。

面试的时候,面试官大概率会问到ArrayList等基本集合的问题,比如如何遍历,有什么优势等等。问到了,你回答好本身问题后,再多说句,在项目里,我遇到过ArrayList快速失效问题,对此我还专研过底层源码,然后坐等面试官提问,面试官一旦问了,你甚至可以边写源码边解释,这样如果你说你才1年经验,面试估计也不信。

集合相关的,HashMap也是一个必考点,姑且我不管面试官怎么提问,回答好以后,你再多说下,我知道为什么要重写hashcode方法,因为我看过HashMap底层源码,然后再说下。甚至你说好HashMap底层源码后,还可以继续提下,HashMap是线程不安全的,而ConcurrentHashMap是线程安全,因为我见过它的源码,然后展开。

甚至可以这样说,当你按上述方式准备并引导后,虽然你只展示了集合方面的技能,但Java核心方面,面试官就不问别的问题了。

在线程方面,准备下锁,volatile,线程池和ThreadLocal的说辞,具体通过ConcurrentHashMap了解下锁(1.7)版本和synchronized+volatile(1.8版本)的用法,以及ThreadLocal里可能引发内存泄漏的问题,这些点网上都有,本文就不展开了,其实也未必多,能讲清楚就行了。

这方面怎么引导?被问及volatile,回答好以后多提一句,ConcurrentHashMap底层源码有这个,然后可以引导到ConcurrentHashMap底层源码。任何线程并发问题,用类似多说一句的方式,引导到volatile,甚至是ConcurrentHashMap底层源码。任何并发问题,可以引导到线程池,线程池里有个参数是描述等待队列,如果设置成无界的有可能出现OOM(不知道的自己查),也就是说,面试中回答好并发后,通过引导,可以引到线程池话题,再可以找机会说出,自己解决过因线程池等待队列设置不当而导致的OOM问题。

或者你可以从ThreadLocal,引出底层的Weak引用话题,再引出JVM结构以及OOM调优方面的话题。这块不知道也自己去查,不说白不说。

异常方面,准备下你在项目里的异常处理方法实践说辞,比如尽量缩小try…catch的范围,finally从句里放释放资源的代码,catch里应尽量处理异常,先用IOException等专业异常处理,再用Exception兜底,以及尽量缩小异常的影响范围,别让程序一遇异常就崩。面试时如果你说出上述异常处理的最佳实践要点,虽然价值不大,好歹也算项目开发经验,也就是说,任何异常方面的问题,你都可以通过上文提到的“多说一句”的方式,引导到“异常实践”上。

Java核心方面,其实还有很多可以挖掘的点,比如String, final关键字等,而且对初级开发也适用。只要大家第一准备些(未必很深的)源码和解决(oom)问题的说辞,再按上文给出的方法找个相关问题点。只要面试官一旦问及,你回答好后再多说句,同时抛出事先准备好的亮点说辞。

其实Java核心方面,虚拟机和内存调优绝对是个值钱的亮点。如何在面试前准备,面试时如何引导以及如何展示,我有专门的文章来介绍。不再重复介绍如何引出该话题,而是讲下在引入虚拟机调优话题后,如何全面展示相关技能的说法。

第一步,发现系统很卡,或者日志里频繁出现OOM异常。

第二步,用dump文件看OOM时的内存镜像,看的工具可以是JMAT。这两个步骤是通用的。

第三,通过dump文件,再结合日志上下文,发现了OOM的原因,比较简单的原因是Redis缓存超时时间过长,或者是ThreadLocal里的对象用好没remove(这块还涉及到弱引用,大家可以自己去查,本文不展开),或者创建线程池时,等待队列设置成了无界,或者你在mybatis里,where条件都是带if的,即如果传入id和name再拼装where id = xxx之类的语句,在一种场景里,都没传条件,所以where后面不带条件,把数据库里记录全捞出来了,导致OOM。

第四是解决,发现问题后,对症下药解决就很容易,比如降低Redis超时时间,或者修改好对应的代码。但既然你说是根据线上问题排查出来的,那么就得说如何解决,善始善终。
再说下,数据库调优方面的说辞该如何准备?以及对应的引导话术。

1 熟悉索引,包括索引结构,复合索引和回表等技能,最好是结合源码。

2 单机版调优技能怎么说?通过看执行计划,调优SQL语句,具体是在项目中,会在linux上设置,如果有超过10秒的SQL就打印出来,然后通过执行计划看耗时点,比如大多是走全表扫描,或者有了索引没用到,或者子sql运行了多次,再往深讲就是Oracle里连接方式不对。你通过执行计划看到问题所在后,就对应修改,比如建复合索引,或者通过with语句把子查询提取出来。

3 可以再进一步讲些MyCAT分库分表和redis方面的调优能力。这方面可以准备的项目说辞是:比如业务请求里,会经常用公司ID向风控模块看风险情况,那么就可以用ID做键,风控字段做值,另外再把null放到键里,以放缓存击穿。另外对于一个千万级别的大表,你可以用ID作为分表字段,分10个表,根据最后一位的值定位到具体的表。同时排查所有的SQL语句,把一些可能全表关联的SQL语句,比如带group by和多表关联,或者用Java业务写,或者优化。

4 同时准备些数据库调优方面解决过的问题,比如索引对应的字段重复率太高,所以索引没用到,解决方法是建复合索引,或redis缓存信息没设超时时间,导致内存爆掉,解决方法是设下。这种问题网上一大堆,你适当准备下。

准备好以后,可以采用对应的引导方式。
1 被问及任何数据库问题,比如sql,jdbc,回答好了再多说下,除了直接实现数据库方面的需求外,我还有数据库性能调优方面的经验。展开时,你是说到单机版调优还是分布式组件调优,看你能力。
2 在介绍项目时,同时说下,在这个项目里,我做过数据库性能调优方面的事情。被继续问及后再展开。
3 被问到索引相关问题后,回答好以后再多说句,除了索引,我还用过其他调优技术,然后展开。
4 随便找个机会,比如谈到索引,或者干脆在介绍项目时,多说一句,我解决过线上的数据库性能过慢的问题,然后展开。
5 当你回答好redis问题后,可以再“顺口”说句,在我们项目里,除了redis外,还用过dubbo组件,结果过因dubbo超时时间过长而导致的问题。然后面试官自然就会问到这块了,你

同样可以准备些dubbo底层细节(乃至其他分布式组件方面)的问题,这方面也很多资料。

分布式组件方面,网上资料更是铺天盖地,这里就仅仅给出初级开发也能准备的点。
1 Redis,Dubbo,kafka等组件的超时问题,以及对应的OOM问题。
2 Netty堆外内存导致的OOM。
3 Netty半包粘包。Netty整合线程池,因线程池等待队列设置不当而导致的oom。
4 kafka重发和堆积消息过多的问题。

上述问题不难,我让我的初级开发学生也这样准备的,同时还能结合源码准备,源码虽然难,但可以死记硬背。
准备到上述点以后,引导到话术就更多了。比如被问及数据库性能调优问题时,引导到同为高并发解决方案的redis和mycat,被问题内存相关问题时,说自己解决过netty,kafka等方面的内存问题等等,这类文字我都不想再多说了,只要有关联,就可以引导。做项目无非是应对高并发,解决数据库和内存等性能问题,这类引导话术准备起来简直可以说一找一大堆。

大家可以发现,上文给出的点包含了java核心,数据库调优和分布式组件调优等诸多要点,而且哪怕初级开发也能在短时间内准备。准备的时候时候,大家可以按照上文的提示,自己举一反三,另外多找些源码和其他值钱问题,网上这种问题太多。

准备好诸多值钱技术点后,第一需要把这些点融入项目,比如我做订单模块时,用ArrayList存订单对象,遍历时遇到快速失效问题。其他点也照此,一一找个可以融入项目的点。结合项目说绝对要比单纯说技术好,不仅可信,而且能证明在项目里用过,第二再多准备些引导话术,别直接抛出,如果没机会抛出千万别自说自话地抛出。

准备引导话术的套路是,回答到现有问题后,再多说一句,比方说,除此之外,我还解决过其他同类xxx问题,看过相关的xxx底层源码。或者说,在解决该性能调优问题时,我还额外用到了xxx组件。或者说,在使用这个xxx技术时,我还遇到xxx(比如oom或超时等)问题。

然后面试官大概率会接嘴问,你就抛出事先准备好的亮点。

讲到这里,再回到主题上,Java面试还真是背答案。如果不背,现场发挥,过面试得碰运气,如果面试官问的点你知道,还可以过,否则就难说了。

但背答案也有背答案的方法,如果单纯背网上的java八股文,那么大概率会得到“理论性,但技术未必能结合项目”但评语。如果按本文给出了“为每个技术找个项目落脚点”的背法,能好些,至少能得到“不仅会技术,而且在项目里用过”的评语。

但是,如果再进一步,按本文给出的“结合项目准备技术,外带引导”的方法,在面试前按java核心,数据库和分布式组件准备技术和亮点(准备起来不难),同时在面试中,不仅能做到背答案,而且还能让面试官继续问出你背过的其他(可能更值钱的)答案,这比单纯地背javab八股文不知道要好多少。

而且大家可以发现,上文给出的技术点其实不复杂,哪怕初级开发,用较短的时间也能准备,但本文给出方法的实践要点是“技术融入项目并引导”。用这套背java答案的方法,甚至可以在不提升自己项目开发技能的前提下高效提升java面试技能。

我辅导的学生用了这套技能以后,遇到的问题可能不是“不知道该如何准备面试”,而是“通过面试后,我不敢去”,或者是“去了以后我怎么过试用期”?这些问题我也有文章,但由于和本问题无关,就不再展开了。

转载自https://www.cnblogs.com/JavaArchitect/p/15723967.html


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部