校招面试不完全指南

2020-10-05
  1. 面试
  2. 秋招
  3. 校招
  4. 工作

背景

在你看到这篇文章时,作为应届生的我,已经基本结束了今年的校招面试,并顺利地拿到了所有我有意向接受的公司 offer。

在今年的校招中,我参加了不同公司的无数场面试。幸运的是,除了极个别的奇葩面试与面试官,我轻松且顺利地通过了几乎所有的面试。如今回顾我这大半年(从年初找暑期实习开始计算)的校招经历,虽然结果尚佳,但是其间倒也确实走了一些弯路,收获了一些经验与教训。

故写此文,简单总结与分享,希望可以帮助到更多参加校招的同学。

不过需要说明的是,这篇文章主要针对互联网公司的技术岗位校招,对于非互联网企业、非技术岗位或者非校招,仅供参考。

校招流程

如果你和大半年之前的我一样,尚未经历过校招,那么,你首先需要对校招流程有一个基本的了解。

一般来说,按照时间线,校招流程主要有如下几个阶段(部分公司的校招流程可以跳过标有星号的阶段):

  • 网申 / 内推投递
  • 简历筛选
  • 笔试 *
  • 技术面试
  • HR 面试 *
  • 发放 offer

接下来,按照上述划分,我分阶段地进一步介绍校招流程,并给出一些我的个人经验。

网申 / 内推投递

这一阶段是一切的开始。

不论是网申投递,还是内推投递,虽然途径不同,但其作用都在于让你的简历进入校招的候选库中,以便 HR (或者其他人)从中挑选她/他觉得足够优秀的候选人,继续后面的流程。

这一阶段的基本原则是:永远优先通过内推投递,除非万不得已,不要自己直接网申。

虽然内推并不会像各种内推广告所言一样,具有起死回生的神奇效果,但是对于不少公司来说,内推的简历和网申的简历是区别对待的,前者优先级较高,甚至会在处理完前者之后才开始处理后者。另外,对于一些公司,直接通过网申投递没法「精准投递」想去的部门,而是由大部门统一分配,具有一定的随机性,这对于意向明确的同学是十分不利的。最后,考虑到近些年的内推泛滥,内推的意义有所贬值,已经成为人手一个的标配了,面对海量的内推简历,网申的优先级进一步降低。

如何寻找内推?其实只要你的信息不是太闭塞,你完全不需要担心没有内推,而是需要考虑如何从海量内推的轰炸下选择一个合适的。

最佳的内推人,应当是在意向部门工作的熟识学长或者前辈,他们可以给你较好的内推反馈和帮助。如果没有,则退而求其次,在校内论坛等私域社交媒体上寻找内推,虽然不是熟人内推,但至少有一定的身份联结(比如校友)。再退一步,对于多数人而言,所谓的「内推」其实并非字面上的「内推」,而不过是投简历的一个渠道罢了,并没有啥特殊的。那么,可以关注各大广域社交媒体,比如 牛客网,上面有海量的内推广告贴:一般是部门员工或者 HR 所发,目的在于赚内推奖金或者完成 KPI。从中挑选你喜欢的,联系对方即可,但是不要对后续的内推反馈抱有太大的期望。

简历筛选

在投递简历之后,你的简历便进入了所谓的「简历池」中,等待 HR 从中捞取。

由于这一阶段对我来说是一个黑盒,我并不了解其中的运作,在此便没有太多可以展开的。譬如如何撰写简历,如何包装自身的经历,这些都很重要,然而我并非 HR,对于这些就不探玄珠了,请参见别处的专业人士解答吧。

不过有一点值得说明:筛选简历的一般是不负责技术的 HR,其筛选标准往往注重候选人的学历、实习经历等直观的硬指标,对于项目经历和技术能力等部分,仅仅略作观察以确保不会和岗位过于不匹配。

此外,对于一些公司,内推确实可以提升简历筛选的通过率,甚至可以直接免筛通过。

笔试

并不是所有公司的校招流程都有笔试环节,或者即便有,也可以通过一些方法跳过(比如内推免笔试)。

如果没法跳过笔试,那么,就面对它。不用担心,这并不困难。

多数公司的笔试是 2 - 5 道算法题目,借助在线的测评平台(比如牛客网)举行,在一定的时间和空间限制下,根据通过的测试用例数量来给分。通常来说,笔试的算法题目难度不会太高,仅仅考察基本的数据结构和算法,比大学算法课程的平时作业难度还要低:毕竟这不是算法竞赛,实际工作中也不需要手写过于复杂的算法。

如果你有一定的算法竞赛基础,那么这一部分对你来说应该轻而易举;如果你没有,就像我一样,也不必太担心,稍微刷题即可应对多数的题目。

另外,少数公司的笔试还会有考察计算机基础知识的选择题,涉及计算机网络、数据库、编译原理、操作系统等计算机专业课,有点类似考研的题目。虽然难度不大,但是如果没有事先准备,还是有些吃力的。习惯于英文教材,且许久没有复习的我,险些在此翻车。

最后,不必过于纠结笔试的成绩。很多时候,笔试只是一个门槛,通过就足够了,不一定非要做到很高的分数,毕竟后续的面试环节才是最重要的。

技术面试

这一阶段是校招中最重要的一部分,既决定了你最终能否拿到 offer,也决定了你所拿到的 offer 级别。

对于多数公司,技术面试会有很多轮,且面试官的级别会逐渐提升:从基层员工到部门领导。一般来说,轮数为 2 - 5 轮;如果中途面试失败,而换部门重新开始面试流程,那么轮数可能会叠加至更多。

由于这一阶段较为复杂,故在此不表,而是在后文更加详细地展开。

HR 面试

在通过了所有的技术面试之后,除了少数没有 HR 面试的公司,对于多数公司,最后一轮面试即是 HR 面试。

不同公司的 HR 面试差别较大。

许多公司的 HR 面试仅仅用于和候选人沟通一些技术之外的事项,比如对工作地点、薪资的期望,只要不表现得过于出格,这一轮面试不过是走个过场,双方互相沟通,以便发放 offer。因此,这些公司的 HR 面试往往很简截,不会超过半小时,甚至不到十分钟。

不过,一些公司的 HR 面试比较严肃,不少人折戟于此。在这些公司的 HR 面试中,HR 会从许多角度探查候选人,比如性格习惯、对公司文化价值观的看法等,甚至有些 HR 会显得有些「咄咄逼人」。不过,也不必过于悲观,如果在此面试失败,便说明这家公司确实与你不合,即便顺利通过面试而入职,也大概率是踏入了坑中,日后并不会开心。早点终结对彼此都好。

发放 offer

恭喜,你(即将)成功收获一家公司的 offer!

通常情况下,offer 的发放有两步:先发放录用意向书,然后发放带有薪资的正式 offer。前者可能在面试完不久就发放,后者一般全公司统一发放(比如秋招大概为 10 月份),且需要在一定时间内选择接受或者回绝。

这一阶段的唯一关键词是:耐心。多数公司在面试流程结束之后,并不会太快给出结果,而是需要等待较长的时间(快则不到一周,慢则可能超过一个月),在此期间,请保持耐心,不要过于焦虑。如果是通过熟人内推,可以定期拜托内推者探听一下消息。

需要提醒的是,在获得意向书之前,不要轻信任何的口头承诺(譬如你的面试肯定能通过云云),不要因此过早终止其他公司的校招流程。有备无患。

另一方面,在获得意向书之后,由于其基本上等同于获得了正式 offer,出于道德的考量,请选择性地终止其他公司的流程。比如,你获得了 A 岗位的意向书,同时确定能去 A 岗位就绝对不会去 B 岗位,那么,可以考虑终止 B 岗位的流程,把更多的机会留给他人。收割大量自己不打算接受的 offer 并不是一件有意义的事情。

面试指南

如前所述,技术面试是互联网公司技术岗位校招的核心环节,决定着校招的成败与 offer 的档次,因而在此专门用一个章节来详细展开。

事先声明,此处没有任何具体公司具体岗位的「面经」(面试经历),我也并不提倡大家通过刷面经来准备面试。事实上,在整个校招过程中,我(几乎)没有看过任何面经。

面试前

一个很有趣的问题:「面试前」指的到底是多久之前。

是等待面试官上线的面试前几分钟吗?是收到下一轮面试通知的面试前几天吗?是投出简历的面试前几个礼拜吗?还是尚未开始校招的面试前几个月?抑或是,初学计算机的面试前几年?

或许都是,但至少于我而言,后两者才是更加主要的:我并没有在面试前几分钟、前几天、前几个礼拜,做太多特别的准备,而是相当随意地开始一场又一场的面试。

因此,如何为技术面试做准备,取决于「面试前」的具体指代。

前几年

那么,从最实际的角度出发,我的建议是:考一所好大学的计算机专业。

虽然互联网行业并不迷信学历,但是不得不承认的是,好的学历可以帮助你轻松地越过某些门槛:比如,名校的学生不论简历写的如何,基本上都可以通过简历筛选,至少得到了面试的机会。当然,到了面试环节,学历的作用感知并不强。

除此之外,更重要的还有两点:专业课的扎实学习多写代码的动手能力

前者需要认真学习计算机的各门专业课程,比如操作系统、计算机网络、算法与数据结构、计算机体系结构、编译原理等等。当然,需要注意的是,这不完全等同于在这些课程中拿到高分。引用一句 《交大生存手册》 的话:

国内绝部分大学的本科教学,不是濒临崩溃,而是早已崩溃。

因此,在学校的课业之外,建议通过阅读一些优秀的专业教材,或者追随世界知名大学的公开课,来更加系统、更加科学地学习这些专业领域。而在我的学习过程中,一定程度上参考了 TeachYourselfCS 给出的建议,在此也推荐给大家。

后者别无他法,只能靠多写代码来实现。或许有些人会认为这句话多余,但是就我的亲身观察来看,计算机专业的一些学生,完全是按照「文科」的方法在学习计算机:背诵各种概念与名词,默写数据结构与算法模板。而在代码量方面,不少人在完成课内的大作业项目(甚至是划水通过的)之余,并不会写更多的代码。我认为,这是不够的。

在这一方面,我最佩服的为 迟先生,其代码量与动手能力,超越了几乎 100% 的同龄学生。客观来说,是吾辈楷模。

另外,还有一点较为「虚无缥缈」:一定程度的「吹牛能力」。并非指不诚信行为,而是指需要具备一定的表达与沟通能力,从而在面试中可以尽量充分展现自我的优秀面。

前几个月

在面试的前几个月,有些人会刷面经来速成前面提到的专业课知识,这样或许有效,但是我并不认同。因为这样只会让面试失去考察的意义,从而恶性发展,让面试的内容不断地往偏难怪的方向畸变,徒增双方的负担。

如果你在面试的前几年如前所述地积攒了专业知识与代码量,那么,在前几个月,你只需要做一件事:刷题。

我并不喜欢刷题,但是鉴于目前互联网行业面试的格局,算法题占据了过大的比重,刷题成为了迫不得已但是相当有效的做法。

如果你有一定的算法竞赛基础,那么此处的刷题只不过是很少量的练习,无非是熟悉一下面试算法题的套路:其难度远低于竞赛算法题,且具备一定的规律;如果你没有算法竞赛的基础,就像我一样,那么,你最好在之前把算法与数据结构课程学的足够好,否则我的建议是先去补习这两门课程,再开始刷题。

至于刷题本身,这件事并无什么值得讲的。曾经(希望不是现在)作为「做题家」的你我,都很懂得应试教育的那一套。并且 Leetcode 平台已经足够成熟,上面有大量的面试算法题,分门别类,难度明确,量力刷一定数量的题目即可(我的体验是,大概两三百道便足够应付绝大多数的面试)。

当然,不要把刷题当作堆量与死记硬背。

前几周 / 前几天

如果你喜欢的话,可以看一下所应聘的公司与岗位的面经,从而对面试的形式与内容有所了解,缓解紧张,并做一些针对性的面试准备。

不过我啥也没做。

前几分钟

放松点,别太紧张。

面试中

终于来到了正式的面试时间。

根据我的经历总结,互联网行业的技术岗位校招面试,一般为这些环节的选择性自由组合:自我介绍、校园经历、过往实习、项目经历、专业知识、算法题、系统设计、向面试官提问。

也即是说,除了一开始的自我介绍和最后的向面试官提问(甚至有些面试这两个也不一定有!),其余环节的顺序和内容均是不确定的,取决于面试官的意愿。

这些环节,其实没有万能答案,唯一的应对方式是:保持自信,保持沟通,尽量展现自我的优秀面。而如果一定要说的话,每个环节可能有一些需要稍微注意的事项:

  • 自我介绍。这一点可以稍做准备,提前想好大概要如何介绍自己,而不至于在面试开场时无话可说。另外,最好同时准备中英文版本的自我介绍。

  • 校园经历。一般来说,技术面试不会涉及这一点,而是 HR 面试会经常问到。不过,由于我的简历上除了 GPA 便没有其他的校园经历,我并没有过多地被问及,也没有太多的经验可以分享。

  • 过往实习。在我看来,这一点是简历上除学历外最重要的内容。不论是技术面试还是 HR 面试,这一点是永远避不开的关键环节。在叙述过往实习经历时,需要清晰地呈现实习的岗位与内容,同时由于是校招,也可以讲一些自己实习中的学习与收获(对于混面试时长很有效)。而如果是技术面试,很大可能面试官还会对实习经历的一些技术细节进一步询问,所以不要编造或夸大经历,以确保自己能够回答出面试官的深入追问,否则会制造出一种「实习没有含金量」的不好印象,适得其反。

  • 项目经历。如果没有实习经历,或者实习经历不够多,那么,项目经历也是很重要的一环。这里所说的项目经历,对于校招学生来说,往往是某门课程的大作业,或者 Github 上的个人项目。考察的形式和实习经历类似,但是重点会更加放在技术方面。

  • 专业知识。以问答的形式,面试官会提出某个专业课的问题,譬如老生常谈的「TCP 的三次握手过程如何」,「什么是操作系统的虚拟内存」,「Python 的 GIL 是什么」等等,有相对固定的答案,但是回答的形式很自由,可以按照个人的理解来回答。事实上,在我看来,背面经的模板式回答并不是最佳选项,在确保正确性的前提下,用自己语言梳理一遍,讲出不落俗套的个人理解,才是最完美的回答。关于这一点,推荐一位同学写的文章:如何在面试中筛选/不做一个「背题家」,我相当赞同其文的观点。

  • 算法题。在技术面试,尤其是前几轮的技术面试,现场做算法题往往是无可避免的。做算法题的最大挑战在于其宽泛的提问空间,尽管有如前所述的刷题,但是依旧要做好遇到陌生题目的准备。我就曾多次遇到一时没有思路的题目。而解决方法是,与面试官充分地沟通,即便暂时没有想出最佳的算法,也可以和面试官积极交流想法,从而获得一些提示与建议(这并不丢人!),打开思路。如果实在没有思路,可以先试着写出最简单粗暴的算法,至少证明「你会写代码」,而不要心态崩溃留下一个空白的页面。

  • 系统设计。一般来说,系统设计题目是对算法题的代替,出现于技术面试的后几轮(面试官为部门领导)。我所遇到的系统设计题不多,而且也没有固定的答案,应当是言之有理即可。其实系统设计一般是社招的考察内容,校招中较为罕见,也要求不高,所以不必太担心。另外,据我猜测,我之所以会遇到系统设计题目,大概率是因为我应聘的岗位是「后端开发」,对于其他岗位,应当是不太可能遇到的。

  • 向面试官提问。这一环节对你的面试表现没有太大影响,但是对于你将来的 offer 选择十分重要。毕竟,面试是一个双向的互动行为,不完全是单向的考核。能够从面试官,将来的同事,口中了解到一些网络上难以搜寻到的部门与岗位信息,我个人觉得是十分有意义的。在这一环节,我常用的问题有:「能否按时间线介绍一下你一天的工作内容呢?」,「部门的工作流程大致是怎样的呢?」等等。

最后,我想表达的是,面试本身其实并无太多技巧:只需要将你的能力充分展示即可。如果你在面试前做足了准备,则完全不需要担心面试的发挥。保持自信,保持沟通,尽管面试本身存在一定的偶然性,但是优秀是掩藏不住的。

面试后

如果这是一场顺利且愉快的面试,那么,你什么也不用做,开心地等待下一场面试就足够了。

如果这场面试不太顺利,比如,遇到了没做出来的算法题、没回答上来的专业问题等,那么你可以回顾检查一下这些问题,查漏补缺。毕竟,考虑到面试的重复与套路,大概率这些问题会被再次问到,但愿下一次不要在同一个地方受挫。

但不管怎样,保持自信,保持乐观,要知道,面试是一件带有偶然性的事情,而且有些面试官其实并不懂得如何面试。

拓展阅读

最后,在准备校招的前前后后,我曾浏览过许多有价值的文档,在此将其列出(部分文档在正文中已提及),以供参阅。同时,也感谢作者们的无私分享:

行文至此,其实作为一名普通的应届生,我不过是参加了比较多的校招面试,加上比较好的运气,对于「校招面试指南」这样的题目,尽管加上了「不完全」,依旧觉得力有未逮。

这份指南必然不是全面的、权威的、绝对正确的,其间不免有许多我的偏见与无知。

所以,欢迎大家的评论指正。