Oracle首席工程师:技术面试中,怎样的问题才是好问题?( 八 )


1、被使用过太多遍的问题
很多公司(如 Google 和 Facebook)都有参考题库 , 而题库不断更新其中一个重要原因就是 , 要尽量避免候选人做过被问到的题目 。
而且 , 问题越明确和具体 , 一旦候选人做过 , 考察的效果就越不客观 。 比方说 , 下面这个问题本来是个很不错的问题 , 但由于是被过于广泛地使用了 , 因此我还是不建议拿它来用作面试题的:
怎样设计一个短网址系统?
2、依赖于特定语言或框架
而这里说的依赖不好 , 是因为考虑到候选人不同的技术背景 , 如果没有特殊的需要 , 避免这样的依赖 , 以避免产生不应有的错误的衡量数据 。
比方说 , 问一个关于 JVM 的问题 , 这个问题可以问 , 特别是在候选人强调其具备一定 Java 背景的前提下 。 但是这样的问题不能成为 “主菜” , 尤其是候选人不一定具备很强的 Java 背景 , 这样的方式会导致考察的偏颇 。
3、过于复杂的规则或背景知识
这主要是基于面试的有限时间考虑的 , 过于复杂的规则或背景知识 , 容易把时间消耗到澄清它们上面 。 另外 , 有些背景知识并非是所有人都熟知的 , 这就会引起考察标准的非预期 。 我给一个经典的反面例子:
设计一个算法 , 把一个小于一百万的正整数 , 使用罗马数字来表示 。
这个问题描述简洁 , 但是拿来做技术面试中的主要问题的话 , 其中一个不妥之处就是 , 不是所有人都很清楚一百万内的罗马数字表示法的 。 对于不清楚的人来说 , 要搞清楚这个表示法的规则 , 就已经是一件有些复杂和耗时的事情了 。 显然 , 这个罗马数字表示法的知识点 , 不应该成为考察和衡量的标准 。
当然 , 有时候有些问题的背景知识是冷门的 , 但是表述简洁 , 那么这样的话只要面试官能够主动、迅速地说清楚 , 拿来使用是没问题的 。
4、知识性问题
我想特别谈一谈 , 对于知识性问题的提问 。 在讨论问题的过程中 , 如果涉及到关联的具体知识 , 那么提问一些基础知识是一个不错的选择 , 这是考察候选人 CS 基础是否牢靠的方式 。
比如候选人提到使用 HashMap , 而他/她最熟悉的编程语言是 C++ , 那么询问在 C++中 HashMap 是怎样实现的就是一个可行的问题 。 而且 , 由于这样的问题是嵌套在前述这个大流量控制问题的解决过程中的 , 更显得自然而不突兀 。
反之 , 如果这样的知识性问题较为冷门或浅表 , 和当前的讨论中的问题无关 , 或是不在候选人的知识体系内 , 这样的问题就值得商榷了 。 比如 , 仅仅因为自己的项目组使用 Spring , 面试官就询问候选人 Spring 的 bean 的单例和多例分别是怎样配置的 , 而恰巧候选人又是 C++背景 , 对于这部分并不熟悉 , 这样的问题除了给候选人造成困扰以外 , 意义就不太大了 。
如果把知识性问题作为主要问题来提问 , 我认为是不适合的 。 因为一方面它不具备普适性 , 另一方面它又具备太强的随机性 。
这里不具备普适性这一条 , 指的是不同技术背景的软件工程师候选人都要能够适合参与这个问题的解答 。 举例来说 , 如果问 “Tomcat 的线程池的配置策略?” , 这就是一个不具备普适性的问题 , 这是一个偏重 “知识性” 的问题 , 如果候选人没有使用过 Tomcat , 或是只是略有了解 , 很可能就栽了 。
而具备太强的随机性这一条 , 指的是一旦待考察的问题具体以后 , 这个问题就容易从对 “能力” 的考察变成了对 “知识” 的考察 , 而这个知识 , 又恰恰是比较容易随机的 。 也就是说 , 我们不希望候选人 “恰巧” 知道或不知道某一个细小的知识点 , 来决定他/她是否通过这项考察 。
无论如何 , 知识性的问题作为考察的辅助方式可以 , 但不应成为主角 。 我还是觉得我们应当能把更多的时间 , 留给主要问题的解决过程本身 。