作者 | hsm_computer
责编 | 李雪敬
出品 | 程序人生(ID: coder_life)
我做Java方面的面试官也有些年头了,从校招学生到初级开发到架构师我都面试过。从技术上来讲,候选人通过面试的标准可能千差万别,但归结成一句话,就是候选人达到了职位介绍的要求,且相关项目经验达到足量的年限。
同样作为程序员,我自然希望所有的候选人都能成功通过面试,但作为面试官总是要忠于职责,尽量甄别出候选人的真实能力。面试时,拿到手的候选人简历是通过筛选的,也就是说,如果候选人真的能像简历上所描述的那样,那么一定能过面试,但事实上不少候选人仅仅是“简历拿得出手”而已。在本文里,将站在资深面试官的角度,讲述如何在面试中甄别候选人能力的若干考察要点,从中广大候选人朋友能进一步了解面试的准备方式。特别地,对于一些看了若干课程的同学,你们可以对照地看下本文里给出的检查点,看下你们当前的准备说辞能否经得起面试官的推敲。
幸存者偏差,不少简历无法到达面试官的手上
面试前我拿到手的简历,一般看上去都行,其实有不少简历已经被过滤掉了,我本人也做过筛选简历的工作,在我之前的博文里也分析过哪些简历可以帮你争取到面试机会,这里就再啰嗦下,讲下哪些面试得不到面试机会。
无法证明自己在相关技术上有足量的工作或项目年限。比如某岗位需要3年 Java 开发经验,你简历上虽然给了一大堆项目描述,但无法总结性地写明你有3年 Java 开发经验,那估计面试机会就没了。
虽然年限够,但简历上看不出本岗位需要的技术,比如本岗位需要 spring cloud 外带 netty 和 dubbo,你简历上项目描述很花哨,前端有 vuejs 后端用 ssm,还有 jvm 调优经验,但关键技术没,那估计也没面试机会。
简历上有明显的缺陷或矛盾点,比如最近半年没工作,学历不够,或非计算机相关专业且技能描述过于简单,或项目时间和之前工作过的公司时间对不上。
其实我个人感觉,那么能力再一般,至少能用简历得到小公司的面试机会,只要你的简历符合如下的条件。
对于社招而言,学校,专业,学历其实重要性并不大,一些小厂或者外派岗位甚至更关注项目经验,但你要写清楚有足量的相关技术项目经验(比如 java),且要进一步用公司和项目经历证明这点。
写清楚你熟悉职位介绍上的技术,这同样是态度问题,你就仔细阅读每份职位介绍,然后针对性地完善项目介绍。
对于一些负面因素,一定要加上说明,比如你最近半年没工作,或最近跳槽太频繁,你可以给出客观理由,不是你主观上不稳定或能力差,是有其它客观因素,比如换城市发展,或者考研。
甄别项目经历的要点和发问方式
作为面试官,拿到简历后会通读其中的公司经历和项目介绍,以此来甄别真实的商业项目经验,哪些点比较可疑呢?
比如要招个 Java 开发,如果候选人有培训班经历,需要确认之前的经验是否和 Java 相关,一般情况下,候选人之前是没做 Java,这样候选人的相关工作经历年限就达不到面试要求了。
小公司但做大项目,比如公司规模也就几十号人,但用半年做了一个电商系统,而且里面分布式技术都用全了,那么这种项目需要重点甄别。
简历上最近的项目描述,候选人一般比较上心,此外还要看一年前或两年前的项目描述,看其中的技术是否有矛盾,比如有候选人两年前用的技术和最近项目用的技术都一样,估计是复制粘贴的,这就露馅了。
上述甄别的目的是,确认相关技术或经历的年限,排查自编或学习的项目经历年限,比如公司给的工资是针对3年项目经验的,如果你用虚假经历来顶替,那么一方面不利于项目组,另一方面就不利于其它候选人。
这些疑点是需要在技术提问前确认好的,也就是说,如果疑点被确认属实,就说明候选人相关技术年限不达标,就没有继续面试的必要了,那么怎么确认?
如果本项目组或其它项目组需要初级开发,而候选人简历上确实有疑点,一般我会明说,你xx项目看上去像学习项目,你和我说实话,如果你告诉我这些项目是真实项目,那就我按高级开发的真实项目面了,如果你告诉我是学习项目,那么我就用初级开发的标准面(或让其它项目组的面试官面),可能初级开发的工资会少,但问题相对简单。这样大多数候选人会说实话,这样两者方便。
如果没有初级开发岗,对于这些疑点项目,我会围绕如下的点来发问。
确认项目人数,项目周期和客户方,以及项目现在是否已经上线。对于编造或学习项目,一般项目都不会上线。
询问项目打包编译和部署的方式,一般的项目都用 maven 或 gradle 打包,或者用 ant 也算了,一般部署在 linux 上,出于可用性方面的考虑,会同时会部署在多台机器上。如果项目真实做过,候选人多少也能说出些,但如果是学习项目,那么回答就五花八门了,我甚至听说过部署在 windows 机器上的。
询问项目的管理方式,比如用什么工具来管理版本(比如 git 或 svn 等),代码 review 是怎么做的?用什么工具来管理 bug(比如 jira 等),用什么工具画 uml 图,怎么做单元测试?(比如 junit)开发代码时需要注意哪些规范。这些也是真实做过项目才能知道。
问你项目里怎么输出日志,你怎么通过日志来排查问题。一般上线后,日志都打在 linux 上,但如果是学习项目,则只能在 windows 上看日志了。
一般真实项目至少会配两套环境,一套测试用,一套上线用,而学习项目(甚至培训班项目)只会用一套。所以我也会对应地问,你项目是怎么搭建这两套环境,这两套环境里配置文件是怎么区分的?
通过上述方式我还真甄别出不少学习或虚假项目。其实我知道,上述甄别方式的作用有限,比如有候选人最近一个项目是真实的,但之前项目是自编的或学习项目,他完全可以用最近一个项目的说辞套在前一个项目里,这就需要用如下的甄别说辞的发问方式了。写到这里,我不敢庆幸,更不敢幸灾乐祸,只有叹息,职责使然,不敢拿公司的信任做人情。
值钱技术“嫁接”到真实项目上的甄别之道
其实在我之前的博文聊聊我当年在培训学校做开发的经历里已经提到,“半真半假”的项目经历最难甄别,这话怎么讲呢?
候选人的公司是真实的,项目也是真实的,但候选人用了这个真实的“壳”加入了虚假的技术。比如候选人在最近的项目里明明只做了最基本的增删改查,但结合项目背景和业务应用添加了从视频课里掌握的分布式组件、性能调优以及 JVM 调优的说辞。甚至可以这样说,有一部分程序员就在本身项目经验不足的情况下,靠这种技巧升级到资深开发或架构师。
作为面试官,当看到候选人在简历上有分布式之类的值钱经验时,就需要考核这些经验是真的从项目里积累的,还是只掌握了理论经验。如果候选人在简历中还有“培训班”、“小公司”和“转行”之类的要素,更要重点考核,如下给出具体的甄别之道。
第一问技术的使用背景,比如分布式用在高并发,分库分表和数据库调优用在大批量数据,就请候选人告诉我,你的业务里,哪些点需要用到这些值钱技术。有些候选人值钱技术只是从网络教学视频上学的,没项目实践经验,这个一问就能问出来。
第二问技术的最基本的用法,比如 Redis 缓存,就问如何以 Hash 表方式读取数据,对于 Dubbo,怎么设置超时时间,Kafka 里怎么设置消息重发,这些问题不求难,只要是用过就一定能知道,但不少候选人如果连这个都说不上,后面我就不会再问了。
如果能回答好第二层问题,那么至少说明候选人用过,接下来会是第三层的问题,问项目里解决过哪些实际问题,再具体些,用到分布式等技术总是要解决高并发等问题,我就问,你项目的并发量是多少?为了应对这个并发量,你项目里用到哪些组件,这些组件是如何构成集群,如何部署在 linux 上的?
以 Redis 举例,根据上述三层提问的方式,我一般会问如下的问题。
你项目业务的并发量是多少?结合一个业务场景,告诉我,你们项目用到了哪些 Redis 数据结构?
你们项目里,Redis 对象的缓存时间一般设多少?(一般项目都会设,否则对象会堆积在内存里,从而导致 OOM)
你们 Redis 集群一般是怎么搭建的?(项目里,出于重用性考虑,一般都用集群,不会用单机版)
Redis 持久化怎么做?消息通讯机制怎么做?如何压测?这些场景在项目里大概率能用到。
上述 2 到 4 点是问技术的用法,一般如果在项目里用过,多少会用到其中几个点,如果都说不上,那么可以说只会理论不会技术。
结合项目里遇到过的一个问题,你说下如何在项目里排查 Redis 方面的问题?具体来说,如何发现问题的?(无非是通过监控,通过日志,或者是用户投诉)如何分析问题的?(一般是看日志),然后如何定位和解决问题的?
对于其它组件,比如 dubbo,mycat,netty,kafka 等,也是采用类似的问法,第一问如何在项目里用,第二问细节,第三问如何排查解决问题。请注意在这阶段我不问底层代码,因为当前还是处于确认候选人技术的阶段,如果候选人过不了这关,只能说具备理论经验,这样通过看视频看资料准备的值钱技能基本就白费了。只有当能自证有项目经验,才有资格通过底层代码调优技能等细节来锦上添花。
候选人说出哪些点,才能证明值钱技术有项目经验
教你准备值钱技术的方法
根据我的体会,如果真的达到资深开发或者架构师级别,面试时大多能靠实力过关,只要结合做过的项目和排查过的问题,稍微准备些技术细节即可,因为他们在面试中能展示自己的亮点太多了。而对于一些只会增删改查的初级开发,或者没分布式组件实践机会的程序员,由于缺乏项目经验以及亮点说辞,这些人在挑战高一级的岗位以及大公司时,难度很大,有不少人就因此长时间停留在低级岗位或小公司,直到30岁和35岁来临。
所谓难者不会,会者不难,在这部分里,将给出一些通用性的技术整合项目经验的说辞,大家如何据此准备面试,大概率能让面试官认为,你有实践经验,毕竟面试顶多了才1小时。
技术结合项目需求的说辞,讲清楚xx技术用到xx场景里。
在这个项目的xx模块里,我用到了 Redis(或其它分布式组件),原因是这个模块的并发量达到了xx,单纯把请求压到数据库不行,所以得用 Redis 缓存,或者给出其它必须用分布式的原因。
在这个项目的订单处理模块里,由于某些流水表数据量太大,所以用到 Mycat 分库分表,具体的做法是,把百万级别的xx表拆分成 10 个表,按xx字段的最后一位,把数据插入到不同的分表里。
准备些技术的细节,并结合项目需求说出来,如下给出 netty 方面的说辞,至于其它技术,也请用类似的方式来组织。
在我们的线下商城项目里的收单和优惠券模块间,需要用 netty 转发收单模块的消息,在使用过程中,我们用到了 protobuf 作为 netty 的序列化协议,并在 encode 和 decode 方法里定义了序列化方面的代码,而且采用了 netty 整合线程池的做法。
准备些解决实际问题的说辞。
在测试环境里,通过 cat 组件会发现,我们的订单模块经常会发现内存使用量过高,而且通过一些 oom 时的 dump 文件,会发现内存溢出时,Redis 相关的内存用量过高,经过分析,发现 Redis 在缓存数据时,没有设置超时时间,后面再说下解决的方法。
在我们项目的测试环境里,经常会看到慢 SQL 的监控,经过看日志,发现是 Redis 并没有缓存住空或者不存在的数据,所以导致把请求全走到数据库,然后说下如何更改缓存规则。
如下再列些可能会出现问题的点:线程池设置不当会导致 OOM,Dubbo 调用超时时间设置过大会导致下游模块返回过慢,从而导致整条链路卡死,Kafka 重发机制没设置好,从而导致不幂等的现象,再不济,可以说 Java 里事务隔离级别设置过高从而导致数据库连接打满,或者是集合等对象用好没关,导致 OOM 问题。任何一个点,都可以围绕“通过监控发现问题”,“通过看 linux 日志定位问题”和“给出解决方案解决问题”来说,同时结合项目案例说明。
技术案例说辞+结合项目经历说明 = 面试成功
当前网上相关分布式技术和面试等课程很多,所以一些值钱的技术说辞,比如 MySQL 集群,Redis 缓存,秒杀系统整合等方面的技术说辞不难准备,甚至 Java 小白都能说得头头是道,但有不少候选人偏重于技术本身的说辞,不结合项目准备,甚至不知道要结合项目准备,可以说这已经是候选人在面试中的通病。由于方法不对,这就导致有部分候选人再怎么准备也过不了面试,甚至没有面试机会。别的不说,本人用本文给出的面试问法,确实甄别出了不少只会说,不会做的候选人。
对此,本文在介绍“甄别方法”后给出的面试说辞,乃至说辞背后包含的“结合项目准备”的方法,可以说是面试准备中的“关键少数”:不需要用太多的时间和精力准备,但不准备这方面的说辞大概率不过面试。可以这样说,这种“四两拨千斤”的面试技术,是本文价值所在,而如果大家能在面试中“顺带”地按本文给出的套路,结合项目需求叙述技术,一定能大概率地提升大家面试成功的可能性。
作者简介:10年大厂工作经验,有 IBM、花旗,平安等一线外企和互联网工作经验,8年 Java 面试官经验,了解面试 java 初级开发高级开发和架构师的背后一面,更熟悉各种在面试中展示亮点的技巧,5年线下 Java 职业培训经验,帮助过上千人拿到心仪的 Offer,5年架构师经验,大量高并发分布式组件的开发经验,更能在架构师面试官的角度给出高并发组件的面试技巧。著有《Java 核心技术及面试指南》。CSDN 博客专家。
更多精彩推荐
☞赞!网红程序员 AI 修复多国古老街景视频
☞漫画:应用程序被拖慢?罪魁祸首竟然是Log4j!
☞苹果市值突破2万亿美元;华为推出PC版HMS“擎云生态”;Android11将强制应用使用内置相机| 极客头条
☞YouTube 网红程序员一夜走红,修复美、日、俄多国街景视频
☞为什么说下一个十年的主战场在Serverless?
☞科普 | 定义 Eth2.0 中的验证者质量
点分享点点赞点在看