项目经验怎么写 范例(分享程序员面试怎么介绍自己的项目方法)

程序员面试时,必被问的问题是介绍项目经验。对面试官来说,这其实是个开场白,因为有些面试官在面试前不会看求职者的简历,而要让求职者自己介绍。听完介绍后,面试官会继续提问。

对应地,对求职者来说,通过介绍项目经验,需要达到如下三个目的。

1 证明自己的技术和该职位的要求很匹配。

2 通过介绍项目,说明自己的技术来自于项目,而不是来自于自学或培训班。

3 抛出亮点,并进一步引导面试官后继的提问。

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和数据库调优经验,那么你就有可能在面试中表现比其它人强。

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

写到这里还不算,上文里也说了,通过介绍项目经验,还应当进一步引导面试官后继的提问。

Java能力和面试能力,这是两个方面的技能,可以这样说,如果不准备,一些大神或许也能通过面试,但能力和工资有可能被低估。再仔细分析下原因,面试中问的问题,虽然在职位介绍里已经给出了范围,但针对每个点,面试官的问题是随机想的,甚至同一个面试官在两场相似的面试里,提的问题也未必一样。

也就是说,如果让面试官自由提问,那么一旦问到你不熟悉的点,你可能就答不上,如果运气不好,再外加上不知道面试引导技巧等因素,真有可能面试官的提问全落在你不熟悉的范围内,这样就非常可惜了。与其这样,还不如事先准备外带面试引导,这样或许你的能力未必行,但你可以尽可能地通过引导展示你的亮点,从而提升面试通过的可能性。在本文里,就将讲述事先准备java亮点和面试中引导面试官提问的技巧。

1 根据职位介绍微调简历,这关系到能否有面试机会

虽然这点和本文的主题无关,但如果没有面试机会,那甚至无法展示引导技能,所以还是来啰嗦一下。筛选简历的人,除了会看学历专业等硬条件外,更会看相关经验的商业项目经验,这在职位介绍上一定能体现出来,比如初级开发,一般需要SSM等框架的1年经验,高级开发一般需要3年,再外带些诸如Netty,数据库调优等方面的技能。

如果看到一份简历上,没有明显的相关商业项目经验(学习项目不算),那么这份简历甚至没面试机会,这就是为什么很多初级开发简历大多石沉大海的原因。其实职位介绍上提到的技能,甚至很多初级开发应该也有项目经验,但这些人就不写清楚,这可能只能怪自己了。这块给出的经验如下。

1 简历上多积累商业项目经验,而且里面用到的技术尽可能是Java的,如果你可以凑出半年商业项目经验,那绝别写5个月。如果是毕业生缺乏商业项目经验,也得多找些学习项目写到简历上,至于帮老师干的项目以及实习项目,那当商业项目写。

2 一般职位介绍里,大多提到SSM,Oracle等技术,这些技术在你的项目里,至少应该用过其它类似吧,那么别客气,这些技术关键字尽可能地出现在你简历中的项目介绍里,比如人家要有Oracle经验,你哪怕是有MySQL,也写上,不写就说明你没数据库开发经验,写了就算有相关经验,类似技术点也照此办理。

3 每份工作的技术要求一定不同,那么你在投简历前,一定得微调,在你项目里做过的前提下,尽可能在你这份简历中,体现出相关技术。

一般对出初级开发,如果没至少半年Java(可能再具体下是SSM等框架)商业项目经验,而且简历里看不到职位介绍里出现的数据库,框架等技能关键字,这份简历基本没机会,高级开发一般是要3年相关经验。

这里不提倡编项目,也不提倡编技术,即你项目里没用到的技术你写到简历中,但话说回来,一般公司要求的技术都很普通,你在项目里哪怕没做过,好歹同事有人做过,你可以看下相关代码,或者你参与过调试此类问题。所以哪怕是初级开发,你的技能应该能对上大多数职位介绍,如果对不上就学,也应该很快能对上,只要你的简历上有足够的java商业项目经验,而且出现大多数技术关键字,至少能有面试机会。

2 结合项目和线上问题,优先准备分布式组件的亮点

面试一般从介绍项目开始,在我的如何在面试中介绍自己的项目经验这篇博文里,给出了相关内容,但本文的主题是事先准备外带面试时引导,那么在面试前,该如何准备亮点呢?先从最值钱的分布式组件亮点准备起。

比如可以准备通过看日志,解决过redis,dubbo等方面的线上问题。这块其实连初级开发也有机会接触,比如Dubbo方面,超时时间没设好,比如设了10秒,平时没事,但一旦订单模块调风控模块出错,过了10秒再返回出错,这样导致整条(基于http的)链路长时间保持,累计起来就导致资源耗尽最终系统崩溃,或者redis超时时间没设或设置很长(1个星期),导致redis的内容在内存中缓存过多,导致OOM问题。这些问题,哪怕是初级开发,应该也有机会接触。

这方面该怎么准备? 1 简历上写上在项目里用过Redis或Dubbo组件,并排查过类似问题 2 看些基本的redis和dubbo接口方法 3 尤其看些可能导致问题点的配置,比如超时时间怎么设 4 复习下linux命令,了解如何通过linux命令看日志排查问题。

上述是最基本的,如果有MyCAT,Netty,Kafka方面的经验,比如Mycat分库字段怎么设,解决过Netty半包和粘包问题,Kakfa解决过因消息重发而导致的不幂等问题,你都可以写到简历上作为亮点。但本文给出的保本技能亮点,比如redis和dubbo超时而导致的问题排查,应该大家都有机会接触。

3 别光背题,要结合项目讲,最好结合你解决过的线上问题讲

网上有不少分布式(以及其它方面)的面试题,比如netty或dubbo底层细节问题,这些有用,但如果你背熟了,面试里最多得到的评价是“了解分布式组件理论”,聊胜于无,如果对于要有分布式组件经验的工作,你就悬了。对于分布式组件,大家实现该如何准备呢?(其实后文提到的亮点也一样)

1 一定要应用在项目里,因为面试官只关心对应的商业项目经验,比如你的dubbo是用在订单系统调会员系统方法里,你的mycat,netty等是用在什么场景,这点简历上未必能体现出,但面试时一定要说,这样能证明你用过。

2 分析问题的能力优于开发能力,所以你最好再结合一个场景说明,比如在项目介绍时,你外带一句,dubbo方面我解决过因超时而导致的问题,然后等面试官来问,问的时候,你大致说下,然后面试官看你对linux看日志的命令,以及dubbo关于超时时间的配置以及问题上下文说得没毛病,那么应该也就信了。

3 这时可以再结合一些面试题准备下细节,比如看netty堆外内存,线程模型,redis数据结构。有些面试官听你说出解决问题的说辞,可能就不问了,有些可能会再问些底层问题,那么你这时候再说下。

这里大家可以对比下两种表现方式,一种是什么也不准备,或者只准备背网上的题目局,等面试官问,那么面试官一定不客气,想到哪问哪,比如netty会问很细,你平时的项目经验未必涵盖到,如果你再无法结合应用讲清楚,那面试官可能认为你只有理论经验。另一种是项目介绍时抛出,而且找机会通过解决过的实际问题抛出,外带稍微了解下细节,这样不仅能很容易让面试官感觉你有实际项目经验,更能展示“看日志解决实际问题”的能力。两者差别一看就知道,更何况其实只要方法得到,准备其实也不难。

4 准备数据库调优和虚拟机调优及排查oom问题的说辞

按值钱的技能排序,对于一般的初级和高级开发而言,除了分布式组件,下面就是调优方面的能力了,具体可以是分布式调优,这之前讲过, 还有数据库调优和虚拟机调优。同样除了在简历上明写之外,还该做哪些准备呢?

数据库跳调优方面。

1 熟悉索引,包括索引结构,复合索引和回表,这块应该大家都会说,同样要结合项目案例说。

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

总之这里你得体现出通过日志看长sql,以及通过执行计划看耗时点。至于如何修改,大多数候选人都能说,但你更知道前两点, 就比别人强了。

3 如果你感觉还有能力,可以再讲些MyCAT分库分表和redis方面的调优能力,毕竟这块涉及到分布式组件。这方面可以准备的项目说辞是:比如业务请求里,会经常用公司ID向风控模块看风险情况,那么就可以用ID做键,风控字段做值,另外再把null放到键里,以放缓存击穿。另外对于一个千万级别的大表,你可以用ID作为分表字段,分10个表,根据最后一位的值定位到具体的表。同时排查所有的SQL语句,把一些可能全表关联的SQL语句,比如带group by和多表关联,或者用Java业务写,或者优化。同时再网上看些面试题准备些相关MyCAT和Redis的语法说辞。这样你会额外增加“分布式性能调优”方面的经验。

在虚拟机方面,我另外有篇博文:在面试中如何展示虚拟机和内存调优技能,大家可以照着准备,总之也是先结合项目展开,然后围绕虚拟机结构展开调优技能,再可以照这篇文章内部类、final与垃圾回收,面试时你一说,面试官就知道,进一步展示你的能力,同时再能照如下的范例,说出你解决过的OOM问题。

第一步,发现系统很卡,或者日志里频繁出现OOM异常。第二步,用dump文件看OOM时的内存镜像,看的工具可以是JMAT。这两个步骤是通用的。

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

如果你再经历过,甚至可以说到Netty堆外内存管理不善而导致的问题,如果能说到这个程度,甚至面试架构师都行。

第四是解决,发现问题后,对症下药解决就很容易,比如降低Redis超时时间,或者修改好对应的代码。但既然你说是根据线上问题排查出来的,那么就得说如何解决,善始善终。总之这里是结合线上问题发现的,所以就别说些因Connection对象没关闭,大的HashMap用好没clear之类的问题了,倒不是这些原因不会引发OOM问题,而是这些问题大多会在上线前测试阶段解决掉了,你再把它们说成线上问题,可能会暴露你们项目组能力不行。

5 java核心方面,准备集合,线程和异常处理等方面的亮点

通过上述分布式组件和调优方面的说辞,你展示的能力已经比别人强很多了,虽然相比之下,java核心方面的能力属于单机版的技能,但毕竟属于基础技能,你除了基本问题之外,也得适当准备亮点。如下给出些同样适用于初级开发的亮点。

1 集合方面,可以准备下HashMap和hashcode的底层代码,同样可以准备下ArrayList和快速失效(fast fail)的底层代码,然后再进一步看下ConcurrentHashMap的读写并发管理部分的代码,因为其中包含volatile,散列表数据结构和线程并发部分的技能,而且jdk1.7和1.8 ConcurrentHashMap的底层代码实现起来还不同,你如果找到机会通过这个对象展示多线程并发和数据结构的能力,或许Java核心方面,面试官就不问别的问题了。

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

3 异常方面,准备下你在项目里的异常处理方法实践说辞,比如尽量缩小try…catch的范围,finally从句里放释放资源的代码,catch里应尽量处理异常,先用IOException等专业异常处理,再用Exception兜底,以及尽量缩小异常的影响范围,别让程序一遇异常就崩。

Java核心方面,其实还有很多可以挖掘的点,比如String, final关键字等,而且Java核心方面,网上面试题太多了,这里就不再展开了。同样这里要结合项目案例,比如在测试阶段发现了因为遍历集合而导致的问题,同时展开快速失效,或者在压测阶段发现因HashMap在高并发场景下丢数据所以用ConcurrentHashMap,同时展示其中的volatile和并发等细节。

其实上述技能不复杂,初级开发照样能说,但涉及到了底层代码,尤其ThreadLocal还涉及到弱引用和OOM问题,更能体现实力,哪怕你经验未必比人家多,但你面试时能结合底层代码展示,想都不用想,面试官一定看好你。

6 介绍项目时,抛出准备过的亮点,别展开

上文里给出的是面试准备的技巧,按值钱角度分析,讲了分布式组件、数据库和JVM调优以及Java核心方面的技能,更重要的是,你是结合实际项目准备的。

台上一分钟台下一年功,如果准备得当,面试时你就可以发挥了。先是在自我介绍环节,你除了介绍基本情况学校学历外,还可以综合说明,比如用过Redis组件,有过数据库和JVM调优经验,有过压测经验(下文会讲),有过排查OOM方面问题的经验等,总之别客气,准备了就说。

然后进入到项目介绍环节,除了介绍项目背景,开发情况以外,你再结合业务说,这里给出若干说辞范例。

1 这个项目里,我们用到了Dubbo作为模块间的调用,我除了写代码外,还解决过因dubbo超时也引发的问题(别展开)

2 在数据库方面,我除了实现技能外,还做了数据库调优,具体用过索引,执行计划,redis缓存和MyCAT分库分表,最后两点自己斟酌。

3 在项目里,每个请求我们会用一个线程处理,其中用到了ThreadLocal对象(结合业务引出ThreadLocal),对此我还解决过因ThreadLocal和线程池设置不当而引发的OOM问题。同时这里可以抛出准备过的其它OOM问题说辞。

4 在这个项目里,我参与过压测,并在压测过程中解决过 OOM问题,并通过看日志优化代码,从而改善了系统的响应时间。

5 在这个项目里,我会结合Cat系统监控长SQL问题,一旦出现,我会通过看Linux日志排查问题。(展示看日志排查问题的能力,同时可以进一步展示你准备过的技能)。

大家可以看到,上述结合项目抛出的亮点时没有展开,因为这时属于项目介绍阶段,如果展开的话可能会让面试官感觉你条理不清晰,而且抛出的亮点都是属于分布式和调优等高级技能。对一些Java核心方面的单机版技能,别人或许当成宝,你可能都掌握的值钱技能太多,都不算什么了。当然,后面有机会,你还是要展示Java核心部分的亮点,只是优先讲更值钱的。

7 回答技术问题后,可以引导到你准备过的亮点上

你介绍项目时,由于已经抛出了足够多的亮点,所以后面面试官自然而然就会往这方面提问,这样就达到了引导效果。比如听你讲到Redis缓存,自然就会问了, 问题无非是怎么用?这你可以结合你的项目实际说,底层细节,这块网上资料太多。也就是说,通过项目介绍,你可以把面试官引导你准备好的话题上,这还不算,在回答问题的时候,你照样还能引导,如下给出些引导的技巧。

1 比如你在回答redis相关问题时,如果之前你没机会讲“排查因超时时间过长而引发的OOM问题”,那么还可以展开说,对redis,我还解决过xx问题,面试官自然会问了,然后再展开。

2 当你回答好redis问题后,可以再“顺口”说句,在我们项目里,除了redis外,还用过dubbo组件,结果过因dubbo超时时间过长而导致的问题。然后面试官自然就会问到这块了,你同样可以准备些dubbo底层细节的问题,这方面也很多资料。

3 在回答好任何数据库相关的问题,比如索引,JDBC等,你顺口说句,我在项目里,还通过执行计划(或Mycat)优化过SQL技能,然后然开。

4 在回答好任何集合(如ArrayList)方面问题时,你可以说,在遍历集合的时候,我们项目里会非常小心快速失效问题,然后展开。

5 在回答好任何线程内存模型,或被问到volatile相关问题时,你就说,我知道ConcurrentHashMap里用到volatile,我能具体说下吗?再结合这个对象,扩展到 线程并发话题,而且这还是结合底层代码讲的。

6 被问到任何异常处理问题,比如运行期异常,如何自定义异常,那么再引导到异常处理最佳实践。

7 从ThreadLocal,引出底层的Weak引用话题,再引出JVM结构以及OOM调优方面的话题。

写到这里我都懒得再写了,在上文里,我已经列出了很多亮点,它们两两横向关联,你说好一个再关联另外一个,足以能全方面展示技能。但在扩展时你需要注意,万一面试官没接嘴问,你就要立即停止,或者另外找机会再引导,这时如果再说下去,就属于自说自话了。而且尽量不露痕迹地引导,比如上文给出的范例中,引导的话术大多是,除了xx技术,我们项目里还用到了xx(关联性很强)技术,然后坐等面试官来问。

也就是说,遇到一些不大自主思考的面试官,你甚至可以通过事先准备外带面试引导,控制面试全程节奏,哪怕是遇到一些大厂的面试官,你同样可以据此把问题引导你熟悉的范围,最多就再根据网上面试题再准备些(dubbo,线程模型等的)细节问题,毕竟人的思维方式的很相似的,听到你“随口”这样一说,很有可能就“接茬”向下提问了。

8 更可以引导到压测和排查线上问题经验等的值钱话题

比起分布式实践技能,更值钱的是压测和排查线上问题和项目上线方面的经验,这在面试时非常容易引导,也就是一两句话的事,比如你随口一说:“在这个项目里我做过压测,而且有过根据压测结果调优系统的经验 ”,或者说,在dubbo等方面,我排查过线上问题。自然前提是你要做过,等到面试官提问时,压测方面你可以给出如下的说辞。

1 你参与全链路压测,即相应的同学坐一起,用jmeter发请求,用zabbix监控cpu内存指标,同时看日志监控问题。

2 压测是用测试环境,当然你也可以说是线上环境,如果是线上环境的话,更要监控,一旦出现CPU等负载过高,立即终止。

3 比如用Jmeter发500个线程,每个线程起5个交易,这些交易用2秒做完,那么每秒的压力是1250。

4 最关键的是,你要根据压测结果改善性能,比如通过压测,发现了线程池设置参数时,把等待队列设成了无界,或者有模块IO对象没关,或者ArrayList没clear,从而导致了OOM,或者发现高并发场景数据库方面出现了长SQL,然后用执行计划分析,再解决,或者发现了系统日志本来是同步输出的,从而导致性能瓶颈,最后改成异步日志。或者发现数据库是瓶颈,所以再引入MyCAT和Redis

总之,压测说辞方面,面试官更关注你分析问题和解决问题的经验,至于发现和解决的问题,只要能说得过去就行了,况且你还能借此展示分布式和调优方面的技能。而排查线上问题方面的经验,你可以用如下的步骤给出说辞。

1 如何发现?无非是通过CAT监控发现长SQL,或者通过Kibana等工具发现。或者可以说是先期业务埋点,发现交易异常时抛提示。

2 发现问题后你的态度,通过手机发现问题后,你第一时间看,哪怕不在你的范围内,你第一时间上报。

3 如何排查问题:通过linux命令看日志,或者通过dump看OOM的镜像。

4 分析原因,借此你可以展示上文给出的亮点技能,以及对应解决。

话说回来,哪怕是初级开发,也有资格参与压测,平时也一定会遇到线上问题,你如果面试时不说,面试官自然不知道,但这块你绝对是大有可为的。

9 总结:总是先找实践机会再提升技能,程序员总该挑战更高级的职位

总结下,本文的主题包括两个,第一结合自身实际,面试前挖掘亮点,第二面试时通过引导,尽量把问题引向自己熟悉的范围。实践起来,技术要结合项目,而且最好再结合你排查和解决过的线上问题,同时回答好一个问题后,再把问题引向同类以及调优方面的话题。

比如Redis,当你结合项目,压测和线上问题,讲述基本用法和解决过的问题后,面试官可能再会问数据结构,高可用集群和事务方面的问题,这些问题就可以事先准备了,而且话说出来,对于初级开发,你说好第一部分的说辞,哪怕细节问题没回答上,面试官虽然无法给出“深入了解Redis细节”的评价,但至少能给出“在项目里用过Redis和排查过Redis相关问题”的评价,如果你再结合项目,如本文所示,全面展示调优,Java核心等方面的技能,那么你面试资深高级开发也够了,面试初级开发真就绰绰有余了,如果经验再丰富些,再去面试小公司的职位,更有些委屈了。

当你按本文所述,准备好相应技能,然后再通过一些面试实践变成面霸后,很有可能你面临的不是要面试什么公司的问题,而是“面试通过后能不能适应更高级职位”的问题。不过总是先有实践机会再提升,比如当你是初级开发时,从事第一份高级开发工作时一定很吃力,甚至还会看人脸色,但如果你不追求更高级的岗位,一直陷入低级职位的舒适区不可自拔时,你的竞争力也会逐月下降。

所以到了必要的时候,你总得根据本文给出到的建议,不断挑战更高级的职位。况且,本文在开篇时就提到,技术能力和面试能力是两个方面,而本文给出面试技巧,都是靠平时技能积累,本文给出的面试建议,能帮助大家更好地在面试中展示亮点。

希望本文不仅能帮到大家更好地挖掘自己项目经验,更能帮到大家高效地找到自己心仪的工作,最后感谢大家看完长文,本文写了有5个小时,如果大家感觉可以,请多多点赞,有问题也可以多写评论。

最后发个付费咨询。如果广大程序员朋友要进一步了解写简历和准备面试的技巧,可以咨询我,本人最近密集帮助了不少程序员朋友成功跳槽,薪资涨幅均在30%以上,多的薪资翻番的例子也有。

1 提供简历辅导,让你的简历更有竞争力,首先能得到面试的机会。

2 用电话的方式辅导面试技巧以及面试说辞,让你不仅能力强,更能在面试中充分展示自己的能力和亮点。

3 如果情况可以,而且在上海,还有内推机会。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至755731262@qq.com举报,一经查实,本站将立刻删除。
(0)
上一篇 2022年11月26日 下午5:30
下一篇 2022年11月26日 下午5:30

相关推荐