准备面试篇,无干货

原帖地址:mitbbs

首先,无干货,可略过。

其次,我的经历不一定对所有人适用,也不是说我这么做就是对的,我工作时间也不长
所以有些问题看的也肤浅,主要目的是抛砖,一不小心又码字码多了,有耐心的同学可
以看看,欢迎指正和建议。

######################################
###

再说一下我的背景,既然很多人感兴趣,但是再细节就没有了。。

北美cs top25水校ms不到两年
之前在一只湾区的三哥驴(非L),版上已经有人猜出来了
做的东西还算可以,大数据的infra

######################################
###

除了刷题之外的准备。。

真正开始准备找工作是半年之前,我相信我在的驴比版上大部分公司都忙,所以开始的
时候进度比较慢,最开始的时候并没有主要刷题,而是列了一些我觉得必须要了解到一
定程度的system和framework来学习,我花了大概三个月时间来看一些paper,
opensource project的文档,presentation,source code和engineering blog。因为
工作中都在用,所以其实没有非常痛苦,但是尽量从design的角度来看问题会学到更多
东西,很多时候问问自己别人为什么要这样做,再结合自己真正的经历会收获很多。这
段时间也是自己对整个knowledge base查缺补漏的重要时间,只要看到不是很理解的概
念基本上都要查清楚,design很多时候其实是考察你的knowledge base和基本功是不是
扎实,没有knowledge base是很难做好design。

后面我还专门花时间来看跟Java concurrency有关的内容,joshua bloch的那本书我看
了一遍,然后又看了一遍Java concurrent library里面几个经典的数据结构的实现,
这个我觉得对我的帮助非常之大,很多东西以前模模糊糊突然会变得清楚很多,理解了
别人是怎么实现的,其实也能学会很多时候各种常见的优化是怎么做的。甚至很多
concurrency design和实现的技巧都是在这里学到的,比如之前不知道IntAccumulator
,AtomicIntArray,再比如我们都知道blockingqueue简单来说怎么实现,但是Java的
LinkedBlockdingQueue其实比较精巧,throughput较高,然后再跟之前接触过的
disruptor queue做比较,总结下来现在无非就是从最早的compareset busy wait浪费
cpu再到用wait condition节省cpu再到compareset busy wait浪费cpu但是提供更好的
throughput。另外就是直接对memory进行volatile读操作可以在很多时候节省读的时候
的锁。新的concurrenthashmap大量用到了这些,其实也提供了很多在做concurrent的
题目的时候一些重要的优化的方法。

做完这些事情之后本来想把Kafka的源码再读一下,但是时间不够了,虽然之前design
还是大体有些了解,但是我觉得hadoop,storm,kafka,Hbase,Cassandra这几个非常
典型的framework是我面试中必然要非常了解的东西,之前接触Kafka并不是非常多,所
以特意又把Kafka的paper和design doc研读了一下,然后又看了大量的其它公司的
engineering blog来了解别人都在做什么,都有什么问题。

之前没有做过很多跟web service相关的东西,所以这个类型的东西还是要看一下,
thanks god,版上有位F的大牛分享了很多有用的资料,有关最经典的几个系统的
design和实现,跟F相关的网上能找到的视频我基本上都看过一遍,文档我也都看过一
遍,基本上类似的问题都能用相同的原则来解决。

有些同学说design没有经验搞不定, 这个也对也不完全对,没有搞过确实缺乏第一手
资料,会不知道可能会出现哪些问题,但是不代表最常见的问题你没有其它途径可以知
道,大家对于各个系统的改进都是基于现有系统出现的常见问题,没做过可以,但是不
能作为不会做的借口,想要了解别人是怎么做的不是一件很难的事情。现在大部分常见
的系统整体来说都是大同小异,有一些最根本的原则其实大家都在遵循,然后区别往往
是针对不同use case的个别的优化。

所以这里我觉得比较有用的准备方法是,在弄明白一个design之前,先要做好几个准备

1. 先把一个process或者一个系统是怎么工作的搞清楚,这里是指,design一个
service需要cpu,memory,disk,network等等很多component协调工作,这些东西分别
都在什么时候用到,为什么要有这些东西,分别有什么特点。
相信大家都很熟悉有一篇文章叫做The numbers eveyone should know,在没有这篇文
章基础上的design都是瞎扯。

2. 要清楚这个design到底是为了解决什么问题,use case是什么,design一个系统根
本上讲是为了解决一个存在的problem,这个problem会有general的要求,比如latency
,比如throughput,比如load,比如哪种操作比较频繁,比如有没有consistency要求
,是不是reactive,是不是需要highly available,等等等等,这样跟第1点相结合才
能明白瓶颈可能在哪里,哪些东西可以tradeoff,进而才会有design的solution

3. knowledge base的储备要尽量够,操作系统,distributed system,concurrency这
些东西很难啃,我也曾经自学过几个大学的distributed system公开课,很多同学想绕
过这些走捷径,但是越难的东西就越有价值。知识量不够不是问题,看一点补充一点,
只要能坚持下来,到了一个时间点基本上还是可以有质变的。

所有的套路都是建立在这些东西基础之上,慢慢总结下来就会明白,在什么情况下可以
怎么做来解决什么样的问题。很多时候不需要你自己去想新的solution,但是对于现有
的solution能够做到灵活运用也不是一件很简单的事情。

简而言之,就是靠平时积累打好知识的基础+多偷学别人现有的东西+自己多总结多站
在解决问题的角度来思考,而不仅仅把这些当作面试题。

另外,我觉得就准备一般面试而言,版上有两大神贴,这两大神贴里面的内容相当的赞
,而且我也完完整整的读了所有的内容,这两大神贴现在还在第一页上

1. 就是beidapig大牛的总结贴
2. 就是另一个facebook大牛的总结经验内推贴

我对web service这一块的总结基本上就靠这两个帖子里面的内容,所以特别感谢这两
位。

以上这些事情其实工作之后断断续续一直都在做,但是集中精力做大概是持续了四个月
时间。
然后我觉得需要开始集中强化一下算法和coding。

######################################
###

有关算法coding:

在之前一个帖子说过了,LC+本版过去半年的面经。

不好意思,我不太擅长把东西整理的很有条理,所以基本上现在这些东西还是处于只有
我一个人能明白是什么的状态,非常之乱所以不好意思献丑。

但是我这里想说的是,总结的结果没有那么重要,过程才是最重要的,如果你看别人面
经的目的就是为了明白这几道题目或者期望面试碰到原题,我觉得面经是看不完的。这
个版上的资源非常之丰富,其实都不需要完全消化就能很容易拿到offer。

看一道题目就理解一道题目而且能够跟之前类似的问题融汇起来才是目的,其实看完版
上半年的面经并没有那么难,我这件事情坚持了一个多月时间,每天晚上看四,五个小
时,每个帖子每道题目,所有的回帖,都仔仔细细看过,这是我感觉算法突飞猛进的一
个重要时间段。

还有现在很多面试的很多题目不是偏向于算法而是coding的基本功,这个没办法就是多
练习,越是麻烦不好写的题目越是要多练习,其实都有规律可以遵循。

版上的难题我一个都没有遇到,我觉得LC中等到中等偏上难度的题目应该是大部分面试
的平均水平,花费大量时间在某些难题上面不一定有意义,还不如把基础打的更佳牢固
些。如果你面试中被问到难题,基本说明面试官在面试前就对你不是非常认可,需要用
一些比较难的题目来考察你。

我本身也面过不少candidates,所以我相信这个是大部分面试官常见的思路,其实真实
的事情是很多时候面试官想让你过你就能过,不想让你过你怎么样也过不了。面试不是
考试,不是题做出来就能100分,况且有很多题目都没有评分标准。

所以我说,刷题只是整个面试过程中最最基本的部分,只是必要的一个条件,远远不是
全部,如果能力够了刷题刷的不好也照样拿offer,大家互相什么水平随便聊两句都知
道个差不多,并不是所有人都喜欢面算法面刷题。

######################################
###

后面就真正进入面试的阶段,然后为了心无旁骛破釜沉舟我把之前没用的假期都用了,
然后开始全职专心致志搞。

面试的时候我的策略是先面练手的公司,然后中间状态最好的时候面最想去的公司,最
后再冲击难一点的hot preipo,不过发现面试的时间基本上自己也说了不算,之前做好
的计划基本没用。

最后三个周我基本上没有太刷题,最多就是看看之前掌握的感觉不是特别好的内容,然
后随便东戳一下西戳一下看看新的帖子,每天再练习两个设计题目,如果需要保持手感
就手写几道题目。每个公司onsite之前我还会把glassdoor上的面经浏览一下,主要是
为了心里有数,不会紧张。
所有的onsite基本上都在最后的两个周时间,这段时间比较艰难。

有关其他:
相比刚毕业的时候,这次找工作还是有一些感触比较深的地方:

1。简历非常重要,即使是去面FG这种大公司,很多时候面试结果在真正面之前就决定
了大半,如果简历还拿得出手自己对做的东西非常熟,有很大加成,所以请大家还是要
刷刷简历,好好准备。我有好几次都是聊简历相关的东西一轮面试就糊弄过去了,面试
官一般也不会为难。

2。找工作请找靠谱的朋友内推和找目标公司的recruiter,recruiter大部分是非常帮
忙的,所以请在一开始的时候对他们好一点,他们如果觉得你有戏会尽力帮你拿到
offer。recruiter在面试中起到的作用可以非常大,他们帮你安排面试官,他们可以看
到你的feedback,他们甚至可以有比较好的私人关系帮你match好的组,所以,在拿到
offer之前,注意是之前,装装孙子没有坏处。拿到offer之后主动权就在你自己手里了
,大局已定后双方的地位会互换,negotiate offer这个环节其实就一条。。。有
compete offer你就牛逼,没有你就。。。

3。面试过程也是不断学习的一个过程,这也是我为什么拼了命也要面这么多公司的一
个原因,因为我想多知道一些细节别的公司是怎么做的,所以面试的时候不要担心大胆
问,很多问题都是他们要解决的真实存在的问题,也是你将来可能会碰到的问题,如果
面下来10个公司只是这些总结下来的东西已经可以帮你再搞定一个面试了

4。另一个我觉得很有帮助的是有一群志同道合的朋友和能够指点自己的大腿,在整个
工作过程中我觉得从我的同事身上学到了很多很多东西,帮助很大,这点我不得不赞一
下我之前的驴的所有中国人,可能因为都被三哥压迫所以大家特别团结,平时对于各种
技术问题的交流都很到位,没有人会有所保留。现在我那一拨的人基本走的差不多了,
我算走的比较晚的,一般都是越牛的人走的越早,我最终的offer在所有人里面也就是
个中等水平吧。

5。运气,很重要,同样的人换一个环境可能是完全不同的结果。我之前问过一个大牛
找工作最重要的是什么,曰:运气。现在我很相信这个。。。

All in all,我不是牛人,我不是国内top20毕业也不是北美top20毕业,我本科也不是
学cs的,但是我特别相信版上之前一位前辈的话,大家能来到美国读一个decent学位说
明大家的智商都没任何问题,很多时候结果怎样只取决于自己的决心和毅力有多强大。
只要肯努力,结果就不会太差。