作为一个cs留学生,在求职季节,我面试过几乎美国所有最热门的公司,最后也顺利拿到了Google、Facebook等大部分公司的offer。在公司分布上,既有FLAG等一线巨头,也有Wework等当红独角兽公司,还有一些刚起步的创业公司;在城市分布上,它们在东岸的纽约、西岸的硅谷和西雅图,都是科技公司最聚集的地方;在流程上,既有简历都不过关的时候,也有据offer后被对方团队强烈挽留的时候。
所以,这段求职经历给了我很多不同的体验,我想在这篇文章中跟你分享一下,在美国找一份软件工程师工作是怎么样的体验,以及如何准备这些公司的面试。
1、准备篇:厚积而薄发
台上一分钟,台下十年功。这句话用来形容面试非常贴切。
很多人的关注点在短短的几十分钟面试过程,去研究“面试技巧”,比如说怎么观察面试官的脸色、怎么随机应变、有什么流程套路等等。这些东西虽然重要(这篇文章后面也会讲到),但也没那么重要,其实更重要的是在面试之前,你是否做了充足的准备。
首先说点抽象层面的东西。
在面试一个候选人的时候,对于能力的要求重要性大概是这样的:智商 > 情商 > 经验(知识和技能),这是对于应届毕业生的考察。而如果是对于有工作经验的人(社招),或者对创业型小公司来说,重要性排序可能就是这样的了:经验(知识和技能)> 智商 > 情商。当然这里说的是美国,所以还有一个必备的条件,就是“工作签证”,没有合法的工作身份,就算你是比尔盖茨般的神童,也没有哪个公司敢招你。
怎么理解这三个能力?
智商。并不是说需要你有爱因斯坦一样爆表的IQ,这里指的是:是否具有从事软件开发工作所需要的正常智商水平,毕竟软件开发也是一个脑力密集型行业。怎么考察智商呢?不是给你做一个IQ测试,而是通过学校背景、成绩、过往项目、面试表现,看出候选人的资质如何。在专业的计算机竞赛中有不错成绩的同学,更能反映了他们从事这个职业的天赋。所以像ACM等竞赛获奖的人,往往被各大企业疯抢。Google的招聘哲学就是,把全世界最聪明的人招募进来,然后再开始想要做什么产品。苹果创始人乔布斯也说:我一直在找最聪明的人,和他们共事。在钱最多的两个行业:计算机和金融,对顶尖人才的渴望都是一样的。
情商。程序员给人的印象是不善言辞,甚至有点一根筋,那为什么要求他们有情商呢?有的人会说,你看那微信之父张小龙、谷歌创始人谢尔盖,不都是羞涩的极客吗?首先你得有人家那天赋异禀,看这篇文章的,应该都是平常百姓的孩子,一个凡人。然后他们只是在公众媒体少曝光,并不代表他们私下也是书呆子一个。其实优秀的程序员,一定也是一个优秀的沟通者,他们能快速地理解产品需求,跟团队打好配合,最终交付一个高质量的产品。企业希望招聘的人,是一个团队协作者,他能和团队相互促进,面对困难能寻找帮助,也能及时帮助同事,首先是群体中的一个人,然后才是一个软件工程师。在面试中,面试官会抛出许多“行为问题”(Behavior questions),比如说:你遇到的最大困难是什么?有没有主导过一个项目?通过你的回答,面试官可以判断你未来是不是一个好相处的同事,毕竟大家每天抬头不见低头见,选对人很重要。
经验。近年来,对经验的要求是越来越高了,随便一个招聘启事,都写着需要至少一年或三年以上工作经历。经验,代表的是候选人具有充分的知识储备和编程技能,在工作岗位上能迅速上手。Google、Facebook这样的大厂对经验的要求并不高(但不是不要求),因为大厂有财力、耐心来慢慢培养新人。而中小型企业尤其看中候选人的经验,需要来到就能干活的人,要不然公司很快就倒闭了。比如说他们招聘一个做ios开发的工程师,而你的简历上相关的经验,没有正式工作经历,他们根本不会考虑你。对应届毕业生,这个要求很残酷,毕竟在一直校园里,哪有什么经验。不过呢,机会是留给有准备的人的,实习、课程项目、业余项目都是积累经验的渠道。
抽象的说完,再来说具体是怎么准备的。
第一,基础知识。我们常说“他是科班计算机出身”,这“尊贵”的“科班”头衔意味着什么呢?就是扎实的基本功。
简单来说,计算机基础知识包括:一门熟悉的语言、计算机组成原理、操作系统、计算机网络、数据库系统。网易公开课给计算机专业专门建立了一套系统的课程(不是广告啊喂!),我引用他们的课程的设计,来说明一个合格的程序员应该具备哪些知识。
图上的每一个课程都可以学上大半年,是不是看着都很绝望呢。不过好消息是,理论归理论,这里我们说的是面试,其实并不会真的考察到这么多知识。按我的经历,正常的软件工程师面试,能考到的知识就是:对一门编程语言的熟悉程度(Java/Python/JavaScript等)、网络常识、数据库常识、系统设计常识,不会再深入了。
简单举个几个栗子,对于编程语言,可能会问到:Java的抽象类和接口有啥区别呀?对于网络常识,可能问到:TCP三次握手是啥?SSL又是啥呀?对于数据库,可能会问到:SQL和NO-SQL的区别是什么?
考察的都是基本的常识,好好上课、好好做作业,这些知识都自然而然印在脑子上了。对于非“科班”的同学,也不必觉得毫无机会,只要认真掌握了这些知识,面试官都是一视同仁的。转专业过来的程序员多着去了,他们都能在硅谷找到一份非常不错的工作。
第二,数据结构与算法。前面说的智商,具体来说是做程序员需要的智商,主要体现在这数据结构和算法掌握上。计算机届有个著名的公式:程序=数据结构+算法,一段程序代码在做的事情,一是怎么储存数据,二是怎么操作这些数据,最终产生想要的结果。
80%的面试内容,都是在考察算法。有一个网站,是北美找工作必不可少的,叫Leetcode,是一个集合了900多道算法题目的网站。用户可以在线提交自己写的答案,Leetcode给出测试结果,以及你的算法耗时和排名。题目来源是各大公司的真实面试题,从不同渠道泄露出来后,被放在了Leetcode网站上。
我刚来美国留学的时候,经常会听到一个词叫“刷题”,一直不明白什么意思,慢慢了解之后才知道说的就是到Leetcode上做题。这些题目几乎覆盖了所有可能在面试中碰到的算法题目,所以如果想要找一份好工作的话,把网站上的大部分题目做完、做熟是基本要求。
在刷题之前,应该系统地学习数据结构知识,掌握常见的数据结构,例如数组、二叉树、链表、哈希表、二分查找、深度优先搜索、广度优先搜索等等,不然面对Leetcode的题目会觉得一头雾水。在这里推荐一本普林斯顿大学出版的《算法》(Algorithms, 4th Edition),一本红皮书,内容通俗易懂,还配套了在线网站和免费视频讲解,非常良心。
除了Leetcode,也有其他选择,例如中文版的Lintcode、HackerRank(很多公司用它做OA,类似笔试)。不过按照大多数人的经历,美国科技公司的面试,有leetcode就够了。
“刷题刷到什么程度才能去面试啊?”,这是一个经常被问到的问题。对于平常人家孩子来说(ACM大神请回避),当然是越多越好,刷完最棒。但是Leetcode这些年来孜孜不倦地添加新题,以前只有200多道,一个多月就刷完了,现在已经有了900多道,而且越来越难,臣妾们都纷纷表示刷不动了。
所以刷完是不太可能了,只能挑重点来刷。好在Leetcode已经给大家分好了类,分为话题tag和公司tag,并且给出了这道题被面试问到的频率。不过是要付费的,160刀一年,毕竟充钱才会让你变得更强。对于Google这样的神级公司,刷题数量是没上限的,大部分进Google的中国学生,都把所有leetcode题目刷完且熟练掌握。而对于其他大部分公司,把经典、高频的三四百道题目掌握好,应付面试已经绰绰有余。
刷算法题是准备面试中最重要的一步,也是最费时间精力的一步。业界有不少声音批判这种“应试般”的面试方法,但是不可否认的是,它是目前最高效率筛选合适人才的方法。能把各种算法题目解出来的人,都符合以下一个或多个特质:1)非常聪明,对算法题举一反三,没有不会做的题目;2)非常努力,把900多道算法题研究透彻,没有一年左右的时间是不可能的,这么专注、勤奋的人,是一个不能错过的潜力股;3)基本功非常扎实,踏踏实实地刷了那么多算法题的人,熟悉地掌握了各种数据结构,知道怎么写出高效率的代码,放到工业界环境,就是一个优秀的程序员。
对于这些人才,企业难倒放着不要,去招只会夸夸其谈但代码都不会写的人?因此,算法面试依然会成为企业的主要面试方式,好好准备算法是求职的第一要务。
第三,经验积累。面试过程中,我跟很多HR或者招人的经理(Hiring manager)聊过,一段正式的相关工作经历,是简历上最有价值的地方,其次是实习经历。他们对经验的重视程度是这样的:全职相关工作 >> 实习 >> 课程(课外)项目 > 学校课程。
从身边的案例来看,具有正式工作经验的人,能够非常容易得到面试机会,甚至被猎头、HR“求着”来面试。虽然大家都说现在是互联网的寒冬,但是一个具有几年全职工作经验的人,放在美国科技就业市场,依然是非常抢手的人才。所以,如果是工作之后再过来留学的人,起码在找工作的起点上,就领先一步了。
然后是实习经历,也非常重要,它代表着你在工业环境中受过正规的训练,能过适应、迅速上手工作环境。有美国名企的实习经历,也能很容易地拿到其他名企的面试机会。在国内的实习经历,就要看当时的HR或者面试官是否知道这家公司了,比如说BAT这种世界级的互联网企业,知道的人会多一些。其实就是光环效应,如果面试官知道这家企业,并且认为这家企业在某个领域做得还不错,那么自然对面试者也多看几眼。
所以,有心找工作的同学,还是在大学期间争取到更好的公司实习一下吧。
如果实习经历也没有呢,那只能自己多努力做一些有质量的项目了。它可以是给开源项目贡献代码,也可以是一些课程项目。我认识的一些同学,给某个开源项目贡献过代码,也被合并到该项目的代码库了,有这样的经历,可以在面试中吹上好一会儿了,拿到面试甚至offer的几率都很大,因为它体现了你的综合能力。
课程项目是每个学生都可以有的经历,美国大学基本上都是选修制度,也就是自己可以选择课程来上。在选择的时候,最好选择对工作有帮助的“硬核”课程,比如说我所在的CMU就有一门课叫云计算(Cloud Computing),内容都是工业界非常流行的一些技术栈,然后结合了很多实际的项目,边学边做。这门课非常辛苦,是CMU最难的课程之一,然而经过这个课程的洗礼之后,可以招架住绝大部分面试内容了,毕竟都是你自己亲自做过的项目,聊起来也特别带感。
最后,有同学会问,工作经验没有、实习没有、课程项目也没有,怎么办?嗯,那么,同学你是真心找工作的吗,家里有矿的吧。