临近年关, 今年面试跳槽的人特别多, 关注我的朋友都知道我不轻易做分享, 因为这没有标准答案, 看法也因人而异. 但我发现有些面试问题还挺普遍的, 今天就说说我做面试官这几年的经验, 从面试官的角度去看面试, 希望对在准备面试以及想要提升的程序员们有点启发, 以下仅是个人经验总结:
如何阅读候选人简历
阅读候选人的简历, 这是招聘流程中的第一项工作. 候选人的简历各式各样, 工程师们一般都比较忙, 如何快速的阅读简历又不失重点呢? 我根据自己的经验总结了几点, 供大家参考:
首先, 对于候选人来讲, 大公司的工作经历是很重要的能力, 而且级别越高可以粗略等同认为越优秀, 虽然也会有个例, 但一般情况下, 阿里 P8 要比 P7 技术能力优秀, 百度的 T7 要比 T6 优秀. 但是这种情况只针对大公司, 对于一些小公司, Title 并不与能力划等号, 小公司技术总监的技术能力不如大公司的一个普通的资深工程师的情况也是常有的事情.
其次, 有比较有技术含量的项目经历, 我发现有很多工作年限比较长的候选人, 简历十几页, 项目大大小小几十个, 而很多项目都是 3,5 个月就做完, 用到的技术也比较重复, 浅显. 对于候选人的技术积累来说, 10 年的经验跟一年的经验差不多, 所以项目不在多, 而在于能提现候选人的技术能力.
还有, 有高质量的开源项目; 项目背景比较切合; 有在技术网站发表过文章或高质量的技术博客; 做过一些业余项目等, 都可以作为加分项.
少问记忆性问题和太理论性问题
有些 JAVA 面试官逢人便问 JVM 几种垃圾回收算法优劣对比, 这种文科题目在我看来是没有太大意义的, 一方面没有区分度, 另一方便容易突击准备, 往往考察不出候选人的真实能力. 所以我面试不直接问记忆性问题, 也不直接问理论性问题, 而是换个问法, 将这些记忆性的, 理论性的知识融入实践.
比如, 有些面试官为了考察候选人多线程方面的知识, 经常会问到的题目比如 ConcurrentHashMap 的实现原理, volatile 关键词的作用等, 我之前也多次拿这些题目当做过面试题, 但总结下来发现, 大部分候选人都能答得七七八八, 区分度很低. 我之后换了一种问法, 要求候选人将一个线程不安全的类改写成线程安全的类, 这期间涉及到 volatile,lock, 并发容器, Atomic 原子操作, CAS 无锁编程等, 发现只有极少部分候选人给出锁粒度小, 并发度高的代码, 部分候选人在提示下可以解决, 一些候选人则仅能写出一把 synchorinzed 大锁的并发度很低的代码.
事实很明显, 那些能够给出优秀答案的候选人, 必定是有着实践经验, 并且深入思考过, 真正理解的人, 而相反, 其他人可能只是临时看了几篇技术博客而已.
白板编程真的有必要吗
白板编程外企面试比较流行, 国内有些候选人不怎么接受, 特别是工作年限较长的, 一说要写个代码, 求职者就觉得是在 "羞辱" 他, 觉得不应该从这么基础的问起.
不过根据我的面试经验发现, 这种拒绝写代码的大龄码农, 满嘴架构, 高可用, 高性能, 分布式, 往往一写代码就抓瞎, 代码写的惨不忍睹.
白板编程一般会问哪种类型的题目呢? 举一个我之前经常用的例子:
"写一个函数将 ipv4 地址字符串 (仅包含数字, 点, 空格) 转化成 32 位整数, 另外, 数字和点之间的空格是合法的, 其他情况均为非法地址, 要求输出合法地址的 32 位整型结果."
这个题目不需要任何的算法背景和技巧, 纯粹考察候选人的基本编程素质: 逻辑思维是否清晰, 细节是否考虑全面, 是否能写出 bug free 的代码, 是否有计算机思维能关注时间空间复杂度等. 而且在候选人完成代码之后, 我还会要求候选人将代码讲给我听, 当然不是因为我看不懂, 而是这样还能顺带考察候选人的表达能力, 沟通能力, 毕竟讲给别人听让别人理解要比单纯自己理解难很多.
智力问题为什么会收到青睐
我们经常在网上看到说谷歌, 微软等大外企经常会面试智力题目, 我认为智力问题不在于候选人最终是否能提出标准答案, 而在于提供一个话题跟面试者讨论. 考察候选人是否是一个有想法的人, 思路是否清晰, 逻辑推理能力是否够强, 总结能力是否够强等等基本素质.
智力问题最好是比较开放性的问题, 一定不要太难的问题, 也不要是抖机灵的问题. 有很多面试官拿数学难题考候选人, 希望 45 分钟答出来标准答案, 这本身就是不可能, 除非之前候选人已经看过, 这样的问题也就没有意义了.
当然, 智力问题也并不是适合所有的公司. 一般成熟型的大公司, 对候选人可以接受比较长的培养时间, 而且默认聪明的人学习能力都很强, 所以对过往技术经验并非特别的看中, 所以一般喜欢面试算法, 智力问题. 对于一些创业型公司, 更看重候选人的工作经验, 青睐技术多面手, 来了就能产出, 所以就不适合在智力问题上浪费太多的面试时间.
把面试当做一场技术讨论
筛选候选人就是筛选将来与你共事的人, 所以为了更准确的反应候选人在以后的工作中的表现, 不妨把面试当做一场与未来同事的技术讨论, 在讨论的过程中感受候选人的技术能力.
技术面试就好比打乒乓球, 一来一往中感受彼此的技术实力, 面试的过程切忌类似与笔试一样的一问一答单向沟通. 特别是一些开放性问题, 架构设计的问题, 本身就没有标准答案, 背景又过于复杂开放, 如果只是丢给候选人回答, 中间没有任何沟通交流和引导, 候选人是很难抓住重点展现出面试官心里期望的表现.
比如我们面试过程中经常会让候选人介绍某个项目的架构设计, 如果面试官能一语中的的提出设计中的缺陷, 或者追问架构中的技术难点, 深入的跟候选人讨论, 这样一方面能给候选人充分发挥的机会, 另一方面, 也会赢来候选人对公司技术的认可.
技术水平才是根本
相信很多工程师随着面试经验的积累, 即便没有经过培训, 面试工作也可以做的非常好, 因为毕竟优秀的工程师都逻辑清晰思维敏锐, 而对于正在进阶学习的程序员们, 则需要通过系统地梳理来提高自己的技术水平和形成架构思维.
针对当前互联网公司的技术需求以及结合主流技术, 我自己整理了一套系统的架构技术体系. 不少公司都很重视高并发高可用的技术, 特别是一线互联网公司, 分布式, JVM,spring 源码分析, 微服务等知识点已是面试的必考题, 这些东西可能你们平时在工作中接触过, 但是缺少的全面系统的学习, 后台私信回复 "架构", 免费领取架构资料, 希望本文能给大家在成长的过程提供一点帮助.
一, 工程化专题
二, 性能优化专题
三, 源码分析
四, 分布式专题
来源: http://www.jianshu.com/p/06b081c9c3c5