再说说System Design。这一块是我最开始比较虚的,之前从来没有系统学习过,工作里接触到的也有限,面试经验更是为零。因为时间有限,我主要用了两个学习资料,我觉得非常适合想快速上手的零基础小白。一个是大家常常提到的Grokking the System Design Interview这套教程,里面有介绍很多常见系统怎么Design,也有介绍很多分布式系统里常见的概念,非常适合快速上手。另一个是一个俄罗斯大哥的Youtube频道,可以搜索UC9vLsnF6QPYuH51njmIooCQ,里面讲的非常深入,比较了很多常见的设计的pros and cons,提到了很多面试时候可以具体用的策略,而且这个频道里的视频数量非常少,但是个个都是精品。这两个教材是我花了最多时间在上面的,而且都是反复看过几遍。其它我有接触了解到的还有:DDIA(如果时间充裕的话非常推荐,我只简单看了关于Database的几个章节,觉得写的很好),Scott Shi视频(地里很多人推荐,可惜我知道的时候已经很晚了,没有机会细看),Youtube上搜索System Design出来的其它一些视频(很多都是印度博主讲的,可以刚开始准备的时候作为入门教材可以看看,但是我自己感觉真正面试的时候碰到的问题会深入很多,还是俄罗斯大哥的视频对面试的帮助比较大)。
2. 沟通交流的能力非常重要。我看了很多经验分享贴,提到了各种怎么刷题怎么设计系统,但是很少人提到面试里面沟通交流能力的重要性。我上面推荐的俄罗斯大哥的youtube视频里,他有一句口头禅,叫“Remember the interviewer is your friend”。我觉得说的非常好。系统设计里跟面试官交流的重要性不需多言。但是我想说的是,不仅是对于系统设计轮,其实对于coding轮和其它所有面试轮也是一样的。在coding拿到题目大脑一片空白的时候,不要慌张,其实你离正确答案很近很近,因为坐在你对面的朋友TA的脑海里就有正确答案。你可以通过跟TA讨论交流来逐步找到答案的。一般来说我不会直白的说“Can you please give me some hint”。我会尽量我能分析的东西先分析一遍,比如最暴力的解法是怎么样,或者比如我感觉这道理能有DP来做,或者我感觉这道题的难点在哪里,类似的我当时的第一感受,然后进一步说说我觉得哪里可能比较困难,一般这个时候面试官都会很自然的给你一些反馈或者提示,尽量顺着面试官的思路去想,如果能有新的思路就最好了,没有的话就继续沟通交流。我整个面试下来大概有两三次拿到题目头脑一片空白的时刻,但是最后都成功跟面试官“交流”出了答案。越是有了这样的经验,到后面我就越不怕coding题了,因为想着最差也能去“交流”,整个表现得越来越好。
. 1point 3 acres
3. 碰到面经题的时候不要想太多。这个是我一个特别后悔的点,我在这个坑里反复摔了几次。我有两三轮都是碰到了面经原题,然而面试官出得题得形式或者具体问的东西又跟面经略有出入,我当时大脑都飞速运转,心想会不会面经里问的是follow up,于是我尝试着,解决当前问的同时,为下一问“留一手”,这就导致了我写的算法或者设计有一些解释不通或者奇怪的地方。其中有一次被面试官当场看出来并且指出来了,质问我为什么会这么写,我支支吾吾解释不出来,他就没问follow up,直接换了下一题。其实本身我正常去做应该完全没问题的,又是面经题,按理说本来应该是送分题了,结果变成了我的表现不足的点。希望大家碰到面经题的时候也不要去想面经,仔细读题,focus在当前看到的题目上,千万别想“留一手”啥的。
. From 1point 3acres bbs
4. 对面试的时间投入要有正确的预估。我原来对于面试的概念就是面试本身,包括phone interview和onsite。但是其实整个面试的流程还包括了一些其它步骤。在schedule面试以前,一般都会有一到两轮的跟recruiter的电话谈话,在所有面试完了以后,还会有很多轮谈话,包括跟recruiter聊offer,跟hiring manager和组员聊天。所有这些都是很画时间和精力的。需要对整个过程有个正确的预估。