系统设计面试心法
Hello,大家好,这里是KenjiTalk,共同学习,共同成长,可关注微信本公众号 ~~
—— 专注编程技术工作学习总结分享
前言
当大家步入职场后,逐渐累积编程经验,在工作中或者面试中对系统设计能力需求也是变得越来越重要,这篇文章主要介绍在面试中如何应对系统设计面试——系统设计面试心法。
核心心法四步
1. 理解问题和明确设计范围
**错误的做法:**当面试官提出系统设计问题时,第一时间就直接回答问题。(大忌!!切记!!)
**正确的做法:**应该先慢下来,深度思考,提出问题去理清需求和做假设。
作为工程师的其中一个最重要的能力是提出好的问题,做适当的假设和收集所有信息需求去构建一个系统,所以不要害怕提出问题。
那么,我们可以提出一些什么问题呢?
例如:
- 我们会创建什么具体的功能?
- 这个产品有怎么样的用户规模?
- 公司预计增长规模有多快?3个月后的规模,6个月后的规模,一年后的规模?
- 公司的技术栈是什么?公司有什么现存的服务可以简化复用于这个系统设计?
2. 提出总体设计思路和让面试官获得参与感
理清设计需求和范围后,我们可以进入第二步——提出总体设计思路。
- 说出初始的设计蓝图,向面试官问反馈意见。如同事一般看待面试官,一起工作,很多好的面试官会乐意说反馈和参与其中。
- 在白板或者纸上画出关键组成部分,这可以包括客户端(移动端或者网页端),接口,网关,服务,数据存储层,缓存,CDN,消息队列。
如下图:
- 跟面试官沟通是否需要在这个面试里使用粗略计算指标去深入评估系统,使用粗略计算指标去评估设计蓝图是否满足规模要求。不要只在心里计算评估,**要说出来!**让面试官知道你知道,你是有在思考的!
一些粗略计算指标:
Service Level Agreement(SLA): 服务提供者和服务消费者的一个协议,这协议正式定义了服务提供者的服务交付的正常运行时间水平。云服务提供商Amazon, Google和Microsoft设定他们的SLA是99.9%或以上。
Query Per Second(QPS)和数据存储估算
假设:
- 该消息应用每个月会有3亿活跃用户且有50%的用户是每日使用。
- 每个用户每天平均发2条消息。
- 消息有10%是有多媒体的,消息存储5年。
QPS估算:
- 每日活跃用户Daily active users(DAU)=3亿 * 50% = 1.5亿
- QPS=1.5亿 * 2条 / 3600秒 / 24小时 = ~3500
- 最高峰流量=2*QPS = ~7000
多媒体存储容量估算:
- 平均每条消息的大小:
- id是64bytes
- 文本是140bytes
- 多媒体是1MB
- 多媒体存储容量= 1.5亿 * 2 * 10% * 1MB = 30 TB 每天
3. 进一步深入讨论设计
在前面2步里,我们已经跟面试官沟通好设计需求范围,和提出了系统的总体设计蓝图。在这一步里,我们可以跟面试官理清服务组成的重要程度,和核心功能情景实现上。对于这个过程,每个面试都会不一样,有时面试官可能会想讨论总体设计,有些面试官则是想聚焦系统的瓶颈和系统性能。例如,对于一个聊天系统,如何减少消息的延迟?
切记,在这一步里面,我们需要聚焦在这个系统的核心重点上讨论。
4. 总结设计思路
最后一步,面试官可能会提出几个连带问题。
例如这几个方向:
- 这个系统有什么瓶颈和潜在可以提高的地方。**千万不要说完美!**总是会有可以提高的地方,而且这个也是展现你评判性思维和留下好印象的好机会。
- 可以扼要重述你的设计,特别是,你提出过几个重要的设计点。经过长时间的讨论,刷新面试官的记忆总是有用的。
- 处理异常案例的方案,如服务器异常,网络丢失的处理方案等。
- 处理人为操作异常的方案,如何监控系统指标和日志?如何发布服务?
- 如何处理下一阶段系统用户规模增长?
- 如果有时间可以提出其他改善的地方。
注意事项
- 要经常问清楚面试官设计的需求范围和假设,不要假设自己的假设就是正确的,可以问面试官,自己的假设是否正确,如果正确,就继续细化设计。
- 没有对的答案和最好的答案,只有适合的答案。对于一个创业公司和已经有百万用户的公司,设计是有不同的。
- 要让面试官知道你在想什么,想的时候需要说出来,多沟通,不要保持沉默和只在心里思考。
- 如果可以,多想几个设计方案。
- 一旦面试官同意你的总体设计蓝图(心法第二步),可以进一步设计每个组成服务的细节,首先设计最核心的组成服务。
- 不要一开始就设计单一组成服务的细节上,需要先提出总体设计的蓝图。
- 不要认为你给出设计就是完成系统设计面试,面试官没有说结束都不要结束,要经常并提早问面试官的反馈,对你设计方案的想法。
- 不要放弃!要如同行交流般多沟通!
时间分配
系统设计面试的问题总是多种多样,45分钟和1个钟没有能完成覆盖整个设计。
一个粗略的45分钟系统设计面试时间分布:
第一步:理解问题和明确设计范围(3-10分钟)
第二步:提出总体设计思路和让面试官获得参与感(10-15分钟)
第三步:进一步深入讨论设计(10-25分钟)
第四步:总结设计思路(3-5分钟)
共同学习,共同成长,可关注微信本公众号 ~~
关注本公众号,并回复 “001” 即可获取原版《System design interview》PDF!
参考资料:
《System design interview》—— Alex Xu