Google · Facebook · LinkedIn · Apple · Uber · Twitter · Bloomberg · Square

我是如何拿到谷歌/FB/苹果/亚马逊/Uber/LinkedIn等9个大Offer的?

Chuchu Zhang | UC Berkeley | CS
参加来offer以来,通过与很多非常优秀的同学和老师切磋,让我打磨出了非常Solid的算法、编程和系统设计知识。等到去面试的时候,已经对自己的水平非常有信心了,拿到9个大公司的Offer不能说是意料之中,但也可算是水到渠成。

我从2015年开始参加来offer培训,断断续续到现在已经两年多了。这两年来通过与很多非常优秀的同学和老师切磋,让我打磨出了非常Solid的算法、编程和系统设计知识。

等到去面试的时候,已经对自己的水平非常有信心了,拿到9个大公司的Offer不能说是意料之中,但也可算是水到渠成。非常感谢来Offer对我的帮助。

借着这篇文章,我想谈谈这两年找工作的经验和方法,希望能给大家带来一些帮助。

大三转专业,求职屡碰壁

我从大三开始转专业学CS,当别人都开始找暑假实习的时候我还在独自啃CS基础课,对面试一点概念也没有。

大三下学期的时候我报名了来offer。一年内,我上了两遍来Offer的课程,但都没有坚持上完。虽然说确实有学校的课业重、实习时间紧的问题,但是最关键的还是求职的觉悟不够,比较贪玩。

由于我上课不认真也没有认真练习算法题,当我大四去找工作的时候,我虽然拿到了大公司的面试机会,但是都以失败告终。在此期间,因为我两遍课程都没有好好上完,我也不好意思和来Offer的老师们联系。

zhangchuchu-1

小试牛刀,加入Startup

直到2016年三月,我还是没有拿到正式offer,这时候离毕业只剩两个月了,我开始着急了起来。不得已,我硬着头皮找到了孙老师。孙老师听了我的情况以后很着急,立刻为我安排重新上课。

这次我终于认真了。

和很多CS科班的同学一样,刚开始似乎感觉很多知识点学校都学过,但是当我真正跟着孙老师完整地把课上下来,才会有一种醍醐灌顶,一通百通的感觉。从基础到提升,我学到了很多。

比如,之前我做算法题目没有什么条理,可上完课之后,我却能清晰地解释出“怎么从brute force的解法开始一步一步优化”、“遇到某一个类型的题目应该从哪入手”等问题。

在认真听课两个月以后,我终于在5月底拿到了一个startup的offer。

精益求精,拿下9个大公司offer

在公司工作了一段时间以后,我发现自己还是想去一线大公司工作。于是,我又联系了孙老师,并在2017年二月加入了小班。小班和大班相比覆盖的内容都差不多,但是深度却加深了很多。

闫老师不仅把每一道题都讲得非常透彻,而且还会从题目出发,联系不同的知识点,教大家如何从最暴力的解法一步步推导至最优解,以及,怎样分析不同方法的Trade Off等等。

此外,老师不仅仅会教大家如何改善算法,还会教大家怎么弄清楚每一个variable的物理意义,使写出来的代码准确不冗余。

我每一次上课都会忍不住感叹老师的代码又简洁又精巧,不愧是非常有工业界经验的资深工程师。

zhangchuchu-2

我觉得即使不是为了找工作,来Offer的课程也是非常有意义的。如果你愿意从师于真正的Top Coder、Top Engineer,成为一个具有强大实力的软件工程师,那么你真的应该加入来Offer。

在上了半年多小班以后,我在今年10月拿到了几个大公司的offer。

理解算法和推导,才是最高效的做题方法

我觉得做题应该从基础的题目开始,来Offer的算法课程和Laicode的题目是最重要的,做完这些题目,大多数面试中的题目你都能回答了。

做题顺序来说,我觉得最有效的是根据老师上课的进度,及时地完成课上例题和作业,这样能够更好的理解这部分知识点。上小班的时候,我会根据公司的tag和老师上课的进度找相应的题目来做。

我觉得做题数量不是最要紧的,更重要的是理解算法和推倒的过程,能够做到举一反三。

另外,不用一味地追求最优解。

有的时候最优解不是很intuitive,我会理解次优解,而不是花很长时间在理解最优解上。有一些难的题目比如说DP, 我会先用DFS来做,然后改成DFS + memorization,最后再改成DP。这样对加深理解很有用。

面试的时候我也经常从次优解开始做,最后优化到最优解。并不是故意想给面试官一个我没有做过这道题目的印象,而是和面试官讲清楚自己理解和推倒的过程,让他清晰地理解你解决问题的思路。这个过程也在面试中起到加分作用。

另外,和同学们组成学习小组也是一个非常好的方法。

和大家一起讨论能够锻炼自己表述、解释和总结代码的能力,也能够增加学习的积极性。

如何准备面试

除了算法之外,我觉得对于面试来说,对自己projects的了解和平时知识的积累很重要。

面试的时候,面试官会问很多关于以前projects的问题。所以一定要想清楚,为什么要做这个project,为什么要选用某一样technology而不是别的alternative。弄清楚一样technology和alternative之间的trade off,对于提高system design的能力也很有帮助。

与此同时平时的积累也很重要。

比如说我比较喜欢读一些Tech Blog,平时的工作中用到的工具我会读Document去弄清楚Architecture。另外我喜欢参加一些Tech Conference和Tech Talk, 这些不但是很好的学习机会,而且是很好Networking的机会,能够近距离的遇到一些Recruiters和Engineers。

zhangchuchu-4

比如说,我拿到LinkedIn的面试就是因为我去参加了Kafka Summit并且和LinkedIn的Recruiter聊了天。

这些平时的积累在面试中发挥出来不但能够帮助System Design,而且会让面试官觉得你对新的Technology很感兴趣,是一个很Passionate的工程师。

写在最后

最后我想告诉大家的是,不要因为一时的挫折而放弃或者灰心。

在我找到第一份工作之前,我也曾在面试中被人拒绝无数次。当时,身边的同学都拿到了大公司的Offer,而我却连工作也没有。

我也会Depressed,会暴饮暴食长胖,会每天都觉得自己一事无成……

可是,你看我现在,经过一年的学习也拿到了想要的Offer。

所以,只要付出时间和努力,最后都会变好的。

当然,这一切都少不了孙老师、闫老师和Jack老师对我的帮助,我真的非常感激。

最后,希望大家都能找到自己喜欢的工作。

zhangchuchu-5