查看原文
其他

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

chenyijia055 一亩三分地Warald 2019-10-07

记得点蓝字关注我们哟

下文由chenyijia055

发布在一亩三分地

北美求职


红着眼睛看完了这篇“硬”闯谷歌之路,感觉就是我本人写的。


https://www.1point3acres.com/bbs/thread-538502-1-1‍‍‍‍‌‍‌‌‍‌‍‌‌‍‌‌‍‌‌.html (“硬”闯谷歌之路)


最近也拿到了狗家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外加入职以可能的痛苦而已。



What doesn't kill you, makes you stronger! 

Whatever it takes!


下文由 jan2019 

发布在一亩三分地

终身学习


刷题的意志力


看励志帖子

1)硬闯谷歌之路

https://www.1point3acres.com/bbs/thread-538502-1-1.html

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

https://www.1point3acres.com/bbs/thread-543136-1-1.html


坚持,坚持,坚持就会胜‍‍‍‍‌‍‌‌‍‌‍‌‌‍‌‌‍‌‌利,就会找到软件工程师的工作。作者是刷了1000多道题目,看了所有可以搜集到的的系统设计资料,还补习了操作系统,网络,数据库等计算机的基础,亲手做了一些项目。我至少要刷400道题目吧。多谢作者的帖子。在刷题低迷自我怀疑的时候看一下,又有动力和信心去刷题。


刷题的策略

首先知道是没有基础知识卡壳,还是有基础知识,不知道题目适合那些数据结构和算法。


如果没有基础,需要看一些算法数据结构基础知识。princeton的coursera algorithm是首先。刷题从easy开始,这样入手快,对基础概念掌握有帮助。我之前入手是看了普林斯顿在coursera的算法课程,跟着某章的基础算法课,把老师讲的题目都做了一遍。


如果有些基础了(看了基础算法和数据结构)。按照分类刷题。知道是用这一类的数据结构和算法更容易入手。


看到题目,找到关键字,需要想到相关的基础知识。比如图想到bfs,dfs等等。tree想到inorder preorder,postorder。以及dfs and stack,bfs and queue等等。比如bst的特点/定义需要知道,inorer traversal得到的是一个升序有序数组。二叉树,搜索二叉树,有几个套路,需要总结出来。比如divide conquer或者遍历,backtracking等等。需要做题目练习。


如果看到”题目1“半个小时想不出来。可以放一下,看别的题目,可以简单一些的,写一下代码。第二天或者看了另外两道题目之后再回来“看题目1”。如果还是没有思路,可以看提示,再想10分钟,如果没有思路,看别人的答案,自己试着写代码。之后看答案的题目,一定要两周之内隔几天再复习一下难题(自己没有想出来的题目,很容易就忘记解法)。


做题的目的不是做出来就可以了。做题目的是学会使用学到的数据结构和算法,分析时间复杂度,空间复杂度,锻炼分析问题,解决问题,写代码的能力。所以,做对了/错了都需要总结,怎么想到的用这些数据结构和算法,时间空间复杂度是什么,我错在哪里了,下次避免类似的错误。答案是否有可以优化的地方。看别人的更优化的算法和更简洁的代码。


算法本身要自己想出来很难,像quick sort都是很多算法大师发了很多paper不断改进的,更不用说trie,shortest path/MST等这些复杂的数据结构和算法。所以,我是学习已有的算法,做题的合理目标是:训练判断用什么数据结构和算法,如何综合几个easy简单问题解决hard复杂问题


最后感言面试的状态/信心。每次在一亩三分地看到google的面经,我的第一反应是心慌胆怯,想题目好难做不出来,真着急。有一天忽然意识到,自己好的面试状态就是就是发挥平时刷题水平的60%。所以平时的刷题状态就是面试时候的状态。平时刷题我遇到难题也是心慌着急,不自信。刷题数目/难度够了,总结的够系统了,再用面经训练一下处理模糊信息能力和熟悉面试风格,这就是在积累面试的状态和信心


刷题的好帖也有很多,比我总结的更全,可以参考。




一亩三分地招小编啦!

欢迎加入我们!

>>>一亩三分地招聘社区运营/小编<<<


What do you think? 

Let us know! 

点击右下角到原文回复

会有加分哦!



提问怎么高效地拿积分看面经?

正确答案在地里积极分享自己的经验或经历!

提问:想学DS,想学算法,但没人教,怎么办?

正确答案:往下滑!



一亩三分地热评第一系统设计课


谷歌面试官教你准备面试


数据科学面试真题讲解



公众号太多,找不到一亩三分地怎么破?

进入一亩三分地公众号首页

点击右上角“···”,点击“Star”或“星标”

就可以一眼找到Warald


https://www.1point3acres.com/bbs/

点击左下方阅读原文

去一亩三分地查看原帖


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存