本人于3年前写的博文,如何在面试中介绍自己的项目经验,经过大家的捧场,陆续得到了将近7万个点击量,也得到了众多网站公众号的转载,不过自己感觉,这篇文章更多的是偏重于方法,没有具体给到Java方面相关的说辞。

    三年过去了,随着本人面试官经验的积累,也随着技术的进步,本人就用适合当下2021年Java初级开发的面试场景,改写本文。请注意,这篇文章并不是简单的技术升级,也没有机械地教大家在介绍项目经验时背诵若干说辞,而是教大家如何结合项目经验更好地展示自己的技术亮点,这样就能最大程度地提升面试通过的可能性。

1  用简历争取到更多的面试机会

    本不想写这段,但最近我在帮一些同学准备简历时,发现他们虽然在当前公司里能胜任Java开发的工作,但凭简历恐怕无法得到面试机会,或者无法得到和自己相匹配的工资。而且准备简历的过程,也是准备项目说辞的过程,所以这里就一并把写简历的注意要点写上。

    注意点1:阅读职位介绍上的技能要求年限,在简历上的醒目位置标明你有足量的相关技术项目经验。

    比如某职位需要有Spring boot 3年经验,又如某职位需要有2年大数据开发经验,而你恰好有了,就在简历第一页个人信息介绍下直接写明。

    万一假设你缺乏一些,比如要求是有2年大数据,而你就只有一年,你就回想下,你在读书阶段,有没有在外面做过兼职,有没有帮老师一起做过项目,有的话别客气,把这部分的技术年限也加上。

    注意点2:再仔细阅读职位介绍上要求的技术,也列在第一页的醒目位置。

    比如某职位需要有jave核心开发,多线程开发经验,分布式组件开发经验。其实对做开发的人来说,这些技术多少在项目里也用过,但如果你不写上,甚至你的简历没法过筛选,甚至你没有面试机会。 

    注意点3:再多少写些你的亮点,怎么写看下面的范例。

    也就是说,在简历第一页,你写好姓名性别年龄和手机邮箱等基本信息后,一般可以用如下概要的形式,向面试官展示你和职位的匹配度,如下是范例。

    1 具有3年Java开发经验,2年Spring Boot开发经验,2年数据库开发经验。(这里的年限需要大于等于职位介绍上的要求,如果达不到,很多公司就不给面试机会)

    如下再根据职位介绍上要求的技术,总纲性列出你掌握的技术,以此证明你很匹配

    2 有Oracle,MySQL等数据库开发经验。

    3 有多线程,集合等方面的开发经验

    4 有大数据方面的xx技术和xx技术的开发经验。

    这里你可以尽可能多地列出你掌握的JD上的技能,然后,你可以照着如下的范例列些你的亮点。

    5 具有用索引,执行计划进行数据库调优的经验。(当前不会就自己查,这块资料太多)

    6 熟悉Java JVM虚拟机结构,熟悉垃圾回收流程,有JVM性能调优的经验。(当前不会也自己查)

    7 有在linux分析日志和排查问题的经验。(如果不会就去看些linux文件打开和搜索的相关命令)

    8 熟悉面向对象思想,在项目里用过设计模式。(自己去看个单例或工厂模式,然后套到项目需求里)

    9 有分布式组件的开发经验。(如果没有就别写,但对初级开发来说,这绝对是加分项)

    10 熟悉Java集合等方面的底层代码。(自己去看HashMap,ConcurrrentHashMap,快速失效,ArrayList增删改查的底层代码,不难)

    11 工作责任心强,具有一定的承压能力,肯加班。(写上去总不会错)

    其实对大多数初级开发而言,应该都具备上述技能,哪怕当下不具备,用个把月绝对也能学会,所以大家完全可以写在简历上。

    但我收到的很多Java开发的简历,只是简单地列出会的技术,没有任何润色性的文字,这样的简历或许就无法完全地展示候选人的能力,对应地,得到的面试机会可能就大大降低了。

    相反,姑且先不论候选人是培训班出身还是科班出身,但就凭在简历第一页醒目地展示和该职位的匹配度,至少面试官就肯继续往下看项目经验了,这样得到面试的机会,乃至通过面试的机会,就大大增加了。

2  自我介绍时,立即全面抛出技术栈和亮点

    在面试的开始阶段,面试官大概率会让候选人自我介绍,这部分别的不用说,就直接根据上文给出的简历上列出的总纲性要点介绍自己,如下给出范例说辞。

    先说技能和jd的匹配度。

    我叫张三,今年25岁,18年从交大大学毕业,计算机系,目前有3年Java开发经验(这个是jd上的要求),有Oracle,MySQL的开发经验,有xx等技术经验(这些经验也是jd上的要求)

    再说自己的亮点。

    在项目里,我用过用索引和执行计划等进行数据库调优经验,有JVM方面排查OOM的经验,大数据方面,用过Spark等框架,分布式组件方面,用过Redis和Dubbo等,有在linux上看日志然后排查线上问题的经验。

    其实天地良心,上述提到的亮点,除了大数据spark以外,其它技能亮点初级开发应该都会,哪怕不会也能轻易学会。但就这样,很多候选人不会说,不过反过来,你说了就比别人强。然后立即引申出最近的项目,因为大多数公司会衡量jd技术是否在最近项目里用过。

    在最近的项目里,我用到了Spring Boot框架,具体用到了JPA组件,数据库用Oracle,最近的项目是xx系统,用到了敏捷开发模式,在这个项目里,我除了做coding外,还做过单元测试,讨论需求和详细设计等工作,并且最近的项目进度比较紧,我自己感觉还能主动加班,一起和同事们保质保量地完成项目。

    在自我介绍阶段甚至也不必展开项目,因为后面你有机会详细说明,但你第一要以此进一步突出你最近的技能经验和职位介绍很匹配,第二还要以此说明你肯加班等特性(毕竟通过项目举例说明自己肯加班,比单纯说肯加班要可信得多)。

     再强调下,在自我介绍阶段,只需要说明自己能胜任当前工作的要点,这些要点不需要展开,比如不必展开说明自己如何排查OOM异常的。而其它没和找工作没关系的,比如兴趣爱好,家庭成员,个人性格等一概不需要说。

    大家在面试前,可以根据上述范例练习下说辞,不紧不慢地说这些话,估计也就需要2分钟,哪怕再腼腆再内向口才再不好的人,多练几遍也能说好,但如果因为没说好被面试官认为沟通能力差,就太冤枉了。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5  用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个问题,应该就足以应对大多数的面试了。 

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

    当你介绍好基于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体系结构这方面的理论知识,这属于面试常用考点,你准备下不吃亏。 

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

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

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

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

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

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

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

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

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

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

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

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

8 总结前文说辞

    这里根据上文给出的要点,整理下介绍项目经验的说辞。

    (介绍项目背景)我最近的项目是在xx公司做的xx社区爱心超市项目(项目别说太大),客户方是xx公司,项目组里是6个人,开发了八个月,最近还在开发,在其中我做了删除和更新订单模块的业务 (如果是在校阶段做的项目需要再加上如下的话),这个项目是我从大三开始,外面找xx公司做的兼职项目,做项目的时候我每月还能拿到钱。 

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

    (介绍项目管理工具)这个项目用到了敏捷开发模式,用Maven框架,用sonar管理质量,用git管理项目版本,用jenkins发布,用logback打日志, 我在这个项目里,除了写代码外,还有用Junit进行单元测试的经验。我们还用sonar来统计代码的测试覆盖度,我们项目经理要求,只有当“行覆盖率高于80%”,代码才能提交。

    (最后抛出亮点)在这个项目里,我用到了单例和工厂设计模式,在这个项目里,我做过JVM调优和数据库调优的的事情,在做项目时为了加深理解,我还看了ArrayList快速失效的底层代码,也看过HashMap关于HashCode以及put和get部分的底层源码。这个项目后期进度比较紧,我也能通过加班等手段保证项目能正常上线,而且一旦遇到线上问题,我也会尽量参与并解决。

    大家在面试前,可以根据上述范例合理地准备说辞,次序和内容上可以做调整,但包含的几个要素尽量都说全。如果可以,事先要多练习几遍,确保能足量地抛出你的相关技能和亮点。

    不过千万注意,在介绍项目时,对具体的点,比如内存调优,你点到为止,别展开,否则的话,面试官一定会认为里思路不清晰。总之在介绍项目时,需要遵循的要点是:第一要尽可能全面地说明你用过JD上的技能,第二要抛出亮点话题,等待面试官提问。

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

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

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

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

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

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

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

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

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

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

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

10 总结:本文所含的说辞和方法足以应对初级面试官

     本人最近在帮上海一家知名培训学校的学员做面试辅导,在教他们用上述方法和说辞准备简历和准备项目介绍说辞后,他们均成功地找到工作。而且有好几位同学,有2到3年开发经验,本来期望工资是11到13k一个月(毕竟是培训班出身不敢要高)。我全程辅导让他们通过技术面试后,在谈薪资时,我好说歹说让他们至少要15k, 当他们硬着头皮咬着牙说出口后,均成功拿到这个价,而且一位胆子比较大的同学,还要到了16.5k。现在他们已经开始担心入职后怎么过试用期了,不过这是后话,如果我有时间还会写文章介绍此类经验。

    这才是我敢在这篇博文里介绍相关方法和说辞的底气。除此之外,我敢写这篇博文的底气还在于我的多年技术面试官经验,以及我还出的两本面试书。对培训班毕业生尚且如此,如果大家最近还在软件公司里真刀真枪地干项目,那么我敢说这篇文章对大家的帮助更大。

    也就是说,通过本文给出的技巧,大家足以能应对一些面试经验不足2年的初级面试官,当然,如果要去支应一些资深面试官(比如我),光凭此应该还不够,更需要在面试中展示多线程、分布式组件,微服务框架以及高并发等方面的技能,对此本人将在后继的文章里继续给出相关的技巧。

    请大家关注我的公众号:一起进步,一起挣钱,在本公众号里,会有更多精彩文章。

 

posted on 2021-01-11 08:23  hsm_computer  阅读(12949)  评论(2编辑  收藏  举报