2022双非应届CS硕士校招上岸字节跳动(校招总结)
前言
大家好,这里是阿新。
笔者学习计算机专业已经七年有余,本科所学专业为软件工程,硕士所学专业为计算机科学与技术。过去一直都是通过阅读互联网上各位大佬的技术文章来解决开发过程中遇到的问题。如今马上就要成为一名打工人,也希望能把自己的学习和开发经验写成一篇篇文章,供各位读者参考。
本篇文章是我在硕士毕业答辩顺利完成之后,对自身校招情况的复盘和总结,虽然笔者只是一个普通的双非渣硕,还是希望我的经历和经验对您有一定的借鉴意义。
校招结果
收到的中大厂offer:
字节跳动-后端开发工程师;
深信服-C++软件开发工程师 ssp;
海康威视-嵌入式软件开发工程师;
理想汽车-软件开发工程师 sp;
小米-软件开发工程师-C/C++方向 sp;
绿盟科技-研发工程师。
其他:
拒绝了地平线三面、百度二面、Momenta三面的面试邀请,因为我当时已经收到了比较满意的offer,同时进入了面试疲惫期,希望能休息一段时间;
完成了阿里巴巴-高德-研发工程师C/C++岗位的HR面,最终内推人反馈没有HC,流程遗憾结束;
完成了腾讯音乐-软件开发-移动客户端(IOS、Android)岗位的HR面,但由于该公司当时正在进行人力盘点,HC被锁了,目前查状态仍在流程中,应该是挂了。
去向:
经过综合考虑,笔者最终选择了字节跳动,原因如下:
岗位base地在北京,离女朋友和家近一些;
对Golang语言本身和所做业务比较感兴趣;
在大厂工作能够学到更多东西,有助于自身成长;
实验室同门也拿到了字节offer,在提前实习期间天天跟我说工作有多开心、基建有多完善、自身成长有多快速,被他忽悠瘸了:p)。
自身情况简介
简单介绍一下自身情况,供各位读者结合自身情况酌情参考,详细复习过程会在下文介绍。
基本情况: 笔者本科毕业于某二本院校,两次考研一志愿院校失败后,调剂至某双非一本院校读研,硕士毕业时英语四级,学习成绩一般,主要技术栈是C/C++,无实习无论文无工作经验,意向岗位包括基础架构开发、后端开发、嵌入式开发和客户端开发,岗位base地无要求;
项目: 项目经验较丰富,完成的项目包括导师横向和自己本科时做的几个课外小项目;
基础知识: 主要复习了C/C++基础、设计模式、操作系统、计算机网络等,阅读了一些项目源码;
算法题: 去重后共刷了约 120道左右,其中在leetcode中刷了约132道,在牛客中刷了约80道。
应对校招的经验
笔者于2021年7月开始正式准备校招,到2022年3月签约,中间耗时两个半月准备小论文和毕业论文,下面笔者将自身应对校招的经验介绍给各位,希望对大家有帮助。
简历
笔者的简历主要包含以下几部分的内容:基本信息、教育经历、专业技能和项目经历(如果有工作或实习经历的话,也要写上)。需要注意的是基本信息中一定不要忘记写联系方式(电话和邮箱),教育经历需要按顺序写清自己的学校、专业、入学和毕业时间以及简单的在校经历。此外,在简历中专业技能部分的描述笔者参考了阿秀的求职笔记,项目经历的描述参考了STAR法则(开源项目可以给出github链接),简历模板则使用了超级简历。
笔试和面试
笔试是很多公司在HC不足情况下刷人的一种手段,笔试的通过率,一般取决于HC的多少。大厂的笔试题一般很难,由于性价比较低,笔者没有特意准备笔试,仅使用准备面试算法题的经验来应对笔试,在大厂笔试中,笔者平均每场的笔试成绩仅仅能排到前百分之40左右,因此我认为自身的笔试经验并没有太大的参考价值。
大中厂研发岗的面试通常包含2到3面技术面,以及1面HR面。笔者向多家公司投递了简历,投递途径包括公司官网、BOSS直聘和牛客等平台,经历了50多场大大小小的面试,下表是笔者参加的一些中大厂笔面试的时间线:
公司 | 时间线 |
---|---|
绿盟 | 8月下旬一面+二面;9月上旬三面+意向。 |
寒武纪 | 8月下旬一面;9月上旬二面+HR面,一周后查状态挂。 |
Momenta | 8月下旬一面;9月上旬二面;10月中旬三面(拒) |
大疆 | 8月中旬笔试;8月下旬一面,两周后查状态挂。 |
深信服 | 8月下旬笔试;9月上旬一面;9月中旬二面;9月下旬SP面+HR面+Offer |
小米 | 9月下旬一面;10月中旬二面;10月下旬Offer |
百度 | 9月下旬笔试+集中面试,二面后挂;10月上旬被捞+一面;10月中旬二面(拒) |
网易,腾讯,美团 | 9月中旬均挂于笔试 |
地平线 | 9月下旬一面;10月中旬二面+三面(拒) |
阿里巴巴 | 9月下旬一面;10月中旬二面+笔试+三面;10月下旬HR面,两周后查状态挂 |
海康威视 | 9月下旬笔试;10月中旬一面+HR面;10月下旬Offer |
理想汽车 | 10月中旬Leader面+Offer |
腾讯音乐 | 9月中旬笔试挂;11月下旬补录被捞+一面+二面+转岗至深圳+一面;12月上旬二面+云证;12月中旬HR面; |
字节跳动 | 6月中旬一面挂;9月中旬笔试挂;10月上旬笔试挂;11月上旬笔试挂;11中旬投递实习岗位+一面;11月下旬二面挂;12月中旬实习被捞+一面;次年1月上旬二面;1月中旬三面挂;1月下旬校招被捞+一面;2月上旬二面;2月中旬三面+Offer |
笔者从最初面试时紧张无助的菜鸡变为了如今的面试老油条(现在是菜的理直气壮),也总结了一些经验:
一般线上面试刚开始是自我介绍环节,建议提前准备一段两分钟左右的自我介绍(姓名,教育经历,项目经历,工作经历),面试的时候直接念,这样可以防止刚开始面试太过紧张导致自我介绍时磕磕巴巴;
在技术面试官考察基础知识时,如果您觉得已经复习的比较全面,可以考虑在八股文的基础上适当扩展,如(1) 问:C++指针和引用的区别;八股文回答:指针是存储地址的变量,引用是被引用变量的别名,和其他各种区别;扩展的回答:在原回答的基础上,额外介绍下C++11的右值引用。(2) 问:new/delete与malloc/free的区别;八股文回答:malloc只能分配内存,new先分配内存再执行构造函数,和其他各种区别;扩展的回答:在原回答的基础上增加placement new。(3) 问:进程和线程的区别;八股文回答:进程是资源分配的最小单位,线程是调度的最小单位,和其他区别;扩展的回答:在线程的基础上介绍一下内核级线程和用户级线程(协程);
当碰见无法回答的问题,实在没有思路的话可以直接说我不了解,如果连续碰到几个问题都回答不出来,可以直接和面试官反馈说这些方面自己不擅长,我更擅长其他某个方面。这样可以将话题引导到自己擅长的领域,更好的展示自身的闪光点。此外,不需要因为回答不出问题而感到抱歉,因为您并没有做错什么,一场好的面试应该更像是一场聊天,而不是一场考试;
如果精力有限不能把所有方向的知识都复习好,可以考虑打造自己的面试长板,即找一门或多门基础科目做深入复习,深入到面试官问不住的程度。这样当上一点中的状况发生时,也可以轻松应对,笔者就是将C/C++和操作系统作为自己的长板。但这么做的缺陷也很明显,那就是可能出现面试官不了解你的长板科目的情况,所以如非必要,还是要尽可能的全面复习;
技术面试官针对项目提问时,有的会针对某项技术在项目中的应用来考察面试者的基础知识,有的会针对项目的整体架构来考察面试者的设计能力,有的会通过提问项目的各项指标来判断面试者考虑问题是否全面。因此,在面试过程中,可以提前准备一些面试官可能提问的关于您所做项目的问题,并将回答写在文档里,被问到的时候直接念;
技术面做算法题时,可能会手忙脚乱,可能会觉得自己做不出来,但是坚持写完,结果可能会比自己想象的好得多。笔者在面试寒武纪时被要求做两道之前从没做过的题:大数加法和大数乘法,这两道题使用C++是纯体力活的题目,虽然不难,但是细节很多,笔者在做的过程中一直觉得自己做不出来,但是坚持写完,最后终于还是AC了;
技术面结尾面试官一般会问:你有什么要问我的吗。如果您真的有问题,这个时候可以直接问,没什么问题但还是想问点问题意思意思的话可以问面试安排、岗位职责、团队规模等。但如果真的没问题,可以直接说我没什么问题了,没必要非得问。笔者在几乎所有技术面中都是这么做的,我认为在技术面试官最关心的是我们的技术以及脑袋是不是够灵活,问不问问题并不会影响我们在面试中的表现,别的如面试礼仪或者所谓交际能力在技术面中只是锦上添花,只要尽可能大方得体即可,无需特意准备;
在面试结束后要好好复盘,将一些没回答出来的问题记录下来,面试结束后好好复习该问题及其相关的知识点,争取下次再碰见同类的问题能回答出来;
HR面问到的问题一般相对固定,比如做了什么项目,在项目中扮演了什么角色,碰到的难点是什么,这些常规问题可以在面试前提前准备好回答,并将其保存为文档,被问到可以直接念。
其他
关于投简历:笔者建议各位同学秋招尽早开始投递简历,如今的秋招不再像过去一样是金九银十,而是金七银八,2021年秋招各个大厂的提前批占了秋招HC总量的一大部分,笔者就是在九月份才开始投的大厂,但是那个时候HC已经很少了,导致我没有收到腾讯美团等大厂的面试。因此,不要觉得自己没准备好就不敢投,校招的面试思路应该是以战养战,在面试中总结遇到的问题并予以解决,而不是完全准备好了才开始投;
战线可以拉长一些:如果您在秋招没有收到满意的offer或者错过了秋招,各个大厂在十一月份以及春招时还会有补录,只是岗位可能没有秋招时丰富,笔者就在2021年秋招补录期间和2022年新年前收到了腾讯音乐和字节跳动的面试通知;
关于违约:如果您在签好三方的情况下收到了更为满意的offer,那么可以和上家公司解除三方,根据学校和公司要求,解除流程不相同。笔者就是与深信服解除三方并支付违约金后,在春招期间与字节跳动签了新三方。但需要注意的是,在签约前认为自己可能违约的情况下,请了解公司允许的违约时间以及违约金数额,方便您违约后及时和下家签三方;
关于心态:在校招过程中,我们可能会碰到以下情况:1. 平时看起来不太努力的同学拿到的Offer比自身拿到的Offer薪资高出很多;2. 其他同学都有Offer了,只有自己还没有;3. 网上很多同学已经收到大厂的意向,而你却才刚开始投简历;4. 由于想去的公司HC不足,被遗憾淘汰。这些可能会让自己心态失衡,解决的办法有两点:1.只关注自身;2.学会知足(也可以说是“认命”)。每个人的基础和复习状态都是不一样的,同时面试也是七分努力三分运气,忽略这些只比较结果其实是没有任何意义的,应该与自己比较,而不是与他人比较。此外,对于某些不可抗因素导致的面试失败也不要沮丧,毕竟您已经尽力了。
复习经验
为了应对面试,笔者主要准备了三个部分的内容:项目,基础知识和算法题,下面笔者将分别介绍各个部分的复习或预习经验。
项目
笔者是如何准备的:
在项目准备上,笔者并未耗费太多精力。这是由于笔者的导师是项目型导师,在读研期间,我的工作重点就是完成导师的横向课题,共积累了4个项目,此外,在本科期间,我完成了3个课外项目,包括玩具操作系统内核(没有完全做完,只完成了一部分)、一个小游戏以及一个Java电商项目。
笔者将所有项目均按照STAR法则写在了简历上,但一次面试的时间有限,我无法向面试官完整的介绍所有项目,因此我从上述项目中选择3个进行了充分的准备(需求描述、实现细节、整体架构、应用技术和演示视频等)并将其作为与面试官交流的谈资,其中包含两个实验室项目和玩具操作系统内核。
一些建议:
笔者的项目仅仅是数量上有些优势,平均质量其实并不高,这是由于笔者大部分项目的业务涉及到特定领域,用到的技术不流行,很多面试官并不了解,导致其问不出问题。因此如果我时间如果充裕的话,我会选择做一些高质量,能够真正学到东西的项目,这对面试很有帮助(深信服offer就是靠笔者的玩具操作系统内核拿到的),笔者在这里为C/C++选手推荐一些项目:哈工大李治军老师的操作系统课程实验;MIT 6.824 分布式系统课程实验;于渊的《Orange's一个操作系统的实现》;400 行 C 代码实现一个虚拟机。
在做项目的过程中,仅仅在形式上解决遇到的问题是不够的,要尽可能的深究问题出现的原理。比如我在做某个C++项目的过程中,碰到了指针使用不当导致的内存泄露问题,我希望找到一种自动管理内存的方法,于是我了解到了C++11的智能指针,并了解了引用计数机制和RAII。之后我在使用智能指针的过程中发现了unique_ptr无法被赋值,于是我又了解到了右值引用和移动构造函数。通过做项目的方式来积累基础知识是一个非常好的选择。
这里给各位推荐一本书:《代码大全》,在写项目期间如果碰见任何问题,你都可以在这本书里找到答案。
基础知识
笔者研究生考试的一志愿院校专业课考试科目是四科(数据结构、操作系统、计算机组成原理、计算机网络),所以自身有一定基础。在此基础上,笔者的主要复习方式包含平时积累(研一,研二上半年)和针对性复习(研二下半年和研三上半年),相应复习经验和参考资料如下:
C/C++:笔者在完成实验室项目期间主要使用的语言是C/C++,平时在实现功能时也会有意识的学习C++基础并使用C++ 11中的特性,语言基础比较熟悉。另外,由于我想将C/C++和操作系统打造为面试时的长板,针对性复习时会看的稍微全面一些,主要参考了以下资料:侯捷老师的课程《C++标准库体系结构与内核分析》(没看完,只把STL中主要容器的实现看完了)、30小时快速精通C++和外挂实战-大神MJ精选(看完了,虚函数表,运算符重载讲的很好)、《C++ Primer 第5版》 (工具书,哪里不熟看哪里);
数据结构:笔者在学习C++ STL容器底层结构、阅读《Redis设计与实现》和刷题期间顺带复习了常用数据结构与算法,线性表、哈希表、二叉树、排序算法等基础数据结构和算法掌握的还可以,但对红黑树、跳表和B树等稍微复杂的数据结构只是了解;
操作系统:笔者本科时尝试实现过玩具操作系统内核,加上考研的底子,因此比较熟悉操作系统的底层原理。在针对性复习期间完整学习了操作系统(哈工大李治军老师)32讲(全)超清,顺便看了Linux 0.11的源码,重新复习了实现操作系统内核期间使用的书籍:《Orange's一个操作系统的实现》,此外还走马观花的浏览了《Linux内核设计与实现(第三版)》;
计算机网络:笔者在针对性复习期间主要参考了图解网络介绍 | 小林coding,此外,还阅读了游双的《Linux高性能服务器编程》,阅读了GitHub - cbsheng/tinyhttpd源码和GitHub - qinguoyi/TinyWebServer源码;
其他:笔者读研期间的研究方向是深度学习,做实验是在Linux下,因此对Linux,Python,PyTorch,OpenCV和常用图像处理算法比较熟悉;在实验室做项目期间用过设计模式和数据库,对MySQL/Redis和常用设计模式(如单例模式、策略模式、工厂模式等)比较了解,但没有特意复习。
算法题
其实我认为算法题在校招面试中是最容易准备的部分,因为考察范围相对固定。笔者去重后共刷了约120道题目,包含剑指offer中的所有题目,labuladong 的算法小抄中的部分题目,以及CodeTop企业题库中的部分高频题目。在刷的过程中,我会尝试多种解法并且尽可能的独立完成,实在做不出来的才看答案,这样能让自己对题目的印象更深刻。另外,其中的每道题目笔者都刷了三遍以上,多重复可以帮助自身巩固解体思路,加深记忆。
在笔者刚开始准备校招面试时,做起题来也比较困难,大概刷完一百多道时才感觉碰到陌生题目能想出一些比较巧妙的思路,因此建议各位对于算法题还是需要多刷多看别人的解题思路。
笔者刷的这些题目仅仅够让自己通过大厂面试中的算法题环节,但如果希望在大厂的笔试中名列前茅,仅仅依靠这些题是不够的,还是需要多刷一些笔试高频题目。
写在最后
耗时一周,终于将这篇文章写完。期间,笔者重新回顾了自身的校招经历,本文的很多段落被我加了又删,删了又加,措辞也被我改了又改,就如同在写毕业论文的致谢,明明想说的有很多,临了却发现什么都说不明白。此外,由于笔者是第一次将自己的经验写给大家看,也惟恐写出来的文字令各位觉得啰嗦,如今已然写完,希望本文能够对正在找工作的您产生一些正向影响。最后,也祝愿看到本篇文章的各位同学都能拿到自己满意的Offer。
公众号:努力学习的阿新
#面试复盘##校招##面经##春招##秋招##C/C++#