设计 Pinterest
系统设计面试是为了让人们找到能够独立设计和实施互联网服务的团队成员。面试是展示你“工程能力”的绝佳机会——你必须将你的知识与决策能力结合起来,为正确的场景设计合适的系统。
为你的受众发出正确的信号
关于系统设计面试, 你需要知道的第一件事是,你必须在整个面试过程中保持健谈。当然,你必须咨询面试官,以确定你是否在正确的轨道上,能够满足他们的需求;然而,你仍然需要证明你可以独立完成工作。因此,理想情况下,在面试过程中,你应该不断谈论面试官所期望的内容,甚至在他们提出问题之前。
其次,不要仅限于一种解决方案。面对同样的问题,可能有很多种解决方法,成为工程师并不需要许可证。你所做的所有选择都有利弊。与面试官讨论权衡,并选择最适合你假设和约束条件的解决方案。这就像在现实世界中,人们不会在沟渠上建造金门大桥,也不会在旧金山湾上建造临时桥。
最后,要在面试中表现出色,你最好带来一些新东西。“优秀的工程师编写脚本;伟大的工程师创新”。如果你不能教会人们一些新东西,你只是优秀,而不是伟大。优质答案 = 新颖性 x 共鸣。
4 步模板
如果你不确定如何在面试中保持健谈,这里有一个简单的 4 步模板,你可以以分而治之的方式遵循:
- 澄清需求并做出假设。
- 勾勒出高层设计。
- 深入各个组件及其相互作用。
- 总结盲点或瓶颈。
本书中的所有设计都将遵循这些步骤。
特别是对于这个“设计 Pinterest”,我将尽可能详细地解释一切,因为这是整本书的第一个案例。然而,为了简单起见,我不会在本书的其他设计中涵盖许多元素。
设计 Pinterest
第一步:澄清需求并做出假设
所有系统存在都是有目的的,软件系统也是如此。同时,软件工程师不是艺术家——我们构建东西是为了满足客户的需求。因此,我们应该始终从客户出发。同时,为了将设计适应 45 分钟的会议,我们必须通过做出假设来设定约束和范围。
Pinterest 是一个高度可扩展的照片分享服务,拥有数亿月活跃用户。以下是需求:
- 最重要的功能
- 新闻推送:客户登录后会看到一系列图像。
- 一个客户关注其他客户以订阅他们的推送。
- 上传照片:他们可以上传自己的图像,这些图像会出现在关注者的推送中。
- 扩展性
- 功能和开发产品的团队太多,因此产品被解耦为微服务。
- 大多数服务应具有水平扩展性和无状态性。
第二步:勾勒出高层设计
在勾勒出大局之前,不要深入细节。 否则,走错方向会浪费时间,并阻止你完成任务。
这是高层架构,其中箭头表示依赖关系。(有时,人们会使用箭头来描述数据流的方向。)