聊聊如何拿大厂的 offer

为什么要进大厂

许多读者,尤其是一些学生朋友在找我聊职业规划和职场困惑时,我给的建议就是,如果你是应届生或者工作年限较短(五年以下),那一定要找个机会去大厂工作几年。

无论是出于所谓的“镀镀金”的心理,还是想去大厂挑战大业务量、接触高并发、提高技术、开阔视野,都是非常值得的。

虽然很多大厂都加班,但是作为工薪阶层的一员,哪里不加班呢?再者大厂的各项规章制度和福利待遇都比较完善,你可以见识到很多成熟的系统和优秀的做法和理念。

就福利待遇来说,大厂给的薪资待遇比一般的小公司给的要高上一截。就算你从大厂离职,你也可以很容易的涨薪去另外一家大厂。这些都是小公司的没有的优势(我这里并不是说小公司不好)。

由于刚毕业的时候,没有能够进大厂,导致起点和平台都比同时间进大厂的同学低许多。虽然最终通过自己的努力,从刚毕业时的月薪 5 千到现在的年薪 50 W+。

这期间我走了很多弯路和吃了很多苦头。以工资收入来说,未进大厂的,可能在社会上摸爬滚打好多年才勉强达到月薪 2~3 万,而进大厂可能工作一两年就够了,甚至有些大厂开出的 SSP 直接就有三五十万。

因此,如果你一毕业就进入了大厂,那么你的第一份工作的收入、起点和视野就会比同龄人高很多。这也是我苦口婆心地劝毕业生们在毕业前夕的那段日子里面咬咬牙,努力去拿个大厂的 Offer 的原因。

进入大厂的难点在哪里

虽然大厂很好,但是进大厂对个人资质、个人素养和技术水平都有一定的要求,并不是每个人都有机会的。这里说的个人资质,如学历和毕业院校的层次。

一般大厂都只接收本科及本科以上的学历,对于本科以下的学历的应届生一般都不会考虑。而且会优先选择学校层次还不错的毕业生。

也就是说对于应届生,学校和学历成了硬性要求。即使你的能力再强,HR 筛选简历时就已经把你给 pass 掉了,你根本没有面试的机会。

高考已经没考好了,这个已经成为既成事实了。那对于学历和学校不好的人,还有机会补救吗?

有的,通过社招。

也就是说,你可以先工作几年,再尝试去大厂面试。因为社招更多的是看重的是你的技术水平、工作经验等,对学历要求没那么高了。

如何进入大厂

无论是应届生还是工作几年的人,一般都需要通过技术面试才能进入大厂。

那么大厂技术面试一般会哪些问题呢?除了少部分相关的技术外,重头戏都是算法与数据结构。

说到算法和数据结构这门学科,很多人尤其是已经工作了几年的社会人士,用范玮琪的一句歌词来形容,那真是“那一些是非题,总让人伤透脑筋”。

大家常学常忘,但为了面试,尤其是大厂面试,所以不得不学。

很多人对算法和数据结构这门课,甚至存在这样一个误解:实际工作中根本用不到算法,只有面试才会用到。产生这种错觉的原理,莫外乎此人技术不够资深、水平不够好,无缘参与核心开发而已。

学好算法和数据结构,无论对从技术水平长远的发展来说,还是对个人逻辑思维锻炼都是大有裨益的。

国内的大厂面试,基本上大多数问题都是各种算法和数据结构题,而国外的大厂,像 Google、Facebook、微软等等,基本上百分之百是算法和数据结构题目。

很多应届毕业生横扫各大大厂 Offer,很大一部分原因是因为算法和数据结构掌握的好,当然薪资也非常可观。社会人士虽然在面试大厂时对相关的项目有一定的工作经验,没有像应届生要求那么高,但是最基础最常用的算法和数据结构还是要熟悉的。

说了这么多,那么大厂面试到底要求哪些算法和数据结构知识?我根据我面试的经验,给大家整理了一个清单:

  1. **排序(常考的排序按频率排序为:**快速排序 > 冒泡排序 > 归并排序 > 桶排序)

    一般对于对算法基础有要求的公司,如果你是应届生或者工作经验在一至三年内,以上算法如果写不出来,给面试官的印象会非常不好,甚至直接被 pass 掉。

    对于工作三年以上的社会人士,如果写不出来,但是能分析出其算法平均、最好和最坏的情况下的复杂度,说出算法大致原理,在多数面试官面前也可以过的。注意,如果你是学生,写不出来或者写的不对,基本上面试就过不了。

  2. 二分查找

    二分查找的算法尽量要求写出来。当然,大多数面试官并不会直接问你二分查找,而是结合具体的场景,例如如何求一个数的平方根,这个时候你要能想到是二分查找。

    我在 2017 年年底,面试 agora 时,面试官问了一个问题:如何从所有很多的 ip 地址中快速找个某个 ip 地址。

  3. 链表

    无论是应届生还是工作年限不长的社会人士,琏表常见的操作一定要熟练写出来,如链表的查找、定位、反转、连接等等。还有一些经典的问题也经常被问到,如两个链表如何判断有环(我在 2017 年面试饿了么二面、上海黄金交易所一面被问过)。

    链表的问题一般不难,但是链表的问题存在非常多的“坑”,如很多人不注意边界检查、空链表、返回一个链表的函数应该返回链表的头指针等等。

  4. 队列与栈

    对于应届生来说一般这一类问的比较少,但是对于社会人士尤其是中高级岗位开发,会结合相关的问题问的比较多,例如让面试者利用队列写一个多线程下的生产者和消费者程序,全面考察的多线程的资源同步与竞态问题(下文介绍多线程面试题时详细地介绍)。

    栈一般对于基础要求高的面试,会结合函数调用实现来问。即函数如何实现的,包括函数的调用的几种常见调用方式、参数的入栈顺序、内存栈在地址从高向低扩展、栈帧指针和栈顶指针的位置、函数内局部变量在栈中的内存分布、函数调用结束后,调用者和被调用者谁和如何清理栈等等

    某年面试京东一基础部门,面试官让写从 0 加到 100 这样一个求和算法,然后写其汇编代码。

  5. 哈希表

    哈希表是考察最多的数据结构之一。常见的问题有哈希冲突的检测、让面试者写一个哈希插入函数等等。基本上一场面试下来不考察红黑树基本上就会问哈希表,而且问题可浅可深。

    我印象比较深刻的是,当年面试百度广告推荐部门时,二面问的一些关于哈希表的问题。

    当时面试官时先问的链表,接着问的哈希冲突的解决方案,后来让写一个哈希插入算法,这里需要注意的是,你的算法中插入的元素一定要是通用元素,所以对于 C++ 或者 Java 语言,一定要使用模板这一类参数作为哈希插入算法的对象。

    然后,就是哈希表中多个元素冲突时,某个位置的元素使用链表往后穿成一串的方案。

    最终考察 Linux 下 malloc(下面的 ptmalloc) 函数在频繁调用造成的内存碎片问题,以及开源方案解决方案 tcmalloc 和 jemalloc。

    总体下来,面试官是一步步引导你深入。(有兴趣的读者可以自行搜索,网上有很多相关资料)

  6. 树 面试高频的树是红黑树,也有一部分是 B 树(B+ 树)。

    红黑树一般的问的深浅不一,大多数面试官只要能说出红黑树的概念、左旋右旋的方式、分析出查找和插入的平均算法复杂度和最好最坏时的算法复杂度,并不要写面试者写出具体代码实现。

    一般 C++ 面试问 stl 的 map,java 面试问 TreeMap 基本上就等于开始问你红黑树了,要有心里准备。笔者曾经面试爱奇艺被问过红黑树。

    B树一般不会直接问,问的最多的形式是通过问 MySQL 索引实现原理。笔者面试腾讯看点部门二面被问到过。

  7. 图的问题我在面试三星电子时就有一道面试题就是深度优先和广度优先问题。

  8. 其他的一些算法

    如 A* 寻路、霍夫曼编码也偶尔会在某一个领域的公司的面试中被问到,我在面试宝开(《植物大战僵尸》的母公司)就被问到过。