## 被问滥的编程问题
我在求职时发现,技术面试的编程题目往往千篇一律——拿我自己来说,反转单链表被问了 5 次,数字转字符串被问了 4 次,随机化数组被问了 3 次,最可笑的是在面试某外企时三个面试官都问我如何反转单链表,以至于我得主动要求更换题目以免误会。
无独有偶,我在求职时同时发现很多面试者都随身带一个本子或是打印好的材料,上面写满了常见的面试题目,一些面试者甚至会祈祷能够被问到上面的题目。
就这个问题,我和我的同学以及后来的同事讨论过,答案是很多面试官在面试前并不会提前准备面试题,而是从网络上(例如 [July 的算法博客](http://blog.csdn.net/v_JULY_v))或 [编程之美](http://www.amazon.cn/gp/product/B0016K8XGQ/ref=as_li_ss_tl?ie=UTF8&camp=536&creative=3132&creativeASIN=B0016K8XGQ&linkCode=as2&tag=lucida-23) 之类的面试题集上随机挑一道题目询问。如果面试者做出来(或背出来)题目那么通过,如果面试者做不出来就挂掉。
这种面试方式的问题非常明显:如果面试者准备充分,那么这些题目根本没有区分度——面试者很可能会把答案直接背下来;如果面试者未做准备,他/她很可能被一些需要 [aha! moment](http://en.wikipedia.org/wiki/Eureka_effect) 的题目困住。总之,如果面试题不能评估面试者水平,那么问它还有什么意义呢?
下面是一些**问滥的编程问题**:
* [编程之美](http://www.amazon.cn/gp/product/B0016K8XGQ/ref=as_li_ss_tl?ie=UTF8&camp=536&creative=3132&creativeASIN=B0016K8XGQ&linkCode=as2&tag=lucida-23) 书里的所有题目;
* [July 的算法博客](http://blog.csdn.net/v_JULY_v) 中的绝大多数题目(包括 [面试 100 题](http://blog.csdn.net/v_JULY_v/archive/2010/11/17/6015165.aspx) 中的所有题目);
* [leecode](https://leetcode.com/) 里的大部分题目;
## 涉及到库函数或 API 调用
白板编程的目标在于考察面试者的编程基本功,而不是考察面试者使用某种语言/类库的熟练度。所以白板编程题目应尽可能库函数无关——例如:编写一个 XML 读取程序就是不合格的题目,因为面试者没有必要把 XML 库中的函数名背下来(不然要 Intellisense 干甚);而原地消除字符串的重复空白(例:`"ab c d e"` => `"ab c d e"`)则是一道合格的题目,因为即便不使用库函数,合格的面试者也能够在 20 分钟内完成这道题目。
## 过于直接(或简单)的算法问题
这类问题类似 [被问滥的编程问题](http://lucida.me/blog/whiteboard-coding-demystified/#abused_problems),它们的特点在于过于直接,以至于面试者不需要思考就可以给出答案,从而使得面试官无法考察面试者的思维过程。快速排序,深度优先搜索,以及二分搜索都属于这类题目。
需要注意的是,尽管过于直接的算法题目不适合面试,但是我们可以将其进行一点改动,从而使其变成合理的题目,例如稳定划分和二分搜索计数(给出有序数组中某个元素出现的次数)就不错,尽管它们实际是快速排序和二分搜索的变种。
## 过于复杂的题目
同 [过于直接的算法问题<](http://lucida.me/blog/whiteboard-coding-demystified/#too_straightforward_problems) 相反,[过于复杂的题目](http://lucida.me/blog/whiteboard-coding-demystified/#too_complicated_problems) 属于另一个极端:这些题目往往要求面试者拥有极强的算法背景,尽管算法问题是否过于复杂因人而异(在一些 ACM 编程竞赛选手的眼里可能就没有复杂的题目 –_-),但我个人认为如果一道题满足了下面任何一点,那么它就太复杂,不适合面试(不过如果面试者是 ACM 编程竞赛选手,那么可以无视此规则):
* 需要 [aha! moment](http://en.wikipedia.org/wiki/Eureka_effect)(参考 [脑筋急转弯](http://lucida.me/blog/whiteboard-coding-demystified/#brain_teaser))
* 需要使用某些『非主流』数据结构/算法才能求解
* 耗时过长(例如实现红黑树的插入/删除)
## 脑筋急转弯
什么是脑筋急转弯?
* 不考察编程能力
* 依赖于 [aha! moment](http://en.wikipedia.org/wiki/Eureka_effect)
* All or nothin:或者做不出来,或者是最终答案
在一些书(例如 [谁是谷歌想要的人才?:破解世界最顶尖公司的面试密码](http://www.amazon.cn/gp/product/B00BB81BB2/ref=as_li_ss_tl?ie=UTF8&camp=536&creative=3132&creativeASIN=B00BB81BB2&linkCode=as2&tag=lucida-23))和电影的渲染下,Google 和微软这些外企的面试被搞的无比神秘,以至于很多人以为外企真的会问诸如『井盖为什么是圆的』或是『货车能装多少高尔夫球』这样的奇诡问题。而实际上,这些题目由于无法考察面试者的技术能力而早已在外企中绝迹。反倒是一些国内公司开始使用[脑筋急转弯](http://lucida.me/blog/whiteboard-coding-demystified/#brain_teaser) 作为面试题目 –_–#