三妹的话:这篇文章授权于我的室友,希望能帮到大家。
校招面试总结
这篇文章是我校招时的回顾和总结,主要是程序员面试相关的整体心得和体会。用六个字总结就是 “早准备,多尝试”。
自身情况
先说一下自己的情况,本硕都在同一所 T2 分段 985 的计算机专业。研究生的时候做了两个深度学习相关的应用以及几个偏工程的项目,没有发上特别好的论文。研二的时候去美国交流了一年,感觉自控制力还是稍稍差点,见识涨了不少,但是研究和学习上还欠缺了一些。9 月初回国,没有实习经历,也错过了不少公司的招聘。在秋招刚开始的时候,没有国内组队学习找工作的环境,仅仅和别的小伙伴刷了一些 Leetcode,还简单看了看机器学习的相关书籍。秋招的时候刷多了一些题目,还看了看基础和网络等面试常问的问题。
心得体会
大学应该是一个长远规划的过程,大一大二可以是去了解自己、了解世界、不断的尝试;而到了后面,就需要认知自己的基础上,或者在迫不得已的情况下作出各种抉择和取舍了。
要准备的内容主要是算法题、语言特性、计算机相关原理、项目经历以及职位相关的问题等。这几个部分有着强烈的内在联系而又会有比较明显的区分。根据面试的公司、岗位以及面试官的喜好,各个部分在面试中的占比不一样,要求也不尽相同。找工作其实和平时考试差不多,范围很大,会的只有那么多,那么面试能不能过就是一个概率的问题了。如果时间充裕,就要多多准备,甚至在多去参加几次实际的面试和笔试,积累经验;如果时间有限,那就根据网上的面经、笔经进行针对性的准备。
简历
写简历一定要从看简历的人的角度来写,看简历的一般就两种人,一个是HR,他们主要就是对简历进行初筛,看看简历是不是清晰,内容够不够丰富,然后推给相应部门来安排笔试面试(这部分是我猜的)。另一个就是面试官了,面试官都不是专职面试的,他们也是程序员每天都很忙,可能在面试前才刚刚看过你的简历,所以写简历的最最最主要的准则就是要突出重点,你是要找一个程序员的职位的,那就突出和 coding 最相关的一些内容,比如会什么语言、做过什么项目、写过什么程序。项目 3 个就差不多,一定要写自己最擅长的东西,实际面试的时候,面试官一定会根据的你的简历上的项目来问一些相关的问题。
高考可能只有一次机会,但是找工作的时候可以找很多家。所以在投简历时要广撒网,可以采用如下的策略:
- 先放一些练手的公司
- 再把最想去的公司放在中间
- 最后加一些保底的公司。
这样做的目的是在面试心仪的公司前,能先获得一些面试的经验。很多事情当你知道了实际的流程、清楚了其中的套路时,就能变得没有压力,甚至轻车熟路了。当然在秋招的时候,会有很多公司扎堆招人,这个时候当然是就能多投就多投了。有内推的机会要多把握,相当于是多一次面试的机会,除了学长学姐,像学校论坛、牛某网上都会有很多相关的消息。公司每一个部门的招聘周期受 HC 的影响很大,在大规模秋招的时候 HC 可能都发出去了,但会有很多人会拿多个 offer,一旦他们作出选择了,就会释放出很多的HC,这个时候也出现一个不错的机会。笔者在 12月、1月面试的公司和 9、10 月相比也没有少太多。当过了秋招也不要气馁,可以接着找人内推,这个时候大都是部门直接招聘,对找想要的工作更有好处。
算法题
算法题的练习,简单来说就是在诸如 Leetcode 之类的网站上多做。一般都不限制语言。
- 刚开始可以刷一些整理好的经典题
- 之后可以按题目类型刷一下,针对类似做法或者使用类似结构的题目可以做一些归纳和总结
- 然后可以参加 LeetCode 的 contest 和 pick one 来巩固,contest 比较接近笔试
- 在面试笔试前可以针对公司的 tag 集中做一下
笔试
现在基本都是在网上答题了,现场笔试的不多。算法编程题基本都有,也可能会有智力题、语言特性题、机器学习简答题等。尽量要找一个网好的、安静的地方做。笔试题的难度比较分散,而且没有和人交流的空间,还有可能因为没有 HC 被涮了。所以笔试能不能过,都比较随机,放平心态。
面试
- 边理解题目边写测试,有什么不清楚的地方和面试官讨论
- 写代码前先说思路,如果是白纸上写的,留一点空间
- 写完以后用测试的数据实际带进去一步一步模拟运行一遍,千万不要想当然
- 做不出的时候,可以要一些提示
我自己面试的时候,判断 BST、BST 中序遍历时的某一个节点的下一个节点、字符串转小数、二叉树的宽搜这几个题目出现的次数比较多。
语言特性、计算机原理和职位相关的问题
语言特性就是在人们在开发和使用程序语言过程中,总结和沉淀下来的特性。不同的程序语言根据其设计思想实现的特性有一定的不同,但是总结下来的方法论都是相似的。计算机相关原理也类似,它是在人们开发和使用计算机的过程中,不过积累、迭代和优化的设计方法和具体实现。这两部分就是多看多想多写代码了。值得注意的是,根据语言版本和 OS 内核版本不一样,相应的特性和实现有可能是不同的,这就需要对某一种语言或者系统进行深入的了解了。
根据面试的岗位不同,还是考察很多职位相关的题目,比如面安全的会问各种漏洞的产生和防护等;面算法的会问经典的机器学习算法等;面大数据的会问分布式系统等。除了面试前的准备,还需要平时的积累。
而实际工作中,更多的就是项目经验和业务知识,就是把各种 case 记在大脑里,知道什么样的场景需要用怎样的实现。如果有了针对的工作目标,或者知道面试官所在的组是做什么的,可以提前看一看这方面的经典书籍。
项目
对于在实验室里做的项目,和公司实际使用技术会有很大的差别,而面试官更关注工程上的特性。所以在问这类项目时可以模糊掉实际怎么做的,而是介绍应该怎么做的。说到具体实现的时候,面试官可能就会针对的问一些问题,所多往自己会的、数据的技术上引导。
我有一个同学,研究生期间的项目都是涉密的,面试的时候不方便聊。于是,自己实现了一个网络通信的项目。参加了很多面试,每次考官都会针对这个项目提一些相关的问题,比如什么地方为什么要用这个算法?为什么不用那个算法呢?个人的小项目涉及的东西肯定不够全面,但是经过和多个面试官的“交流”,他就知道了项目有哪些不足,哪里可以有更好的做法。之后他的项目就越完整,后面的面试越面越顺畅,拿到了好些 offer。
后记
我最后一共投了大约 30 家公司,笔试参加 20 个左右,面试了 10 家,拿了 5+个 offer。可惜错过了腾讯的投简历时间,特意坐高铁去霸面,也没面上。面了 Google,给了个 pending,本来说亚洲其他国家的 Google 可能有 HC,结果过了 3 周还是 4 周又说没有机会了。所以,你可能由于各种不可控的原因导致错失 offer,而好心态在整个求职过程中就显得尤为重要。我从本科开始一共面了三次微软,回头来看,我认为本科找实习那次的难度才是最大的。所幸最后拿到的 offer 中有我最向往的微软,其他是京东,知乎,头条,商汤等,出于个人对微软的执念,我毫不犹豫做出了最终的选择。
以上就是我的一点经验和心得。希望正在阅读本文的你,也能拿到心仪的 offer。