时间线
和国内不同,美国暑期实习入职早,投简历更早。基金和Fintech公司在7月就会开放次年的暑期实习岗位,科技公司则是8月初,部分大厂可以到8月底。总体而言,越是招人少的公司越要早投,很可能晚一周竞争者就会超级加倍。大部分简历拒不是因为你不够强,而是根本没有被从池子里打捞出来,如果能找到人内推会好一些。此外,9月份高校开学后就会举办career fair,这是上岸的最好时机。Career fair的意义不在于让你提交申请,而是给你一个机会催recruiter推进流程,我这样拿到了三个面试。
9、10月是面试的高峰期,秋季的head count最晚在11月也会用完了。如果秋招情况不理想,可以等到圣诞节后的1月春招继续面。
简历关
如果你的简历有幸被打捞起来,恭喜!你迈出了万里长征的第一步。一位并不technical的technical recruiter会花大概十秒扫视这些内容:
你的实习经历(☆☆☆☆☆)。对于国内大厂,recruiter一般只听过字节阿里腾讯,但是只要你有随便一段工作经历就已经超过一小半人了。
你的学校和专业(☆☆)。除了顶尖学校以外,只会区分听过的学校和野鸡学校,top50的差别不会很大。关于专业,最理想的情况当然是CS,如果是偏硬件的泛CS专业(EE、CE、ECE)可以统一写成Computer Engineering占个便宜。
技术关键字(☆)。因为实习都是general hire,什么和CS沾边的方向都可以,但对方大概率对Web前后端的关键字更熟悉。如果你之前没有实习过,可以在个人项目里赛一堆有的没的buzzwords来凑数。
我可以保证这是100%准确的一手信息,因为有个亲戚就是recruiter。当然,如果您在MIT读书或者有绿卡,可以无视以上所有内容。
排版(☆☆☆)也是很重要的因素,虽然每个人的偏好都不一样,简历一定要做到机读友好,不然很可能根本到不了真人手里。可以找免费的resume parsing API试试读出来的信息是否准确。
面试
面试考察的无非是三个维度:算法题、系统设计、沟通能力。
算法题:我的体验是,和一亩三分地里流传的不同,其实Intern岗位并不会对你的解题能力有很高的期待。我的Leetcode到今天也只刷了三十多道,实际面试里也没遇到过想不出来的题目。能够熟悉几个基本的数据结构(数组、链表、优先队列、哈希表)并且将他们排列组合使用就行了。比如,题目让你实现一个deque*(支持O(1) random access),你应该能很快反应过来需要在双向链表上套一个哈希表。恰恰相反,对语法和标准库的熟悉程度、代码风格、bug率、写test case的能力更容易让你挂掉。C++标准实际上没有规定实现方法,GCC用的是vector套vector
系统设计:给intern和new grad写的系统设计题目都很naive,围绕怎么设计一个类的数据和接口展开。我只有几次被问到过算是棘手的问题:
怎么用一个类来表示一张n*n的拼图?如果再写一个类来作为拼图solver呢?
在一个key-value存储系统里,怎么控制并发?
对于一个依赖timestamp的系统,怎么给它设计test framework?
锻炼这些能力,最好的方法就是上system类的课程,比如我校的神课EECS 482(Operating Systems)和MIT的6.824(Distributed Systems)。这些课的projects都有一个特点:代码量大而且存在shared states以及race conditions。这些挑战会强迫你分析清楚每个模块之间的依赖关系,而解决它们需要你掌握很多琐碎的编程技巧。我在这些课里学到了很多新东西,比如规范的日志输出、自动化测试、RPC、条件变量、RAII。
沟通能力:这部分和技术关系不大。最基础的,你的英语需要能够让面试官听懂。口音并不重要(毕竟面试官都是老印老中),但你的表达一定要平稳流畅,不要说几个词就停顿一下,打断自己和对方的思路。在这之上,你要学会将自己解题的思路表达出来——足够详细却又不包括琐碎的细节。在一时想不出解法的情况下,你也需要用沟通技巧为自己争取时间和提示,对问题一番分析、从暴力解法开始娓娓道来、最后将几个可能的优化方法说出来,观察对方的反应。很多国人的问题在于拿到题就开始一顿操作,然后一声不吭直接扔出一个最优解,最后两个人大眼瞪小眼。切记面试官寻求的是“解题能力”而不是“题解”,重点在于“解”的过程。
留学生想在美国找好一份较好的工作,必须要做足充分准备,比如大厂的一些面试技巧以及面试题等等,Uoffer提供各类专业咨询与课程服务,助你成功上岸大厂工作。