CHAPTER 3: 《A FRAMEWORK FOR SYSTEM DESIGN INTERVIEWS》第3章 《面试系统设计框架》

CHAPTER 3: A FRAMEWORK FOR SYSTEM DESIGN INTERVIEWS

你刚刚获得了梦寐以求的理想公司的现场面试机会。招聘协调员给你发送了当天的日程安排。浏览列表,你会感觉很好直到你的目光落在这个面试环节——系统设计面试

系统设计面试通常很吓人。它可以像“设计一个非常知名的产品X?”一样模糊。这些问题含糊不清,似乎过于宽泛。你的厌倦是可以理解的。毕竟,谁能在一个小时内设计出一款受欢迎的产品呢 这需要数百甚至数千名工程师来建造。好消息是没人指望你这么做。现实世界的系统设计非常复杂。

例如,谷歌搜索看似简单;然而,数量支撑这种简单性的技术确实令人惊讶。如果没有人期望你一个小时去设计真实的系统,

系统设计面试的好处是什么?

系统设计面试模拟现实生活中两个同事解决问题在一个模棱两可的问题上合作,并提出一个满足他们目标的解决方案。问题是开放式的,没有完美的答案。最终的设计并不那么重要,与你在设计过程中投入的工作相比。这可以让你展示你的设计技巧,捍卫你的设计选择,并以建设性的方式回应反馈。

让我们把表格翻过来,想想面试官走进来的时候脑子里在想什么在会议室等你。

面试官的首要目标是准确评估你的能力。如果会议进行得很糟糕,而且没有足够的信号,她最不想做的就是给出一个不确定的评价。面试官想要的是什么?

在系统设计面试中,许多人认为系统设计面试是关于一个人的技术设计技能。其实它远不止这些,一个有效的系统设计面试会希望你有一个强有力的信号,协作能力,在压力下工作,并解决歧义的,有建设性的

提出好问题的能力也是一项基本技能,而且很多面试官特别看重这项技能。 一个好的面试官也会寻找危险信号。过度工程设计是许多人的顽疾,工程师们喜欢设计的纯粹性,而忽略了权衡。他们往往没有意识到 过度设计系统的复合成本,以及许多公司为此无知付出的高昂代价。
您肯定不希望在系统设计中展示这种负面情绪面试。面试危险的信号包括心胸狭窄、固执等。
在本章中,我们将回顾一些有用的技巧,并介绍一种简单有效的方法 框架解决系统设计面试问题。

有效的系统设计面试的四步流程

每个系统设计面试都是不同的。一个优秀的系统设计面试是开放式的
没有十全十美而标准的解决方案。然而,有一些步骤和共同点在每个系统设计面试中。

步骤1 -理解问题并确定设计范围

“老虎为什么吼叫?”
教室后面突然举起一只手。
“什么事,吉米?”老师回答。
“因为他饿了。”
“很好,吉米。”
在他的童年,吉米总是第一个在课堂上回答问题。每当老师提问时,教室里总有一个孩子喜欢提问试试这个问题,不管他知不知道答案。那是吉米。吉米是个优等生。他以能很快知道所有答案而自豪。在考试中,他通常是第一个完成问题的人。他是老师对任何学生的首选竞争。别像吉米那样
在系统设计面试中,不加思考地迅速给出答案,就等于否定加分。在没有透彻理解需求的情况下回答是一个巨大的错误因为面试不是一场琐事竞赛。没有正确答案。所以,不要直接给出解决方案。慢下来。深入思考并提出问题澄清需求和假设。这是非常重要的。作为一名工程师,我们喜欢解决难题,并直接进入最终设计;然而,这方法很可能导致您设计错误的系统。最重要的技能之一是工程师要提出正确的问题,做出正确的假设,并收集所有的信息构建系统所需的信息。所以,不要害怕问问题。当你问一个问题时,面试官要么直接回答你的问题,要么让你回答
做出你的假设。如果发生后一种情况,写下你的假设白板或纸。你以后可能会用到它们。要问什么样的问题?通过提问来了解具体的需求。这是一个帮助你开始的问题列表:

  • 我们将构建哪些特定功能?
  • 产品有多少用户?
  • 公司预计扩大规模的速度有多快?第3章的预期尺度是什么几个月,六个月,还是一年?
  • 公司的技术栈是什么?您可以利用哪些现有服务简化设计?

例子

如果你被要求设计一个新闻推送系统,你想问一些问题来帮助你澄清
需求。你和面试官之间的对话可能是这样的:

应聘者: 这是一个移动应用程序吗?还是网页应用?还是两个?
面试官: 这两个。
候选人: 这个产品最重要的特性是什么?
采访者: 能够发帖和查看朋友的动态消息。
候选人: 新闻提要是按时间倒序排序还是按特定顺序排序?的特定的顺序意味着每个帖子被赋予不同的权重。
例如,从你的帖子亲密的朋友比来自一个群体的帖子更重要。
采访者:为了简单起见,让我们假设提要是按时间倒序排序的秩序。
候选人:一个用户可以有多少朋友?
面试官:5000
候选人:交通流量是多少?
面试官:1000万DAU(日活跃用户)
应聘者:feed可以包含图片、视频还是只包含文本?
采访者:它可以包含媒体文件,包括图像和视频。
以上是一些你可以问面试官的问题。重要的是理解需求并澄清歧义

步骤2 -提出高层次的设计并获得支持

在这一步中,我们的目标是开发一个高层次的设计,并与面试官对设计的看法。在面试过程中与面试官合作是个好主意的过程。

  • 提出设计的初步蓝图。寻求反馈。对待你的面试官视面试官为队友,一起工作。许多好的面试官都喜欢说话和回答问题参与。
  • 在白板或纸上绘制关键部件的框图。这可能包括客户端(移动/web)、api、web服务器、数据存储、缓存、CDN、消息队列等。
  • 做一些粗略的计算来评估你的蓝图是否符合标准约束。大声地想。如果信封背面有问题,请与面试官沟通在深入研究之前是必要的。如果可能的话,浏览几个具体的用例。这将帮助您构建高层设计。用例还可能帮助您发现您没有发现的边缘用例然而,考虑。

我们应该在这里包括API端点和数据库模式吗?这取决于问题本身。对于像“设计谷歌搜索引擎”这样的大型设计问题,这有点太低了。对于设计多人扑克游戏后端这样的问题,这是一个公平的游戏。与面试官沟通。

例子

让我们用“设计一个新闻提要系统”来演示如何接近高层次设计。在这里,您不需要了解系统的实际工作原理。所有的详情将在第十一章解释。
在高层次上,设计分为两个流:提要发布和新闻提要构建。

  • Feed发布:当用户发布一个帖子时,相应的数据被写入缓存/数据库,帖子将被填充到朋友的新闻提要中。
  • 新闻提要构建:新闻提要是通过反向聚合朋友的帖子来构建的时间顺序排列。

figure3-1和figure3-2给出了提要发布和新闻提要的高级设计分别是建筑流程
在这里插入图片描述
在这里插入图片描述

步骤3 -设计深度潜水

在这一步,你和你的面试官应该已经达到了以下目标:

  • 就总体目标和功能范围达成一致
  • 勾勒出总体设计的高层次蓝图
  • 从面试官那里获得关于高层次设计的反馈
  • 根据她的反馈,对深度潜水的重点领域有了一些初步的想法

您应该与面试官一起确定体系结构中的组件并确定其优先级。值得强调的是,每次面试都是不同的。有时候,面试官可能会放话暗示她喜欢专注于高层次的设计。有时候,是为了一个资深的候选人面试时,讨论可能会集中在系统的性能特点上关于瓶颈和资源估计。在大多数情况下,面试官可能希望你这么做深入了解一些系统组件的细节。对于URL缩短器,深入研究是很有趣的将长URL转换为短URL的哈希函数设计对于一个聊天系统,如何减少延迟和如何支持在线/离线状态是两个有趣的主题。时间管理很重要,因为我们很容易被无关紧要的小细节冲昏头脑展示你的能力。你必须准备好向面试官展示的信号。尽量不进入不必要的细节。

例如,谈论的EdgeRank算法在系统设计面试中,详细了解Facebook动态排名并不理想,浪费宝贵的时间,并不能证明您在设计可扩展系统方面的能力。

例子

至此,我们已经讨论了新闻提要系统的高级设计,以及面试官对你的建议很满意。接下来,我们将研究其中最重要的两个
用例:

  1. 提要发布
  2. 新闻提要检索

两个用例的详细设计如figure3-3和figure3-4所示在第11章详细解释
在这里插入图片描述
在这里插入图片描述

步骤4 -打包

在最后一步,面试官可能会问你一些后续问题,或者给你一些面试的机会讨论其他附加问题的自由。以下是一些可以遵循的指导:面试官可能希望你找出系统的瓶颈,并讨论其潜力
改进。**永远不要说你的设计是完美的,没有什么可以改进的。**有总有需要改进的地方。这是一个展示你的谦虚,善于思考的机会,并给人留下良好的最终印象。

  • 向面试官简要介绍一下你的设计可能会很有用。这是特别的重要的是,如果你提出了一些解决方案。刷新面试官的记忆可以在长时间的治疗后很有帮助。
  • 错误案例(服务器故障,网络丢失等)是一个有趣的话题
  • 运营问题值得一提。您如何监控度量标准和错误日志?如何推出该系统?
  • 如何处理下一个比例曲线也是一个有趣的话题。例如,如果你的目前的设计支持100万用户,你需要做什么改变来支持10个百万用户?
  • 如果你有更多的时间,提出其他需要改进的地方。最后,我们总结了一份该做和不该做的清单。

- Dos

  • 总是要求澄清。不要以为你的假设是正确的。
  • 了解问题的要求。没有正确的答案,也没有最好的答案。一个解决方案,旨在解决一个年轻的创业公司的问题不同于一个拥有数百万美元的成熟公司的问题的用户。确保你理解了需求。
  • 让面试官知道你的想法。与面试官沟通。
  • 如果可能,建议多种方法。
  • 一旦你同意面试官对蓝图的看法,就要详细说明组件。首先设计最关键的组件。
  • 向面试官征求意见。一个好的面试官就像你的队友一样。
  • 永不放弃。

Don’ts

  • 不要对典型的面试问题毫无准备。
  • 在没有明确需求和假设的情况下,不要贸然提出解决方案。
  • 不要在一开始就在单个组件上投入太多细节。先给出较高的关卡设计,然后再深入。
  • 如果你被困住了,不要犹豫,向别人寻求提示。
  • 再次强调,沟通。不要在沉默中思考。
  • 不要以为一旦你给出了设计方案,面试就结束了。你还没有完成,直到你面试官说你完了。尽早并经常寻求反馈。

每一步的时间分配

系统设计面试的问题通常是非常宽泛的,而45分钟或一个小时的面试问题则不是足以覆盖整个设计。时间管理是必不可少的。你应该花多少时间每一步的花费?下面是一个关于如何分配你的时间的粗略指南一分钟的面试时间。请记住这是一个粗略的估计,和实际的时间分配取决于问题的范围和面试官的要求。

步骤

1了解问题并确定设计范围:3 - 10分钟
2 .提出高层次的设计方案并获得支持:10 - 15分钟
3 .设计深度潜水:10 - 25分钟
4 .包裹:3 - 5分钟

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后端工匠之道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值