我的面试经验
背景
在我写下这篇文章时,我通过了字节跳动和华为两家公司的面试,并即将与字节跳动签约。
之前的半年忙于考研而并没有准备工作,因此相比于其他参加秋招的同学来说,我的招聘流程无疑是十分短暂的,从2021年12月28日考研结束后准备简历,到2022年2月7日接到字节的offer,一共经过了一个多月的时间。总的来说,我对offer还算满意,现将经验记录如下,以期对后来人有所帮助。
另外,这篇文章仅针对互联网公司开发岗位校招秋招补录环节,至于非开发岗、非校招,仅供参考。
补录流程
首先,秋招补录大概包括如下几个环节(部分公司可以跳过标有星号的阶段):
- 网申/内推
- 简历筛选
- 笔试*
- 技术面试
- HR面试 / 主管面试 *
- 发放offer
网申/内推投递
这一阶段标志着整个流程的正式开始。
在这里借用Wu Zhengke的一句话:永远优先通过内推投递,除非万不得已,不要自己直接网申。
坦白说,内推与网申最大的不同在于,内推能够优先进入hr的筛选范围,甚至于对于部分公司来说,内推能够免掉笔试,直接进入技术面。另外,在秋招补录阶段,由于秋招大批量的offer已经发放完毕,企业剩余的hc已经不多,大部分公司并没有正式的补录阶段,甚至关闭了网申的入口,因此这时候内推往往是唯一的投递途径。
在牛客、leetcode、各种交流群、校内论坛上常常有企业内部的员工发帖打广告,因此获取内推资格相当简单。但是如果需要对方帮忙查看简历投递进度,那么选择自己认识的员工内推更加合理。
如果你的算法水平过关,你也可以通过LeetCode周赛来获得企业的内推资格,虽然我AK了两次周赛并拿到了内推,但对这两个企业并不感兴趣,并没有真正投递,因此我对周赛能够带来多大的帮助并不清楚。
我在这个阶段几乎投递了听说过的所有企业,在短时间内给我反馈的公司有字节跳动、华为、Intel、阿里、shopee。
简历筛选
根据我的经验,以上海交通大学信息安全专业的文凭,几乎可以平趟大厂的筛选关,除了网易的Android开发和小红书的后台开发岗之外,其他的公司大都通过了简历筛选,并向我发出了面试邀请。
基于岗位和公司的考量,我参加后续考察环节的公司有Intel、华为和字节跳动。
笔试
笔试往往是对于算法的考察,类似于OJ。与Leetcode的不同之处在于,需要自己写输入输出函数,因此在笔试前需要熟悉一下输入输出操作,以免临时忘记。
如果有OI/ACM基础,通过笔试自然不在话下。如果没有相应的基础,只要在Leetcode上投入一定的时间,也足以应对大部分题目。
据说部分公司的题目会包含对计算机基础知识,如编译原理、操作系统等的考察,但我并没有遇到,因此略过不提。
据我的经历,笔试只是一个门槛,对于最终的结果并没有决定性作用。分不在高,过了就行。后续的几轮技术面,才是真正决定命运的时候。
技术面试
这一部分往往包括2 ~ 3轮,每次的时间在20min~1h不等,通常包括对于基础知识和项目经历的考察,再辅以1个算法题的测试,难度一半不会超过leetcode medium,与上面一样,刷刷leetcode足以应付。
部分外企可能会采取另外一种面试方式:给出一个明确的任务,让你围绕这个主题进行研究和操作,并在后续的面试中向面试官介绍,在我所投递的Intel亚太研发中心的Edge Computing组中给出了如下的要求,难度并不高,但开放性的题目属实让我不知道应该做到什么程度,因此我主动结束了面试流程:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
A Technical Exercise with KIND (Kubernetes in Docker Containers)
Requirements:
1. Deploy a 3-node KIND cluster on the Linux host. In this cluster, there should be 1 controller node and 2 worker nodes
2. Do research about KIND and related key technologies, and present your understandings on the following topics, but not limited:
a. Kubernetes (K8s) cluster architecture and key components (modules) on the architecture diagram
b. KIND architecture
c. Linux Container technologies
3. Record all the problems and questions which you run into in this tech exercise and describe the questions with us in the report-out session
Report-out session: presentation what you have done for 1~3 above, during the next round of phone or Face-2-Face interview.
References:
1. https://kind.sigs.k8s.io/
2. Any other online information
HR面试/主管面试
大部分公司在通过前面的笔试和技术面试之后,会进入hr面阶段。
不同公司对于该阶段的定位不同。字节的hr面仅仅是与我进行了工作地点、工作内容、公司介绍等问题的沟通,而华为的主管面问了一些奇奇怪怪的问题,如“你有没有遇到过什么比较困难的问题”之类的。只要回答的不是过于出格,一般不会在这一轮被筛掉。
同时,你还可能通过这一轮感受不同企业的企业文化or价值观,通过几轮面试,字节给我的感觉更加舒服,而华为更加具有侵略性和压迫感,这也促使我最终选择了字节。
发放offer
公司一般会在面试通过后一段时间内与你联系,一般可能不会超过两周(由于我在年底完成的面试,之后就是除夕,因此不太清楚正常的时间)。
我认为在hr口头通知通过面试后不应立即终止其他公司的面试流程,一方面公司可能会突然毁约,另一方面手握多家公司的offer能让你在hr面前占据主动,并且对不同的offer进行充分的比较。
然而,在企业发放正式的offer并确认岗位之后,出于道德,应该考虑终止其他公司的流程,以将对应的hc释放,以免占着茅坑不拉屎。
面试指南
面试前的准备
虽然互联网并不卡死学历,但是出身985的科班生往往要比双非本科生能够更加轻易的越过某些门槛。如我上面所说的,上交本基本能够帮你顺利通过几乎所有公司的简历筛选,相对于因为学历而拿不到面试资格的人来说,你已经赢在了起跑线上。当然,真正进入面试之后,学历基本就没用了。
在面试中,最重要的是两点:专业课的基础知识与多写代码的动手能力。
前者需要认真学习计算机的各门专业课程,具体来说,大致是数据结构、操作系统、计算机网络、计算机组成、计算机系统结构、编译原理、程序设计以及围绕这些课程而展开的进阶课程等。学好这些课程,并不意味着在学校开设的课程中取得高分,或者说,取得高分并不意味着你掌握了这些课程的精髓。毕竟,
国内大部分大学的本科教学,不是濒临崩溃,而是早已崩溃。
坦白说,我认为信安的培养计划上的大部分课程只是徒有虚名,真正学到课程的精髓,还是要靠自己课下去找书看。一年之后的今天,我依然不理解为什么薛质教授能够在操作系统课上将约1/3的篇幅用来讲解shell命令,甚至还有一部分同学认为应该讲。难道shell的使用不是Google就能学明白的吗?我依然不理解为什么在2020年,计算机网络依然将大量的篇幅用在ALOHA等上古协议中,而不是聚焦更加实用的HTTP 2.0甚至3.0。好在,我选择自己读完了《计算机网络——自顶向下方法》《现代操作系统 原理与实现》等一系列比较优秀的教材。
关于代码能力的提高,无他,唯手熟耳。不少同学可能苦恼于想写代码,但是不知道从何写起,对此,我认为一方面可以通过完成公开课的lab,就我做过的几个lab而言,通常都有完整的代码框架和tutorial,使得上手难度不至于过高。另一方面,可以选择一些书籍,如XXXX真象还原等,在书的指引下写出一个完整的project。
据我观察,身边的很多同学学习的方式仅仅是背书,代码能不写就不写,能抄就抄,四年过去,代码水平并没有太大提升。显然,这往往并不足以拿到令人满意的offer。
非常遗憾的是,我的代码训练量并不够,甚至于我在面试时拿不出足够多的项目以证明我的能力,当然这也影响到了我的最终评级。
就我个人而言,我非常佩服张弛(aka. 迟先生),毫不夸张地讲,他的代码能力至少顶100个我。当然,交大人才济济,身边还有诸多代码能力优秀的同学,这也激励着我不断追赶他们的脚步。
在平时打好基础之外,还需要在面试前一段时间抽出一定的时间投入到leetcode中,题量视基础而定,一般而言剑指Offer + hot 100足以。由于我在大二以来闲暇时间一直在与wzy一起做leetcode玩,因此Leetcode并没有成为我的阻碍。
面试前几天,多看看岗位相近的面经我认为是有帮助的,至少会有查缺补漏的作用。但是,如果本身基础不够扎实,想靠面经逆天改命,或许几率并不大。
根据我的经验,面试大概包括这么几个部分:
- 自我介绍。自我介绍基本按照简历来讲,可以事先组织一下语言,以免逻辑混乱。
- 基础知识。就我所面试的后端开发/基础架构而言,对于基础知识的考察主要围绕系统和网络两部分,其中可能穿插一些语言or算法等零碎的知识,很多问题在面经中很常见,但是如何答出自己的理解,展现自己的优势一面,或许还要多思考和总结。
- 项目设计。无论项目多还是少,建议至少选择一个或两个自己重度参与并能够完整讲明白的项目重点准备,面试官在你介绍项目时往往会包含一些基础知识的穿插和刨根问题的追究,这就要求真正明白自己代码每一行为什么这么写。
- 算法题。字节的面试是使用飞书自带的在线编辑平台,华为的面试是桌面投屏IDE,一般不会写输入输出,但还是需要写测试用例并通过测试,因此在平时练习时还是要多思考如何快速写出bug free的代码。
- 反问环节。这一环节并没有太大的影响,一般可以问“说说对我的评价”、“你们部门的技术栈”、“介绍一下你们工作的内容”或者之前自己没答上来的问题等。
面试的核心还是将自己的能力充分暴露给面试官,保持自信、保持沟通,维持良好的心理状态。“一俊遮百丑”,我认为木桶效应并不是绝对的,在面试时要尽可能把握谈话的主动权,有意识地将面试官的问题引导到自己擅长的方面去,当然,具体怎么操作,就看各自的能力了。
面试后
想必面试完对于自己的水平也有了比较清醒的认识,如果面试中问题答出来八九成,那么大概率可以顺利通过,否则,或许可以准备找下家或是等待被捞。
鉴于面试的套路相似,因此对于面试中暴露出来的问题应当及时解决,无论是基础知识的缺憾,抑或是代码设计不清晰,都要查缺补漏,但愿不会出现同样的问题。
我们不应当因为一次面试的失败而灰心丧气,也不应因一次面试的成功而沾沾自喜。无论如何,保持乐观、自信与谦逊,追求无限进步。
拓展阅读
一路走来,我阅读了许多有价值的文档,将其列举如下,一并感谢作者的分享:
[校招面试不完全指南 无辄的栈 (zackwu.com)](https://www.zackwu.com/posts/2020-10-05-an-incomplete-guide-to-campus-recruitment-interviews/) - 上海交通大学生存手册
[iPotato 如何在面试中筛选/不做一个「背题家」](https://ipotato.me/article/66) - 写给即将学习编程的大学新生 - Randy’s Blog (lutaonan.com)
- TeachYourselfCS-CN
- The Missing Semester of Your CS Education · the missing semester of your cs education (mit.edu)
- etc
I’m always a noob at Computer Science.
所以,欢迎批评指正。