I. 面试过程

在大多数顶级科技公司(以及许多其他公司),算法和编码问题是面试过程中最大的组成部分。这类问题都可以被视为问题解决型(problem-solving)的问题。面试官希望能通过观察你解决以前没有遇到过的算法问题的过程,来评估你的能力。

很多时候,在面试中你可能只会遇到一个问题。因为 45 分钟并不长,在这段时间内你很难全部回答完几个不同的问题。

在整个解决问题的过程中,你应该大声地说出你的方案,并解释你的思考过程。你的面试官有时会跳出来引导你,让他们这样做。这是正常的,并不意味着你做得很差。(当然,不需要提示就更好了。)

在面试结束后,面试官一般会对你的表现就已经有了直观的感觉。他们可能会给你的表现打分,但这并不是一个定量的评价。没有图表显示你在不同的事情上得到了多少分。面试本身就不像是那样工作。

相反,你的面试官对你的表现进行评估,通常是基于以下几点:

  • 分析能力:你需要很多帮助来解决问题吗?你的解决方案有多优?你花了多长时间才找到解决办法?如果你必须设计/架构一个新的解决方案,你是否很好地组织了问题并考虑了不同决策的权衡?

  • 编码水平:你是否能够将算法成功转换为合理的代码?它干净有序吗?你是否考虑过潜在的错误? 你的代码风格好吗?

  • 技术知识/计算机科学基础知识:你是否拥有计算机科学和相关技术的坚实基础?

  • 经验:你过去做过很好的技术决策吗?你做过有趣、有挑战性的项目吗?你是否表现出动力、主动性和其他重要因素?

  • 文化契合/沟通技巧:你的个性和价值观是否与公司和团队契合?你和面试官是否能够良好沟通?

这些领域的权重将根据问题、面试官、角色、团队和公司的不同而有所不同。在一个标准算法问题中,它主要考察的几乎完全是前三个方面。

Why?

这是求职者在开始面试时最常问的问题之一。为什么面试要设计成这样?毕竟:

  1. 很多优秀的求职者在这类面试中都表现不佳。

  2. 如果确实出现过,你可以直接查找到答案。

  3. 在实际工作中,很少需要使用诸如二叉搜索树之类的数据结构。如果你确实需要,你肯定可以学习它。

  4. 白板编码是一种人为的环境。显然,在实际工作中你永远不会在白板上编写代码。

这些抱怨不无道理。事实上,我同意他们所有人的观点,至少部分是这样。

与此同时,我们有理由对某些职位(而不是所有职位)采取这种做法。同意这个逻辑并不重要,但是理解为什么要问这些问题是一个好主意。它能帮助你深入了解面试官的心态。

漏报(False negatives)是可以接收的。

这让人难过(也让候选人感到沮丧),但这却是事实。

从公司的角度来看,一些优秀的候选人被拒其实是可以接受的。如果这家公司打算自己培养一批优秀的员工,他们可以接受错过一些优秀的人。当然,他们也不想这么做,因为这会增加他们的招聘成本。不过,这是一个可以接受的折衷方案,只要他们仍然能够聘用到足够多的优秀人才。

他们更关心的是误报(false positives):那些在面试中表现很优秀的人,但实际上并不是很优秀。

解决问题的能力(Problem-solving skills)很有价值。

如果你能够解决几个难题(或许是在一定的帮助下),那么你可能非常擅长开发最优算法。换句话说,你很聪明。

聪明的人倾向于将事情做好,这对公司来说很有价值。当然,这不是唯一重要的,但这是一件非常好的事情。

基本数据结构和算法知识很有用。

许多面试官会认为,基本的计算机科学知识实际上是有用的。要清楚,需要用到树、图、列表、排序和其他知识的情况隔段时间肯定会出现。如果真是这样的话,掌握书本的知识真的很有必要。

难道不可以遇到问题的时候根据需要有选择地学习吗?当然可以。但是如果你不知道二叉搜索树的存在,你就很难在需要的时候知道应该去使用它。如果你知道它的存在,那么你具有了基本的概念。

其他面试官依靠数据结构和算法相关的问题来考察求职者,是因为他们认为这是一个很好的“代理”。即使这些技能本身并不难学,但他们表示,这与成为一名优秀的开发人员是有相当大的关联的。这意味着你要么通过了计算机科学课程(在这种情况下,你已经学习并保留了相当广泛的技术知识),要么自学了这些东西。无论哪种方式,这都是一个好迹象。

数据结构和算法知识出现的另一个原因是:很难提出不涉及它们的问题解决型(problem-solving )的问题。事实证明,绝大多数解决问题的问题涉及其中一些基础知识。当足够多的应聘者了解这些基本知识时,很容易进入一种向他们提问的模式。

白板能让你专注于重要的事情。

在白板上编写完美的代码是非常困难的,这是绝对肯定的。幸运的是,你的面试官对此并没有苛求。实际上,每个人都有一些 bug 或轻微的语法错误。

白板的好处在于,在某种程度上,你可以专注于大局。你没有编译器。所以你不需要编译代码。你不需要编写整个类定义和样板代码。你可以关注代码中有趣的、“充实的”部分:该问题真正关注的功能。

这并不是说你应该只写伪代码或者正确性无关紧要。大多数面试官不接受伪代码,并且希望错误越少越好。

白板也倾向于鼓励候选人多发言,并解释他们的思维过程。当给应聘者一台电脑时,他们的沟通能力会大幅下降。

但这并不适用于每个人、每个公司或每种情况。

以上部分旨在帮助你了解公司的思维过程。

我的个人想法? 对于正确的情况,如果面试过程处理得当,是能够帮助对一个人解决问题能力做出的合理判断的,因为表现优秀的人往往相当聪明。

然而,许多面试过程体验的并不好。你可能会遇到你的面试官很差劲,或者他们问的问题也很差劲。

它也不适合所有的公司。有些公司应该更重视员工以前的经验,或者需要掌握特定技术的技能。那么这类问题并没有太大分量。

它也不能衡量一个人的职业道德或专注力。再说一次,几乎没有面试过程能真正评估这一点。

无论如何,这都不是一个完美的过程,但什么是完美的过程呢?事实上所有的面试过程都有其缺点。

我只能说:事情就是这样,所以我们只能尽自己所能。

面试题是如何被选择的

应聘者经常会问在某家公司“最近”的面试问题是什么。仅仅问这个问题就揭示了他对问题来源的根本性误解。

在绝大多数公司,面试官该问的问题并没有一个清单。相反,每个面试官都会选择他们自己的问题。

因为就问题而言,它是“对任何人都开放的(free for all)”,所以没有什么能让一个问题成为“最近 Google 面试的问题”,除了一个碰巧在 Google 工作的面试官最近碰巧问了这个问题。

今年 Google 面试被问到的的问题与三年前的问题并没有太大区别。事实上, Google 提出的问题通常与在类似公司(Amazon、Facebook等)提出的问题没有什么不同。

不同公司之间存在着一些广泛的差异。一些公司专注于算法(通常被用于一些系统设计),而另一些公司则非常喜欢基于知识的问题。但在一个给定的问题类别中,几乎没有什么能让它“属于”一家公司,而不是另一家公司。Google 的算法问题和 Facebook 的算法问题本质上是一样的。

一切都是相对的

如果没有评分系统,你是如何被评估的?面试官如何知道你的期望?

好问题。一旦理解了,答案就会变得很有意义。

面试官会通过在同一个面试官的同一个问题上的表现评估你与其他候选人的优劣。这是一个相对比较。

例如,假设你想出了一个很酷的新脑筋急转弯或数学问题。你问你的朋友 Alex 这个问题,他花了30分钟来解决它。你问 Bella,她花了50分钟。Chris 永远也解不出来。Dexter 需要15分钟,但你必须给他一些重要的提示,如果没有这些提示,他可能会花更长的时间。Ellie 采用了 10 种方法,并提出了一个你甚至都不知道的替代方法。Fred 需要35分钟。

你会走开,说道,“哇,Ellie 表现得真不错。我敢打赌她的数学一定很好。”(当然,很有可能只是她比较走运,而 Chris 不走运。你可能会问更多的问题,以确保这不是因为运气好或运气坏。)

面试问题也是如此。面试官通过将你与其他人进行比较,会对你的表现有所了解。当然这和她那周面试的候选人无关,而是基于她曾经问过这个问题的所有候选人的表现。

因此,被问到一个很难的问题并不是一件坏事。如果对你来说很难,那对每个人来说也都是很难的。这并不会降低你成功的可能性。

FAQ

我在面试后没有立即收到回复。我被拒绝了吗?

不。公司的决定可能会被推迟,原因有很多。一个非常简单的解释是,你的一位面试官还没有给出他们的反馈。很少有公司的政策是不回应他们拒绝的候选人。

如果你在面试后的 3~5 个工作日内没有收到任何公司的回复,礼貌地和招聘人员联系。

我被拒绝后可以重新申请公司吗?

几乎都是可以的,但你通常需要等待一段时间(6 个月到 1 年)。当你重新面试时,你的第一次不良面试通常不会对你产生太大的影响。许多人曾被 Google 或 Microsoft 拒绝过,但后来都得到了他们的 offer。