先前在申请、找工作的时候受惠于留学版以及版友许多,最近刚好找工作到一个段落想说
有些心得和大家分享。因为版上的上的大神太多了(今天才受教于一位大神版友XD),若有
不足之处还请大家多多指教。
背景:
NTUEE B.S. in EE
UC Berkeley M.Eng. in EECS
申请工作:
Bloomberg ML Engineer -> Rejected Early Sept.
Boeing SW Engineer -> Rejected Early Sept.
Intel PSG (Formerly Altera) Rotation Program -> Offered Early Oct.
Twitter Deep Learning Engineer -> Offered Early Nov. Accepted
Apple Camera Group HW Engineer -> Offered Early Nov.
Apple GPU Group HW Engineer -> Offered Early Nov.
NVIDIA ASIC HW Engineer -> On-site Nov. 8th (Today XD)
Apple Siri NLP -> Ongoing (Likely decline further interview)
因为念的是一年的 Program,从八月一号一登陆就开始海投、请人内推、Career Fair
在过程中有很多自己做不好的地方,因此想把一些经验和版友分享。FLAG 的部分...
因为小弟真的还差一截,完全没有收到回音,还请版友多多指教。
一、M.Eng. 一年 Program 的优劣、面试管道的取得
在正文开始前想先特别提到一下版上先前有讨论过的 M.Eng。最近几年前面的学校
都开设了所谓的 Master of Engineering (M.Eng.) Program。因为先前来唸的人
不算多,大家主要的担忧有两点 (1) 学位名称不一样,找工作不好找 (2) 一落地
就要开始找工作,没实习经验不好找。但就小弟的目前为止的经验,我想其实几个
大名字的 M.Eng (UIUC, UCB, Cornell) 对于未来想要直接投入职场的同学来说,
绝对是个好选择(注意若想要升学博士则未必)。其实大家来美国念硕士也就无非是
当成一个找工作的跳板,你知我知 HR 也都知道。因此挂的学位名称真的关系不大
。有人会担心会不会是 M.S. 若比较有 domain knowledge 的事情,M.Eng 做比较
技术的职位。其实真的是没差的,我有看过 Ph.D 投 SDE,也有看到同届的 M.Eng
找到挂 Data Scientist 的职位。到头来,校名只是帮你过第一关,从第二关的电
话面试以降,就都是靠个人的实力了(顺便打个广告,欢迎大家申请 UCB 的 M.Eng
XD省钱又可以快速开始工作)。而这又带到第二个议题: 面试管道的取得。一般来
说面试就是三种方式取得: (1) 海投 (2) Career Fair (3) 内推
先说海投,基本上真的是比较运气的事情。尤其是 CS 热到不行,HR 的信箱可能
随时都塞著一百封未读信。一般来说海被看到的机会极低,但一旦 HR 和你开始联
络后,起跑点也就跟大家一样了。
再来是 Career Fair,我觉得常常被大家低估。小弟的四个 Offer 中,有三个是
透过 Career Fair 最终拿到的 (Apple*2 + Intel*1)。Career Fair 有两大优点
(1) 保证可以跟 recruiter 说到话 (2) recruiter 保证会看你的履历。要知道
跟 recruiter 说到话,是取得面试机会的第一步。在海投和内推中,你的履历都
是透过第三方转到 recruiter 手上的。对 recruiter 来说,你是一个遥远、陌
生的概念。Recruiter 不知道你履历上的东西含金量到底多少,也不知道这个人
的能耐到底到哪里。但在 Career Fair,你站在 recruiter 前的五分钟是一个活
生生的人。通常也有一点工程背景的 recruiter,听到你讲几个关键字,就大概
知道含金量高不高。通常第二天,至慢一个礼拜,就会有回音。真的对你很有兴
趣的 recruiter,甚至当场就跟你说了,直接预约面试详谈时间。因此 Career
Fair 的时候,不论要排多久,请穿上衬衫、印好二十份履历,到现场大开杀戒。
最后是内推,一件非常奇妙的事情XD 内推是确保 recruiter 一定会看到你履历
的方法。但是 recruiter 要不要和你联络,基本上还是操之在他。因此在内推之
余,也绝对不要松懈,持续透过 Career Fair 和海投找机会。
二、面试前: 流程、尽早、刷题、念书
(a) 流程
一般来说 EECS 的面试流程如下
1st Round Phone Screen -> 2nd Round Phone Screen -> On-Site Interview
HR Engineer A hell lot..
上面是小弟碰过最短的,最长的有四轮 phone screen,一轮 recruiter、一轮
hiring manager、一轮 coding、一轮 domain knowledge。而 on-site 通常是
一轮,唯一的例外是 Apple Camera 让我下去 Cupertino 两趟...。基本上一个
完整的面试流程跑完,也大概是一个月了。因此十月拿的 offer,是九月种的果
,找工作这件事是越早开始越好,等看到大家都在面试再开始投就真的来不及了
。通常第一轮的 Phone Screen 主要是 Recruiter 看看你的口语表达,还有你
到底对于这份工作有没有兴趣。一定要做的功课是至少看看这间公司最近的新闻
,不然当 Recruiter 问你 "So why do you choose xxx?" 而我只能回答 "Cuz
I need a job,"真的会很尴尬XD(我 Bloomberg 真的这样回答...)。接这一定
要练习自我介绍,分成三个版本: 30 sec、1 min、5 min。台湾人比较会有的习
惯是从 "I am currently studying at xxx" 开始。但这样的开头能避免则避免
,就像老美说的 "Show me the juicy pary",30 sec 的自我介绍就是要把自己
的技能包讲给 recruiter 听,并且跟他说为什么这些技能包对公司有用。举例
来说,一个冗于的开头是
"I am Max, I currently study at the famous xxx University. My major is
in yyy, and I am really interested in your company."
基本上算是讲了等于白讲,底下这段则告诉 recruiter 很多有用的资讯
"My major proficiency is in ooo and xxx, my publications/projects can
further prove it. I think this is a crucial skill to you because yyy."
Recruiter 听到有兴趣的关键字,才会想继续和你聊下去。这样三十秒的自我介
绍请准备多种版本(针对不同职缺)一再练习,因为每个阶段的面试都有可能用上
。接着是一分钟版本,和三十秒版本比起来大同小异,但可以加入更多技术细节
,如
"I have implemented xxx algorithm in yyy language, which is a common
algorithm in your industry. To build the project, I used ooo as a tool."
最后是五分钟版本,选择一个你认为最重要的专题或是研究,在介绍完一分钟版
本后进一步说明
"One project I like the most is xxx, this is because I learned ooo from
it. The core problem this project deals with is mmm, this is an important
topic because nnn. To tackle this down, we divide it into three stages.."
打稿后,可以反复练习、找同学练习、找室友练习(感谢我的大神室友常常陪我练)
。当面试官进小间然后和你说 "Please tell me about yourself.",一个信心满
满而且结构严明的自我介绍,绝对会提升你自己的自信,也让面试官留下好印象。
(b) 尽早
尽早开始投。有些人会想 (1) 太早投还没准备好 (2) 专心准备 dream job。基本
上,面试也是一种技巧,包含 (1) 如何传达你的知识 (2) 如何传达你的思路 (3)
如何传达你的潜力,这三点都是很难透过练习或是念书准备的。因此尽早开始投,
透过和一些小公司的面试,开始磨练自己的面试技巧。以我自己为例,我的第一个
on-campus 面试是 Bloomberg,那时候我的表现糟糕透顶,很多想法都讲不出来。
两天后的波音也是一团糟,甚至不小心在 F-22 的电战工程师前表了 F-22 (我 "F
35 outperforms F22 mainly on the software but not hardware"XD)。但这些经
验都让我有机会再修正日后的面试和准备方向。我自己投的策略是这样
Tier 3 -> Tier 1 -> Tier 2
我的想法是透过 Tier 3 的面试经验,让我能挑战看看 Tier 1,若真的失败,再
以 Tier 2 当成最后的保底。幸运的是在 Tier 1 这关就结束了 Orz。因此尽早投
,就算面试表现极差,也是宝贵的经验。
(c) 刷题
刷题也是很火红的议题。我自己觉得其实不用刷到炉火纯青(我知道有中国人刷两
三轮),但我自己大概是刷 ~100 题。从后来面试的过程看来,被问得多数软件问
题也都有解出来,反而是硬件常常写出很烂的 Verilog XD。我认为刷题主要要训
练自己三件事情
(1) Writing Neat Code
怎么让自己的 Code 精简不杂乱,因为 on-site 的白板空间真的有限,大家
都不会想写/看一长串的 Code。
(2) Using Core Data Structure
也就是 C++ STDLIB 的核心几个: Vector, Queue, Heap (Priority Queue),
Map, Hash Table (Unordered Map)。我非常老派,写 code 都用 C++,但出
乎意料地好用,也感谢多数面试官接受。
(3) Time/Memory Complexity Analysis
Big O Notation,写完 code 后必考,一定要熟知。
(d) 念书
念书、念书、再念书。面软件就念 Abstract Class, Virtual Function, Pointer
,面硬件就念 Cache, MIPS, FSM。面试考的记忆问题绝对不难,都是我们当时
学校学的滚瓜烂熟的那些老问题。C++ Memory 怎么 Allocate,变量在 Function
Call 后会发生什么事,Memory Leak 怎么发生。MIPS 怎么切 Pipeline,Cache
分成哪三种,Moore Machine 是什么。上面都是我在面试被问过的,都不难,但
是不念书真的一时间想不起来。因此不论时间再少,一定要把这些基础知识念过
一轮,真的不知道要念什么可以写信问问 recruiter 面试的方向。我时常是通宵
念书到早上六七点买杯咖啡开车下去 on-site 的 Orz 一路上都很怕车祸。但面
试官主要也就问两种题目,有制式答案的和需要动脑想的,前者当然是越快速答
出越好。一来可以让面试官印象好,二来你有更多时间可以讨论后面的开放问题
。最好的情况下,你可以把面试官准备的问题都回答完,这应该算是大大加分。
三、面试中: 发言、发问、发狠
(a) 发言
好不容易履历过关斩将后,第一个面试终于来了! 不论是 HR 打来的非技术面试还
是工程师的技术面试,尽量别让场面干掉,能补充的请补充,不能补充的就发挥幽
默感让面试官笑一笑。比如说底下的一个问题
"Tell me what you know about virtual function"
你当然可以简单回答(这问题我被问过三遍以上...)
"Virtual function allows us to perform run-time polymorphism"
当然是一个正确的答案,但就这样打住,很容易让面试官觉得你就只知道这么多,
因此底下这样的答案可以让面试官真正清楚你的知识
"Virtual function allows us to perform run-time polymorphism. In C++,
it is specified by a keyword "virtual" in a parent class. The function
can be overwritten by inherited classes. By doing so, a pointer to the
parent class can be used to call different functions, achieving run-time
polymorphism. We can further define "pure virtual" functions by adding a
"equals zero" statement right after the function."
(小弟不是CS专业,有错请见谅) 基本上就是能说多少就说多少,如果你就此打住
了,面试官当然可能问也可能不问,后者的情况吃亏的是我们 QQ 所以能说则说。
另外一个我们比较会忽略的是 "Think our loud",把自己的思路大声讲出来,避
免一长串的沉默。比如说当你不确定该怎么做一个 coding 题的时候,可以先讲讲
看,
"I am thinking of using a hash table, because it can support constant
lookup time. However, I know this introduces much memory overhead."
这样得到的回应无非是两种
"You are on the right direction, what supporting data structure may we add
to the hash table?"
或是
"Oops, perhaps hash tableis not what we are looking for, if lookup time
is not a concern, what else might you use?"
上面两种答案对于情况都一定有帮助。偶尔面试官可能会铁石心肠地看这你XD但机
会不大。总之,把自己想到的东西烧经整理后都讲出来,可以让面试官知道你的极
限在哪里,也知道如何帮你继续。当然,若有东西自己真的不知道,也要大方承认
。若随便乱猜猜错了,可能会让先前你讲的东西大打折扣。另外一点
(b) 发问
除了发言外,面试的时候多多发问。我最常问的三个问题是
(1) "Did I answer your question?"
(2) "Am I on the right direction?"
(3) "Would you mind giving some hints?"
(3) 特别重要!! 不要怕要求提示,面试官宁愿给点提示后你开始有想法,也不愿意
在一旁陪我们发呆一整天。遇到瓶颈,就勇于发问。没有面试是完美的,小弟拿到
Offer 的几间面试几乎有一两场小弟完全搞砸了,都是需要提示才能继续解。所以
问问题显然是没关系的。此外记得把一些背景的限制问清楚,memory 比较重要还是
running time? 想要写成 object-oriented 吗? Code 要不要 Scalable。边回答也
可以边补充,说明自己为什么做这样的设计。
(c) 发狠
看到题目,如果心中模模糊糊有一个好解法,但是不确定是否可以在时限内写出来,
务必要先和面试官交代你大概的想法。若时间真的不足,可以尝试先解出暴力解 (即
Brute Force (此点特别感谢 Scott 学长教导 Orz)。不论 Brute Force 多丑,先拿
出狠劲写下来。确定会动、结果也正确后,在来谈优化。但当然若有更好的想法一定
要先说。有时候我们难免会想解出最佳解,但最佳解或许要很久才能得到。如果时间
到了,你只留下一团乱的白板,是很难说服面试官你真的有解出问题的。Brute Force
可能很丑、很笨、很乱,但是先写下来,好像考试先拿了基本分,是不会出错的。
四、面试后: Follow-up、Follow-up、Follow-up
面试后我们可能很沮丧(难免搞砸),也可能很兴奋(把面试官的问题列表用光了!!),
但请一定要寄信 follow-up。我在每次面试后(phone screen 不例外)几乎都会继续
坐在电脑前两三个小时,把刚刚没答好的地方查清楚,或是把没写完的 code 写成
正式的 code (既然有时间就不要写 pseudo code),寄给 recruiter,请他代转给
面试官。这有可能救我们一命!! 小弟印象最深刻的是 Apple Siri 的第三轮 Phone
Screen,小弟真的完全搞砸了,interviewer 在电话那端叹气连连(是真的叹气...)
,写 code 手气也很差。事后小弟花了三个多小时几乎重新把每个问题答好,code
也写成 .cpp,一并寄给面试官。没想到面试官回信跟我说他决定再给我一次机会,
后来也顺利通过了...(这也证明第一次真的答不好XD)。所以说每次面完,花点时间
把题目重想一遍,既可复习又可加分。至于面很顺利的情况,也不要忘了寄信给面试
官和 Recruiter 道谢,当作是锦上添花。
五、后记
从八月中开始找工作到这几天终于定底,一路上很感谢学长姊的提携和朋友们的鼓励
,也谢谢版上几位大神的开示。找工作是一条很长的路,但每次多坚持一点,相信各
位版友也可以找到心目中的理想工作,也预祝大家找工作顺利!