近期有机会坐到面试桌的另一面,感悟到一些当面试官的心得,和大家分享一下技术岗的招人、面试经验。希望能帮到读者更多地了解面试这件事。

@[toc]

作为面试官

作为面试官,最核心的任务就是找到适合目标职位的人,首先自己心中需要明白,做这份工作需要的核心能力是什么,在准备面试问题的时候围绕这些点来沟通,当然除了核心能力,一些通用能力也需要在对话中给出一定评分。
往往会由表入里地去尝试了解

  • 技能水平(体现在工作经历中)
  • 工作经验(知识结构与发展规划)
  • 能力水平(成长空间)
  • 沟通协作能力
  • 是否能做好自我管理和保持自驱
    等等方面来综合打分,短短一两个小时的时间很难看出究竟,所以最考验面试官的,是发问的思路和把控对话的节奏,在有限的对话中挖掘出最多的有用信息。

面试前

候选人给到的第一个印象来自简历,它是整场面试的基础。以下几点是面试官比较看重的

  1. 候选人准备简历是否用心(排版、错别字、内容信噪比、专业程度等等)
  2. 过一遍简历提及的经历,勾勒一个职业形象,从技能、经验、能力这三个核心要素上判断是否适合这个职位
  3. 看一下哪段经验是着重描写的,做些深挖的准备(比如了解下用到的技术栈)

面试中


可以从自己的自我介绍开始,简要的一两句话。

很多大公司会直接要求面试者做自我介绍,我觉得从面试官开始的自我介绍可以使面试者放松,从而更好地激发候选人表现出自己应有的水平。

简历中的信息

正式开始后第一个阶段,要确认简历描述的真实性。这份简历打动了你,所以你要知道坐在你对面的那个人是不是就是 TA 勾勒出的那个。

一般我会从最近的一份工作开始,问以下几个方面

  • 做了什么项目,项目的阶段
  • 候选人在项目中担任的角色,发挥了哪些作用
  • 探讨一些工作过程中遇到的问题以及解决方式

    如果说没有会造成一些负面分,因为尝试了解无果,实在想不起来的话候选人可以聊一些周边话题,但最好对简历中的内容有所准备

  • 项目带来的成长有哪些(是否有做回顾和反思)

走过几份重要的工作后,我会问一些统筹性的问题,在沟通中进一步了解面试者,这部分也可以由 HR 来问

  • 职业规划
  • 跳槽原因
    • 为什么想得到这份工作
    • 为什么选择这份工作

技术问题

准备一块白板无疑再好不过

算法 / 系统设计笔试题,第一次描述可以模糊一些,在后面的沟通中

  • 考察需求分析能力(边界情况是否有考虑清楚)
  • 考察系统设计能力和知识结构(算法、数据结构)
  • 考察代码落地能力(扩展性、性能、可读性、编程范式)

过程中需要和候选人保持沟通,不确定如何沟通可以参考 Google 面试过程。候选人不能很好引导沟通的话,面试官需要提供一些引导或帮助,注意面试是为了更好地了解对方以给出准确评价。在讨论方案的过程中逐渐明确需求、候选人的思路和解法,确保开始编码前把讨论推进到一个可实现的地步,候选人完成编码后可以在以下方面进行讨论

  • 有哪些 edge case?对算法有什么影响?
  • 目前算法的时 / 空复杂度?能否在某个点上进行进一步优化?
  • 你觉的代码有哪些问题?怎么来优化?
  • 如何去设计测试用例?

讨论到面试者踮踮脚能够到是比较合适的状态,要到达这个状态需要面试官也做好相应的准备,否则可能出现问不深的情况(可以参考 技术面试中,什么样的问题才是好问题?)。

为什么技术问题总是以算法 / 数据结构 / 系统设计的形式出现?

面试官和候选人往往有不同领域和背景的鸿沟,如果讨论业务属性特别明显的话题、或者需要大量背景知识或冷门知识才能进行讨论的话,很可能因为问题不具备普适性而把面试过程变成单向输出,无法建立有效的讨论基础,继而导致无法准确衡量候选人的能力,而考察算法和数据结构是一个工程师共通的基础能力,所有级别的工程师都应该有一定的掌握和了解。系统设计更偏向于针对思维模型、经验的考察,提问的内容一般不会特别深,但往往没有完美方案,需要做出考量和权衡,这个时候知识结构、思维角度、经验的作用更能体现出来。这套考察体系是以算法数据结构为基础,用系统设计来考察全面能力的一套大厂面试标准。

为什么感觉问不深,或者由于聊不到点上,面试进行不下去?

遇到面试进行不下去的情况,大多是因为没有建立一个工程师的有效讨论基础,往往可以从这几点上找问题

  1. 在只有一方熟悉的领域中死扣细节
  2. 一下子给出了过于抽象的信息,候选人懵了
  3. 候选人比较沉默,不主动发言
  4. 候选人想直接实现一个复杂版本,但是由于思路不清晰卡壳了
  5. 候选人一直泛泛而谈,很难作出判断是不是纯理论派,或者技术品味如何

对应的解决方式是

  1. 不必太扣经验上的细节,在考察技术能力这一块首先需要让双方有讨论的基础(这里双方的偏向可能性都是存在的,所以除了对方的专业领域以外,尽量基于一个中立问题来构建讨论基础)
  2. 通过举例来给对方更多信息,增进理解
  3. 先确认一下是否前两步已经没问题,如果 ok 的话,那么看一下是不是技术问题太简单 / 死板了,没有思考 / 发挥空间,导致无法进行深度考察。如果也不是这个原因,那么可能这个候选人的确不适合团队。
  4. 提示候选人不如从 brute force 的方式开始,毕竟一个可工作的版本是远好过一个不能跑的版本的(这个可工作版本就是讨论基础)
  5. 尝试写点代码,或者尝试给出一些针对对方思路的反对论调,看对方的反应如何

为什么从模糊的问题到细节的明确这一步很重要?

这是一个工作常态,需求来自问题,而一开始的问题是缺少细节的,通过软件来解决问题的过程,是把需求从提出到分析、归纳、思考、抽象并映射到一个软件问题的过程,这会直接关系到解决问题的能力。一个 junior 工程师的思维方式往往是把分配给他的任务做完,而一个 senior 工程师会了解清楚这个需求的来龙去脉,需求本身是否合理,在系统中的影响面有多大,在软件层面如何做系统设计来保证性能、扩展性和可维护性等等。

为什么尽量避免特定语言、框架、知识?

特定技术的经验或能力并不能和软件工程能力划等号,因为技术本身会被淘汰,只有了解技术本质的工程师才是企业需要找的人才。除了这一点以外,对其他背景的人来讲,具体的技术考察是有失偏颇的。尽量使用上限比较高的、不需要很多额外信息的、中等难度 CS 相关问题来作为主问题来展开讨论。如果候选人明确表示自己有这方面知识,那么考察一下是可以的,但不应该作为一个基本问题来考察候选人,否则会容易发生对能力的误判。

当然如果要招的就是特定语言、框架、知识体系下的,那么这些都是要作为基本考察点的。

为什么是否可以融入团队很重要?

团队风格是工作中很重要的一件事情,如果因为人的原因导致有很多摩擦,进而阻塞工作进度是管理上极其不能接受的事情。构成一支优秀团队的必要因素中很重要的两点是自管理以及顺畅的信息流通,不能融入团队在这两个方面都是会拉低团队水准的。

开放性问题

开放性问题让你对面试者有一个更感性的认识,可以侧面了解面试者的谈吐、性格、兴趣、自驱能力、信息获取能力、分享意愿等等,这里列了几个,大家可以发散思维

  • 对自己的发展规划是怎样的(为了实现目标做了些什么?是否有拆解?是否遵循自己制定的计划?是否有回顾?)
  • 如何分享自己的心得(什么渠道?哪些形式?如何评价自己的分享效果?)
  • 行业这几年的变迁、针对这些变迁的看法(对行业内的变化是否有所思考?是否有应用的案例?)
  • 关注哪些技术不相关的领域,有哪些获取信息的渠道?
    • 设计
    • 政治
    • 经济
  • 如何做调研?
  • 完成过最有难度 / 成就感的事情?工作中最享受什么?(感兴趣的点在哪里?)
  • 遇到过的最大挑战?(抗压能力如何?)
  • 如何达到最佳工作状态?(工作常态是怎样的?)

简要介绍情况

问的差不多了,有意思的话可以介绍一下公司的情况,部门的组成情况,职位具体从事的工作,一般的工作流。

这个环节主要是介绍 + 拉票,可以突出自己公司的优势。

  • 公司情况
    • 做什么业务
    • 行业怎样,行业中什么样的水平
    • 价值观
    • 近期规划,远期规划
  • 工作内容、时间、强度、环境
    • 需要做到什么程度
    • 组中会和谁共事
    • 向谁汇报
    • 升职机会
  • 薪资结构、福利

询问面试者,对职位或者公司有什么问题,对问题作出回答。

面试不是单向筛选,这个环节在一个完整的面试过程中必不可少,它的重要性不亚于面试官询问的所有问题。除了展示面试官、公司的专业性以外,同时给出人性的面试环境,给面试者留下一个更好的印象。

送一下

视是否是最后一个环节定,礼貌非常重要

面试后

面试完和 HR / 面试小组的其他面试官沟通一下聊了哪些方面,自己的评价如何,哪些方面还需要更多的了解,以便后续面试进行有侧重点的考察。


作为面试者

作为面试者,最主要的就是展现自己应有的水平,不论是技术上还是沟通上。

面试前

  • 自己竞争这个职位的优势是什么
  • 为什么想要得到这份工作
  • 外表整理一下
  • 放松,不轻浮,娓娓道来

面试中

假设面试官没看过你的简历,做一个有亮点的自我介绍,最好引一两个实际发生的例子,有助于建立立体印象。

核心问题

  • 证明自己的能力满足职位要求
  • 是否在自己的职业规划中
  • 能给团队带来什么

技术问题的探讨

  • 要了解清楚问题所处的环境
  • 沟通清楚需求本身的边界,输入 / 输出 / 异常
  • 给出自己的几个思路,可以从简单的开始(需要是一个完整的 solution)
    • 自上往下的思路优于自下往上的思路,需要合理拆分子任务
  • 完成 solution 的实现后基于自己的 solution 给出评价(时空复杂度、工程隐患等等、写法建议)

“你还有什么问题要问我吗?”

针对上面列出的一些点,哪些存疑的,可以针对对方身份来询问。比如平级面的时候,询问一些工作内容;项目组长面的时候,询问项目内容、进度、人员构成等等;CTO 面的时候可以问一些技术方针、目前团队的长处和不足、如何管理、如何克服、如何发展、团队项目如何配比、或者一些涉及价值观上的问题;HR 面的时候可以就薪酬制度、福利、休假等话题着手。

这个时候也可以通过抛出问题来展现自己的眼界、技术储备、价值观等等,越是高管越可以深入聊一下,千万不能错过这个互相了解的机会,而且如果没有问任何问题,会显得缺少求职意愿。

行业相关问题

  • 行业如何,前景如何
  • 公司竞争力如何

公司相关问题

  • 工作环境怎样
    • 工作时间怎样?加班?弹性?
    • 有助于集中精力吗?
    • 协作流程怎样?
  • 公司基本情况
    • 人事架构
    • 薪资架构
    • 技术架构
    • 人员流动性
    • 有培训嘛?

团队相关问题

  • 团队人员构成
    • 人员流动性
    • leader 背景
  • 项目内容
    • 最大挑战是什么?如何解决的?
    • 有什么不满意的要在将来改进?
    • 觉得目前做的很好的方面?
    • 如何做选型?
    • 项目技术栈变过嘛?有的话迁移过程怎样?
    • 代码质量(如何保证?)
    • 最近期的一次重构是做的什么内容?
  • 团队如何协作
    • 开会频率?(是否有代码评审?需求评审?如何做好排期?)
    • 开发模式、流程?瀑布?敏捷?效率如何?合适团队嘛?
    • 迭代周期(报告周期?是否有做每个周期的计划?OKR 还是 KPI?如何做的目标管理?是否有 review?)
    • 团队 IM 用的哪个?做了哪些 IM 集成?
    • 发布流程(做了哪些自动化?如何保证发布不出错?有无服务中断要求?发布完是否有 review 会?)
    • 备份流程(是否有?)
    • 故障流程(是否有故障演练?是否有错误收集?如何复现 / 调试线上问题?)
  • 技术栈
    • 技术债有哪些?
    • 现有技术栈是什么样的?
    • 将来的规划
    • 迭代周期

职位相关问题

  • 能得到什么提升?(具体一点可能问的是直接问面试官认为他的成长最大的是哪方面?)
  • 升职机会
  • 人员流动性
  • 在公司的角色,上下游分别是?
  • 工作职责

面试官

可以了解一下面试官,问一些他工作中的事,从侧面了解一下公司

  • 做什么工作
  • 工作期限
  • 碰到什么难点
  • 有没有什么开源项目

薪资

薪资谈判是一个博弈的过程,一般小公司的薪资比较随意,没有很健全的体系,你可以从面试官面你的过程中感觉一下他对你各方面水平的评价,提出一个自己比较舒服的薪资要求。

  • 询问面试官公司薪资结构
  • 薪资之外有什么福利
  • 税前税后
    • 如何交
  • 根据对方的说明来报价
    • 根据能力定工资
    • 根据行业薪资区间
    • 根据能发挥的价值、契合度

面试后

  • 总结自己的表现
  • 心态放平,面试就像相亲,不只看能力,也看缘分
  • 一般一周会出结果,如果没有联系你,可以主动联系一下对方询问原因
    • 原因也不一定是真的,他们才不会告诉你他们预算不够 / 你是备胎这个大实话啊啊啊

一些通用的技巧

  • 所有的谈判都需要余地,话不要说死
  • 多用客观角度
  • 尊重对方,话要有专业性

延伸阅读