专栏 | 九章算法
网址 |
最近,有一位New Grads学员收到了HR的面试通知。在欢天喜地的同时,他发现HR发来了这样一段面试tips:
毫无疑问,HR在这里告诉这位同学:
哎,准备好了,你的面试里有系统设计面试哦
-
需通过提问、互动的方式厘清面试官的需求
-
需要提出自己觉得可行的系统实施方案,并说明原因
-
可能涉及数据结构、算法、交互等方面的问题
-
一般不要求代码实现
系统设计面试,对于毫无工作经验的应届毕业生(new grads)来说,是非常难的。由于缺乏大规模分布式系统开发的经验,求职者在面对系统设计问题时,甚至不知如何破题。
如何准备系统设计面试
1.厘清问题
系统设计面试的核心目的是给应聘者一个展示自己处理复杂系统能力的机会。与 coding 不同的是,系统设计问题没有绝对正确或错误的答案。一个好的系统设计问题通常听起来模棱两可,其原因主要是想考察以下内容:
-
你如何看待问题空间(problem space)?
-
你如何看待瓶颈(bottlenecks)?
-
你如何消除这些瓶颈(remove these bottlenecks)?
面试例题:
请您设计一个黑匣子,使之可以容纳一些物品。
在这个例题中,除了要求其能够容纳一些物品之外,没有任何其他明确的要求。因此,需要通过提问来厘清面试官的需求。
那什么是一个“好的”提问呢?一个好的提问可以帮助你做到以下几点:
-
帮助你缩小设计范围;
-
帮助你了解用户对系统的要求;
-
给你设计的方向;
-
告诉你可能存在的瓶颈(bottlenecks)/问题空间(problem space)。
比如在这个黑匣子的例子中,你可以问:"盒子里装的是什么?它能容纳多少物品?用户群体是?"
那么你可能就会得到一个具体的描述,比如这是一个黄色带有笑脸的方盒子,最多可容纳 1 个网球。但这不是普通的网球,它的半径大于等于 0.5 米,重约 1 千克。这就意味着这个盒子是被抱着而不是被提着的,因此不需要任何手柄。
因此,问清楚问题非常重要。面试官不会根据你是否在面试中问了一个具体的问题来评判你,而是根据你对问题空间的看法。
例如,如果我现在让你设计 Twitter,你会怎么做?你可以花几分钟思考一下,然后可以在纸上画个草图,尽可能地去涵盖整体和深入细节,对于我个人来说,我会深入研究 API 设计和后端基础架构,也会探索一些关于 iphone 特有的问题,也可以讨论客户端如何与中间层端点交互,如何记录日志,如何设计后端以确保正常运行时间等等。
2系统地解决问题
根据我的经验,在处理一个系统的时我会考虑以下几个方面:
-
系统设计目标是什么?
-
系统用户是谁?
-
系统规模是多大?
-
这是一个新系统还是旧系统?如何处理版本控制
有了这些问题的答案后,就可以着手处理手头的问题了,然后系统地将该问题分解成多个部件。
例题
如何设计一个咖啡订购系统?
在这个题目中,我会思考下面这几个部分。
-
这台咖啡点餐机有什么作用?
-
如果我制作了一个点餐机,我应该把它卖给星巴克,还是给它贴上白标(white-label)作为服务出售?
-
如果我把它卖给星巴克,需要支持多少用户?
-
如果我给它贴上白标(white-label),是否将接口卖给点餐服务,再帮助客户搭建一个后端,以便他们能够在机器上存储订单?
一旦我找到了这些问题的答案,我就能对我的咖啡订购服务有一个全面的了解。我的咖啡订购服务是软件即服务(*software as a service,*SAAS)。它为各种合作伙伴提供了接口。
-
它有一个名为 *addCoffeeForMerchant *的API,参数为咖啡名称、咖啡价格和咖啡成分。
-
它有一个名为 *getCoffeesForMerchant *的GET API,可以返回指定 merchant ID 的咖啡列表。
-
merchant ID 是使用某种哈希机制生成的唯一标识符(UUID),可以与客户进一步区分。
-
该软件针对只读操作进行了优化,因为大多数客户都只会创建一次订单并在一天内多次读取。
-
它使用最近最少使用(Least-Recently-Used)的缓存机制,因为如果客户长时间没有下订单,那他并不关心是否显示缓慢。
-
以防其中一个数据库崩溃,它将在美国西海岸和东海岸的不同集群中复制数据。
或者,你能想到的任何其他的咖啡订购服务都是非常好的,这是你在优化问题。我认为这些都非常有趣,因为优化问题,思考解决方案能够锻炼你的思维,并让你的大脑保持专注。
学习资源推荐
1.Intro to:Architecture and Systems Designs :来自前Facebook工程师的关于如何处理系统设计问题的 Youtube教程。网址:
2.Designing data-intensive applications :这是一本书籍,是学习如何设计规模(design pattern)的另一个好资源。它讨论了 数据库(mySQL和noSQL)是如何工作的,什么时候使用哪一个,各种处理规模技术的利弊等。amazon网上有卖。
3.What every software engineer should know about real-time data’s unifying abstraction - 一个关于日志和权衡的非常冗长的技术讨论。我还没有完成它,但得到了同事的强烈认可。网址:
4.Grokking the System Design Interview :这是一个在线课程,教你如何详细设计分布式系统,但课程并不是免费的。网址:
5.九章算法《系统设计班》:这是一个在线直播课程,全面讲解硅谷IT企业系统设计面试的考点,并结合硅谷IT企业工程实例进行讲解,如twitter, uber, intagram, google drive设计等。网址: