刷题王的春天---‘硬’闯谷歌有感

最近也拿到了狗家offer 希望把自己之前10个月的经历分享给大家。给大家打一针鸡血。

背景

CS master 在一个偏硬件的公司做了近五年QA,绝大多数时候是manual testing. 这五年coding的东西不仅是一点没学到,反而忘了很多 。周围的很多同学朋友都在大‍‍‍‍‌‍‌‌‍‌‍‌‌‍‌‌‍‌‌厂, 也有一些从小厂换到大厂的工资都会涨百分之50 ,十分羡慕。并且我发现我越来越和他们无法交流,我平时做的东西和他们比起来就是non-sense,他们说的那些技术我也完全不懂。 想着自己才20多岁,还要工作几十年不能继续在这里浪费时间了 ,去年开始决定换一份正儿八经的software development engineer的工作,并且无论如何都要做到。Whatever it takes!

面试

跳过刷题和准备的阶段,先说说投简历和面试。由于我的背景和year of experience比较长(五年)。投简历这一步就比其他人艰难很多,简历投出去毫无音讯的公司很多,有人内‍‍‍‍‌‍‌‌‍‌‍‌‌‍‌‌‍‌‌推的会好一些,但是很多hr都会直接给我说我的背景和SDE真的不太match,并且五年的经验应该是一个senior甚至以上的role,他们并愿意train我这么一个白板,愿不愿意考虑其他的一些role 比如sre,support engineer或者一些specialist role什么source control 或者disaster recovery之类的。所以这一阶段,我经历了各种各样的被拒,1 简历拒,2 hr screening拒, 3 phone interview过了hire manager拒。4 对hr提供的职位不感兴趣,希望hr再帮我找找之后毫无音讯拒。5 面着面着 hire manager 突然叫停拒 等等等等。 之后我就学‘聪明’了,改简历包装自己,自学自做了很多project,在youtube上看别人做project无论什么职位都展现出浓厚的兴趣,先拿到面试再说 。慢慢的我拿到了9个phone interview 且公司都还不错,最终拿到了8个oniste, 去了其中五个拿了三个offer。

刷题王的春天

先上图大家可以感受下。

10个月纯手工打造22000次submission, 1000题刷了五遍 。每天刷题时间不少于8小时。 有很长一段时间每天就睡4, 5个小时。(这里并不推荐大家这样也没必要,因‍‍‍‍‌‍‌‌‍‌‍‌‌‍‌‌‍‌‌为那段时间身体确实明显出现了问题)。 这10个月里面我只有一两天没刷题。刷题最重要的就是坚持,绝对不能三天打鱼两天晒网。 除了leetcode,我还刷了无数leetcode没有的面经题,以及网上流传的各公司高频以及少部分lintcode的题以及自己实现了各种经典算法和数据结构。刷题数量1500+肯定是有的。并且每一道起码都是3遍。 正因为如此,我所有电面, onsite遇到的算法相关的题,没有一道是我觉得难的。

系统设计

我在准备面试之前,完全没有任何distributed system的经验,并且连server都没碰到过,从来没launch过一个website,没有用过任何‍‍‍‍‌‍‌‌‍‌‍‌‌‍‌‌‍‌‌open source的东西和cloud service,离开学校之后五年没有碰过一次database。我觉得基础再差也就这样了吧。 系统设计我几乎看完了地里面所有推荐的资料,文章,书和论文,youtube上所有点击率比较高的相关视频,上了 educative.io,外加网上各种各样的其他文章,各种open source tool/framework的training和paper, eng blog等等,地里系统设计的版块每一篇帖子我都看过,每个case我都思考过 。资料只要用心都能找到,好多内容是重复的,但是没关系,很多东西你多看几遍,你会有不同的理解,好多新东西看第一遍会很懵或似懂非懂,但是如果你在10个不同的地方看了10个不同的人写的文章和用法以后,你的理解慢慢就会上升好几个levels, 量变真的会慢慢产生质变。我不会在这里列出我看过的所有东西,因为我自己也找不齐了也根本列不完。我用的dfs+web crawler的方法(还好这不会stack overflow),自己maintain一个stack(就是一个文档), 每看一篇文章里面如果里面有不懂的概念和keyword, 我都会加到stack里面继续通过google学习,然后无限持续下去 。永远都有新的东西可以学。这种学习方法成效慢,但是基础会十分扎实,如果你只想去靠运气去碰经典原题,面试就说说基本实现的原理和架构,面对各种follow up和tradeoff 能说就说,说不出来就算,那可能这个办法不适合你。我五个onsite里问了5个系统设计,结果全部都很impressive,甚至我感觉某些interviewer理论上的理解并没有我深,办法(tao lu)也没我多。有些时候我甚至可以inspire他们并指出他们没考虑到的问题,虽然我其实从来没做过。我每天花在系统设计的时间大概是4-5个小时。下面具体会说。

Project Deepdive &

Behavioral Question

这是我的弱项,因为根本没有什么太valuable的project和experience。挂的onsite估计就是挂在这些方面了。但自己还是准备了很多,通过自己动手做,看网上别人做的以‍‍‍‍‌‍‌‌‍‌‍‌‌‍‌‌‍‌‌及bian。 Behavioral question我准备了100来个常见问题的答案 。大概里面有20个不同的例子左右,真真假假,假假真真,对于不同的问题从不同的角度出发去回答。按照Amazon来准备,每个公司稍加修改即可。在美国多年,英语交流还行,所以只是提前把答案写下来,看一两遍,并没有背或者对着镜子和朋友练习。

背景

估计很多人很好奇为什么我在职还能花这么多时间在准备面试上面。 其实这10个月里面我放弃了一切的娱乐和私人时间每一分钟对我来说都是宝贵的 ,工作上的事情也都尽力放缓,比如我知道‍‍‍‍‌‍‌‌‍‌‍‌‌‍‌‌‍‌‌有一个重要的project要来,我一定会给老板请几天假,然后project就会assign给别人。我有目的通过一些办法选择接受一些简单的相对轻松的和自己十分熟悉的project来做。同时以前存的30多天pto以及这10个月新累计的接近20天pto,这10个月里面也断断续续用完了。 每天早上我一般会7点以前起来,然后刷3个小时题 ,避开高峰期 , 到公司没有会的情况下就是小房间刷题,小会没办法,大会角落躲着偷偷刷题, 下班一般会堵车,就在公司刷一两个小时题,避开高峰, 这样来回比平时会节省一个多小时的堵车时间。每周固定work from home 1-2天。一度以为自己会被裁掉。但是由于有绿卡所以也做好了被裁的准备,虽然这样,但心理压力也相当大。反正就是不成功也要成功,whatever it takes! 到家之后就完全是系统设计时间,从8点多大概1-2点结束。周末花的时间更多,10个月里面几乎没有休息,没有娱乐,朋友约都是拒绝,印象中只去看了一次复联4,实在忍不住想看 。自从开始找工作以后,感觉在旧公司一天都待不下去,所有project都是如此的boring,一点心思和时间都不想花在上面,只想早点离开。躲着老板,躲着同事,躲项目,每次被要求和老板one-on-one都生不如死,一度感觉要崩溃。

我相信只要有决心有信心,任何人都可以做到自己想做的事, 换工作面试其实很简单,比起人生当中今后会遇到的困难这可能根本算不上什么。最重要的坚持和用心 ,静下心来沉淀一段时间,拒绝各种诱惑,无论你基础多差,无论你运气多差,无论你是不是转专业,无论你有多少主观或客观的困难。对于那些正在找还没上岸的同学,也一定不要丢失信心,多总结多学习,挂10家面20家,永不言弃,不仅仅是刷题,一定要全方位高质量的提高自己,无论是soft还是hard skills。只要你真的时间花够了,方法对了,你收获的绝对不仅仅是一个offer,还有扎实的基础以及和今后遇到困难解决困难的方法和信心。相反很多没花太多时间基础也一般的人,哪怕运气好面试过了,最终收获的仅仅只是一个offer外加入职以可能的痛苦而已。

楼主真的很不容易啊。。