系统设计面试到底考察什么?
在准备任何面试的时候,我们都要回归本质,想想这个面试到底在考察什么。
大家一定要明白,系统设计面试 != 系统设计。这个面试并不是考察你能否在短短的40分钟里设计出一个完善的系统, 而是要extract以下的signal
1. Ability to break down hard problems
面对一个复杂的问题,怎么把它scope成一个approachable 的problem。 比如设计instgram,我们要把它breakdown 成具体一个featurelist (1. upload photo 2. timeline 3. comment)。
2. Fundemental knwoledge about distributed systems
要有基本关于分布式系统的知识,比如load balancer,async processing, sharding。
3. Abilitiy to think through trade-offs
没有完美的系统,it's all about trade-offs, 就像生命中任何一个抉择一样。 很多适合,面试官不在乎你最终做了什么决定,而是how did you arrive at the conclusion。 一个经典的例子是noSql vs Sql
所以我们在系统面试里,就是要给到这些面试官这些signal
如何破题 & 设计模板
现在明白了想要考察什么,具体来说说我一般是怎么approach一道系统设计题目。 我们以设计Instgram 为例子 1. narrow down functional/non-functional requirements (5min)
第一步就是map到上面 Ability to break down hard problems 这个signal。 我们要学会把一个复杂的问题breakdown成一个featurelist以及具体的requirements
我会用到 functional requirements 和 non-functional requirements 两个notion (你可以用自己的语言)。functioanl requirements就是具体的feature,non-functional 是除了feature意外关于系统性能的要求,以Inst这道题为例
# Functional Requirements
- post photo
- view photo
- news feed
#Non-functional Requirements
- availability > consistency
- no silent drop of photo/posts
这个部分最好不要花超过五分钟
2. traffic estimation (2min)
100M daily users
- 3 billion total -> 1.5 * 10^12 = 1.5T
- 3 post each -> 300M posts daily -> 4k/s
3. draw flow chart (rest)
这一步就是画图了,我可以给大家这两个小tip
1. 一般来说,一道题都有read and write split
2. 我喜欢从client出发,自然而然的画到后端,遇到需要state的时候再开始选择db架构以及设计DB schema。我觉得这样最自然,我自己不太喜欢从 DB schema 入手解决问题。3. AVOID Microservice。 This might be controversial for some folks. 但是我会建议大家在答系统设计题的时候避免使用所谓microservice 这种架构思维。因为很简单,其实面试官想知道的是每个microservice里面的设计
你不如就直接画出LB+webservers。microservice只会让你的设计变得没有必要的复杂。如果是有你需要调用的不需要你设计的系统,直接说出API就好。
4. 一定要drive the conversation 同时与面试官保持交流,当面试官有hint他想用哪种方式设计的时候,take the hint! 一定不要自己按照自己想要的方式去设计(这是我面试的时候经常遇到candidate会犯的错)
5. Think through the tradeoffs! 这个是最重要signal
如何准备
1. 一般会被问到系统设计的candidate,是有工作经验的。所以在平时工作中,多思索,多学习,保持好奇心。因为其实对于系统设计,没有什么可以代替平时的积累。 积极的参加各种design doc的讨论,请教同事。并且 take ownership of your own system。
2. 遇到有趣的app 系统,可以想想用你自己的思考方式/模板去想想应该怎么设计。比如我之前用robinhood,我就会去思考各个feature我自己会怎么去design。无关乎对错,关键是训练思维
3. 如果想密集的训练,grokking the system design interview 是一个不错的题库。里面的很多解法我不赞同,所以我建议你自己解一遍
4. https://github.com/donnemartin/system-design-primer 这是一个好的referrence