准备阶段:
阶段1, 4-5个月: 重点刷题,大概每天晚上刷2-3题,(medium or hard) 当时和一个一起准备的小伙伴一起,每晚线上刷题一两个小时,然后各自散伙dota/lol/steam。。每周六晚上参加LC周赛。大概四五个月新刷了2,3百medium, hard..周赛>=3道的水平,好的时候ranking能到100+,差的时候做3道这个水平。我觉得周赛3道这个水平应该就够了,最后一题做不做得出来对面试其实影响很小很小,至少从我自己的面试体验看是这样.然后和小伙伴一起分类总结了各个类别的题目和常见技巧,提炼出了几十道题,重新写了一次,这个时候感觉刷题水平已经差不多了,然后开始侧重准备system design,进入第二阶段。
阶段2, 1-2个月:重点system design,首先,每周还是拿出一定时间刷题保持手感,基本就是每周比赛+随机做各种地里面经题,大部分时间准备system design了。
system design就是首先把design data intensive app和小伙伴一起又看了一遍(说“又”是因为 之前我们俩刚好各自刚好看了一遍这本书,说实话即使不面试,看一下这本书也很好。)。这次看的时候 每一章看完基本周末花30-60分钟左右讨论了一下,小伙伴工作以后和我做的方向不同,所以有些章节他理解深一些,有些时候我深一些,所以交流效果还是不错的,学到了不少东西。大概一个多月把ddia讨论完了。我们又把groking system design interview每题用mock interview的方式一两周过了一次,grokking虽然不是很深,但是我觉得coverage是够的,每题看几次,自己想一想还是有必要的。事实上grokking我每题前后应该也都看过三次以上,真的很快,看一次每题10+分钟也就够了其实。
接下来我做的事情基本就是看youtube各种视频: https://www.youtube.com/c/ScottShiCS/videos 小伙伴推荐的,讲得不错,基本每个我都看了,个别看了多次。 https://www.youtube.com/channel/UC9vLsnF6QPYuH51njmIooCQ 这个基本我也都看了。
还有很多随机找的system design视频,因为我上班说实话真不是很忙,所以每天时间很多。。基本就是打打游戏 刷刷题 看看视频。。后面家里买了个椭圆机,一边健身一边看视频(再后来开始用健身环健身,看视频就少了。。。
阶段3, 1个月: 找职位+内推+店面:一转眼到了今年一二月份,这个时候约了各种面试,因为楼主对未来职业规划希望做特定相关领域,所以花了一个周末,选了一些公司,然后开始找内推。。如果只对大的方向有要求 比如backend, fullstack,frontend这种的小伙伴我觉得基本所有公司都有很多岗位。。如果是特定的security,payment,database,storage这种,可能就要找一下,尤其是对于按组/岗位招的公司,得好好找找岗位再招人推。因为楼主面的领域基本是和自己背景相关的,且工作经历快5年了,按组招人的一些公司稍微argue一下 就直接waive一面了,比如apple,airbnb这种按组招人的...general hire的一般就不会waive,比如fb,snap(但gg这种估计5yoe 一般还是会waive).. anyways,2月份在店面中度过,同时看看面经,然后看看有名的几篇paper,比如cassandra, FB TAO, dynamodb...看看五花八门的博客。比如payment怎么注意idempotency啊,log/monitoring系统怎么设计呀,at least once vs at at most once啊,可能会涉及一些前面没见过的领域,不过多看看其实感觉system design也差不多。。
最后说一下多线程和behavior questions:
如果工作中接触多线程不多的小伙伴可以看看多线程,leetcode concurrency那几题做一下感觉差不多了,但要理解一下各种lock为什么这么用。楼主工作中用的不少,所以这方面没怎么花时间,一个周末做了那个leetcode的concurrency section就没怎么看了,不过面试中被问的真的非常多!!我觉得要面senior岗的小伙伴,可能要好好准备一下,下面提到的很多公司都面到了多线程。。比如楼主面试主要用java,可以想想比如condition为什么要bakced by a lock,reentrantlock.lock为什么写在try外面呀之类的。。细节多想想 或者看一下best practice 理解为什么这么写. critical section怎么样尽可能小一点之类的。即使别人不一定会问到,但你写的时候提一下这些我觉得会比较好..1point3acres
BQ我觉得多准备几个例子就好,比如conflict怎么办,项目delay怎么办这种,说一个失败/自豪的项目,在职跳槽大家肯定都有素材,适当加工好好说就行了。。或者按照亚麻的leadership principles准备一下也不错。。这个一周肯定够了.能有一些例子体现scope会很好。。准备一个好的例子加分会很多,楼主工作中有一个很独特的帮助别人的例子,在面试中说了多次,每一次感觉都加分不少,我觉得好好挖掘一下自己的例子,不用准备太多,但准备几个很有说服力的就行。
virtual onsite 按顺序:(3个周)
Baidu -- 面他家是因为楼主有回国打算,另一方面做的项目还挺有意思的。。面试1轮店面+onsite4轮+2轮聊天....生生面了7轮。。。他家pkg给的是大厂水准,wlb也不错。
. check 1point3acres for more.
Amazon --- 面他家一个原因是想看看自己bq怎么样,但其实体验不好,尤其是recruiter竟然在一面和onsite之间离职了(难怪朋友跟我说他在公司上班四年多beat了大部分员工的在职时间。。),导致本来argue了半天面senior岗,最后变成了5/6..我理解亚麻很少给5年以内senior,但同一个问题going back and forth让我很心累。。最后一面的时候面试官又多花了20多分钟超时面试,用这20分钟不停的教育我为什么亚马逊的level很值钱之类的,为什么我现在的公司level不如亚马逊之类的,说的有些东西让我觉得offsensive(面完已举报)。。不过他家特点是bq比较多,算法和design我面到的非常简单。。不过bq要答出他们想要的scope倒是不容易,我已经反复吹自己tl的经历了,还是不行。。。Amazon是一家我个人觉得前途很好的公司,用离职率相对其他几家可能是最高的工程师团队作出了世界上最稳定的产品(aws),这个还是很厉害的。楼主本人如上文所说,很看重wlb,所以不是首选。
tableau --- 楼主当时找工作时候3个标准,工资可以,别太忙,继续做相同领域。。tableau符合楼主要求,所以就去面了,面试题也不怎么难,不过后来研究了一下,好像收购之后包裹变得不是特别给力。。也没继续了。.google и
google -- system design和bq面的应该不错,有2轮算法我挺无语的,题都很简单,在那跟我争一些很trivial的细节,楼主真的couldn't care less的那种细节...我不想具体说了,我后来和朋友说也都挺无语的。。g在西雅图做楼主方向的也不多。。看地里的dp 这一两年的4.5yoe 的l5好像也怎么看到match fb和airbnb的顶包。。(吃不到葡萄说葡萄酸一下,g肯定是一家很棒的公司毫无疑问..)
这次求职最大感想就是 刷题真的不是那么重要,多线程 bq system design也都被问的很多。。如果时间有限,刷题不用刷的太多,周赛3题水平我觉得就可以很有信心了,如果有时间design data intensive app建议看一下,然后grokking system design interview虽然很多人说不好,我觉得看一下还是挺好的,至少每题都想一下。。如果不想多看论文,dynamodb论文和facebook tao这两篇强推,很多分布式的东西,或者cache的一些有意思的问题就会了解到。
我觉得肯定是不必要的。。但system design是个面试者drive的过程。。所以多说点肯定没坏处。。。
我也不是很懂message queue,基本都是自己瞎看总结的:
kafka是每个consumer有自己的offset,那肯定不能有competing consumer,比如电商网站把用户order先放kafka,然后异步去处理payment... 肯定只能有一个consumer去处理payment,因为kafka的message是persistent,处理完不删,你有两个consumer每个按照自己offset都去处理payment,那每个message都会处理两次(payment做两次),肯定不对,at least once也不可能这么设计。但kafka 你可以有多个noncompeting consumer,比如一个consumer管每个Order的payment,一个consumer管shipping,一个把它写进hdfs等会做offline ML model training,一个统计top k items这样,每个consumer做不同的事情。。。因为每个consumer有自己的Offset,message被一个consumer处理完也不会被删除,所以可以有non competing consumer。毕竟kafka更像一个log,immutable db的感觉。. 1point3acres.com
sql based queue好处就是你可以query每一个message的status.这个视频这么用的,我觉得比较方便。不过一定要用sql,因为你需要transactional support,可能会有多个worker试图更新同一个request,下面这个视频就是这么用的。https://www.youtube.com/watch?v=FI8G3VeI94w