“硬”闯谷歌之路

CE硕士 3-5年 在职跳槽

本文分为四个部分:Part 1 《重生》介绍我的早期生活。 Part 2 《悲剧男留美记》介绍我坎坷的美国留学历程以及如何找到第一份工作。 Part 3 《刷题王的春天》介绍我跨行跳槽谷歌的经历。 Part 4 《液体面包》分享一下如何刷题、跳槽、转CS的经验。

Part 1 重生
从初中说起吧,在初二之前我都是一个讨人嫌、傻不啦叽的男孩,非常平庸和普通。成绩一般,身高一般,相貌中上。印象中我从来不梳头,每天的发型随风而定。突然有一天,班里最漂亮的女生之一在毫无征兆的情况下向我表白。那一瞬间我整个灵魂好像被唤醒了:我身高突增到一米八几,成绩突然挤进前20,然后我也开始玩发型了。记得第一次自己买的名牌衣服是佐丹奴,买回家之后高兴了好几天。其中改变最大的是我的学习能力和自信心,那时候突然我就能听懂课了,解题越来越顺。最后中考的时候至少是班里前几名吧,考进了市重点高中。

到了高中我一直无知地以为自己是最聪明的孩子,所以只放了3分精力在学习,7分精力在玩游戏打篮球。结果可想而知,我的成绩一直保持班里后10名。到了高三我才意识到自己没有学习的重要性,所以开始恶补,最后勉强考上了一所三流大学。所选专业是电子信息工程。

我是一个比较小心眼的人:当我的朋友都比我出色时我会非常不舒服。大学期间我一直反思,如何我才能追上我的高中同学们呢,要知道他们都考到了一流大学啊。我当时想了想,只有另辟蹊径才有机会:出国留学!我的家境一般,父母是标准的工薪阶层。好在早年间父母英明,我家买了两套房子。所以咬咬牙还是能勉强供我出国留学的。有了非常粗略的目标之后我就开始学习英语,这里略去几千字吧,我从零开始学英语的经历其实是非常励志的。我勉强考过了四级和六级。这个时候我需要决定去哪个国家,一开始目标是澳大利亚,因为和我学校有合作项目。但是那天在留学中介中心恰巧澳大利亚的办公室没人,而对面就是留学美国办公室。报着随便听听的心态走进了美国办公室,一位阿姨成功地在几分钟内说服了我美国是留学的第一选择。然后我就考托福,由于基础较差,大学毕业一年后才考完GRE并申请到美国学校。所选专业是EE硕士。

Part 2 悲剧男历险记
到了美国的第一夜我痛哭流涕,首先是想念父母,然后是觉得美国太穷了!后来了解到EE不好找工作,然后深入地了解到了美国的贫瘠和不方便,也找不到属于自己的圈子。哭了一星期后我决定偷偷回国算了,趁着还没交学费,就别浪费父母的钱了。当时脑子里只想着和父母在一起。幸好一个印度室友劝我,他告诉我美国的教育还是非常棒的,至少听几节课再决定是否回国。上了几节课发现我完全听不懂,原因有两点:第一,我本科光学英语了,专业课没有学得很好。第二,我英语也不行。这时我再次萌生回国的念头。那时我烦得每天抽烟,每天像个乞丐一样咨询本专业的学长们我是否应该留在美国。庆幸的是我碰上了一个烟友,他是我们专业的学长,而且还是我老乡,他还有车!于是我找到了组织,从那以后每天跟着几个学长鬼混,乐不思蜀,也就打消了回国的想法。

由于高中的失败我深深理解到学习的重要性,再加上父母是砸锅卖铁供我上学的,所以我丝毫不敢怠慢。既然听不懂课那我就好好看书,提前预习,选些简单的课。后来我才发现,我听不懂的那两门课别人大多也听不懂,老师讲的不好,其他的课完全可以听懂。就这样我越学越好,毕业时我的GPA是3.9+。

毕业后我暂住在一个House,遇见了我的妻子!此处省去几千字,我俩相遇的故事还挺好玩的。之后我被一个朋友说动了要去硅谷一起找工作,我老婆随后也过来了。这时悲剧发生了,我的OPT申请被拒了,我错在30%,校方错在70%。我采取了各种办法,找律师,找校长,找议员,最后还是不行。于是我回国了,和我老婆开始了异国恋情…… 那时候我的运气和心情可谓跌入谷底。(OPT被拒的事情也可以写几千字,暂时略去吧。)

回国找工作的问题更是雪上加霜。我发现很可悲的一个事实,也是我在网上看到的一句话:“没有工作经验的留学生,如果学校不是特别有名的,请把自己当做三本毕业生来找工作。” 另一个可怕但很少有人提及的问题是对于应届生的定义,美国的应届生是指当年毕了业的学生,而中国的应届生是指还差一年才毕业的学生。所以,我回国时属于零工作经验的非应届生,只能参加社招。相信大部分人可以靠家里的关系帮忙找工作,我见过家里在爱立信,在中国电信有人的,然而我家没有这种关系。好在挣扎了几个月之后终于找到了一个远差于市场平均薪资水平的工作。当时我的是年薪10万人民币,我大部分朋友的年薪是将近10万美元…… 这种落差你不亲身体会过的话很难理解。

在国内当工程师有几个不爽之处,我在这里简单说一下,想回国工作的朋友请认真看完再决定是否要回国:

  1. 工资比美国低。这个很明显,就不多说了。
  2. 怨声载道。我发现这可能是我们国人的一个特点,就是非常爱抱怨,每天都抱怨而又不想办法改变。我有一个同事每天都说软件工程师怎么怎么好,但是完全没勇气转行。另一个同事每天抱怨经理多么压迫他,却又不准备跳槽。我奉劝大家,多做少说,把吐槽抱怨的精力留给努力奋斗改变现状。
  3. 屌丝。我国内接触的一些同事生活质量极低,素质也较差,下面举几个例子。公司有每天15元的饭票,有次晚餐我点了红烧牛肉,价格是18元,所以我自己搭了3元。然后同事们惊呼:“你是有钱人啊,我这么多年都没在这点过红烧牛肉。” 还有次组内小聚餐,最后结账大概是83左右,他们非让老板抹掉那3块钱,老板又不同意,他们就坐在那僵着。后来我掏了3块钱,他们还骂我惯着饭店老板…… 还有国内很多同事上完厕所不洗手,有一次我忍不住了,问了一个同事为啥不洗手。他差异地回答到:“洗什么手,又没尿手上。”
  4. 国企、民企、外企的选择。国企优点是稳定,缺点是官僚化严重。民企优点是工资高、能学的东西多,缺点是996,上年纪了就很难续约.外企优点是工资高,轻松,缺点是学不到核心科技。所以我认为选哪个都不好。
  5. 名校情结严重。如果你不是211里靠前的学校毕业的话,对不起,很多好公司都不会给你面试机会。当时我的同事学校最差的也是北航、天大之类的。
  6. 房子、车、户口。这个大家都讨论烂了,就不多说了。
  7. 环境:雾霾等。同上。

干了几个月之后我越来越郁闷,想到我在美国的同事们每个月的工资都相当于我一半的年薪,想到我和我老婆一直分居两国,想到我的未来越来越模糊。有一天我终于忍不住了,想出去透透气。正好那天下午不上班,我打算坐地铁到天安门转转。在地铁上一条平淡无奇的广告改变了我的一生,广告的其他内容忘了,但标题大概是“出国留学”。我突然想到,对啊,我为什么不再次出国呢?我曾经成功过,而且我现在的英语也更好,我的GPA也还不错,我的GRE也还没过期,再加上我现在有工作经验。这些虽然在国内一无是处,但对于申请留学却是很有用的。到了天安门我和我老婆视频,我激动得热泪盈眶。我当时发誓,我要再闯美国,而且我这次一定要成功!

在那之后我就每天挤时间学英语准备托福,这里省去几千字吧,上班考托福的经历也是一言难尽。庆幸的是结果还不错,我这次考了100多分。紧接着我也换到了一家稍微好点的公司。

由于我家当时已经没有任何积蓄了,我在公司赚的那点钱勉强够申请学校和机票的,所以我申请的都是博士学位。终于,历尽千辛万苦之后,我又成功地拿到了美国一所学校的录取通知书,而且这次是有奖学金的,奖学金可以勉强够我的学费和住宿,专业是Computer Engineering。

读博的第一年我认真上课,认真跟着教授做Research,一切都还算顺利。直到有一天,教授突然给我发了一封邮件,里面的内容大概就是说我是她带过的最烂的学生,比本科生都不如,质疑我是否能发出paper,如果发不出paper就不打算给我钱了。当时我意外得很,因为我真的是把很大一部分时间都放在Research上了,而且上周教授才刚刚表扬过我做得很好。当天我就做出了一个决定:我要赶紧找实习,然后博转硕毕业直接工作。我的思路大概如下。她不爽我无非有两种原因:第一,我真的不适合做Research。第二,她就是这么pushy。无论是哪个原因,我都觉得我应该选择离开。于是,我边发论文边找实习,所幸我论文也发了,实习也找到了。然后我就立即跟教授辞职了,并表达了我想博转硕的想法。还好我最后也拿到了那家公司的return offer,顺利地开始全职工作了。而且在这期间我的宝宝诞生了!

Part 3 刷题王的春天
我在美国第一份工作的年薪算上股票大概是十万美元多一些,我当时感觉还不错,毕竟比十万人民币多多了!这份工作的职位是硬件,具体点说是数字电路设计。刚开始我挺满意的,基本够花的。但后来一些事情改变了我的想法:我找人借钱买了房,每月的房贷加上还债主的钱让我入不敷出。而且我身边的朋友和同事一个个地跳到了Apple、linkedin、Facebook、Twitter、Microsoft、Amazon,让我好不眼红。慢慢地我也有了想换工作甚至转行的想法。最终让我下定决心的是以下几个原因:

  1. 名。我希望我未来的Employer是举世闻名的,不需要我跟其他人挨个讲我公司的名字怎么拼怎么发音。我希望我未来的Employer是Tier 1的,我不想再羡慕在任何其他公司工作的人。这一点在硬件公司里好像只有Apple和Intel符合要求,然而大部分互联网公司都能符合要求。
  2. 利。我想我每年的Total Compensation突破20万美元。这一点在硬件公司里应该只有在Apple和Nvidia可以实现,同样的,大部分互联网公司都能轻松实现。
  3. 不服。我一直认为软件的东西没什么难的,远比硬件简单。硬件不学个三五年你根本找不到工作,软件的话学个一两年就足以应付面试了。我不服!凭什么你们这些学软件的毕业就能拿到比我们高五六万的年薪?我不服!凭什么你们的就业机会那么多,我们硬件的选择范围就屈指可数?我不服!凭什么你们有免费三餐,专业咖啡师?我不服啊!!!但是我没有选择怨天尤人,我选择用自己证明软件并没有什么难的,我选择变成我羡慕的那些人之一。
  4. 机会。跟大部分硬件工程师一样,我也一直骗自己:“软件就是吃青春饭,硬件越老越值钱。”相信大家都听过这句话吧?但是大家想想,软件工程师的工资是硬件工程师的1.5倍,就是说即使到后期软件工程师老了之后真的没人要了,你到时总共赚的钱已经领先硬件工程师好几年了。有了钱还怕找不到事情做?况且我认为这句话本身就是错的,在各大网站上大家可以看看五年到十年工作经验的软件工程师有多抢手。而且老了之后大家可以转型做管理啊,或者自己投资啊。在硬件公司,35岁以下的国人工程师被升职为经理的概率几乎为零,至少我从来没见过。但是我亲眼见到过很多30岁左右的国人软件工程师升职为经理。就连在我们硬件公司也是软件工程师升职速度快:硬件三年一级,软件两年一级(这个数据我是仔细研究和咨询过的,相当可信)。我们组有两个国人工程师,年纪大约在四五十。他们做的工作和模电还有眼图有关,没个十年经验的话做不来。可以说他俩的不可替代性很高。但他俩的现状怎么样呢?他俩基本每天带饭,不去食堂而是躲在小角落里吃饭。两人都不是经理,都是高级工程师。开会时不怎么说话。前几天一个35左右的印度人刚刚升为经理,这哥们的实力远不如这两位国人前辈。或许大家觉得这种状态挺好,但我不想变成他们这样!我看见了他们就看见了未来的自己——如果我不转行的话。
  5. 他人建议。当萌生了想转软的想法之后,我是想尽一切办法说服自己不要转。因为我懒得再努力了,懒得从零学起一样东西。于是我咨询了几位前辈,包括:三位本公司的硬件高级经理,一位谷歌硬件工程师,一位谷歌软件工程师,一位苹果staff硬件工程师,一位Twitter软件工程师。这些前辈有印度人,有国人,有台湾人,有美国人,大家口吻完全一致:必须转他娘的!我感谢这些前辈真诚地表达了他们的观点。那一刻我没有了任何犹豫,必须转软!
  6. 硬件越来越软了。随着EDA工具越来越成熟,现在的趋势是硬件工程师平时的工作也需要写很多代码。这就导致了很多硬件岗位也需要你会编程。有一次我面了Apple的硬件职位,我准备的当然也都是电路的知识。结果面试了面了一天的算法题,而我当时完全不懂算法…… 在其中的一轮我急了,我问面试官:“你们不是招硬件工程师嘛,为什么问这么多C++和算法?” 我忘了她具体的答案了。

在2018年二月初左右我开始思考转行跳槽的可能性。
从萌生转行的想法到决定转行我用了一个月时间,毕竟这也算是人生大事。下了决心之后我就开始进行粗略的计划,然后认真执行。
入门的第一件事是选语言来刷题,你肯定不相信我用了一个月来选语言(结果还选错了)…… 刚开始我用C++刷题,因为那是我唯一接触过的编程语言。刷了几天刷不动了…… 然后我就想从Java、Python、JavaScript和Go当中选一个作为刷题用的编程语言。由于我老婆是用JavaScript的,我也就决定用JavaScript,想到如果不会还能问她。后来发现JavaScript在Leetcode上有些题无法Debug,我就果断换成了Python3,从那之后一直用到现在。
编程语言算是外功,我当时最需要的是内功,也就是算法。我仔细学习了普林斯顿老大爷的算法课,收益匪浅。
那之后我就开始进入“刷题王”状态了。我是这么想的,如果把战线拉到一年,然后我每天只刷三道题,那我一年也能刷一千多道题!那也就是Leetcode上所有题加起来的数量。于是我就开始执行了,每天至少刷三道题。一开始我晚上刷,后来发现晚上如果碰到Hard题几个小时都搞不定,影响睡觉。然后我就换成白天刷题了,对的,也就是说在公司刷题。我刷题超慢,一道题可能要搞两三个小时,所以留给工作的时间就很少了。这也就是我最强大的地方:如何不怎么干活但又不至于让老板把你开了,而且Performance Review还不至于太差。这个我就不多讲了,我不希望每个国人都像我一样狡猾,到时外国人对我们的印象越来越差。总之,我白天80%的时间是用来刷题的,20%用来工作。我把晚上的时间用来学习CS核心知识。学习新知识的方法大概有三种:1,搜关键字、逛论坛、刷博客。 2,到学校上课、看书。 3, 搜视频、网课。1和3都很容易速成,也是大家最常用的自学方法。但是我感觉各大论坛上对的错的东西都有,而且很碎很乱。所以我主要是看书为主,辅以网课和视频。这样做的缺点是速度慢,耗时间。但是优点是学得通透,知识点覆盖比较全。这一年多我看了不少书也学了不少知识,其中包括Algorithm, Database, Operating System, Networking, HTML, CSS, JavaScript, Python, Amazon AWS, System Design, Object Oriented Design, Design Patterns, Redis, MongoDB, MySQL, Kafka, Web Scraping, Flask, Distributed Systems, Big Data, Hadoop, Java等等……
直到我开始投简历时我已经刷了900+的题目,其中包括当时Leetcode上所有的Hard题。所以我自称“刷题王”是基于以下几点:
1, 我刷的数目够多,难度够高。
2, 我是转专业,所以刷题对我来说并非易事。
3, 我是在职跳槽。
4, 我有孩子。
5, 我毅力够强,这一年多好像只有一天没有刷题。
6, 大部分题(>70%)都是我都能想出解法。
7, 我没有向任何人请教算法,都是自己研究,自己看答案。

下面讲讲我找工作的具体过程。
我计划的面公司的顺序是这样的:
1, 几乎不想去的公司(Ebay, Walmart, Cisco, Pure Storage等等)。
2, 喜欢但是很远的公司(Uber, Lyft, Pinterest, Yelp, Salesforce, Twitter等等)。
3, 喜欢的公司(Microsoft, Apple, Tesla, PayPal等等)。
4, Dream Companies(Google, Facebook, LinkedIn, Amazon, Netflix等等)。
这样做的有很多优点,首先Dream Companies肯定是要面的,而且很好拿到面试,所以我可以在面之前拿其他公司练手。而且如果有了其他公司的offer也可以用来催它们或者谈total compensation。

我最初的计划是先海投,试试凭着自己的实力能不能拿到面试。不行的话再找人内推。
可惜由于我是EE背景,海投全无音讯,于是我就开始找内推了(我会在《液体面包》中讲为什么不要海投,而应该直接找内推。)。在此我感谢所有帮助我内推的朋友、同学、同事以及论坛里的前辈们,没有你们我不可能成功。通过内推我依次拿到了以下几个公司的面试:Ebay, Twitter, Microsoft, Google, LinkedIn, Facebook。然后我只拿到了Microsoft和Google的offer,但是对我来说已经很满意了。
Ebay电面轻松搞定,但后面告诉我已经找到合适的candidate了,所以没给我安排on-site。
Twitter过了电面,可惜这个职位是SRE,而且几乎全组都是老印,所以on-site挂掉了。最主要的原因还是我实力不够。
Microsoft我面的是event,过了OTS然后到西雅图面试,拿到了offer。但给的工资是lowball。
LinkedIn我面的是Senior职位,我感觉我面得相当好,所有题都答得不错,最后感觉被一位国人女生黑了。大家可以认为是我实力不行,或者说我找借口,但我能面过Google巨难的新题没理由面不过LinkedIn巨简单的老题吧?这位女生迟到了十分钟,然后给我出了一道很简单的题,接着各种刁难,比如让我想办法把O(N)优化到O(N-2)之类的,让我重写了三四次,让我证明二分法的正确性…… 我清楚地回答出了她问的每一道题,结果HR告诉我其他组都反馈很好,但说最后一轮的女生觉得我communication很烂,强力反对我加入……
借此机会我跟大家聊一聊,在美国的国人大概分为如下几种:
1, 帮助国人。在另一个国人candidate可过可不过的情况下会给过,还好美国大部分的国人属于这类!
2, 狂草国人。在他/她面前国人candidate别想过,除非你是大神,或者你跟她永远不会有竞争关系。
3, 一视同仁。
我希望大家以后有机会做面试官的话,最好能一视同仁,这样是对公司负责,也对自己的名誉负责。当然在我们的同胞可过可不过的情况下,我们可以给他一次机会,想想你的一个简单的决定或许可以改变他人的一生。无论如何,也请大家别狂草自己的同胞,在强大的老印军团的存在下,我们在Job Market中已经很处劣势了,如果你阴我、我阴你,这样我们的道路会更艰难。我从我自己做起,保证不阴任何一个同胞。即使这位LinkedIn的女生碰巧有一天被我面试,我也绝不会报复她,甚至会帮她refer(这个是我信封God之后才有的想法,之前确实是想报复她)。
Facebook我面的也是Senior职位,全是原题,但都很难。我挂在老印的一轮,那一轮他问了我两道很长很容易出错的hard题。我第一道写错了,他高兴得马上拍照。第二道题我用的是完美解法,他非说你这样不快,你的解法有没有缺点…… 然后他并不想拍照我写对的答案,我两次提醒下他才拍照。但我必须承认,Facebook挂的主要原因还是我题刷得不熟。
Google我跳掉了电面。on-site很幸运,全程碰到的都是老美、老亚、老欧。出的都是我没见过的题,难度也高于其他公司。但由于没有歧视,以及那天状态好,我面过了!这里说一下,Google的流程超慢超复杂,不过大多都不需要面试者参与。我的HR建议我先Team Match然后再送Hiring Committee (HC),后来才知道她主要负责那个Team,所以她给我推荐的职位都是她们组的。面试之后很快就有两个经理跟我联系,他们都表示很想要我。那时候我就猜出来我的面试的feedback应该相当不错(我猜是有两到三个strong hire,甚至更多)。我选了一个比较喜欢的组,接下来送Hiring Committee。这时我刚刚得知我挂了LinkedIn和Facebook,然后转天Google的HC就要出结果了。那时我的心情很沉重,有一种命悬一线的感觉。假设Google再挂了,我转行基本就宣告失败了。因为那时我父母就快回国了,他们回去了我就不可能全力以赴找工作了。也许是God的旨意,我觉得我应该向教堂寻求帮助。于是我苦苦地拨出电话,给每一个我周围的教堂打电话。当天已经4:15了,大部分教堂都是4:00下班。打了第六七个左右电话时,一个Church的前台接了电话并转给牧师。我天真烂漫地问牧师:“我知道这个世界一定有God,你能不能跟我讲讲祂是谁?另外你能不能教我如何Pray?”他跟我约好转天早上与我探讨。从那一刻起,我的心情变得很平静,没有太害怕,也没有太紧张。转天早上我向他请教了一番,他也教我如何Pray。就在我开车去公司的路上,我看到了神迹(学术名应该叫sign)。我看到天上飞过三架飞机并驾齐驱,两架是白的,一架是黑的,黑的在前面,白的在后面。然后过一会儿我再看就找不着它们了!我在想这是不是说God想告诉我两个失败和一个成功呢?过了一会儿,在我独自祷告的时候一个电话打进来,通知我全票通过了HC,而且是几分钟就通过的,没有一个人有任何异议!之后我赶紧给牧师打电话报喜,也跟他讲了我看到的sign。他说在我走之后他帮我祷告了,希望God可以show me some signs。你可以认为我产生了幻觉,也可以认为牧师在讲大话,更可以认为这一切只是巧合,但我认为这些都是God的作为!

谷歌的完整流程包括以下:
申请->电面->On-site Interview->Team Matchin->Hiring Committee->Senior Leadership Review->Compensation Negotiation->Final Offer->(后面的是H1b签证相关)LCA->H1b Transfer->Congratulations!
其中通过率最低的要属HC,不过这两年H1b Transfer也很难搞。我的H1b Transfer用了PP,但有一阵子很尴尬,在我Receipt Number周围的朋友都Approve了,只有我的还在pending… 当时我老婆也在申H1b Transfer去Facebook,然后我俩的各种更新都基本同步。那一阵子我们等H1b等得很辛苦,于是决定去洛杉矶和圣迭戈玩耍一星期。某个上午,我俩正在吃Brunch,一刷状态,两人同时Approve了!神奇的是过了几分钟牧师给我发来短信,他说我刚刚为你们祈祷过,希望你俩都能通过…… 没错,就是这么神奇!看来牧师的Prayer还是更强大一些。

Part 4 液体面包
我希望我的转行经验可以帮助和激励大家,下面具体谈谈我觉得哪些东西是该准备的。
刷题:
刷题对找工作的帮助至少占90%,当你不知道该干什么的时候去刷题吧,一定不亏。
无论你基础如何,我强烈推荐Princeton Robert Sedgewick教授的Algorithms, Part I和Algorithms, Part II,好好听一遍受用终身。老人家的Slides整理得相当之好,他的code和证明也非常清晰。这两门课覆盖了大多数面试中会用到的算法,但最大的缺点是没有讲Dynamic Programming。
所以我推荐细读Introduction To Algorithms中关于Dynamic Programming的这一章,有时间的话建议通读全书。
还有一本必读的书是Cracking the Coding Interview,但我当时没看,有时间的话一定要看看。
学了这些之后基本你可以刷大部分题了,然后你每隔几天可以学习一下下面的算法:
Floyd Cycle Detection, Boyer-Moore Voting Algorithm, Reservoir Sampling, Euler Path (Hierholzer’s algorithm), Binary indexed tree (Fenwick Tree), Segment Tree, Morris Tree Traversal
你刷的前两百道题可能会比较吃力,后面应该越刷越顺。
刷题方式大体分为兔派和龟派,我属于龟派。
兔派的方式大概是扫一遍题目,想个几分钟,如果做不出来马上看答案,看懂后自己Implement。
兔派的优点是速度快,效率高,适合记忆力比较强的人,适合面Facebook和LinkedIn等不怎么出新题的公司。
龟派的方式大概是尽量自己解题,即使耗掉半天也自己解,实在做不出来的情况下看看提示再自己解。
龟派的优点是锻炼思维能力,适合分析能力较强的人,适合面谷歌等只出新题的公司。
刷题时间:我建议白天刷题,原因是面试都是在白天,而且晚上刷题的话想不出来很痛苦……
临近面试时建议:每天刷一两道新题,帮助活跃思维。刷高频题,刷自己经常写错的题,刷近期面经(请斟酌:面经有很多问题,比如没答案,比如题表达错误等等)。

系统设计:
这个一开始大家一定很头大,其实还是有套路的。建议早点开始准备,学习好数据库。
一定要学一学Grokking the System Design Interview,最好再自己花钱上个补习班。
系统设计的书很少,目前最公认的是这本:Designing Data-Intensive Applications.

数据库:
我认为数据库是除了算法之外对找工作最有用的一门课,占5%吧。如果实在没时间可以不看,我大部分转专业的朋友都完全不懂数据库,但是也都找到了理想的工作。如果真想学好数据库的话,至少要花两个月时间吧。
建议SQL和NoSQL每个掌握一样,比如MySQL和Cassandra。
数据库的书我推荐这本:Database System Concepts。

Object Oriented Design & Design Patterns:
传说是Amazon必考的内容,微软偶尔也考。如果你不面这两家可以不准备。
推荐书:
Design Patterns, Elements of Reusable Object-Oriented Software (终极参考书)
Head First Object-Oriented Analysis and Design (好理解的一本书)
Agile Principles Patterns and Practices (重点看S.O.L.I.D principles)

其他CS知识:
如果你时间真的超级充裕的话我还建议你学习以下内容:
Operating Systems,面SRE的时候很容易考到里面的知识。 推荐书:Operating Systems 龙书。
Computer Networking,同样的,SRE容易被考。推荐书:Computer Networking - A Top-Down Approach (6th Edition)。

简历:
建议至少有三个软件相关的Projects:一个数据库,一个网站,一个其他(Big Data, Machine Learning, 游戏等等)。
简历是一个绝对头疼的东西,不管你的简历多好,挂在论坛里大家肯定能指出一大堆问题,而且说得不一定对。
如果你实在一个拿得出手的Project都没有,我有以下几点建议:

  1. 在udemy报一个Web development的课,肯定能出一个project.
  2. 报一个big data的班,能出两三个Hadoop的projects.
  3. 把自己工作时的东西“软件包装”。比如你平时的工作时技术支持,要记录用户的问题,那你就说你使用数据库来记录。当然我们不要骗人,最好真的自己搭一个数据库。再比如你平时做实验需要run三样东西,你就说你用script来run这些东西。同样的,建议你真的写script来试试run。
    你一定要有一个自己特别了解的Project,面试时几乎100%会被问题,目的是考你是否能讲清楚一样东西,具体内容不重要。

Behavior Questions:
这类问题最好回答也最难回答,主要考核你是否适合在他家工作。
What is your Biggest challenge? 想听的是你面对challenge和如何解决的能力。
最引以为豪的project是什么? 考你的沟通能力,看看你能不能通过画图和讲话把一个project说清楚。
如果在团队中你有不同意见会怎么办?如果他人针对你你会怎么办?想听你解决冲突和沟通能力,答案的关键词是沟通,沟通可以解决一切问题……
有什么赶掉deadline或者几乎赶掉deadline的情况吗?怎么处理的?想听你的计划和抗压能力,答案的关键词是计划好,如果计划赶不上变化要赶快和经理以及相关人员沟通,然后每次update进度时通知这些人,开会时写meeting minutes并发给他们。
告诉我一个你之前manager给你的negative feedback。你犯过最大的错误是什么。这时候一定要回答一个真真正正的错误,他们主要想听你以后是如何改正或者避免的。
必问题:What questions do you want to ask me?
参考问题:
A. What is the ratio of testers to developers to program managers?
B. What brought you to this company?
C. Why did the product choose to use the X protocol over the Y protocol?
D. I’m very interested in scalability, and I’d love to learn more about it. What opportunities are there at this company to learn about this?
E. I’m not familiar with technology X, but it sounds like a very interesting solution. Could you tell me more about how it works?

英语:
英语也重要也不重要,平时练习一下给别人用英语把题讲清楚,对方能听明白就可以了。
有追求的朋友可以学习一下美音是如何发音的,很多单词的美音和英语差别很大。比如Herb, Watch等等。再有一些单词的读音可以注意一下,老美会故意吞音,比如Button, Manhattan等等。
还有重音要弄清楚,很多朋友连Project都读错了,作名词讲时重音是在前的。
另外,注意老美什么时候卷舌什么时候不卷舌,简单来讲是看单词里有没有R,比如Idea就不卷舌,Paper就卷舌。

内功:
动力:每个人的核心动力的来源都不一样,其中包括:好胜心、金钱、权利、自由、追求知识等等。我的核心动力是好胜心,算是比较不正能量的一个动力。很多人会问:“我想转CS想找工作,但是我没动力怎么办?” 我的内心回答是:“那就别去做!”你连动力都没有还搞什么搞?如果连找动力都成了问题那我觉得你不可能做好任何事情,还是别找工作了,回国种田吧。但我还是尝试给这些朋友一点启示吧,你想不想住别墅?想不想将来的孩子可以享受这边不用高考不用考研的权利?想不想开特斯拉、保时捷?想不想周末去海边冲浪、打沙滩排球、钓鱼?想不想开船出海潜水?想不想公司有专业咖啡师给你煮咖啡?想不想将来有个大院子自己可以种树、种多肉?想不想朝十晚五周末双休?想不想周末游山玩水?想不想买劳力士?想不想买LV?想不想买奢侈品时不考虑价钱?想不想跟别人聊起自己公司时一脸的自豪?我只是随便开个头,你可以想象一下自己想要的生活是什么样的,然后找到软件的工作能不能帮你实现。

别找借口: 我老婆是CS科班出身,她现在在Facebook工作。听到这里很多我眼中的“弱者”会想到“难怪他能去谷歌,她老婆可以教他。”其实她在学习上几乎没怎么帮我,就连语言都推荐错了…… 我举这个例子是想告诉大家,别给自己找任何借口。
“他年轻所以他能拼,我老了我拼不动了。”
“他是科班出身所以他能找到工作,我不是学CS的,所以我找不到工作。”
“她是女生,面试肯定简单。”
“她长得漂亮,所以好找工作。”
“他是PhD,机会比我多。”
“他有绿卡,机会比我多。”
“他是应届生,门槛低,好找工作。”
“他有工作经验,好拿面试。”
“他没结婚,所以他有时间准备面试。”
“她没孩子,所以她有时间准备面试。”
…………
别人成功了,他就是成功了,就证明他牛X。你没成功,至少目前来看你就是不牛X。
别为自己的不努力找借口,别为自己的失败找借口。这个世界上有一百个借口导致你失败,有一千个借口导致你无法努力,但也有一万个原因能让你成功,有一百万个动力能让你坚持努力下去!

别觉得自己笨:刷题网上有两类人,第一类包括lee215、Stefan Pochmann、dietpepsi、awice等等,第二类就是我们。就好像美国的学校可以大体分为两类,第一类是斯坦福和MIT,第二类是其它所有学校。就是说我们找工作的竞争对手并不是斯坦福和MIT里的大牛们,也不是刷题网里的大神们,而是许多刷了不到300道题的芸芸众生。而且大部分人都很难自己刷Hard题,包括我,我也比较吃力。所以请大家放心的去看答案,想不出来最优解完全正常。

坚持:一定要一鼓作气,千万不要三天打鱼两天晒网,每天至少刷一两道题,不然就别睡觉!刷题期间请麻醉自己,请暂时改名“不刷不爽斯基”。我当时刷题甚至刷出了幸福感!1000这个数字看起来很多,但是如果除以365的话就小于3了!

投简历:
一定不要海投,一定要找内推。
海投的回复率非常低,而且还有一个更大的问题,就是很多公司你海投之后就不能内推了!这是我后来才知道的,希望大家不要犯我犯过的错。怎么找内推呢?论坛里的小伙伴们给力的很!

先写这么多,大家加油!大家具体想听些什么的话欢迎提问和讨论!

6 Likes

好励志啊,哈哈哈哈

还在挣扎中!多谢楼主的分享!