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

avatar 444722
chenyijia055
100454
193
红着眼睛看完了 这篇“硬”闯谷歌之路,感觉就是我本人写的。instant.1point3acres.cn
最近也拿到了狗家offer 希望把自己之前10个月的经历分享给大家。给大家打一针鸡血。

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


2 面试
跳过刷题和准备的阶段,先说说投简历和面试。由于我的背景和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。


3 刷题王的春天
先上图大家可以感受下。
Preview



Preview


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


4 系统设计
我在准备面试之前,完全没有任何distributed system的经验,并且连server都没碰到过,从来没launch过一个website,没有用过任何open source的东西和cloud service,离开学校之后五年没有碰过一次database。我觉得基础再差也就这样了吧。系统设计我几乎看完了地里面所有推荐的资料,文章,书和论文,youtube上所有点击率比较高的相关视频,上了educative.io,外加网上各种各样的其他文章,各种open source tool/framework的training和paper, eng blog等等,1point3acres.com每一篇帖子我都看过,每个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个小时。下面具体会说。

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


6时间安排
估计很多人很好奇为什么我在职还能花这么多时间在准备面试上面。其实这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外加入职以可能的痛苦而已。

What doesn't kill you, makes you stronger ! Whatever it takes!




补充内容 (2019-8-15 10:30):
问我项目的朋友,不好意思我不能把我简历里面的项目分享给你们,我也不能教你们怎么bian。想一下招你的组需要什么经历和industry什么比较hot。前端后端CI/CD自己写个func spec,每个环节youtube和网上都有很好课程。

补充内容 (2019-8-15 10:34):
同时还是那句老话,先把基础打好,基础不仅仅是刷题和design,还包括目前流行的industry standard比如CI/CD,各种data pipeline以及popular的open source framework/tool等等。只需要有一定的了解,好项目的思路就有了

补充内容 (2019-8-15 10:42):
每个环节不一定需要了解得特别细。有工作经验的人都知道一个好的大的项目往往都是很多engineers合作的成果。并不可能有一个人了解所有细节。面试一个小时,大多时候都是在问high level的东西而不是具体的操作.
  • 767
置顶回复
收起
avatar 444722
chenyijia055楼主

一个人刷的,确实很难。其实和有没有同伴没关系。愿意坚持的人,一个人也可以坚持,不愿意的人全世界陪他也没用。在职刷题尤其辛苦,不仅是体力上的,还有心理上的。我经常刷着刷着就想抽自己几耳光,当时在学校的时候,有大把时间可以刷题学习,都浪费干嘛去了。。。。
avatar 444722
chenyijia055楼主

能啊,看得够多就可以。我也是一开始从那个最出名的哈佛视频, 然后到cpa, horizonal scale, vertical scale这些最基础的概念开始的,比如我从来没用过hbase cassandra 这些no sql, 你就去google和youtube搜,看到自己懂了为止。不要想着一口吃成个胖子,上来就学一个很大的distributed system,先把常见的这些component的基础打好,慢慢积累。基础打好了你在去看那种分布式的教程,youtube有专门的system design的视频,educative.io, 9zhang也可以上,地理也有很多讨论,其他网上也有很多讨论,还可以去看那些open source的distributed system的architecture。学好系统设计,不是把网上别人写的东西背下来,是真的要懂里面的各种原理和tradeoff,见招拆招。
大米 18
2
admin+16
2011051305+2谢谢!我也没用过没感性认识 看讲解看的很.
avatar 444722
chenyijia055楼主

个人的经验你可以听一下,不一定永远都是第二种好。如果是easy和medium的题 上去直接自信讲思路给最优解我觉得完全没问题,不仅可以节约时间给第二题或者follow up而且还会给interviewer一个很好的印象,会加分,如果非要强行演的话,不仅浪费时间还可能把自己演没了。如果是已到hard或以上的题,第二种层层递进的方法更好。
大米 1
1
fmusk+1感谢楼主~对刷题小白的我特有帮助!
avatar 444722
chenyijia055楼主

一起加油!这只是个开始,未来还会有各种各样的挑战。希望我们都能在google创出一片天地。
avatar 359880
ethan1987
楼主好,我就是你说的那个帖子的作者,很高兴我们有相似的经历。
我感觉你的成功不是偶然,你比我还要硬核很多。
祝我们以后不再这样辛苦!
大米 2
2
eiei39+1赞一个
夏·小天使·目+1赞一个
193条回复