前几天我写了篇文章,在做技术面试官时,我是这样甄别大忽悠的——如果面试时你有这样的表现,估计悬,得到了大家的广泛关注,一度上了最多评论榜。不过,也收到了4个反对,也有有朋友说:”简直不给人活路!”,我可以想象是哪些朋友给的反对。
由于项目介绍是面试中的重头戏,一些技术问题会围绕你介绍的项目展开,你也可以在介绍项目时亮出你的优势。所以,在准备面试的时候,你可以刷题,但首先得准备好你的项目介绍,因为这关系到你面试的成败,文本就将围绕这点展开。
如果在简历中的项目经验是真实的,那么本文给出的技巧一定能提升面试官对你的评价,毕竟你不仅要能力强,更要让面试官感觉出这点。如果你的项目经历是虚构的,那么我也不能阻止你阅读本文。如果你用虚构的项目经验外加你的(忽悠)本事外加本文给出的技巧进了某个公司,我想这个公司的面试官也怨不到我头上,毕竟面试技术是中立的,就看被谁用。
开场白结束,正文开始。
---------------------------------------------------------------------------------------------------------------------------------1 面试前,回顾下你最近的项目经验,在对比下职位介绍,在简历中多列些契合点
比如某个职位介绍里,要求候选人有Spring Boot相关经验,数据库要会Oracle,而且需要有分布式组件,比如nginx,dubbo等的相关经验,那么你就得回顾下你上个或之前的项目,是否用到过同样的或类似的技术,如果有,那么就得加到简历上,这些技术无需在简历上展开,但得结合项目具体需求写。
一般的写法,在项目里,我用到了dubbo,redis等的技术。
比较好的写法,在项目里的订单管理模块里,我们是用dubbo的方式调用了客户管理系统里的方法,调用的时候我们还考虑到了超时等的异常情况。在页面展示部分,我们用redis缓存了商品信息,redis是用主从热备。
对比上述两种写法,很明显,第二种写法明显更有说服力,因为其中列出了只有用过才知道的点,这样就能向面试官证明你确实用过相关技术。
类似的,在职位介绍里提到的技术,最好都用同样的方法写到简历中。不过这里请注意,过犹不及,比如职位介绍里提到了5个技术,你用到了其中的3个,那么你本来也可以通过面试。但如果你自己在项目里拼接了一个实际没用到的技术,那么你就得自己承担后果了。
2 能帮到你的其实是和职位相关的商业项目经验(含简历疑点和如何避免)
在本文开头提到的这篇文章里,我已经分享过甄别商业项目的方法。这里我通过些假装商业项目的案例来作为反面教材,以此来说明商业项目经验该怎么描述。
1 小A,3本学校毕业,计算机系,2年相关经验,之前的公司是一个名不见经传的公司,也就叫xx科技公司,但描述的项目却很高大上,是xx ERP项目。疑点分析:如果某大型公司,或国企,要做ERP或之类的大型项目,或者自己开发,或者让别的大公司开发(因为能出得起这个钱),如果是小公司要用,估计也就拿别人的现成的代码来改,一般不会出这个钱,所以遇到人经历少,公司规模小但项目很有名头的简历,我不能说是一律排除,但我会问很细。
2 小B,2本计算机系,3年经验,但最近有3个月工作断档的记录。之前的公司是个软件公司,但并非是一个互联网公司,但简历上写的技术非常新潮,比如分布式缓存,dubbo之类的,而且用到了集群。还是这句话,技术是为成本服务,你上个项目规模不大,也不可能有高并发的流量,那么为什么要用这些技术?
遇到这类简历,我就找些用过就一定能知道的问题来问,比如Redis的基本数据结构,redis如何部署,如何看redis日志,在上述案例中,我就通过这个方法发现该项目其实是个学习项目,而且这个项目是在培训学校里学的。
3 小C,最近简历上写的是个xx系统(大家可以理解成金融物流保险等),但时间跨度比较可疑,一般来说,做个系统至少10个人左右,而且得大半年,但他简历上写的参与时间是3个月,这和培训学校里的学习时间非常相近。而且,在简历中写的是自己开发了xx系统里的xx模块,用到了redis,logstash等技术。这类简历的疑点是,第一,用了3个月完成了一个项目,而且该项目里有高新技术,且做好了以后马上离职了,这个和实际情况不符,很像培训项目。
其实简历的疑点不止上述三个,大家也可以换位思考下,如果你是面试官,看到这份简历,会相信吗?很多疑点其实很明显。
下面我说下真实项目里会出现的情况,写这些内容的目的不是让有些同学把学习项目和培训项目往商业项目上靠,而是让大家的简历更具备说服力。
1 工作年限比较少的同学,未必会开发完成一个模块或参与一个项目的开发,更多场景下是参与一个维护项目,比如公司一个项目已经上线了,这个项目是历史项目,所以用的技术未必最新,但在维护项目里,其实也会开发一些功能点,该用的技术一个不会少,针对每个模块维护的时间周期也不会太长,比如每个月,针对某个模块上线3个功能点,这样也是合情合理的。
2 还是这句话,如果有用到比较新的技术,结合业务场景写,比如用到了redis,你是缓存了哪类业务数据,这类业务数据的特点如果真的是符合缓存条件的,那么就加深了你熟悉这个技术的可信度。
3 你站在项目经理的角度想一下,某个功能如果工期很紧,而且数据量和并发量真的不大,那么为什么要用分布式组件?换句话说,如果你在简历里写的项目背景里,有高并发请求,那么引入分布式组件的可信度就高了。而且,项目经理会让一个工作经验不足的人独立使用技术含量高的组件吗?如果候选人工作经验不多,那么比较可信的描述是,由架构师搭建好组件框架,本人用到其中一些API,但用的时候,对该组件的流程和技术坑非常了解,那么以此证明自己对该组件比较熟悉,这样可信度就非常高了。
换句话说,你写好简历里的项目描述后,自己先读一遍,如果有夸张的成分,更得多推敲,除了个别虚假简历之外,很多情况下,其实简历是真实的,但没写好,有很多漏洞,被面试官一质疑就慌了,导致面试官认为简历不真实。
3 沉浸入项目角色,多列些项目管理工具和技术使用细节(就是坑)
其实证明相关项目经验是商业项目,这仅仅是第一步,更多的时候,你得通过简历中的项目描述,证明你的技能和职位描述相匹配,再进一步,你也可以证明你确实用过一些比较值钱的技术。
对于项目开发而言,只要项目是真实的,你就一定会经历过一些场景,对于技术而言,只要你用到了,那么一定能说出些“海底针”。所以在写简历时,建议大家列些如下的关键点,以证实真实性。
1 项目的背景,多少人做?做了多久?用什么工具打包部署发布(比如ant加jenkins)?用到哪些测试工具?用什么来进行版本管理(比如Maven+JIra)?如何打印日志(比如logger)?部署环境时,用到哪个web服务器和数据库(比如spring boot+oracle)。
这些话在简历中一笔带过也用不了多少文字,但这样不仅能提升项目的真实性,更能展示你的实际技能。
2 项目的开发模式和开发周期,比如用敏捷开发,那么每一个月作为一个周期,每次发布个若干功能,在每个周期发布前几天,会冻结开发,在开发过程中,会有每天的站会,代码开发完成后,会有code review。
3 在写技术(尤其是值钱技术)描述时,最好写些细节,比如用到了dubbo,那么可以写需要设置dubbo超时时间和重试次数是1,否则可能会出现调用,如果用到了线程池,那么如何避免线程池中的OOM问题,或者用到了nginx,你就把配置文件里的关键要素写些出来。
也就是说,你写技术时,不仅得结合项目需求写(即xx技术实现了xx功能),最好再些一些(不用太多)这个技术的用法细节(也未必太深)。面试官其实就看你用到的技术是否和职位匹配,如果职位介绍里的技术点你有都招这点要求写了,至少在筛选简历的时候,你过关的可能性就很大了。
4 最好写些你解决的实际问题,大而言之,实际问题可以包括配置集群时的要点(比如一定要设置某个配置),小而言之,你可以写如何实现一个功能(比如出统计报表时,你用到了数据库里的行转列的功能)。哪怕是学习项目和培训项目,你运行通现有代码的时候,也会遇到各类的坑,这就更不用说商业项目了。在简历里项目描述部分,你就写上一两个,这样证明真实性的力度绝对会非常高。
5 加上单元测试和分析问题和排查问题的描述。
比如,在这个系统里,我是用SoapUI作为自测的工具(或者用JUnit),在测试环境上,如果出现问题,我会到linux里,用less等命令查看日志,再用JMeter等工具查看JVM的调用情况,以此来排查问题。
这种话在简历中写下大概的描述,给出关键字(比如Jmeter,SOAPUI或职位介绍里出现的关键字)即可,不用展开,但在面试前要准备说辞。
我知道有些候选人会对项目描述做些改动,比如在最近的项目描述里,加上些之前项目里用到的技术,或者加上职位描述里提到的技术。在这种做法是否恰当,大家自己评估,但如果你在这类技术描述里,加上本部分提到的一些要点,面试官就很难甄别了。
4 事先得排练介绍项目的说辞,讲解时,一定得围绕职位需求要点
这里说句题外话,我面试过的候选人,从他们的表现来看,很多人是不准备项目描述的,是想到哪说到哪,这样的话,如果你准备了,和你的竞争者相比,你就大占优势了。
在本文的第3部分里,我给出了5个方面,在简历里,你未必要写全,但在准备面试说辞时,你一定得都准备。
1 你在项目描述里列到的所有技术点,尤其是热门的以及在职位介绍里提到的技术点,你一定得准备说辞。也是按“技术如何服务需求”以及“技术实现细节”来说,更进一步,你最好全面了解下这个技术的用法。比如nginx如何实现反向代理,该如何设置配置以及lua脚本,如果分布式系统里某个结点失效了,我想在反向代理时去掉,那该怎么在nginx配置里设。针对这个技术的常用问题点,你最好都准备下。
2 介绍项目时,可以介绍用到哪些技术,但别展开,等面试官来问,所谓放长线钓大鱼。这个效果要比你直接说出来要好很多。
3 有些基础的技能需求,在职位描述里未必会列,但你一定得掌握。比如通过设计模式优化代码架构,熟悉多线程并发,熟悉数据库调优等。关于这些,你可以准备些说辞,比如在这个项目里,遇到sql过长的情况,我会通过执行计划来调优,如果通过日志发现JVM性能不高,我也能排查问题,然后坐等面试官来问。
4 开阔你的视野,别让面试官感觉你只会用非常初步的功能点。比如你项目里用到了dubbo,但在项目里,你就用到了简单的调用,那么你就不妨搜下该技术的深入技术以及别人遇到的坑,在面试过程中,你也可以找机会说出来。
5 在项目介绍时多准备些“包袱”
刚才也提到了,在介绍项目里,你可以抛些亮点,但未必要展开,因为介绍项目时,你是介绍整体的项目以及用到的技术,如果你过于偏重介绍一个技术,那么面试官不仅会认为你表达沟通方面有问题,而且还会认为这个技术你事先准备过。
如下列些大家可以抛出的亮点:
1 底层代码方面,大家可以说,了解Spring IOC或Nginx(或其它任何一个职位介绍里提到的技术)的底层实现代码。面试时,大家可以先通过UML图的形式画出该技术的重要模块和过程流程,再通过讲述其中一个模块的代码来说明你确实熟悉这个技术的底层实现。
2 数据库调优方面。比如oracle,你可以用某个长SQL为例,讲下你通过执行计划看到有哪些改进点,然后如何改进,这样的例子不用多,2,3个即可,面试时估计面试官听到其中一个以后就会认为你非常熟悉数据调优了。
3 JVM调优和如何通过设计模式改善代码结构,在Java核心技术及面试指南里我已经提到了,这里就不展开了。
4 架构层面的调优方法,比如通过分库分表,通过数据库集群,或者通过缓存。
其实关于亮点的内容,我在Java Web轻量级开发面试教程里,也有详细描述。这里想说的是,大家可以准备的亮点绝不止上述4个,大家可以从调优(比如通过分布式优化并发情况场景)和技术架构(比如SSM, 分布式消息队列)上准备。再啰嗦一句,职位介绍里提到的技能点,比如Redis,大家还可以用熟悉底层实现代码来作为“亮点”,比如介绍项目时,轻描淡写地说句,我熟悉Redis底层代码(当然也可以写到简历上),然后等面试官来问时,动笔说下。
6 别让面试官感觉你只会使用技术
按照上述的建议,只要你能力可以(哪怕可上可下),你通过技术面试的可能性就大大增加了。但面试时,如果你表现出如下的软实力,比如在简历上项目描述部分写上,或介绍项目时说出,那么面试官甚至会感觉你很优秀。
1 该项目的工期比较紧,我会合理安排时间,必要时,我会在项目经理安排下周末加班。(体现你的责任心)
2 这个项目里,用到了分布式组件技术,刚开始我对此不熟悉,但我会主动查资料,遇到问题,我会及时问架构师,解决问题后,我会主动在组内分享。(有责任心,学习能力强,有团队合作意识,有分享精神)
3 遇到技术上或需求上的疑点或是我个人无法完成问题点,我会主动上报,不会坐等问题扩大。
4 在开发项目的过程中,通过学习,我慢慢掌握了Git+Ant+Jeninks的打包发布部署流程,现在,我会负责项目里的打包工作。或者说,在组内,我会每天观察长SQL脚本和长Dubbo调用的情况,如果遇到问题,我会每天上报,然后大家一起解决问题。(不仅能完成本职工作,而且还能积极分担项目组里的其它工作)
5 如果出现问题,我主动会到linux里通过xxx命令查看日志,然后排查问题。(不仅积极主动,而且掌握了排查问题的方法)
6 我会和测试人员一起,用xxx工具进行自动化测试,出现问题然后一起解决。(工作积极,而且掌握了测试等的技巧)
7 在项目里,我会用Sonar等工具扫描代码,出现质量问题,我会和大家一起协商改掉。(具有代码质量管理的意识,而且具有提升代码质量的能力)
7 版权说明,总结,求推荐
本文欢迎转载,转载前请和本人说下,请全文转载并用链接的方式指明原出处。
本文给出的准备项目描述和说辞的经验,是根据本人以及其它多位资深技术面试官的经验总结而来。如果大家感觉本文多少有帮助,请点击下方的推荐按钮,您的推荐是我写博客的最大动力。如果大家在这方面有问题,可以通过评论问或私下给我发消息,一般我都会回。