前段时间,有一位好友找到我,向我打听阿里社招笔试是否看重算法题的考察,我给予了肯定的答复。他表现的有些沮丧,表示自己工程底子很扎实,框架源码也研究地很透彻,唯独算法能力不行,leetcode 上的简单题做起来都有点吃力。以至于面试一些公司时,基本都是前几面和面试官聊工程,相聊甚欢,一到笔试就 GG。鉴于我个人在学生时代有过 ACM 经历,对算法还是相当感冒的,个人算法能力不算出众,也不算弱,最好成绩是省赛金牌,区域赛铜牌(主要还是抱得队友的大腿),后来实在是写不动 C 了,中途转了 Java,借这个机会跟大家聊一聊,分享下个人对算法的一些认识。
我发现很多人有的一个观念是刷算法并不能很好地帮助他工作,他们中有些人是有了很多学校或者公司的项目经验,有些则是在数据库、RPC、大数据等某个垂直领域有了比较长时间的沉淀,他们会觉得刻意地刷算法题比较偏门,没有太大的价值。一方面有些人会比较自信,不认为需要靠算法来证明自己的价值,另一方面,有些人会认为刷算法题是应届生面试才需要考察的技能,对于社招来说,公司应该更注重考察项目经验和系统设计层面的技能。以我个人经验来看,面试互联网公司时,算法题几乎都是必考的一个环节,从公司的考察点出发,就可以佐证出,算法不重要这个观点的确是有待商榷的。还有一些人轻视算法,是觉得只有大厂才看重算法,一些小公司的面试根本不 care 算法,而且特别是像我文章开头提到那个朋友一样的人,有着比较强的工程能力,我相信在面试中一定可以凭借着这个优势,赢得面试官的好感,那我不妨再反问一句,为什么要让算法成为你的软肋呢?
我已经表露了我对面试中算法重要程度的态度,而且我也认为面试中考察算法能力是非常重要的一环。在公司里做项目,我们往往需要花费数个月去落地,而面试中完成算法题最多只限制在半小时内,虽然时间区间不同,但本质上都是在考察一个人在一个固定的时间内完成某个任务的能力。读题考察了候选人的理解能力,期间我会与候选人沟通,以确保他正确理解的题意,并且在码字之前,我会要求对方先讲解题思路,这考察了沟通能力,有的候选人可能没有经历过刷题训练,缺少一些常见的算法思维,但经过提示后,如果能快速地完成 coding,在笔试中或许也能够通过。所以你看,其实考察算法题其实和也是借此考验了你的工作能力,它要求你在短短的半个小时之内做到 Bug Free,一定程度上这比做工程更难,因为没有人为你测试,而你要想通过这一环节,是需要额外花费精力去训练的。
虽然我认为面试中算法很重要,推荐大家准备面试时多去刷刷题,但我也确实抵制一些偏题、怪题。以我的刷题经验和工作经验结合来看,推荐的难度为 leetcode 简单、中等题,ACM 铜牌、银牌题,仅供参考。记得有一次瞄了一眼阿里的校招在线笔试题,具体是哪个部门不清楚,那个难度估计得是地狱难度了,这类情况仅仅是小概率会发生,至少在我们大部门不会出现特别难的算法题。
很多人说面试造火箭,入职拧螺丝,以此来讽刺面试中算法面是不必要的,我是不赞同的。抛开面试,算法能力也的确是工作中帮助了我。简单举几个例子吧,我通过算法题接触到了欧拉函数、GCD 等数论知识,让我可以非常好地理解 RSA 加密的原理和实现过程,而 RSA 加密是很有可能在工程中被使用到的一种非对称加密方式;通过解决常见的数据结构类算法题,我了解到了跳表的实现,这方便了我去理解 Redis 的 Set 结构;熟练地解决贪心和 DP 等问题,也潜移默化地影响着我在工程项目中的代码逻辑。
字节跳动可以说是业内有名的看重算法面的公司了,但鉴于本人并不了解实际的情况,只能跟大家聊聊阿里的算法面试。分成两部分:实习生面试和社招面试。我这里的经验主要都是基于我所了解的情况,在阿里其他部门(非阿里云)可能情况就不一样了。先说实习生面试吧,算法主要考察的是简单题,主要以贪心、数据结构、模拟为主,可以说非常友好了,主要考验学生对于基础知识的掌握程度,但也要求候选人能够在较短时间内完成,否则很难在整体面试中获得 A 评价。而社招,算法面试的地位肯定是要低于工程能力的考核的,但是对于能不能发 offer 又起着决定性的作用,等于说,即使你的工作履历很 match 岗位,工程经验也很丰富,但算法面一塌糊涂,往往用人部门只能忍痛割爱了。
如果你正在准备面试,我是建议准备下算法,刷一些题目找下手感,leetcode 和各种在线 OJ 都是不错的选择,B 站也有很多视频,具体的刷题列表,我这儿没准备,相信你可以在网上找到很多的。