每年校招的季节总会有这种讨论,有人觉得考算法题没意义不如考实战考项目考 XX 。有人大学的时候做了很多个网站写了很多项目然而就是做不出这些“没有意义”的算法题拿不到 offer ,有人觉得太简单做算法题区分度不大。
先来看一下,在大公司来说,程序员日常的开发工作是怎么样的。就拿腾讯来说,比如你的职位是 qq 的后台开发,那么你的日常开发语言是 C++,你日常的工作是维护一大堆已经上线的用 c++写成的 cgi 和后台的逻辑 server ,有新需求的时候用 C++去开发新的逻辑 server 和 cgi 来实现这些功能。而这其中, cgi 有现成的库,逻辑 svr 也有现成的库,存储方面用公司内部开发的 CKV 或者其他组件,它们有专门的运维团队来维护,其他像发布数据统计日报等全部都有现成的组件。你只需要把产品的逻辑组织好填到框架中就行。
那么你工作之外接触的其他技术哪部分跟你工作中用到的东西有关系?你开发网站用的 php/python ?或者是做存储用的 redis 和 mysql ?甚至更时髦的 docker ?
事实就是,越成熟的大公司,内部有越多的内部组件内部系统,你在里面工作,你不需要担心应该采用什么数据库用什么语言什么发行版的 linux ,你只需要选择现有的组件设计好架构组织好代码就足够。
那么回到面试题目这个问题上,特别是校招面试上面,假如一个应届生非常聪明和刻苦,每天都是专研计算机课程的专业课程(算法、编译器、 os 、 etc.),里面的每个算法都倒背如流,甚至能在一场面试内写个 LR1 的 parser 算法出来,那么你问他一些实际项目是考察不出他的潜力的和实际的学习能力的。而对于一个没怎么学过算法,但是做了几十个外包网站的同学,他的项目能力很强,但是你确定他能在入职后应付到工作中遇到的挑战?
所以说,面试考算法是一个基准点,因为算法是计算机科学里面最基础的学科,其他更高级的学科都是在这个基础上面展开的。在过了这个基准点的基础上,再考其他的东西,例如更复杂的算法,实际的项目经验,知识广度等。这也是目前国内大公司面试的标准形式。但这其中有个问题是面试官的知识水平不一,所以有时候面试官水平不够甄别出水货和牛人。说白了就是不够标准化。就比如我试过一次面试,面试官连珠带炮问了我两个小时,但是全都是问的各种基础概念,假如我当时对着电脑打字速度够快的话,他这种面试方式有何意义?
而说到面试的标准化,那就得说回微软 /google/facebook 以及湾区众多 hot startup 的面试方式。这些公司的 onsite 面试一般是四轮,应届生大多数情况下不会有设计题,几乎都是算法题。在现在刷题网站越来越多的时代,靠考算法题还有没有筛选度?
这里我拿 facebook 来举例,因为 facebook 的面试太过标准化了。 facebook 的面试分为四轮,其中一轮 culture fit ,两轮算法,一轮设计(应届生不会有这一轮)。 facebook 的算法题不难,几乎不会有 dp 题目,大概就是 leetcode 上面中等难度及以下的题目。有人说,这么简单的题目,随便一个英语好点的搞过 acm 的学生都能过。实际上去年 facebook 在中国招了多少个应届生呢?不超过 30 个。
为什么?一道简单的算法题,你现在对着电脑想,可能没什么难度,一下就能写出来,但是面对面试的时候的压力,你能否在十几分钟内在纸上能写出整洁无 bug 的代码?另外,简单的题目只是一道开胃菜,后面几乎可能有稍难的 follow up 。而且还有非常关键的一点,就是沟通能力。以前在知乎上面看过一个是清华的一个竞赛出身的学生问为什么 google 问的问题那么简单他答出来了还被拒了,你搞竞赛出身你有一身牛逼的 coding 本领熟悉各种奇技淫巧,但是要你解释思路的时候却三言两语就糊弄过去,换你做这样的同事你愿意不?一道算法题你觉得做出来不难,但是试试自己用语言描述出你的思路,然后证明你的算法是对的,可不一定那么简单。
而对于社招来说,算法题是一个考查方面, design 题目也很重要, design 题目很大程度会影响你的入职的级别和工资。而假如你知识面广或者某个方面很厉害,在简历上体现出来的话面试官也会适当地问你有关的问题,这里也是加分点,但是这不是能否通过面试的关键点。
说了这么多,我只想说明一点,面试时考算法不一定是最好的,但是是比较有效的,而且是比较公平的方法。至于你说花几天的时候让他做一个项目,那么你想想 facebook 人均创收几十万上百万美刀,本来请个人过来面试已经要花个几百刀的了,还要让个员工花了几天去应付他,那一年下来得亏多少钱?公司不是傻子,你要是发明一种更有效的更低成本的甄别人才的方式,不用多久肯定就传开来了。