如何备战互联网公司技术面试
以下文章来源于Golang 成神之路 ,作者L
点击上方蓝色“Go语言中文网”关注我们,设个星标,每天学习 Go 语言
对于很多即将毕业的应届生,这是第一次踏入社会。很多同学因为毕业时候拿到不同的 offer,加入不同的公司,然后在五年之后发生了翻天覆地的变化。为什么有的人明明上学的时候平平无奇,为何工作之后如鱼得水,迅速升级,五年之内年薪百万?而有的人成绩数一数二,职场缺不见起色?这都说明了工作平台的重要性。本文就来剖析一下如何备战互联网公司的技术面试,适用于应届生以及刚毕业两到三年的职场新人。
本文提纲如下:
- 互联网公司技术面试主要考察什么(以面试官的角度)
- 我们应该如何准备面试(以学生的角度)
- 准备资料推荐
- 面试笔记推荐
- 如果需要,可以提供免费咨询和 BAT 滴滴头条等各大互联网公司的校招内推
1. 互联网公司技术面试主要考察什么
很多大公司对于校招生(刚工作的职场新人)的考察主要就是考察有没有潜力,那么问题又来了,如何衡量一个人有没有潜力,可以概括为如下几个方面:
- 基础
- 成果
- 热情
- 智商
- 软技能
基础。基础的考察基本是所有公司都会考察的,因为这些都是工作中需要用到的。这里的基础主要包括计算机的相关知识,比如操作系统、数据结构、算法、网络、编译原理等,对于算法岗位的同学,数学基础也是需要考察的。大学里面的计算机课程构成了计算机行业的基石,基础的掌握程度如何直接决定了你以后可以到达的专业高度,这个在大公司里面更加明显。比如很多系统优化到极致都是和计算机底层打交道,在大公司里面,系统哪怕优化 1%,带来的收益或者成本节约可能都是千万级的。所以基础的考察很多大公司的资深面试官尤其看重。
成果
。成果方面对于学生时代主要集中在:
- paper/专利等,这个是硬通货。这个指标对于一些研究性质的工作影响尤为大,比如一些博士的岗位,可以根据 Paper 的数量和质量,可能对应的 offer 具有天壤之别。其中 paper 又根据影响因子以及不同类别分成三六九等。
- 比赛得奖,比如 ACM、Kaggle、数学建模比赛等对于计算机相关专业的学生具有一定的加分项。ACM 和数据建模比赛大家应该都比较了解,Kaggle 是机器/深度学习打比赛的网站,如果你打算求职算法职位(机器学习/深度学习),强烈建议去 Kaggle 打一打比赛,最好能有一个 top 的成绩。
- 项目,项目可以是在实验室里面的项目,也可以是开源项目。比如你毕业想从事大数据行业,那么如果你深度参与过 Hadoop 生态圈的开源项目,那么将是一个非常大的加分项。如果是实验室项目或者个人项目一定说清楚,比如参考 STAR 法则。当然最好要有亮点,可以给人一种你是专业的感觉。有些同学因为实验室的原因,可能没有特别有说服力的项目经验,这个时候参与到开源项目中绝对是一个性价比超高的投资。
热情。热情这点很多人不以为意,很多公司也不会考察,但是笔者所在的公司的面试守则里面是明确有热情这一项的要求。热情的一个体现是:对某一个领域具有强烈的好奇心,并且付诸行动并取得了不错的成果。现在很多应届生在简历上面都喜欢写自己学习能力强,对技术有追求,但你要问他有没有 “好奇心 -> 行动 -> 成果” 这样的示例,得到的大部分回答都是没有,怎么能让人信服呢?
智商。对于智商这点虽然大家都不愿意明面上面谈及,但是私底下还是很看重的。对于智商的衡量不同公司的衡量不一样。可以主要概括为如下几个方面:
- 智力题。智力题的话比较常见的有各种硬币相关的问题。举个例子,现在有 9 枚硬币,其中又一枚坏的,那么最少称多少次可以找出坏的那枚呢?
- 算法题。不能不承认有的时候算法题还是能体现出一个人的智商程度的。我们当年有一年面试,有一家公司宣讲的时候就说我们只要最聪明的人,然后笔试十道算法题,面试又全是算法题。关于算法题面试题出处很多都会参考 Leetcode,网址 www.leetcode.com。相信准备面试的同学都在上面做过题,这个网站上面的题目对于我们短时间提高应试算法能力是非常有效的。当然也不排除有些面试官会自己出题,但是以一个面试官的角度来说,这种情况可以说少之又少。
软技能。在职场或者公司大部分情况下都是多人协作做一个项目,不太可能有单兵作战的情况,所以很多公司也会考察候选人的沟通能力,协作能力等软技能,考察方式也因人而异。有些面试官会特意考察沟通这块的能力,比如给你一个背景不明确的问题看你会不会主动和面试官沟通以及如何高效沟通。高效沟通的一个标准是能抓住重点,简明扼要,不啰嗦。想一想,如果在工作中你和合作方讨论问题的时候,对方一直啰啰嗦嗦,永远讨论不到关键点上面,你是不是很奔溃。所以这一块在很多公司的面试中会重点考察,有时候甚至会占有较大的币种。
2. 我们应该如何准备面试
有了第一节的大纲,我们就可以有的放矢了。下面我们针对上面提出的几点考察项目逐个击破。
1. 基础
虽说基础的学习不是一朝一夕的事情,但是也是可以在短时间内进行补救的。其中一个主要的方式就是实践+刷题。
- 操作系统学习:这个一定要一边看书籍/资料,一边在 Linux 操作系统上面进行实践,更深入一点可以自己尝试写一个微型的系统出来。还有 Linux 的操作系统源码有时间也值得一读。
- 数据结构:数据结构的最有效学习方式是经典数据结构(比如堆、栈等)自己从 0 到 1 实现一套,不管使用什么语言。然后再将自己的实现方案和一些标准库(比如 STL)进行比较。
- 算法:对于一些经典的算法(比如排序算法,LRU 算法)一定要自己实现。其次,还要活学活用,就是通过数据结构 + 算法去解决问题,这里建议一个刷题网站:www.leetcode.com,只要你持续的刷两三个月是可以感觉到编程技术实打实的提高的。
- 网络:网络的学习实践起来更简单了,我们可以通过抓包来分析各种的网络协议栈,比如使用 TcpDump, Charles 等工具。除此之外,像路由表这些可以网络实验有时间一定要做。
2. 成果
成果方面的话,比赛得奖这种短期内如果没有机会就不要强求了。在短期内可以努力的方向主要集中在开源软件的参与上面,简单说一下如何实操。
-
先将开源软件用起来,一边用一边测试并思考有没有可以改善的地方
-
如果在使用过程发现了 bug 或者可以改进的点,那么可以提 issue 和 pull request
-
如果没有发现 bug 等,那么可以遍历项目的 issue,看看有没有可以自己帮忙解决的。在规范的开源项目中,这种 issue 一般会被打标 "help wanted"
-
通过上面三步逐步深度参与进去
关于开源项目的选择,如果想短期内有效果的话最好是选择刚开源不就不太成熟的开源项目,这个在各个领域都会有,一般各大公司开源的时候都会发 pr 稿,然后瞅准机会参与进去。
3. 热情
热情的培养可以通过订阅一些优质的公众号或者网站来培养,比如 InfoQ 的系列公众号对于技术的视野提升都有不错的效果。然后找到自己感兴趣的领域,然后按 “好奇心 -> 行动 -> 成果” 来行动起来。
关于如何让面试官认可你的热情,我觉得有一个点是可以短期内做到的,就是找到一个行业领域中最先进,或者说最主流的计算方案和实现原理,如果能有自己的理解和改进建议最好。比如说实时计算这块,现在主流的就是 Flink, Spark 两种方案,那么这两种方案的对比有哪些优劣呢?以及这两种方案的底层技术。比如 Flink 底层的分布式一致性算法实现和增量 Snapshot 实现。相信我,如果在面试中你能将类似这样的东西说出来,面试官对你的印象绝对提升一个量级。
4. 智商
智力题的话只能多收集网络上的题目,多看多练了。算法题的话在第一个部分有介绍刷题网站。
3. 准备资料推荐
这里主要推荐一些资料,包括书籍和网站等。
1. 书籍
操作系统:
- 《深入理解计算机系统》:这本书里面的内容涵盖了计算机领域非常多的内容,如果有时间强烈建议一段
- Operating System: Three Easy Pieces。非常不错的一本书,参考我的书评:https://zhuanlan.zhihu.com/p/49286109
- 《现代操作系统》
- 《Unix 环境高级编程》
网络:
- 《计算机网络:自顶向下》
- 《TCP/IP》
数据结构与算法:
- 《算法导论》:大部头,但是非常值得一读,最好能做一下课后习题
- 《算法》:Java 语言实现
- 《数据结构与算法分析》
机器学习与深度学习:
- 《统计学习方法》
- 《机器学习》:西瓜书
- 《深度学习》:花书
- 《动手学深度学习》
编程语言
- 《STL 源码剖析》
- 《C++ Primer》
- 《Effective C++》
- 《More Effective C++》
- 《Effective Modern C++》
其他:
- 《高性能 MySQL》
- 《Redis 设计与实现》
- 《Hadoop 权威指南》
2. 网站
- leetcode.com: leetcode 对于很多人的算法锻炼是非常有效的,你可以按特定的 tag 来练习特定的算法,并梳理出常用的解题套路。那么如何判断自己对 leetcode 的利用程度呢?一遍写出 bug-free 代码,直接使用浏览器写,这个联系对于白板面试是有非常大的帮助的。
- https://www.careercup.com,也是一个面试相关的网站,具有非常丰富的资源。比如其中有一个专门的页面叫:Recent Interview Questions,也就是最近的面试题,一般都是来自硅谷的互联网公司,如果你打算直接找海外的公司,这个参考意义非常大,对于国内公司面试也有很大的参考意义。
- https://www.geeksforgeeks.org,geeks for geeks,在我当时面试的时候也帮了非常多的忙。这个网站的内容非常丰富,包括:算法、数据结构、编程语言、面试等。
3. 其他
- 极客时间:极客时间也是我目前一直在使用的 app,里面的很多课程都是值得一看的。但是极客时间里面的课程都是收费的,对于有些学生可能囊肿羞涩,如果想买的话可以联系我,通过我的推荐码去买,然后将我将返佣全部返给你,这样还能优惠一些。
4. 面试笔记推荐
这个是我之前校招整理的面试资源,可以参考:http://note.youdao.com/noteshare?id=8780f31b014354d56942c0f9c612b673