第 1 章 面试流程

第 1 章 面试流程

在大多数顶尖科技公司和许多其他公司的面试中,算法和编程问题占最大一部分。这些问题可以归类为问题解决型题目(problem-solving question)。面试官希望测试你解答未见过的算法题目的能力。

很多时候,你或许只能够在一场面试中完成一道题。45分钟并不长,在这样短的时间内很难解决几个不同的问题。

整个解题过程中,你应该尽可能地大声讲解你的思考过程。有时面试官或许会中途打断你,想给你一些提示。没关系,这十分常见,而且这并不意味着你表现得很糟糕(当然不需要提示则会更好)。

面试结束后,面试官会对你的表现有一个基本的印象。或许,他会为你的表现打一个分数,但是,分值实际上并不代表一个定量的评价。从来没有一个表格能列出不同的表现应该获得多少分,面试成绩并不是这样得出的。

其实,面试官一般会根据以下几个方面对你的表现做出评价。

  • 分析能力:你在解决问题的过程中是否需要很多帮助?你的解决方案优化到了什么程度?你用多长时间得出了解决方案?如果不得不设计或者架构一个新的解决方案,你是否能够很好地组织问题,并且全面考虑不同决策的取舍?
  • 编程能力:你是否能够成功地将算法转化为合理的代码?代码是否整洁且结构清晰?你是否思考过潜在的错误?你是否有良好的编程风格?
  • 技术知识、计算机科学基础知识:你是否有扎实的计算机科学以及相关技术的基础知识?
  • 经验:你在过去是否做出过良好的技术决策?你是否构建过有趣且具有挑战性的项目?你是否展现出魄力、主动性或者其他的重要品质?
  • 文化契合度、沟通能力:你的个人品质和价值观是否与公司和团队相契合?你和面试官是否沟通顺畅?

这些方面的权重会根据不同的题目、面试官、职位、团队和公司有所变化。对于一个标准的算法题目,面试的表现基本上完全取决于前三个方面。

1.1 为什么

这是求职者在开始准备面试时最常见的问题之一。面试流程为什么是这样的?现实中可能存在以下情况。

(1) 许多出色的候选人在这些面试中表现不佳。

(2) 如果真的遇到这样的问题,你可以查找答案。

(3) 在现实世界中,你很少会使用诸如二叉搜索树之类的数据结构。如果你确实需要,肯定可以学习。

(4) 白板编程是模拟的环境。显然,在现实世界中,你永远不会在白板上编写代码。

这些抱怨并不是没有依据的。事实上,我至少在一定程度上赞同这些说法。

同时,对于一些职位(并不是所有职位),有理由以这种方式进行面试。你是否同意这样的逻辑并不重要,但是你最好能够了解在面试中为什么会问及这些问题,这有助于你理解面试官的想法。

1.1.1 错过了优秀人才是可以的

虽然令人难过(也令求职者沮丧),但这是真的。

对公司而言,优秀的求职者被拒实际上是可以接受的。公司的目的是组建强大的员工队伍,因此可以接受错过优秀求职者这一事实。当然,公司并不希望出现这样的情况,因为这样会增加招聘的成本。尽管如此,只要仍然可以拥有足够多的优秀员工,这是一个可以接受的折中方法。

公司更担心的是“错误肯定”:一些人在面试中表现得很好,但实际上并不是非常优秀。

1.1.2 解决问题的技能很宝贵

你如果能够独自或在一些提示下解决几个难题,那么你很可能擅长于开发最优算法。你是个聪明人。

聪明的人往往能够出色地完成工作,这对公司来说是很有价值的。当然,这不是唯一重要的事情,但是这是个非常重要的亮点。

1.1.3 基础数据结构和算法知识很有用

许多面试官认为,计算机科学的基础知识实际上非常有用。树、图、链表、排序等经常会在工作当中出现,所以应该掌握这些知识。

你可以根据需要学习这些知识吗?当然可以。但是,如果你不知道二叉搜索树的存在,就很难知道何时应该使用它。而如果你知道它的存在,那么也就基本上掌握了它的基础概念。

另外一些面试官认为,依靠数据结构和算法来判断求职者的表现是一种很好的“替代”手段。即使这些知识学起来并不是很难,但是他们认为,是否掌握这些技能和能否成为优秀的开发人员有很强的相关性。掌握这些知识往往意味着你已经完成了计算机科学专业的学历教育(在这个过程中,你已经学到并掌握了相当广泛的技术知识)或者自学了这些知识。无论哪一种情况,这都是一个好的信号。

数据结构和算法知识出现在面试中的另一个原因是:很难问一个涉及这些知识的问题解决型题目。事实证明,绝大多数问题解决型题目都涉及一些相关的基础知识。当有足够多的求职者掌握这些基础知识时,考查有关数据结构和算法的问题则很容易形成一种模式。

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

要在白板上编写完美的代码,确实十分困难。不过面试官并不期望你能够做到完美。绝大多数人的代码中会出现一些bug或小的语法错误。

白板的好处在于,你可以在某种程度上专注于整体结构。你并没有编译器,所以不需要使代码能够通过编译。你也不需要写出整个类的定义和样板代码。你应该专注于代码中有趣、关键的部分,即题目所要求的核心功能。

这并不是说你应该只写一些伪代码,也不是说代码的正确性无关紧要。大多数面试官并不接受伪代码,而且代码中的错误越少越好。

另外,使用白板会鼓励求职者多交流、多解释他们的思考过程。而如果给求职者一台计算机,则会大大减少与他们的交流。

1.1.5 但这并不适用于每个人、每家公司和每种场合

上述内容旨在帮助你了解公司的想法。

我个人怎么看?在适当的场合,当这样的面试流程有效时,可以对求职者的问题解决能力进行合理的判断,因为表现出色的人往往比较聪明。

然而,这样的面试流程并不总是奏效的。你或许会遇到不称职的面试官,或者面试官会问及不合适的题目。

另外,这样的方法也并不适合所有的公司。一些公司会更重视以前的经验,或者需要求职者具有特定的技术能力。而这些数据结构和算法问题并没有考虑到这些方面。

这样的过程也不会衡量求职者的职业道德或者专注力。然而,几乎没有任何一种面试流程可以评估这方面的能力。

该面试流程并不是完美的,但是又有什么样的面试流程是完美的呢?所有的方法都有缺点。

我的结论是:现实既然如此,只需尽力而为,做到最好。

1.2 面试问题的来源

求职者经常会问某个公司最近使用的面试问题是什么。会这样问,表示求职者对于面试问题的来源存在着根本性误解。

在大部分公司,并不存在面试问题的清单。实际上,每个面试官会挑选自己的面试问题。

因为使用哪些问题在某种程度上是完全自由的,所以并不会有一道面试题成为“谷歌最新面试题”——这只不过是因为就职于谷歌的一位面试官恰巧最近问了这道题目罢了。

今年谷歌使用的面试题和三年前使用的面试题其实并没有什么区别。实际上,谷歌和类似的公司(亚马逊、Facebook等)所使用的面试题一般说来也没有什么不同。

不同公司的面试风格存在着一些差异。一些公司专注于算法(有时会涉及一些系统设计的内容),另一些公司则喜欢基础知识题目。但是在同一类别的题目中,很少会出现一道题属于一家公司而不属于另一家公司的现象。一道谷歌算法面试题和一道Facebook算法面试题基本上是一样的。

1.3 一切都是相对的

如果没有评分体系,如何评估你?一位面试官怎样才能确定对你应该有怎样的期望?

问得好。搞清楚这个问题的答案,实际上很有意义。

同一位面试官会使用同一道面试题来比较你和其他的求职者,这是一个对比的过程。

例如,假设你想出了一个很不错的脑筋急转弯或者是数学题目。你问好朋友Alex这道题目,他花了30分钟求解出了答案。你问Bella这道题目,她用了50分钟。Chris一直都没有解出这道题。虽然Dexter只用了15分钟,但是你不得不给他一些关键的提示信息,否则他花费的时间要远多于此。Ellie花了10分钟,并且她提出了一个你从没有想到过的解题方法。Fred花了35分钟。

这之后你会说:“哇,Ellie真得太棒了!我相信她数学一定不错。”(当然,她或许只是十分幸运,或许Chris运气有些差。你可以再多问一些题目以确保这样的结果并不是因为运气。)

面试题也是一样的。通过比较你和其他求职者,你的面试官会对你的表现有一个印象。比较的对象,并不是这位面试官一周之内面试的所有求职者,而是她曾经问过同一道题目的所有人。

正因如此,遇到一道很难的题目并不是一件坏事。一道题目对你来说比较难,那么它对于所有人都会很难。你仍然可以有出色的表现。

1.4 常见问题

1.4.1 面试结束后没有立即收到回复,我是被拒了吗

不是的。有很多原因会使得公司的决定出现一些延误。一个简单的解释是,你的其中一位面试官还没有提供面试反馈。不回复而直接拒绝求职者的公司微乎其微。

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

1.4.2 被拒之后我还能重新申请吗

当然可以,不过通常需要等上一段时间(6个月至1年)。上一次面试中的糟糕表现一般不会对你新的面试有很大影响。很多人都被谷歌或微软拒绝过,但他们后来还是拿到了这些公司的录用通知书。

目录