北美(湾区)CS工作进阶攻略-求职篇

avatar 10906
ilnlh
100354
109
[align="left"]先告诉大家个秘密,集齐FLAG onsite各一次,可以换Apple offer一个。 ;-)[/align]

0. 写在前面的“废话”

[align="left"]因为当时full time是intern时拿到的return offer,所以也就没有什么找工作的经验可写;直到最近换工作、有机会体验了一下,把经历和经验共享出来,希望能帮助那么几个人少走一些弯路,也便没有白费时间了;同时写总结也是自己一贯的习惯,并留个纪念。[/align]
[align="left"]我的背景相对特殊,没有特别参考价值,所以放到最后面去说;不过整个准备和面试过程 是可以参考、复制的。这里写的主要是我做的,并不一定是必要的,对牛人来说更是;不过话说回来,往往有很多需要做的事情 反而可能被省去了,真正在看了别人的经验总结后 能指导自己行动取得正面效果的 总是少数。还有一部分同学,可能经常能被自己看经验帖时的决心和决定感动,但第二天就好像一切都没有发生过。我能给的建议只是 温故而知新,有些经验帖同样需要反复看,这点我在GRE的经验帖里也提到过。[/align]
[align="left"]有些同学经常不加区分把做成一些事情的人叫牛人,其实是给了自己一个心里暗示,他们成功是因为他们本身很牛,我不牛 所以不成功也没有关系、是理所应当的,也就这样把那些人付出的努力忽略过去、或者价值贬低了。[/align]

1. 基础准备工作

[align="left"]下面主要是我自己做过的一些前期工作,严格来说不属于找工作阶段,什么时候都可以做,什么时候开始都只可能晚、不会算早。[/align]
[align="left"]1)基础知识[/align]
[align="left"]算法首当其冲。个人不推荐CLRS,啃下来需要的精力是大多数人来不及投入的,除非目前还是本科或者工作后慢慢来。国内用的严蔚敏、吴伟民的数据结构(C语言版)其实就足够了,基础需要掌握的都cover到了,一些相对advanced topics比如KMP算法、trie tree也都有。面试前至少这上面(bigocheatsheet.com)大多基本数据结构的复杂度能够很快反应出来吧。可以了解一下quick selection、reservoir sampling、bloom filter、suffix tree、disjoint set、morris traversal等,面试时真聊起来 会锦上添花。[/align]
[align="left"]如果对big data感兴趣,至少弄清楚hadoop的工作机制,了解一下NoSQL、CAP、BASE、dynamo、BigTable等等,可能的话了解一些visulization tools,比如matlab、octave、d3等;如果对scalability/distributed system感兴趣,可以多看看highscalability.com的文章(特别是右边 ALL TIME FAVORITES 部分),上各大公司的tech blog读几篇文章;用Java的话,对Collection和Map两组数据结构了解清楚,了解一下多线程,推荐javarevisited.blogspot.com。(这里说的“了解”,是至少达到能够脱稿聊得起来得程度,否则面试时真说到了,只是”哦,我好像听说过“ 那么也没什么太大意义)[/align]
[align="left"]推荐读读这两篇posts:[/align][align="left"]steve-yegge.blogspot.com[/align][align="left"]facebook.com[/align]
[align="left"]2)简历[/align]
[align="left"]网上有各种详细说如何写简历的帖子,我这里不赘述了。我自己的简历最开始是申请学校时用的版本,到这次找工作最后用的是第11版(每次大改升级)。个人推荐把LinkedIn和GitHub链接放在简历上,这两个链接的质量就看你前期准备工作做得如何了,特别是LinkedIn。可能和我有过一些工作经验、并且身在湾区有关,至少每周基本上总会有几个recruiter在LinkedIn上给我发招聘信息的,大多是小公司、但也有facebook、yahoo、apple等。[/align]
[align="left"]有些同学听说LinkedIn重要,就开始各种发邀请,最好同时看看自己是否有准备好,以己度人 考虑下别人看到一个 长度连半屏幕都不到、滚动条都没有的profile,是否有动力点“Accept Invitation”。这样的profile即使connection再多也没有什么意义。[/align]
[align="left"]3)练习[/align]
[align="left"]最基本的应该算是Careercup的CtCI。我找实习前 寒假过了一遍,基础的部分写了一下,找实习时断断续续又过了一遍,这次找工作以这个起手 先过了一遍。推荐一下mac上的Skim软件,阅读时可以添加标记、注释等,我把自己不能很容易想到解法的题目圈出来,之后每次面试前都会把这些题目过一遍。[/align]
[align="left"]进阶选的LeetCode。目前151道题online judge,我对自己动手能力比较有信心、第一遍只写了50+题目,主要目的是熟悉有什么样的解法,花了更多精力去看别人的讨论,并标注收藏,顺序按照AC rate从高到低,这样方便开始找一些小公司练手;第二遍根据分类把所有题目都写出来 同时复习之前标注的各种解法,以巩固动手能力、提高熟练度 并查漏补缺,一些edge case或者细节 不自己写很难发现,同时在写错的地方添加注释提醒自己注意。整个过程,我觉得最大的收获是了解了一些自己可能想不到的解题思路,比如n-queen的bit manipulation解法、largest rectangle in histogram的不同解法、post-order traversal的不同解法等,发现自己在写代码时 不适合面试的一些习惯,同时提高了对贪婪算法、D&C、DP、DFS等的熟练度。之后面试就反复看以前写过的题目 和 上面注释的自己一开始出错的地方,同时用Java再重写一些题目(之前我用的Python),或者换个思路写。[/align]
[align="left"]关键是拿到题目知道怎样庖丁解牛一样把题目剖析开,用不同的解法去解,明白各有什么优劣,面试的时候问到原题也能说出一二三四,让面试官看得出来你下了功夫 而不是死记硬背。[/align]
[align="left"]我的基本态度是:只会刷题不行,但是刷题可以有好处。时间考虑上,我觉得大部分人把这些都准备好总需要2、3个月吧。当时看过ctci感觉自己差不多了,也能拿到一些onsite,也碰到一些熟题,但是想提升一下并做到相对的有备无患,还是要上leetcode。[/align]
[align="left"]4)项目经验[/align]
[align="left"]除去正式的internship和工作经验,最好自然是自己有拿的出手的产品,比如在Apple Store里有多少下载量,有自己的网站等等,不过这些牛人估计也不会在读这篇经验贴了。每个人都可能做的是尝试参加open source的project,最基本可以从改issue做起;还可以参加topcoder、Code Jam或者Google Summer of Code等;再退一步,可以把course project做好,放到github上面。实在没有project的话,女生可以考虑把自己照片放在简历上占位,说不定有意外收获哦。 ;-)[/align]
[align="left"]5)其他资料:[/align]
[align="left"]辅助读物强烈推荐一下 Programming Pearls/编程珠玑,主要是思维训练。GoF的design pattern算是基础吧,不多说了。Java的话推荐一下 Effective Java 和 Java Puzzlers。[/align]
[align="left"]Online course也可以短时间内提升背景。我花了一个周末完整看了Andrew Ng的machine learning(以前都是断断续续、零零散散),并且做了笔记,速度调为1.5X 还算可以接受;之后面试前都会把笔记快速过一遍,因为和我做过的project、大多面试职位都相关,面试时说话底气更足,感觉这部分时间花销 收效非常明显。面某个公司前发现会scala是plus,就花了些时间去上scala的课。大概意思就这意思,你懂的。[/align]
[align="left"]休息或者吃饭的时候,可以读读quora,从 quora.comquora.com 等都可以得到很多不同的建议。[/align]

2. 投简历
你还在自己去公司career page投简历吗?那么你已经输在起跑线上了(yes,I said it,“起跑线”),1point3acres.com里详细写了LinkedIn怎么用,非常实用。能找到校友内推自然最好,不然直接找中国人效果也不会太差,我碰到的大多中国人都还是满热心帮忙的(也或许和我背景还算过得去有关)。另外,我经常收到LinkedIn发的premium account 或者 job seeker account 免费试用广告,如果真的找不到人内推,把这些用起来应该也是不错的选择。我基本完全放弃了自己投简历,但前提是自己做足功课、有一个还算拿得出手的背景让别人愿意内推。

[align="left"]在找人内推的时候,我除了附上简历以外,还包括:先找好对应的职位,简要介绍自己的经验、背景 并说明为什么我适合这个/这些职位,附上cover letter,附上 一段不太夸张的第三人称自我介绍,以方便对方更加了解我、从而更容易决定是否要帮忙内推,并且在内推时 更方便地填写表格(与人方便,与己方便)。[/align]
[align="left"]几点提醒:不要一次在一个公司找若干人来内推,要不就明确说明,有些人可能在看到系统提示已经有档案时 跟recruiter说明这个人在到处海投;个人觉得说这话也很公平。发邮件语气尽量客气些,毕竟有求于人,中国人特别是年轻人说话容易显得傲气重;因为我也偶尔收到别人要求内推的请求,所以深有体会。再提醒一点关于简历的格式问题,有些系统需要把pdf转成文本,最好自己找个网站尝试一下 看看自己的简历转换成文本后 是否很难阅读;不是每个帮忙内推的同学都会帮你重新格式化的。[/align]
[align="left"]除了那些知名公司、众矢之的以外,如何找公司投?[/align][align="left"]1)在glassdoor、linkedin(或者indeed等)上面建立saved search;特别是LinkedIn点击一个职位信息后,可以看看旁边“People also viewed” 和 下面“Similar jobs”。[/align][align="left"]2)hired.com 是一个不错的平台,从我拿到的“offer”来看,大多都是有些实力的startup,有利于发现一些hidden gems,比如最近的thumbtack。多说一句,如果用hired.com的话,最好下点功夫把summary部分好好写一下。[/align][align="left"]3)有兴趣加入startup拼一把的话,还可以关注一下crunchbase的daily update。[/align]
[align="left"]上面Dincy的帖子里讲了很多关于如何投简历的内容,我不多赘述了。[/align]

3. 面试
1)面试前

[align="left"]第一轮和recruiter聊,最好把下面几个说滥的behavior questions准备好:[/align][align="left"]-tell me about yourself[/align][align="left"]-why our company? why leave your current company?[/align][align="left"]-what specific things you are interested in?[/align][align="left"]-what are you looking for in the new position?[/align][align="left"]-tell me a conflict that you met in your project[/align][align="left"]-tell me a technical difficulty you have met recently[/align][align="left"](后两个更多在phone interview或者culture fit时问到)[/align]
[align="left"]除此之外,面试前一天我还会:[/align][align="left"]-看公司主页,具体了解他们的business model(特别是小公司),主要产品、最新产品,最新的press news,tech blog(如果有的话),team members背景(特别是小公司)[/align][align="left"]-到crunchbase、angellist、linkedin、wikipedia看公司profile和发展历史[/align][align="left"]-研究具体的职位信息,上LinkedIn找公司里现有这个职位的人 看他们的背景[/align][align="left"]-上mitbbs和glassdoor看相关面经[/align][align="left"]-尽量思考一两个针对公司量身定制的问题 并写下来[/align][align="left"]-把上面过程中的相关网页分公司加入收藏夹,把想法都写下来,电面的时候随时可以“读”,而且之后若干轮电面、onsite的时候都可以一劳永逸[/align]
[align="left"]这些都是do my homework,在聊起来的时候有的放矢,能提出一些有质量的问题。还有,看recruiter和面试官的LinkedIn profile。为什么看?看什么?了解他们的资历,做过什么、对什么感兴趣,做到知己知彼,考虑好问什么问题比较合适。一点小技巧:一般google上直接搜名字 都能搜到;有时这样搜到的简历可见部分较少,可以先搜索公司profile,通过右边“How you're connected”点击“See all”看你能连接到的此公司员工,再通过名字过滤,往往能够看到更多的内容。[/align]
[align="left"]电面前半个到一个小时,我会把binary search、reverse linked list、merge two sorted list等非常基础、简短的算法都快速写一遍,把自己总结的、容易错过的小知识点(比如 说到 int 就要考虑是否unsigned、是否overflow)都过一遍,bfs、dfs、permutation等的特点想一遍;onsite 我会开车早到公司半个小时,迅速再把一些知识点过一遍。这些都算是热脑活动了、让自己进入状态。[/align]
2)面试中

[align="left"]知识普及(主要针对还没有面试过,想了解一下面试可能遇到的情况的同学):[/align]
[align="left"]简历提交上去了,联系你的一般是recruiter(见最后具体介绍),有时也可能是hiring manager。recruiter 如果support很多组,可能会先跟你聊聊、看你的兴趣是什么、看哪个组更合适,然后再去跟有相关opening的hiring manager聊,看哪个组可以给你面试机会;这种情况一般在general hire的公司更常见。有的recruiter可能就support一个具体小组,在系统中看到你的简历、感觉你的背景match,就直接找你聊聊,然后直接确定要不要给你安排面试,或者是帮忙安排hiring manager直接来聊一下决定是否match。这轮一般都是半个小时。如果安排面试,一般都会有专门的coordinator再来联系你具体面试时间。[/align]
[align="left"]phone screen常问的问题:talk about yourself / why move / why us。大多数人应该都有想过,觉得自己没有问题,但重要的是试着说一说;我自己是写下来 反复说熟练了,而且这样也能少花些时间在聊天上,有更多的时间完成coding problem。大些的公司,比如facebook、linkedin等,一般都是期望一轮interview完成至少两个coding problem的,所以不要在第一道题上浪费太多时间;小公司可能更随意一些。[/align]
[align="left"]面试时如果碰到完全没见过、没思路的题目,我觉得ctci上面提到的方法很不错:[/align]
  1. [align="left"]Exemplify[/align]
  2. [align="left"]Pattern Matching (min value in rotated sorted array)[/align]
  3. [align="left"]Simplify and Generalize (ransom note)[/align]
  4. [align="left"]Basic Case and Build (permutation; recursion / DP)[/align]
  5. [align="left"]Data Structure Brainstorm (median of random numbers)[/align]

[align="left"]面试最后问面试官问题,我常问的通用问题:[/align][align="left"]-how is the team organized (how many teams / team size)[/align][align="left"]-what’s the stack[/align][align="left"]-short term (1 - 2 years) plan[/align][align="left"]-how to distinguish from competitor / similar service provider[/align]
3)面试后

[align="left"]每次面试后,我会把整个过程再回想一遍,总结一下哪里答得好、哪里需要改进,避免再犯同样的错误,并把每次interview的过程都大致写下来、添加注释,下次电面或者onsite之前可以review一下问过什么问题,答案是什么。这些都能让公司觉得我对他们有所了解、确实对这个机会很感兴趣。[/align]
[align="left"]如果面试没有发挥好,只要觉得有情可原 都可以找recruiter argue,很多recruiter也希望自己接触的candidate能够work out,也会帮忙争取机会。举几个例子:我google第一面因为是个口音很重的三哥,沟通非常费劲,之后通知我电面没过后,我就直接说accent问题,recruiter又安排了一个美国native来面,后来拿到onsite(当时不懂事,被我裸面浪费了);某startup 第一个recruiter找我面data engineer,结果各种不match,我自己都知道明显是挂的,收到通知后,跟recruiter说明感觉更适合另外的职位,recruiter又帮忙转给负责其他组的recruiter,最后也拿到onsite。[/align]

4. 其他
[align="left"]我建立了一个spreadsheet来track自己什么时候发送referral 请求、被refer了、收到recruiter联系等活动,同时添加注释 比如什么时候follow-up、约了什么时候下次面试 等,用颜色区分进度和紧急程度,每天晚上更新、早上复查。[/align]
[align="left"]location,location,location。在湾区肯定是不一样的,各种meetup都是networking的机会,比如前些天刚去了Baidu USA的open day。我不很确定,但是感觉recruiter也会更倾向找在湾区的人联系。[/align]
[align="left"]FB我阴差阳错面到tools team(据recruiter说 内部分为tools和product两大块,都会一起参加boot camp,但是tools team的不像product的可以自己选组、而是prelocate到tools team;不过很多在fb工作的朋友也没听说过这么分的)。onsite过了,但是candidate review因为种种原因拖了一周,被告知因为我对product更感兴趣所以被pass到product team去review,又拖了一周后被告知因为一些原因最后也没有通过,即使有一个onsite面试官champion我。之前拖的原因之一是 疑惑为什么我的onsite coding interview只回答了一个问题;感觉可能还是被备胎了。[/align]

5. Q & A
[align="left"]Q:我的背景[/align][align="left"]A:国内工作若干年,属于consulting company,有一些在美国工作经验;master第一年暑假湾区实习,拿到return offer,第二年年初加入公司工作,到开始找工作 大概full time 一年半。这次一共面了大概10家公司,最后7个onsite,拿到3个offer,withdrew两个onsite。[/align]
[align="left"]Q:面试碰到熟题怎么办?[/align][align="left"]A:如果面试官没有特别要求你告诉他你是否见过,那么没有必要主动说明你见过,但最好是真的彻底研究过,从最基础的方法说起,说明各种方法的复杂度分析 和 利弊;如果面试官特别要求你说明是否见过,最好不要说谎,不过还是可以继续说自己有做过很透彻的分析、如何如何,不要轻易放过给自己加分的机会。[/align]
[align="left"]Q:找 full time 和 internship 时间的区别[/align][align="left"]A:internship越早开始越好,一般公司从夏季送走intern开始就准备招收下一年的summer intern了,个别公司可能开始稍晚,不过一般秋季的career fair也会去参加一下 做做宣传,碰上很出色的也还是会提前给机会。full time就相对随意了,大多公司一年四季都可能招人,但主要因公司而异,大些的公司可能需要有head count余额;一些公司是general hire,典型的比如FB,更多的是specific position。[/align]
[align="left"]Q:hr 和 recruiter 的区别[/align][align="left"]A:招聘期间打交道的应该叫recruiter,他们一般不属于hr部门,很多公司划在engineering部门下面,小公司一般一个recruiter team支持整个engineering team,大公司可能每个大的engineering group会有一个到几个recruiters support单独招人(Facebook,Apple,Yahoo等都是)。recruiter在把人招进公司一般就完成任务了,而hr是从开始准备offer letter到员工离开公司期间负责各种人事的,涨工资、h1b和绿卡申请、调整公司福利、安排ESPP等等。[/align]

6. 一些资源链接

[align="left"]Brewer's CAP Theorem:julianbrowne.com[/align][align="left"]NoSQL Patterns:horicky.blogspot.co.uk[/align][align="left"]Dynamo:allthingsdistributed.com[/align]
[align="left"]Andrew Ng的machine learning course(9/22开课):coursera.org[/align][align="left"]A Few Useful Things to Know about Machine Learning:[/align][align="left"]ics.uci.edu[/align]
[align="left"]如何准备system design:mitbbs.com[/align]
[align="left"]CtCI: hawstein.com[/align][align="left"]LeetCode OJ:[/align][align="left"]Algorithm:[/align][align="left"]cnblogs.com[/align][align="left"]http://geeksforgeeks.org[/align]
[align="left"]Quora:[/align][align="left"]
他山之石:[/align]

  • 472
109条回复