写在前面
从去年开始,作为一面面试官,陆续面试了30+候选人,在这里分享一下感悟。
面试流程与考察方面
面试流程
以我经历的面试为例,基本的流程如下:
- 候选人自我介绍:基本情况与项目
- 针对项目提问
- 编程题
- 基础:语言基础、框架、中间件
- 候选人向面试官提问沟通
一面的定位
候选人进入一面,说明已经通过了HR与leader的简历筛选,我认为一面的定位是: 筛选技术能力与工程能力良好、沟通顺畅的候选人。这么定义有些宽泛,下面我会详细讨论。
项目经历
不同公司的业务差异很大,即使是同一公司同一小组,每个人做的事情也各不相同。考察的要点是:
- 项目背景
- 候选人的工作:主要参与了哪些部分
- 候选人对上下游的了解
- 上游如何生产数据,下游如何消费数据,即整个的数据链路
- 对系统的整体架构的了解
- 收益的评估:项目对团队/公司带来的技术/业务贡献
这里详细说下对项目收益的评估,做项目的目的是解决问题,既然通过了需求评审+技术评审,就需要评估项目上线后的收益,不做无用功。根据不同的项目分类,我提供几点思路:
- 技术基建类:技术团队使用
- 稳定性:比如搭建微服务监控体系,线上问题发现缩短xxx,事故减少xxx
- 开发效率:比如开发了xxx插件,自动生成xxxx
- 安全性:比如统一记录xxxx日志,每一个操作可追溯到人
- 业务平台:产品运营使用,配置广告/活动等等等
- 效率:比如广告投放平台,广告投放效率提高xxxx
- 成本:比如更精细的广告投放
- 用户增长:此类平台的最终目标,通过配置不同的策略,拉新/激励老用户参与
- 直接面向B/C端用户的功能
- 盈利情况:使用人数提高xxx,付费人数xxxx
- 用户体验:比如提高了用户点击率,促进创作者发布等等
项目收益这里,主要考察候选人对项目的认可度,希望候选人认为做这些事情是有意义的。如果一些收益指标无法估计,作为研发,至少应该了解相应的QPS、数据量等。
编程题
程序员面试考编程题是无法避免的,写代码是程序员的基本能力,编程题考察的就是理解问题、分析问题、将解决方案转化为代码的能力。这里只聊一下我个人的喜好:
- 我个人偏爱的题目
- 题目简单易懂
- 代码量较少,重分析的题目:比如二叉树/链表/递归等
- 容易实现暴力解法,需要加以分析找出优化点
- 这些题目没必要出
- 偏题、超难题:比如题目超长或者难度hard的题目
- 大家都会刷的题:例如有次考察合并2个有序链表,感觉候选人直接默写了出来,提问边界条件为什么要这样写,完全不知道
- 奇技淫巧:比如什么脑筋急转弯,分析了半天,最终答案就一行代码
- 面试官都hold不住的问题
这一部分主要是考察候选人的逻辑思维与代码能力,我个人的评分是逻辑清晰&写出优化解>提示下出优化解>能想到优化思路但无法写出代码>逻辑混乱。这一环节,如果候选人在提示下能想到优化思路,代码逻辑结构正确,即使边界有些瑕疵,也已经达到了我的及格线。
工程能力
对工程能力的考察包含在各个环节中,这里单独列出来,是因为我见过不少刷题溜的飞起,工程能力一塌糊涂的候选人。
- 服务稳定性
- 候选人是否对微服务监控体系有所了解,如何快速标识出问题的请求
- 很多人简历中都会提到写过技术方案,那么新旧接口如何兼容、回滚方案、出问题如何快速恢复(这类问题回答的好,也能侧面印证候选人对项目上下游比较了解)、是否有灾备方案
- 业务监控
- 问题排查与解决,如果候选人简历中提到该类问题,可以细问
如何面试比自己更牛的程序员
作为一面面试官,我经常会面试到一些更资深的程序员。这些候选人比我年长、经验更丰富,那么该怎样面试这些候选人呢?
- 正视候选人
- 尊重:尊重这些前辈,聚焦于技术本身,不问一些烂大街问题刁难候选人
- 不卑不亢
- 面试偏向
- 求同存异:如果业务差异较大、编程语言也不同,可以考察数据库、并发、工程能力等
- 编程:侧重逻辑思维与编码,识别候选人是否脱离一线开发很久了
- 项目:更多看候选人对整个系统是否有全貌认知,项目难点在哪里
最近行情不太好,也面试了一些被裁员的兄弟,我本人也有被裁员后焦急找工作的经历。同样是工作经验3年的程序员,技术水平的差距可能非常大,程序员还是要多多磨练技术。
最后
最后想说,面试是候选人的舞台,面试官只是引导。祝愿广大程序员朋友都能找到心仪的工作,也希望我能成长为我心目中的资深程序员。
关注关注,主页更多的java课程学习路线,笔记,面试等架构资料