做过的Java项目太low也不要紧,面试时能用此办法介绍项目经验


我甚至可以这样说,java面试时介绍项目其实和开发项目的能力关系不大,因为大多数java开发在项目组里做的都是增删改查,所以只要面试前事先做过准备,那不仅能通过项目让面试官知道自己的能力,而且还能进一步引导面试官后继的提问。

本人之前出过一本Java面试书,Java web轻量级开发面试教程。

里面专门有一章来讲如何介绍项目,而其中一部分的内容,不知道被抄了多少次,在知乎上我也看到太多抄这篇文章的内容。不过可笑的是,我的书出自2017年,现在都2022年了,那些文抄公们不仅还在抄,而且只是单纯地抄,丝毫不加任何自己的内容。


如何为Java面试准备项目经验


在下文里,就将结合本人最近的java面试官经验,以及Java面试辅导经验,讲讲如何在面试前准备Java项目说辞。

在讲之前一定请大家注意,Java面试中介绍项目,别单纯地讲业务细节,因为面试官不感兴趣,而需要通过介绍项目达到如下的目的。

1 证明自己的项目是用来挣钱的商业项目,而不是学习项目。

2 展示自己所掌握的技能,比如spring boot等,而且这方面的技能应当尽量和jd上匹配。

3 更重要的是,抛出自己的亮点,全面展示的能力。

先介绍项目背景,打消面试官疑问

由于你在自我介绍阶段已经涉及到最近项目了,所以面试官一定就会再问下去。不过不管怎么样,面试官总会问及你最近的项目,所以你总是有机会通过介绍项目经验来验证自己能胜任这份工作。

当面试官让你介绍下最近的项目时,你可以先大致先说下项目背景。因为有些候选人在简历上的项目经验看上去就像学习项目(其实我知道不少项目经验还真是),但你可以通过如下的说辞,证明这个项目是商业项目经验。

我最近是在xx公司(以此突出商业项目)里做了xx项目,这个项目的客户方是xx,已经上线(但如果是web项目面试官大概率会去核对)。这个项目用到了敏捷开发模式(提一下别展开,算抛出个提问点), 这个项目组人员是xx人,做了n个月,我在里面做了xx和xx模块。

你这样一说,能通过项目所在公司和客户方等要素,说明这个项目不是你编的。有人会问了,如果项目真的是编的,该怎么说?这块我不管,你自己想办法说。

但你这样说之前,事先需要做好如下的功课。

1 了解敏捷开发模式,比如站会每个人该说什么,用jira管理进度,一年定好若干个发布日期,一个月发布一次等,因为你提到了,面试官大概率后继会问到。

2 如果你说的是xx财务系统xx图书馆系统等,一些资深的面试官可能会问,这块有现成的项目,为什么你们公司还要自己开发?所以说你在准备项目描述时,不能夸张,比如把一个数据收集模块的维护项目夸张成xx财务系统。不过我也遇到过一些候选人,他们就说这是公司接的项目,为什么人家还要下订单做此项目他们管不着。

3 你一旦说了这个项目,那么面试官就会认为你真实做过,所以其中每个业务需求,比如数据从哪里收集,客户从哪个前端发请求,客户请求处理的流程,以及数据表的规模等信息,你得知道并且事先准备好回答预案,我就经常用此来确认候选人的项目是真实项目还是编的项目。

通过说项目管理工具,说明你不仅会写代码

在介绍项目背景之后,你更可以说些项目管理的工具,以此证明你在项目里还做过其它事情,不仅是仅会写代码,具体的说辞范例如下。

在这个项目里,我们用到了maven,用git来管理代码,用jira来管理任务和bug,用jenkins工具来发布。我还用过junit编写过单元测试,我们还用sonar来统计代码的测试覆盖度,我们项目经理要求,只有当“行覆盖率高于80%”,代码才能提交。

上文提到maven,Git和junit这块不难,jira管理bug和task这个也没什么可问,但你要事先了解下sonar管理代码质量的基础知识以及行覆盖率等要点,至于jenkins发布脚本,这个无需一般开发操心,你说下就行了。在上文里你仅仅提到的是工具,但你更要通过这些工具,来进行自我表扬。

我在使用junit时,不会敷衍地编写案例,而会根据真实的业务数据来编写案例,并且我还会着重考虑各种边界情况(这些哪怕初级开发也有本事做到),而且在编写代码时,我会非常注意编码规范,比如定义变量时会让人一看就理解 ,在关键代码地方多写注释,在if等条件里不会写太复杂,一个方法不会写太长,或者你可以再说些其它好的编码规范。而且,一旦遇到我的bug,我会第一时间跟进,并会和相关对应的人一起解决掉。

上述文字,虽然说是自卖自夸,但由于你结合到了项目,所以面试官不会有违和感。而且你这样一说,面试官就会认为你除了写代码外,其它开发项目的综合能力也很强。

不过千万注意,介绍项目经验的目的主要是证明技能的匹配度,所以上文提到的“介绍项目背景”和“说明项目用到的工具”以及“自卖自夸”的说辞,你别说太多,可以通过练习把它们控制在1分钟以内。

Spring Boot项目举例,说明你的技术基本面

然后就需要介绍项目里用到的技术,哪怕你的亮点说辞再说,你也得保证技术的基本面说辞,这里就用当前Java项目的主流框架Spring Boot为例,告诉大家如何以此展示Java开发的基本功。

我们这个项目用到了Spring Boot框架,其中用JPA连接Oracle(或MySQL等)数据库,在控制层里用到了@RequestMapping注解来编写业务处理方法。在业务代码里,是用@Autowired注解来以IOC的方式引入类,还用到了@Service和@Component注解。当我们从数据库里拿到数据后,会用包含@Entity和@Table注解的模型类来映射数据。在这个项目里,我们还用到了@Transactional注解来定义事务,这个注解是作用在Service层上的,在这个项目里,我们还用到多个Java集合类和异常处理类。

通过上文的范例,大家应该可以很好地展示Spring Boot的基本技术面,其实对大多数Java初级开发而言,日常工作也就是用Spring Boot写一些增删改查的工作,所谓根据现有的业务再编写新的业务,所以上述说辞足够了。但是由于你提到了Spring Boot,所以在提问阶段,面试官大概率会问及如下的问题。

1 @Service和@Component注解的差别?

2 各种Restful请求格式以及各种http请求返回码。

3 @Transactional事务里的事务隔离级别和事务传播机制概念。

4 Spring依赖注入概念和@Autowired的用法。

5 Spring Bean的生命周期。

6 甚至可能还会问Spring Boot启动流程以及底层源码。

对Java 0到3年的初级开发而言,其实能按本范例给出的说辞,并结合网上题目说好前4个问题,应该就足以应对大多数的面试了。

用实例说明你在内存调优方面的经验

当你介绍好基于Spring Boot的技术基本面以后,你还可以进一步说明诸多亮点,这里就先给出结合项目展示内存调优方面说辞的范例。

(之前是介绍项目技术基本面,比如Spring Boot)在本项目里,我会非常注意内存的使用性能,并在项目里有过排查分析OOM的项目经验,我在编码的时候,也会非常注意内存性能,同时我也了解过JVM内存结构以及GC算法。

不管怎么组织语言,这方面你需要突出四点:第一强调你有内存调优意识,第二说明你有排查OOM的经验,第三说明你写代码的时候也会注意内存性能,第四说明你还了解JVM结构和GC流程的知识。但这里依然要强调,你尚在项目介绍阶段,你说明要点即可,别展开,如果这里你展开说明内存调优的做法,面试官会认为你思路不清晰,不过既然你提到了,面试官可能立即就打断你介绍让你详细说明,或者你介绍完项目后会继续问,总之你是有机会详细展示内存调优亮点技能了。

这里不仅给出项目介绍阶段怎么说,还会给出你后继如何详细回答。

如果面试官事后详细问你排查OOM经验细节时,你可以这样回答。

在测试环境,我们经常会收到内存使用率高于70%的告警,(至于怎么告警的相关设置,你可以看下new relic,如果你是初级开发,甚至不需要掌握相关经验),收到告警后,我第一通过dump命令观察当前内存镜像(你得熟悉下dump命令以及dump文件的打开方式和dump文件的内容),第二通过日志观察是哪个方法抛出的,最后发现是因为在订单模块(或其它模块)一个JDBC连接对象没关闭(或一个大的Hashmap对象用好没clear),所以导致了内存无法回收,发现问题后对应回收掉即可。

这里你结合的业务(比如订单模块)来说明,然后面试官再问dump细节时,你再说下dump文件的结构,这就行了。

如果面试官再问你如何在代码里注意内存性能,你可以这样说:

在写代码时,我会非常注意,在try…catch…finally从句里关闭或释放Connection和大的集合,一些大的对象用好以后,我会及时把它们设置成null,以此提升它们的回收时间,在for等循环里,我不会频繁地操作String对象,因为会产生大量内存碎片。同时,我会非常谨慎地使用finalize方法(事先看下),因为这可能会导致对象无法回收。

其实说上这四点就够了, 如果你自己感觉有本事,可以在了解强引用、弱引用和软引用的前提下在说如下的点,这很值钱。

在数据同步的业务场景里,我用到了弱引用(或软引用),以此提升数据对象的回收时间。

如果面试官问你JVM内存结构及GC(垃圾回收)流程,这其实是理论问题,网上资料太多,靠背就行了,所以这里就不再详细说了。但话说回来,GC流程以及JVM体系结构这方面的理论知识,这属于面试常用考点,你准备下不吃亏。

展示你在数据库调优方面的经验

很多候选人其实不会在面试中展示内存调优方面的经验,而你如果按照上述说辞,一方面在介绍项目经验时引出要点,另一方面在后继交流中很好地说明细节,那么可以这样说,你就超越了很多竞争者,甚至说句不该说的话,一些初级开发甚至还能以此充实自己的项目经验。

在介绍项目经验时,如果单纯展示内存调优方面的经验,可能说服力不强,这里再给出用实际说明数据库调优技能的范例。首先你可以在介绍项目时,适当地通过如下的说辞来引入要点。

在本项目里,我参与过数据表设计,所以会考虑用反范式来避免因大表关联而导致的性能损耗,同时我们会合理地设置索引以提升数据库的访问性能,并且我还有过用执行计划优化语句的经验,同时在使用事务的时候,我会非常注意配置事务隔离级别和事务传播机制,以免造成锁表。

同样,在项目介绍阶段,数据库调优方面的说辞不需要展开,给出点即可,由于你提到了,所以面试官在后面大概率会问到。

不过你在面试前,需要准备如下的技能(其实这些技能属于数据库基本点,你不准备反而会有问题)。

1 你去看下索引的数据结构(比如B+树),建索引的语句,索引的种类,尤其是复合索引以及对应的回表和最左匹配原则。

2 事先看下索引的正确用法,以及哪些情况下用不到索引,比如where a != ‘xx’可能就用不到。
3 索引的代价(会占硬盘,以及大批量读写时会重建索引,所以性能慢),以及在小表里,无需建索引。

4执行计划的概念,以及通过执行计划排查慢sql时该注意的点(避免全表扫描,设置合理的关联表方式等)。

三范式和反范式相关概念,因为你提到了。

6 事务隔离级别里的脏读等概念,以及事务传播机制,尤其地,你要具体说出你项目里用的是哪个。

其实上述点属于面试常考点,但根据我面试下来的结果,一些有3年java开发经验的候选人也未必能说好,不过再一次天地良心,这些技能点不难学,大多靠背就行,所以哪怕你刚毕业,或者只具备少量的开发经验,只要靠用功背下这些要点,一方面在介绍项目时就能很好地亮出要点,另一方面还能很好地应付后继的数据库问题,这样你的表现就足以超出大多数你的竞争者。

更为重要的是,可以准备高并发方面的经验

1 刚开就通过在本机搭建环境,在此基础上掌握一些高并发组件的API和配置方式,比如Redis,nginx,dubbomycat,dubbo或zookeeper组件的api或配置文件里的写法,或者是spring cloud alibaba体系下的nacos,sentinel,gateway,ribbon或seata组件,这是两个不同的方向,学好一个方向即可。

如果当下所在项目有用到分布式组件,那最好了,就结合当前项目的业务需求,看下这些组件的api或配置方式。要学组件的api或配置问题不大,这块得看全,比如redis,kafka之类的组件都掌握全面些。

2 在看熟组件的api和配置文件后,需要为每个组件准备个业务场景,即所谓的“把组件技术嫁接到项目需求里”,进而证明相关组件技术的项目经验。

比如对于基于redis的缓存技术,大家可以在熟悉在spring boot等项目场景里缓存和读取数据的api前提下,为缓存找个项目需求落脚点,比如因为在本项目里,多次去查询用户数据会导致性能慢,所以会引入redis。引入后redis的键是什么,值是什么,能解决什么业务。

同时,为其他组件,比如kafka,dubbo这类的,也准备个业务场景,同时从api和参数角度,细化准备这些组件是怎么用的。

3 再结合项目,准备一些“解决过的组件方面的问题”,以此证明自己不仅在项目里用过组件,而且还通过解决问题深入了解过。比如Redis组件,在用的时候设置的超时时间是多少,通过设置超时时间避免了因对象在内存中无法释放而导致的问题,同时还解决过缓存穿透问题。

每个组件相关的问题,网上都有现成的,比如Dubbo超时时间,kafka消息重发,zookeeper双脚注册中心等,这里大家要做的是,就把这些解决问题的步骤和方式嵌入到你当前项目的业务中,比如在用dubbo远程调用风控接口时,因对方服务宕机,同时超时时间过长,而导致系统崩溃,我分析和排查过这个问题,总之技术结合业务,就一定能增加可信度。

4 上述是针对组件的,同时还要针对一些限流熔断和扩容等高并发的业务动作准备说辞,一样要结合业务。

比如说,我们对核心模块即对账模块要进行限流保护,限流的需求是一秒限制多少个,是用hystrix里的哪个api做的,限流时用到哪些组件,遇到大流量时又该怎么处理。

如果可以,再准备些集群和部署方面的说辞,不过这比较难,比如说怎么搭建redis主从集群,dubbo+zookeeper集群怎么搭建,扩容时是怎么操作,不过这方面的技能属于资深架构,一般的架构师在面试时不说问题也不大。

准备项目说辞时,更可以准备后继面试官的问题

其实大多数面试官在面试前,有可能还在调试代码,或者还在开会,也就是他们事先是不会准备面试问题的。所以当你在自我介绍和介绍项目经验时抛出亮点后,他们往往会随口接着这个话题问下去,也就是说,只要实现准备好,你是知道面试官会问什么的。

根据上文给出的项目介绍说辞,你提到了敏捷开发,Spring Boot框架,数据库调优,内存调优,设计模式,junit以及项目管理软件,java集合以及底层源码等话题,在前文里也给出了一些面试官可能问到的问题以及对应的准备要点,除此之外,大家还可以做如下的准备。

1 理解单例模式,尤其是双重检查的单例模式,要会写代码,并给出一个项目使用场景,比如某工具类需要用单例的方式创建。同样地,对于工厂模式也准备一个使用场景,这更好办,比如xml解析器类,是用Factory模式创建的。

2 在理解的基础上,背诵并会默写ArrayList快速失效的底层代码,面试时,当面试官顺着你给出的言辞继续提问时,你可以边写边说,同时也可以准备HashMap以及Hashcode的底层源码。

3 去看下JVM内存调优和垃圾回收相关理论,最好再看下强引用,弱引用和软引用理论。

这里请注意,你在自我介绍和项目介绍时,可以通过抛出亮点来引导面试官提问,但同时,你更需要准备其它常见问题,因为有些面试官依然会问其它问题。对此大家可以在Spring Boot框架,数据库和Java核心开发这三个方面多刷些面试题,甚至可以多准备些笔试题。那么这样一说,你抛出亮点有什么好处呢?

第一,真有些面试官在顺着你言辞提问后,发现你回答很好(因为你事先准备过,想不好回答都难),然后他们就不再提问了。

第二,面试官多少会问及些你提到的亮点,这样你就能最大程度避免面试官问及你不熟悉的点。

第三,其实大多数初级开发在项目中只是做增删改查,但一方面你根据上文描述准备了若干常稳点,另一方面你能很好证明你熟悉设计模式,有JVM和数据库调优经验,那么你就有可能在面试中表现比其它人强。

总之,你在准备项目经验的前提下准备些基础和亮点技术点,准不会吃亏。

本号其它原创文章。

零基础学Java,哪个方面最重要?


就说说那些得不到面试机会的Java简历长什么样?


再论Java入行要不要靠培训班


再说说JAVA后端小白该如何过试用期


以前的互联网都是什么样的?

原文始发于微信公众号(老胡聊Java):做过的Java项目太low也不要紧,面试时能用此办法介绍项目经验

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/64059.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!