登录
  • #面试经验
  • #系统设计
  • #求职
  • #面试
  • #找工求职

10‌‌‍‍‌‍‍‌‍‌‍‍‌‌‌‌‍‍‌‍‌‌‌‌‍‌‌‍‌‌‍‍00+刷题经验及面试感悟分享之系统设计总结

Upstairs
16802
62
兑现1000+刷题经验及面试感悟分享中的承诺,放上第二篇:系统设计总结。几点声明:



  • 楼主面的都是senior职位,所有经验教训领会也是针对senior这个范围。

  • 此乃自己体会,不一定适用于每个人,或者每个公司。

  • 更多是希望给大家启发,而不是教条主义。

  • 更多强调积累与准备,而不是速成。

  • 地里这篇一文解决所有系统设计对楼主启发甚大,建议大家都去看看。

以下正文。





修炼内功





首先是看什么材料,DDIA 这本神书已经多次被推荐,我不赘述此书的好处,多读几遍肯定对内功有帮助。更多的讲讲怎么读这本书,我自己是先硬啃了Part 1和Part 2,起码花了一个月才看完。但看完时候,很多又忘了。 二刷时,为避免重蹈覆辙,我找了些速成方法,去网上搜到别人写的读书笔记,比如这篇都总结的非常不错,还有中文写的,比如这一系列。这三个读书笔记,不论中英文,有个共同点,高度又全面的概括了主要的技术知识点,所以非常简短。一个笔记你可能一到两天就看完了。把三个笔记全看了,相当于看了三遍,且是从不同人对这本书的理解的角度来看,会有一些启发。看完这些笔记,从一个比较高的维度来理解了这本书的框架脉络,再去逐章节读一遍,读每一个章节时,脑中就容易建立脉络体系,并把当前读的知识点放到这个体系中,印象就会更深刻。如此从笔记到精读来一遍后,对于此书的理解会上一个台阶。此时你如果有时间,可以自己谢谢读书笔记,看着书的目录写,看看记得多少:)





然后,读一些经典技术文章。比如这篇Airbnb的。看这篇文章不是为了真去对付如何避免double payments,而是去提炼其思想。这篇文章精华主要有两点:



  1. 客户端(client)到服务端(server)的API call得是idempotent,也就是说,客户端多次重复call 付款API不会造成多次付款,比如用户看到没反应又点了一次付款。服务端怎么做到idempotent,继续看下一点。

  2. 服务端将接收到的API请求与发起对dependency服务(比如银行)的call 完全分开,这句话比较绕,就是说,服务端收到一个付款请求,它需要call它的下游,比如银行,去真正的把钱付出去。此文的精彩之处在于,对于请求和call 下游做了彻底隔离,它先查询这个请求是否已经有了,有了的话什么状态,是已经fullfilled了还是有其他意外。如果没有,它先把请求存在数据库,并标记状态是收到此请求但还没fullfilled。保存成功,发起对下游的付款请求,并把返回的结果更新到数据库。最后返回给客户端结果。这个设计就有效的做到了idempotent。再复盘下怎么做到的,因为服务端收到请求后是存到了数据库,如果数据库里记录这条请求已经处理过了,那么直接返回处理结果,并不会二次call下游。



这两条思想可以应用到很多系统设计里,比如,你要设计一个类似AWS, Azure这样的云服务,简化下,就是用户可以到一个网页客户端创建资源,比如创建10台某个配置的vm,服务端收到请求,会provision这些vm,客户端需要知道何时provision完成,然后去登陆使用。

这个问题当然有很多点可以讨论,其中一个关键点是如何防止后端重复创建资源,完全可以套用上面两条,稍加修改形成一个solid解决方案。

以此延伸,还可以继续拓展这个问题,比如,payment中客户端如何知道payment真正完成了 vs AWS中客户端如何知道vm provision好了?是不是非常相似?

这样的好文章地里已经推荐了不少,我就不一一列举了。好的技术文章一般都通俗易懂,多读几遍,就能慢慢提炼出文章的设计思想,而这是最为重要的,在面试中碰到不熟悉的系统设计问题,最能帮助你完成一个高水平设计的就是这些思想。所以再次强调,多读几遍,将思想提炼出来,写下来,多回顾,内化成自己的东西。顺便提一句,notion这个笔记app非常好用,推荐!

最后一点,可能大多数人平时工作中造轮子的项目不多,或者design doc写的少。但如果有这种机会,则是实践中修炼内功,事半功倍。design doc其中一般有一项metrics,要指出你的项目影响的metrics有哪些,正面的还是负面的,预期多少百分比变化,哪些metrics是你期望neutral的。metrics在什么变动范围内,可以认为项目成功,值得ship,等等这些实践,在面试中完全可以提一提。比如面试官问或者你主动提如何衡量我们这个系统设计最终的成功呢?如何monitor这个系统的health呢?这些都可能为你加分。

准备面试

到要面试前一两个月,更早时间越充足当然越好,可以看看grokking system design interview或者amazon上那本系统设计的书。我个人认为这两个写的都比较浅,可能有几篇写的比较深入,但总体偏入门。他们好的地方是,你如果都看一遍,相当于每一篇文章都在反复强化你关于系统设计流程的记忆:clarify requirements, QPS, storage, bandwidth estimation, high level design, component detail design, tradeoff, bottleneck, single point of failure, etc. 面试中也确实是大体按照这个套路来,但也要针对面试官的风格随机应。

需要注意的一点是,这两本教程的讲述方式都是按照介绍一个系统设计问题的书面方式来呈现的。而面试时,你是在口述并辅以画图来呈现,口语表达系统设计与书面表达有很大差别。我个人的体会是,口语表达,我们要更注重按API的流程来描述。

比如instagram newsfeed,首先是定义API有哪些输入,期望什么输出。然后从客户端call这个API开始,这个请求途径哪些地方,根据面试官反应,你可以说Reverse Proxy, LB, CDN这些,也可以快速提下然后直切app server,app server收到这个请求,需要做什么。以发一个post为例,这时候,可以谈存db这个操作,是transactional么,为什么?需要replicate到replica后再返回么还是写到leader就可以,tradeoff的考虑点在哪?继续延伸,可以谈下partition,这时候还是应该以提到为准,跟面试官确认要不要deep dive。最后,返回response,这个response里面包括什么,经过哪些路径,client收到response后需要做什么,不同的status code是不是需要不同的操作,等等。这个API的flow要完整,扎实,最佳效果是你说完,就像写的design doc一样,照着就可以开始写代码实现了。

按照这个flow来讲high level包括component设计,多加练习,去除无关紧要的废话,让自己表达简明扼要,会显得更senior更沉稳。

什么叫简明扼要,可以看看这位貌似,那简直就是惜字如金,但句句有货。

与此同时,看一些mock interview,比如,视频中最后面试官给的feedback,你自己看时有没有想到?甚至,你觉得他还有哪些地方可以再多讲讲?

与此同时,看一些工业界的真实技术分享,InfoQ上有挺多高质量的分享,比如

看这些真实案例的技术分享,一方面是学习他们怎么基于当时的情况逐步演化。另一方面,学习他们怎么把这个问题提出,探索,解决,反思的。里面的tradeoff,bottleneck,scalability等等探讨与问题,他们如何present的。我相信,如果我们面试中的presentation能做到跟这些视频的主讲者一样,条理清晰,得分不会低。

这部分也可以算作修炼内功,但如果没有一定的内功,看这些视频又会云里雾里,所以我放到了准备面试这一章,如果你都准备面试了,应该是要有一定内功为好:)

面试中

当一切就绪,你已经面对这面试官,此时,一切的内功修炼,准备都已经完成,好不好已经不重要了,重要的是此刻。此刻你需要的是自信,沉着,保持头脑清醒活跃

你的自信沉着会感染面试官,或者说能感染一部分有可能被感染的面试官。你保持头脑清醒活跃,会让你在面试官抛出题目后,快速整理思路,考点,组织语言。甚至能让你有飞来之笔,想到一些平时积累但没针对准备的点。

前面已经谈到了,系统设计面试是用口语表达如何设计一个系统,所以按照API的flow来谈各个component,会更清晰,面试官也更容易接收到你想传递的信息。需要多少个API就说多少次flow,在说第二个API flow时,你可能就会想起些第一个flow漏掉的点,此时可以立马提一下,也可以写记下来,讲完第二个API甚至全部讲完再提。这就是按照flow讲的另一个好处,你会多次重复,这中间,会有很多你一开始没想到的点,可能后面就浮现了。而面试官,也在这多次重复中,反复接收到你想表达的信息。所以,你要简明扼要,因为时间有限。

面试后





一家面完,很多想法,及时记下来(还记得notion么),很多反思,记下来。实战经验是最宝贵的经验,但是也不那么持久,只有记下来,后面多次复盘,才会内化为自己的积累。失败的教训更能加深你的记忆,所以,失败真的是成功之母。经验教训有了,再回到修炼内功,准备面试的环节看看,还有哪些可以提高的。这个复盘加学习的过程,是面试之旅的成长与财富。

先写这么多,可能还有很多没有涉及,但就这么多。希望对看到的朋友有所帮助。下一篇也就是最后一篇,behavior question总结。

补充内容 (2021-06-22 06:32 +8:00):

第三篇也是最后一篇,behavior question总结:1point3acres.com
62条回复
热度排序

发表回复