之前写了篇博文,你的简历能帮你争取到面试机会吗,反响不错,也承蒙管理员抬爱,放在首页,为了答谢大家,在这篇博文里,我来分享些如何准备和叙述项目经验的技巧。
本文的内容是根据java web轻量级开发面试教程改编的。
1 缺乏相关项目经验的补救措施
在之前的你的简历能帮你争取到面试机会吗博文里,已经给出过增加项目匹配度的技巧。其实大家在跳槽换时,遇到的最大问题可能不是技术方面的问题,而是缺乏足够的技能经验。
大家一定遇到过如下的情况,比如投了很多简历,但得到的面试机会寥寥无几,有些初级的程序员甚至再投简历也得不到面试机会。很大程度上,这问题出在“工作年限”和“项目匹配度上”。
工作年限方面,大家尚可写上在校实习经验,但如果你在简历上的项目描述(尤其是最近一个项目)和目标公司的职位介绍不一致,那么你得到面试的机会很难,如果你再是非211,985学校,那么就更难了。抱歉我这里不是对这些学校有偏见,事实上不少一般学校里毕业出来的学生能力也很强,但我这里只是描述一下业内的情况。
比如某公司在招聘时,写明了要有2年Spring MVC相关经验,小李虽然也工作2年了,但做的主要是Java Core方面的,而小赵在做了C#.NET项目两年后想转到Java方向,他们在应聘这个岗位时,同样都会遇到“没有足够的实际项目经验”的困难。
大家在遇到类似情况时,强烈不建议大家弄虚作假地改写简历,比如把2年Java Core经验改写成Spring MVC方面的。虽然这种修改未必能在背景调查时被发现,甚至某人如果能在面试时让面试官感到他在Spring MVC方面达到了2年工作经验的水准,这种修改未必能被发现,但在职场上毕竟要以诚信为主,这种虚假简历一旦被发现,后果甚至比缺乏经验还严重。
遇到这样的问题,大家可以做的是,挖掘之前项目和所应聘职位相匹配的技术要点,而不是伪造简历。
挖掘点一,比如某项目的一些模块是用C#做的,而一些和客户交互的功能用到了Spring MVC,小张主要做的是C#模块,在简历上他也以此描述为主,但他也做过点Spring MVC,那么遇到上述情况,他就可以在简历中写上Spring MVC的经验。
挖掘点二,有些公司规模比较小,所以一个人可能要做多方面事情,比如小王是以“测试”人员的身份进入的项目组,但后来项目进度比较紧,小王也被要求去开发Spring MVC了,这种情况我们也见了不少,这样当小王想往Java方向转时,也可以在简历上加上这段经历。
除此之外,我们还见过这样的简历:候选人正式工作是做C#,但他在业余时间跟着他们的项目经理用Spring MVC干私活,这样他好歹在简历上也能写上Spring MVC等相关方面的经验。
但请大家注意,通过上述方式挖掘出来的项目经验虽然能做到“实事求是”,但毕竟不能算“专职”;虽然也能提升获得面试机会的可能性,但面试时技术面试官一定会因此加大相关经验(比如Spring MVC)的考核力度。所以说大家不能简单地在简历上加上相关经验了事,面试前更得多做准备,比如多看面试题,或者深入实践一个Spring MVC的学习项目,这样最后才能应聘成功。
2 面试前请准备项目描述的说辞
当大家得到面试机会时,其实能大致猜出这个公司技术面试问题的大致范围:技术面试的问题一定会围绕“招聘岗位”的要求,这似乎是废话,但很少有人会照此准备面试,至少我面试的人里,我会发现不少人一点准备也没有。
具体而言,技术面试的问题会集中在三个方面,第一会确认候选人的项目经历,第二会针对性地问些技术问题,第三才会问些算法和逻辑方面的问题。而这三方面的问题大多是通过候选人叙述的项目经验来展开的。
不过我发现不少候选人会大量准备一些算法和逻辑方面的问题,对项目方面的问题往往很不重视,这就有些本末倒置了。
在面试环节,第一个问题一般是“介绍自己”,或“介绍下最近的(或最拿手的)项目”,然后面试官一般会以此为切入点提问。
这样做除了能让候选人放松下来从而能很好地进入到面试状态,还有如下两个目的,第一,面试官能以此确认候选人在简历上写的项目经验是否是真实的,第二,会根据候选人提到的技术点针对性地问问题。也就是说,候选人可以通过叙述项目,一定程度地引导后面面试官的提问。
具体而言,大家可以从如下几个方面有条理地详细叙述一个具体的项目。
第一,介绍项目的背景,比如客户是谁,是要干什么的,分哪些模块,大致的工期是多少。这部分大家其实已经写在简历里了,这里就简要叙述下,无需详细,因为面试官不会过多关注这个项目的需求,而是关注你是如何在这个项目用到和本岗位相关的技术的。
第二,介绍你做的模块里用到了哪些技术?以及有哪些亮点,这里需要提及的技术和亮点最好要和职位要求相一致。而且,面试官有可能会问你提到的技术的细节,也就是说,你宁可只讲你非常熟悉的技术,而别提你不熟悉的技术。具体地,在介绍完项目背景后,大家可以采用如下的样式来介绍在这个项目里用到的技术。
在这个项目里,我们用到了Spring MVC,具体而言,用到了拦截器和AOP组件,在数据库层面,我们用到Oracle,其中最多的数据表里大概有2千万条数据,所以我在项目里还做了SQL调优的工作。在代码里,我们还用到了诸如ArrayList和HashMap等的集合对象。这个项目对内存有一定的要求,所以我还做了些内存调优的工作。
第三,可以介绍下这个项目的开发方式,以及在项目管理方面用到的软件,比如可以这样说:
这个项目我们采用了敏捷开发的方式(点到为止即可,如果面试官感兴趣,会继续提问),在项目管理方面,我们用Maven来管理项目,用Git做版本管理,用Junit来做单元测试,用Jira来做bug管理,在代码上线前,我们还会用Sonar来扫描代码,如果发现一些可改进点,比如Junit覆盖率不高,我们会及时改正。
大家会发现,这些话在简历中都有,但面试官未必能注意这些细节,所以在面试时,大家还是有必要口头说下。而且,这里大家是在介绍项目,所以说出各个关键点即可,没必要偏离这个主题去详细介绍敏捷开发以及各种项目管理软件的细节。
我们这里是拿Spring MVC的项目举例,如果大家要介绍其他类型的项目,也可以根据如下两个要点来准备(因为重要,所以这两个要点我们已经重复多次了,所以请大家务必重视)。
第一,尽可能多地提到职位描述里给出的技能点,并且在此基础上,适当地介绍些在这个项目里你能拿得出手的而且别人未必有的亮点。
第二,在介绍时,点到为止即可,因为此时是在介绍项目,所以如果过于展开的话会喧宾夺主,从而偏离“介绍项目”这个主题,从而会给面试官留下“叙述条理不清晰”的不良印象。
3 回答问题时尽量结合你的项目实际
当面试官听完大家按上述两点准备好的项目叙述后,或多或少地会受到影响,根据大家提到的技术点深入地提些问题。比如会问,在你们的项目里Spring的拦截器是怎么用的,或者是,你们是怎么做SQL调优的?
在提出问题后,面试官期望得到的结果是,首先候选人得知道相关技术点的用法,再进一步,候选人在实际项目里还用过。所以,大家在回答时,可以结合项目的实际,而且还可以顺势展示自己的其它亮点,通过下面的两个实例,我们来看下具体的回答方式。
实例一,面试官提问,Spring的拦截器是怎么用的。
在我们的保证金项目里,我们是通过Spring来拦截掉一些非法请求,比如在订单撮合成交时,发送的请求一定会包含些安全验证信息,这些请求在被请求前,会经过拦截器。具体而言,我们是通过继承HandlerInterceptorAdapter类来实现拦截器,并在其中的preHandle方法里添加了验证安全信息的逻辑,同时,我们还在配置文件引入了拦截器的相关配置。
在说完Spring拦截器之后,大家还可以顺势说些其它相关的亮点,比如:除了拦截器之外,我们还用到了Spring里的声明式事务,这样我们就能分离数据库操作业务和事务处理业务,从而能用比较小的代价来更改业务的事务属性。
这样一来,候选人就能清晰地让面试官感受到确实在项目里用到拦截器,而且还有可能有很大概率把接下来的问题引入到声明式事务方面。
实例二,面试官提问,你是否重写过hashcode方法。
我们知道,当我们在HashMap里放入自定义类型的对象时,需要在这个对象里重写equals和hashcode方法,否则在调用HashMap对象的get和 containsKey方法时,可能会得到意料之外的结果。这部分的内容我们在描述集合内容时详细提到过。所以我们可以这样回答。
在项目里,我们用了HashMap对象来存放键值对类型的对象,其中“键“是用户对象,值是这位用户的订单列表,所以我们就需要在用户对象的class里,重写hashcode和equals方法,否则会出错。
随后可以举个不重写hashcode方法会导致的问题,之后可以结合项目的实际进一步展示自己对HashMap对象的理解。比如可以这样说,由于在HashMap里,放入的数据和它的“存储位置”是通过hash算法相关联的,所以它的get方法的效率相当高,比如在我们的项目里,我们在HashMap里存了将近20万条键值对数据,但它的get效率基本上是一枪命中。
从上述两个实例中,大家可以体会下“如何结合项目实际”,其实也就是说下这个技术点解决实际需求的大致步骤。同样地,大家在“顺势扩展”相关技能点时,提到即可,不用再结合项目展开具体的用法,如果面试官感兴趣自然会接着问。毕竟这是“借其它问题”的扩展,如果展开过度也会导致喧宾夺主,从而给面试官留下“思维不清晰”的不良印象。
4 面试前一定得准备些亮点,叙述项目时找机会抛出
在下表里,我们归纳了些可以在Java核心(Java Core)方面展示的亮点。事实上,我们不可能列出所有的亮点,这里只是给出些案例,大家可以据此扩展。
技术方面
可以说的亮点
Java集合对象
1 能根据项目的需求选用合适的集合对象,比如知道ArrayList和LinkedList的差异,并能合理选用。
2 能在合适的场合选用WeakHashMap。
3 可以适当讲一些集合的JDK底层实现代码。
异常处理方面
能在finally从句里写释放资源的代码
JDBC方面
1 能通过PreparedStatement的预处理方法来防止SQL注入。
2 能通过批处理来提升操作性能。
3 能通过实例讲述事务隔离级别的含义
多线程方面
1 会使用线程池
2 能通过锁或信号量等手段正确地处理多线程并发时的数据一致性。
在下表里,我们列了些在数据库方面可以准备的亮点。
技术方面
可以说的亮点
建表
建表时需要根据项目的数据情况,考虑是采用三范式或是反范式。
SQL调优
1 可以通过查看日志等方式看哪些SQL需要调优。
2 可以通过执行计划查看SQL的所消耗的代价,并据此调优。
3 可以通过建索引,建分区等手段来优化SQL性能。
事务
1 可以说下JDBC或Spring里是如何管理事务的。
2 可以说下Spring里的声明式事务的做法和优点。
3 可以举例说明事务隔离级别和事务传播机制的用法。
分布式数据库
1 可以通过水平或竖直等方式的方式来拆分数据库,从而减轻对单表访问所需要的代价。
2 可以通过集群等方式来承担对数据库的过量的访问请求。
NoSQL和Hadoop
这两个本身就是个亮点,如果大家用过,可以结合项目来说明。
在下表里,我们归纳了web这方面大家可以准备的亮点。
技术方面
可以说的亮点
Spring MVC架构
1 可以说下Spring的IOC和AOP是如何优化项目结构的。
2 可以说下拦截器等Spring组件对项目的帮助。
ORM,比如Hibernte或Mybatis
使用这种ORM技术时,如何优化访问和操作数据库的性能。
Spring和Mybatis等的整合
可以讲下整合框架的细节,并可以举例说明整合后的框架能很好地适应需求的变更。
此外,大家还可以在Linux使用技能以及项目管理软件的使用经验方面展示自己的亮点。这里请注意,一定找合适的机会“顺带”地说,如果没机会宁可别说,更不能仗着有所准备就直接自说自话地说。否则的话,反倒可能会得到“表达能力不清晰”或“叙述条理混乱”等的不良评价。
5 结语(求之后的文章内容)
同样,如果这篇文章反响不错,我会继续写文章告诉大家如何在面试前做准备,以便能更好地通过面试。
如果大家感觉我的文章有哪里可以改进,请留言告诉我,同时也可以“反对”我,如果感觉对大家的面试有所帮助,也请帮忙推荐一下。
另外,大家如果还想了解面试方面的其它哪些知识点,也请留言告诉我,我就会准备这方面的文章了。