LeetCode上的算法题,是早年的Google那帮搞竞赛的人带起来的歪风,就是用竞争性编程(competitive programming)的题目来考察候选人。之后由于Google在科技行业的地位,导致这股歪风吹到了整个行业。现在虽然很多公司都意识到LeetCode题目从各种角度来说都不是最优的面试方式,但是积重难返,一时半会儿改不了。
我从初中到高中每年都参加信息学竞赛,但是LeetCode上一些题目要在面试的时间限制里写对也不容易。除了极少数智力超群的人,绝大多数人要通过这样的面试时需要花时间准备的。而且解答此类算法题的技能,并不会随着工作年限的增长而提高,反而长时间不刷题,解题技能就会退步,对资深的候选人来说反而是劣势。所以LeetCode题目最终考察的是候选人花了多少时间去练习这种解题技能,和实际的工作能力毫无关系。更加广义地说,任何可以通过大量练习来准备的面试形式都是无效的,因为最终选出来的是那些花了足够长时间去准备面试的人。
从实践的角度来看,大厂的求职者数量众多,面试的数量也很大,所以面试必须采用类似于标准化考试的方式来进行,否则没法快速地培训面试官,以及相对客观地比较候选人面试的表现。算法题刚好可以满足这种需求。其他形式的面试题,需要面试官花更多的精力去准备,而且评价标准很难统一,不适合大厂的需求。比如我在这个问题里提到的我自己招人采用的方式(如何评价阿里等大厂笔试现已经禁用本地IDE?)就不适合大厂。
其实很多大厂的码农,技术水平不见得有多高。我自己在Facebook/Meta工作过7年,见识过各种基础知识差得一塌糊涂,只会搭积木的Ikea Developer. 但是大厂拥有完善的基础设施和强大的dev infra团队,把各种底层细节全部都封装起来,做产品开发还真就只需要会搭积木就行了。ToC的业务大多不需要强大的技术支撑,更需要的是快速的产品迭代和交付。所以大厂产品组的码农的升职加薪和技术水平的相关性并不高,而跟产品思维、商业嗅觉更有关系。
另外,从求职者的角度来说,刷题是一种进入大厂的宗教仪式。类似于美国大学里,加入兄弟会会被要求做一些无聊甚至恶趣味的事情一样。刷题是一种形式的proof of work, 用能够解答算法题代表自己花了足够多的时间准备,来向公司证明,自己愿意花时间去练习一种和工作毫无关系的技能,彰显自己求职的诚意。这个问题下面已有的不少回答就充分证明了大家对这种宗教仪式的认可程度。想象一下,假如今天Google/Meta的面试开始考察俯卧撑和引体向上,湾区的健身房马上会出现大量码农挥汗如雨。同时大厂薪资高,又反过来强化了刷题者对这一宗教仪式的认可。因为内心里会觉得,大厂的薪资高、福利好是我的努力换来的。
有10年以上工作经验以后,如果自己还有比较拿得出手的track record, 比如在简历上写I wrote Python[1]. 那么就可以跟recruiter/hiring manager谈条件,降低算法面试的权重,甚至完全跳过算法面试。如果还没有达到这个程度但是想进大厂的话,还是先接受这个宗教仪式,刷题面进去了再说。另一条路就是去小的创业公司,小公司更看重实践的技能,因为他们真的要招入职能马上干活的人。