程序员面试金典(第6版)
上QQ阅读APP看书,第一时间看更新

1.1 为什么

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

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

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

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

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

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

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

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

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

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

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

1.1.2 解决问题的技能很宝贵

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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