文 | 不敢透露姓名的 Severus 和小轶
面试官坐在那撇着大嘴的,“咳,给你一机会,最短的时间内让我记住你。”这个我会,我抡圆了“啪!”,扭头我就走。我刚到家,录取通知书就来了,请你务必马上来一趟。
——出自郭德纲的相声
大家好,我是Severus,一个在某厂做中文文本理解的程序员。同时,也感谢小轶与我一同讨论和梳理本文的内容。
2021年的秋季招聘已经过去了,大概是从著名的“拥抱变化”开始,每一年的秋季招聘,都能看到知乎里面的阵阵哀嚎,比如,2020年算法岗一片红海,2021年算法岗灰飞烟灭,2022年算法岗人间地狱……。算法岗招聘标准看上去水涨船高,“内卷”这个词用在近几年的校园招聘上再合适不过。
我浏览各个技术公众号,或者技术交流平台,也是充斥着各种各样的面经、秋招指南等等。我深感其中存在许多观点很是有误人子弟的可能性。大概是由于这些文章多来源于当年刚刚斩获 offer 的毕业生,以至于这些经验也只是站在作者个人的面试经历来说,普适性很低。另外,应试者自身可能也并不清楚自己秋招成功,为面试官所赏识的关键点是什么,因而 ta 所分享的秋招攻略可能也颇具误导性。
那今天,我作为一个工作了6年,同时也是一个有相当经验的面试官,乘着现在的 offer 已经该发都发了,来分享一下我 从一个面试官的角度,是怎么看待算法岗求职的 。当然,以下的面试风格,有我非常浓厚的个人印记。我的工作,兼有基础算法研发、前沿探索以及部分工程、落地应用开发,所以自有我的面试要求及职业发展规划,但我也敢说,搞得定我,就能搞得定大部分一二面面试官。
这篇文章将围绕以下几个问题展开。前两个问题其实是我关于算法岗求职的一些概括性的观点,后面三个问题会涉及具体的面试细节。
算法岗求职真的有那么卷吗?
我面试时,会考察什么?
简历有多重要?
我如何和应试者聊项目?
只要刷完三百道 LeetCode,就一定能通过算法考察吗?
那么,从我们面试官的视角来看,这个行业招聘的时候卷不卷?
这里我也想给各位计划进入业界的在校生打一个强心针
——虽然卷,但我们也是真的很缺人!!! 我们每年面试季,能遇到真正优秀的工程师凤毛麟角。本人工作6年有余,面试过后真正认为优秀的候选人只有4人;而最后一起共事的,仅有2人。所谓“卷”,完全是从应试者的角度看。从我们面试者的角度看,仍然是求贤若渴的状态。所以要具备基本的信心:只要你确实具备一名合格算法岗的潜质,一定会被各个大厂争抢。
那大家可能还是会觉得:求职者这么多的情况下,你们还是挑不出满意的,不是更加说明算法岗求职之艰难吗?如果我没有名校光环,没有顶会论文,是不是根本不可能脱颖而出?
对于这样的疑问,我还希望能够为大家树立一点信心的是:名校光环/顶会论文绝不是顶级 offer 的充要条件。论文等身的清北博士却拿不到顶级 offer 并不罕见,而普通高校本科毕业却能拿到 SSP 的也大有人在。是否应试成功的关键,还是在于其本身的能力是否过关,以及与应聘岗位的需求是否 match。上面提到招来共事的2人之一,当时就没有已发表的论文,但这没有成为他的短板。他们的优秀在于在自身研究领域内做得足够深入,分析问题非常全面,每一步创新有据可循,所以我认为和他合作,一定会高效且愉快。
那么,我面试的时候究竟会着重考察哪些方面呢?
关于这个内容的答案,其实我很多已经写在了我的上一篇推送《工作6年,谈谈我对“算法岗”的理解》中。我这篇推送中,我分享了我眼中算法岗所必须具备的能力。那我对面试者的考察要求,其实和我个人对算法岗的理解是一脉相承的。
除了尽可能客观地考察应试者的能力,这里我还想再补一点——那就是,我面试的最终目标还是考察我是否愿意与这个人一起共事。没错,面试的过程就是这样的,不仅仅要看这个人的客观技术水平,还要看我的主观合作意向。也就是说,哪怕所有的问题都回答了,但如果面试过程中发现了一些非技术层面的问题。例如沟通困难、逻辑表达混乱、情商过低等,都可能作为考量因素。
列位可能要问了,非技术层面的考察会不会带有过多面试官的主观性?没错,确实并非完全客观,但也不意味着不公平。实际上,这也就是所谓 “team match” 的过程,是完全双向的。就像相亲一样,面试官在考察候选人是否适合,候选人也同样要斟酌和这个面试官共事是否会愉快。
不过大家也不用过于紧张。大多数面试官,比如我,一般都是抱着“挑刺儿”的心态进行面试的。对我来说,面试的一大目标还是尽可能去挖掘候选人的优势,而不是找不足。
基于以上目标,各个面试官都会有自己的手段。而我按照面试风格,大体分为三种:
有固定题库,简历不相关的模板面试,多见于统招面
简历强相关,流程不固定的定制面试,多见于定向的团队面试
二者相结合,先用模板面试初步筛选,再使用定制面试深入了解
而我大多数情况是第二种,本篇我也着重于介绍第二种面试。当然,根据候选人情况不同,我的面试流程也会直接退化到第一种面试(其实就是简历内容可聊的点不多的时候,只能用模板化面试先挖掘一些潜质)。
作为一个面试官,每一次面试之前,我也是要准备的。开始我会要到简历,花一点时间浏览一下。
网上有很多关于如何写求职简历的经验分享,对简历的重要性强调得很重。确实,简历会给我下一个第一印象,但简历绝不是最终 offer 的决定因素。简历的主要作用,是用于筛选是否给予面试机会。一般来说,只要有方向 match 的岗位,简历不是过于离谱,都是会给予初面机会的。事实上,我也遇到过很多简历平平但面试发现非常惊喜的候选人。
所以,对于简历,我能给出的建议就是,真诚与专注。
真诚是指实实在在的写出自己的经历、能力等,如果在面试的过程中发现问出来的表现和简历上写的东西有区别,会是非常掉分;
专注指的是简历内容集中针对技术岗位的求职,甚至只针对某个细分方向。其余的东西(比如什么学生干部经历什么的),至少对于技术岗位来讲,是不需要,且不会被关注的(在我这种性格比较隔路的面试官眼里甚至可能是减分项)。
其他的方面,比如在项目经历排序、删减上,针对不同的岗位可能都会有不同的安排(当然项目经历在介绍简历环节可能也是要调整着重点的),体验上来讲,如果是多页的简历,第一页一定是最想要对这个岗位展示的内容。
作为技术面试官,在看简历的时候,第一眼注意到的一定是研究经历或实习经历部分。看一看候选人做过什么项目,里面是怎么写的。如果主要的研究领域我了解不足,我会花一些时间迅速了解一下该域的经典做法、前沿做法等。如果候选人贴出了论文,我也会粗读一下,了解他选择了什么样的方法;如果贴了 GitHub repo,我也会翻一翻,大体观察一下。这一套功课做下来,少则10分钟,多则一两小时。
如果有预设的问题,也会事先记录下来,留着面试的时候去问,碰到简历上有什么疑虑(为防止被拿去反套路,这部分不会详细阐述),也会记下来当成决定面试结果的依据。也就是说,当我看过简历后,自然而然地就对候选人产生了一系列的疑问,面试过程中,部分问题也是在解决这些疑问。
这里也从技术面试官的角度,谈谈某些关于简历的江湖传闻。
首先是简历格式,现在绝大多数的简历模板都还不错,格式上比较干净美观,没什么可说的。不过,电子简历的格式,肯定是 pdf 为最好,尽可能不要传 doc 的简历过来,因为 doc 格式文档可能因为使用编辑软件不同,或者同一个编辑软件,版本不同,导致格式乱套,首先在感官上就造成了非常糟糕的体验,而且可能一些内容会直接看不到。
相对来讲,简历是什么邮箱地址发过来的确实没有那么重要(不存在QQ邮箱发过来就low了,Gmail发过来就高端的说法)。至少简历到我手里的时候,我是不会特意去注意候选人的联系方式那一栏的(至于筛简历的HR怎么想我就不知道了)。
模板化的面试中,考察算法的方式多数是直接问基本概念、公式推导、以及一些证明之类的(例如比较著名的,BatchNorm 有什么用,SVM 公式推导),这些题目流行的现象也被戏称为“面试八股化”。实际上,这些题目是非常容易准备的(当然针对这个也有了不少的培训手段),毕竟,其是固定题库,面试之前,以应试的思路突击复习即可,形式实则更像是笔试,但有时作为初步筛选的手段是有效的,毕竟都是学校课程,这些都不会,就别谈后面的东西了。
在我这里,从自我介绍开始,算法考察就开始了。
对于我比较有面试兴趣的简历,我的第一个问题往往是:请选择简历中,认为最满意的一个项目给我整体介绍一下。这个问题实际上就是想看一下,候选人的技术品味是什么样子的,同时也看得出,候选人对哪个项目的掌握程度是比较有自信的。在候选人介绍的过程中,遇到我感觉比较模糊或有疑虑的地方,会记录下来。在介绍之后,一个一个确认,而在这个过程中,真正考察的,就是候选人对这个问题本身、及对他的方法背后的背景知识的理解程度。往往通过这个过程,就可以判断,这个候选人到底是在搭积木撞运气还是真的有本事了。这里,我关注的细节有:候选人增加的模块自己是否知道是为什么要加。是否有理论上的推导过程以及对应的消融实验;如果将这个模块更换为其他的模块是否可以。例如:将图神经网络建模的依存分析树更换为 用 self-attention 直接对文本建模是否可以?图神经网络中是否使用了边 embedding 将不同种关系投影到了不同的空间中?
每个项目介绍之后,我也会去询问,这个项目如果要继续做的话,会怎么做,继续引出一系列的讨论,而这个讨论,就是宏观层面上,技术视野的交锋,看一下候选人对项目整体把控怎么样,技术成长空间大不大。
通常这类问题的背后,考察的就是候选人对他所使用的算法的理解程度,到底是仅限于定义,还是有自己的理解。这个交流的过程中,有的候选人能够完完全全说服我,有的候选人则是经不住我多次挑战。
以上是考察候选人在自己的研究领域的深入情况。在考察完深度之后,我就会用我的一个固定题库去试探广度。
是的,我也有题库,题库里面仅仅有一道题。
▲我们的算法题上图就是我们题库的缩影。说是题库,实则是我们的“面试指导书”。这道题提出了一个非常粗的需求,也只给出了大体数据规模。需要候选人从理解这个需求开始,直到将完整的算法设计出来,图中,每一个分支都代表了一类解决方案,向下的细分支则是一个个算法的应用考察点。这就要求候选人知道,想要达到某一个目的,可以去应用什么样的算法,遇到了某一些问题,可以用什么样的思路去解决。我们认为,这种思路,相比于机械记忆要有价值得多。毕竟现在的深度学习有强力的框架支持,丰富的文档。相比于精准记忆怎么推,更应该充分理解怎么用。
以上整个过程,说是面试,实则是思想交流,期间,我不仅仅是在提问题,引导候选人把自己的项目讲清楚,我也会提观点,与候选人的思想碰撞,看与候选人是否能对得上频率。
专项的工程能力考察,实际上就是基础数据结构/算法,以及代码实现、需求实现等。
算法面试中,实际上也可以部分了解到工程能力,比如候选人对自己工作的完成情况、实验情况等,如果算法面试中得到的反馈已经让我对其工程能力放心了,专项的工程能力考察我或许会跳过。
我看到的很多面经,或准备面试的说辞中,多数是在 LeetCode 上下功夫,或者看一些类似于《剑指offer》之类的书,或者靠刷题博客来试图通关基础数据结构/算法考察。但,在我这里,单靠无脑刷题一般会失效。
可以说,很多朋友们刷题是不会刷的。他们在刷题的时候,更像是在背考试题库,想要对题库里面的题形成肌肉记忆,而非去理解题目背后对应的算法思维。但我们在问候选人这类题目的时候,考察的从来不是肌肉记忆、思维定势,而是思维方式。学习数据结构/算法,从来也不是学习解决某一类或者某几类固定问题的模板,而是学会以计算机思维高效解决问题的方式,而这些本应是 CS 专业的基本功(这里想要吐槽,一些 CS 朋友们本科课程没学好,以为上岸 AI 了之后就更可以弥补 CS 的不足了,不是的)。在实际工程开发中,我会不断地利用基础数据结构/算法优化我的项目,题目也往往是从实际需求中抽象而来。
哪怕是使用成题,我会尽可能避免从 LeetCode 中或其他面试题库中选题;哪怕是从题库中选题,我也会在条件上有所增减,或者脑子里有一个比市面上流通的答案更好的解法(反套路),才会用于面试。而那些例如限制零内存的类似于脑筋急转弯之类的问题,我倒是认为,至少我们不会在那样的硬件环境里面工作,所以我也不会去考察那种问题。
其余的,例如代码风格等,只要不是太离谱,一般我都认为是可以培养的,所以写代码方面的考察我倒是标准比较松。
这里插播一段有趣的经历,几年前我找工作的时候,流传一个江湖传说,就是面试的时候,如果被问到了算法题,哪怕这道题已经会了,那第一次回答的时候也说最笨的方法,等面试官说“你再想想”之后,再看似艰难地说出标准答案。但是朋友们,你们能看到的江湖传说,面试官也能看到,莫不如真诚一些。我入行的导师告诉我,如果他真出了这种题,那一定准备好了比标准答案更好的算法,如果候选人能从暴力方法跨越到标准答案,那也一定能推出更优的方法。
巧合的是,在8月的一场面试中,我也遇到了这个套路,惊叹于还有人使用,故在此说出,以为诫勉。
以上,是我以面试官的角度,对面试的理解。出于避免被针对、被反套路,以上的内容中,没有涉及到太具体的观察手段,以及考评标准,具体的题目也只放了高糊图,没有披露细节。
写这篇的目的,也是看着满世界的面经,以及内卷的所谓人间地狱的哀嚎,给出一些属于我个人的回应以及态度。自大一些,也是想讲出我心中求职季的正风,希望有志于此的学生,以及需要人才的岗位,以后都能够容易一些。
从我求职,到现在成为“老司机”,我一直坚信,技术岗位的面试、工作,贵在简单、纯粹、真诚。面试过程中的套路,终归有在工作中见真章的时候,实习期、试用期实际上都是考察期。从我的角度,不妨功在平常,而非在套路与突击。
最后,也祝愿所有正在求职的读者小伙伴们都能够找到自己满意的工作,正在招聘的老伙伴们都能够找到自己想要的人才。
Severus,在某厂工作的老程序员,主要从事自然语言理解方向,资深死宅,日常愤青,对个人觉得难以理解的同行工作都采取直接吐槽的态度。笔名取自哈利波特系列的斯内普教授,觉得自己也像他那么自闭、刻薄、阴阳怪气,也向往他为爱而伟大。
作品推荐
深度学习,路在何方?
数据还是模型?人类知识在深度学习里还有用武之地吗?
在错误的数据上,刷到 SOTA 又有什么意义?
加入卖萌屋NLP/IR/Rec与求职讨论群
后台回复关键词【顶会】
获取ACL、CIKM等各大顶会论文集!