Twitter 工程师的系统设计备战攻略

2018 年 9 月 19 日 九章算法


与Coding问题不同的是,系统设计面试的非结构化性质会让求职者更难做好准备。不少很优秀的国人candidate算法轮没问题,code bug free行云流水,但非常可惜的败在设计这一轮,因为得分过低而导致了整个onsite的失败。即使有一些构建大型系统经验的程序员也对也不一定能很好的通过SDI,这主要是因为设计问题的开放性没有一个标准的答案。


今天我们来分享一个 Twitter 软件工程师写的准备系统设计的建议。


1哪些公司考系统设计?


对于 New Grads 来说,系统设计面试,占整个面试评估的比例约为大概是10-30%,可能是项目问题/算法问题的follow up,最经常出现在加面环节。有的公司会考核系统设计,有的公司则不会,需要根据具体公司的面经来定。Amazon、Uber的new grads面试会面到OOD和系统设计,Facebook、Google的New Grads面试考到系统设计的概率不是很高,主要是算法为主。建议new grads在算法准备已经比较充分、或者时间比较宽裕的情况下,着手进行系统设计知识的补充,可展示自己在工业实践上的知识积累,为面试加分。


而对于 Experienced 求职者,基本上80%以上的概率会遇到系统设计面试。建议Experienced 求职者 一定要准备系统设计面试内容。


2大公司为什么考系统设计?


实际工作中用到fancy的算法还是非常少的,基本上现在市面上做web的公司实现新的feature都是利用client搭积木。但是实现功能A可能有几个path,问题在于如何把积木搭好,然后让系统的performace更好,latency更低,scalability, 利于maintainance和 debug,公司更赚钱,这可能需要你作为开发这个feature的一员做出决定, take ownership。


当然,你需要给出最后方案的理由,说服组里的其他人都照着你的计划来实施。做一个成功的产品,很多时候写代码通常只占很小的一部分时间,大多数的时间应该在讨论这个产品的requirement和最后站在customer的角度来看产品的功能是不是符合实际,让用户喜欢。这里的customer不仅是传统意义上的付费用户,也可能是一个公司里面别的team使用你开发工具的人,以及同一个组里面将来维护你code的同事。没有任何一个程序员愿意维护shitty code。


所以,系统设计这一轮在面试里面往往占的比重很大,实际上也是在考察在短时间内,你能不能作为一个feature的owner自圆其说,权衡利弊,给公司给客户设计一个"能用"的feature。于是,我们也时常能听到经典的比如设计一个fb online chat, google calendar之类的题目。



3系统设计面试是什么?


系统设计问题已成为软件工程面试过程中的一个标准部分,但SDI超出了测试传统编码、技术和分析技能的范围。系统设计面试的主要目的是让应聘者有机会展示自己的知识,面试官会测试他们在动态、不可预测的情况下是如何工作的,以及如何解决一些棘手的问题。


面试中,应聘者将不会遇到可以运行或编译的编码问题,还经常会被问到一些公开的问题,比如设计一个新的、大规模的分布式系统,比如youtube,另一个社交平台,一个URL缩短服务等等...面试官会要求你能够去解决一个开放的问题,类似于如果你是一名软件工程师,你所要做的规划和结构的类型是什么?



4你要知道,在SDI中,面试官主要考察你的哪些方面?


在SDI过程中,至关重要的是始终保持开放的通信线路,面试官会重点考察你是如何处理动态的,开放的工程情况的。展开来说,你的面试结果是被如下因素所评估决定的:


1. 储备的知识博学实用

2. 你表达思想的能力和领导谈话,与面试官讨论高层次的组件、细节、设计利弊以及其他相关信息的表达能力。

3. 你的运作效率你是否按照最佳做法步骤工作,例如:

A.需求收集:澄清不明确之处,并确定系统最终目标,以评估手头问题或任 务的确切范围。

B.系统接口定义:确定和定义任何预期的系统API。

C.系统规模估计确保您知道系统的范围。

D.数据模型定义:澄清数据将如何在不同的系统组件之间流动,并能够更好地进行数据划分和管理。

E.高级别设计:确定从端到端解决SDI问题所需的组件,首先是基础层次,然后是更深层次。

F.查明和解决瓶颈确定如何最有效地减轻其影响。

4. 你的更新和改进能力:一旦你设计了这个系统,你将如何不断地工作以使它变得更好?


除此以外,你的面试官也可能想看看你是否具备:技能和能力抽象、数据库、联网、并发、估计、可用性和可靠性。



5你要掌握的系统设计面试中最常见的问题?


1.设计TinyURL或bity(URL缩短服务)

2.设计YouTube,Netflix或Twitch(全球视频流服务)

3.设计Facebook Messenger或WhatsApp(全球聊天服务)

4.设计Quora或Reddit或HackerNews(社交网络+留言板服务)

5.设计Dropbox或Google Drive或Google Photos(全球文件存储和共享服务)

6.设计Facebook,Twitter或Instagram(拥有数亿用户的社交媒体服务)

7.设计Uber或Lyft(乘车共享服务)

8.设计Web爬虫或预先输入(搜索引擎相关服务)

9. 设计API速率限制器(例如,用于Firebase或Github)

10.设计Yelp或附近的地方/朋友(接近服务器)



5面试时,你应该去注意哪些问题?


1. 问清楚问题

系统设计面试的核心目标是给候选人一个展示他们知识的机会。没有绝对正确或错误的答案。一个好的系统设计问题通常听起来非常模糊,原因是它应该给您一个演示以下内容的机会:


  • 你会如何看待问题空间

  • 你如何看待瓶颈

  • 你能做些什么来消除这些瓶颈


例如,如果我现在要求你设计Twitter,你会怎么做?


2. 利用你的背景

求职者在面试中容易犯的一个问题:去试图弄清楚面试官想问什么,然后迎合他们的反应以满足他们的期望。事实上,这样反而不利于自我表现,原因有几点:


  • 每个人都有自己独特的背景。在系统设计面试中,这是一个展示自己优势的机会。不要浪费时间去想别人对你的期望。

  • 面试官可能会对你的回答点头,但他们可能知道你只是在虚张声势,并没有真正考虑问题。


你的经验和背景可能与下一个候选人大不相同。你把一套价值观和专业知识带到桌子上,这是其他人都做不到的。这就是使你有价值和不可替代的原因。不管你在哪个领域,面试官都关心你或者你们可以把什么带到桌子上来。


3. 系统地解决问题

当你在面对一个新系统,或者即将构建一个新系统的时候,你需要注意以下几点:


  • l 系统的目标是什么?

  • l 谁是系统的用户?

  • l 我们的工作规模是多少?

  • l 这是一种新/旧的制度吗?我们如何处理版本控制?


这一套标准不同于前端工程师的那套标准。你可以尝试用这些标准在脑海中描绘出一幅图画,条理清晰的去完成你的构建和决策过程。



6你必须要知道的面试中系统设计的关键点?


明白了为什么考察系统设计,关键点就很容易列出了:


1.产品的requirement是什么?

很多candidate常犯的错误就是拿到题目夸夸其谈,罗列概念词汇。比如我这个系统要有app server,要有load balancer,要用 nosql 数据库。这其实是一个本末倒置的思考方向,从技术到功能,而不是从功能到技术。


我们首先要问自己,为什么要设计这个产品?假设我们忘掉所有现在的技术,假如我们是最后这个产品的使用者,我们需要这个产品具备什么功能?比如google calendar,我们要能create personal calendar;我们要能book time slot,并且time slot要可以设置不同的权限,对不同的group显示不同的内容;time slot要能解决event conflict的问题;如果一个用户可以create多个canlander,这些calendar能够confict吗?用户可以tag calendar吗? 怎么做calendar third party integration?  


有了这些想法,剩下的时间就是和面试官讨论其中的一个或者多个功能的实现。讨论requirement的过程就是一个交流的过程,你也可以从交流中得到面试官的喜好,然后实现他想要看到的功能。面试开始的头几分钟,其实就是一个头脑风暴的过程,从点到面,再收回到点。很多candidate缺少这一个过程,很容易留下communication不足,缺少detail的印象。


好了,和面试官讨论好具体实现的功能,那么再描述一个整体的flow。我们可以在白板上画出sequence chart, 什么是request, 什么是response。 request里面有哪些信息?作为一个client我需要你返回什么信息?简而述之,就是把上面的功能讨论抽象成一个一个的service。这时候,如果知道如何serialize这些data,比如用json,avro,知道如何在network中对data进行encryption,checksum....这些都是加分点


有了这些,进一步的可以再谈如何储存这些data,以及这些data之间的关系是什么样的,这些API怎么interact?怎么样optimize这些API?再选取世面上的技术就变得理所当然。


2.如何把积木搭好?

有了产品的flow,剩下的就是如何让performace更好,latency更低,scalability。假设我们现在产品只有10个用户,我们可能只用一台机器,但是当用户x 1k后,我们的瓶颈又在哪里呢?假设你是这个feature的owner,你可能会遇到哪些问题?比如IO, CPU?  怎么处理exception?可能我们一开始为了快速迭代快糙猛什么都是sequential,后来需要queuing task,batch write以解决database的IO问题,可能最后再加个Kafka来做streaming,run hadoop 来做offline computation。到这一步我们可能需要站在稍微高一些的角度来解决user growth pain。这一部分可能需要平时看engineering blog或者视频对目前的技术做一些学习积累了。


3.take ownership

很多candidate能够提供一个reasonable的solution,但是通常没有办法比较不同solution的trade off。很多时候面试官更在乎的是思考的过程,在不同的solution中为什么选A而不选B,或者换句话说,什么时候选A好, 但是换一个环境以后选B更reasonable? 你有什么论据来论证你的观点呢? 比如,我们要多少的资源存储那些data,我们的data center为什么要建在地点A而不是地点B呢?如果需要更新功能,我们怎么合理的设置好AB testing? 面试的过程里面,不会期望 candidate了解所有的tech stack,包括面试官在某些方面也一定比你了解得少,但是你要始终把这次面试讨论的问题当做日常工作中讨论的一个部分,事实上,工作的时候也是如此。


遇到一些表现特别出色的candidate,他们有时候具体讨论到如何设置service alert以及他们想到实际中可能会出现的一些意外的解决方法,这非常能impress到面试官。Nobody wants to figure out how to handle the accidents in the early morning.



7其它面试的加分点?


1.利用好白板。 one picture is worth 1000000 words.  善用不同颜色的马克笔,字写好 。

2.把握面试的主动权,不要让面试变成Q&A 。

3.了解公司的一些open source project或者有名的产品。不了解公司来面着干嘛 ?

4.不要过多 challenge 面试官

5.把抽象的问题具体化站在系统的角度来优化功能。



以上面试攻略,只能帮助你快速地了解系统设计的面试内容,及如何准备。在准备的过程中,还需要对各个系统设计的问题进行深度的剖析。九章算法《系统设计班》的讲师,一个来自 Facebook, 一个有 Google 的相关经验,以他们最直接的工作经验,为您讲解 Facebook News Feed, Instagram, Google 的三驾马车这些最常见的系统设计问题。



// 免费听课时间 //

美西时间 9月23日 周日 18:30-20:30 p.m

美东时间 9月23日 周日 21:30-23:30 p.m

北京时间 9月24日 周一 09:30-11:30 a.m




// 讲什么 //

通过实战面试真题,讲解实际面试中会遇到的系统设计知识和面试技巧,包括:数据系统设计、爬虫系统与搜索建议系统、Google 三驾马车(Big Table / Google File System / MapReduce)、分布式系统设计、实时位置信息系统等。



// 谁来讲 //

课程由系统设计各个领域的专家分别授课,讲师均为北美顶尖IT企业工程师: 


东邪

顶尖IT企业工程师

曾就就职于亿级活跃用户的社交网络公司,拥有多年的网站开发经验,擅长基础架构,网站架构,数据库


周伯通

全国信息学竞赛金奖获得者,量化工程师

全国信息学竞赛金奖,国内TOP3名校毕业,北美哈佛大学留学交换。斩获谷歌,Facebook, 微软,高盛等对冲基金offer



// 如何免费听课 //


长按二维码,报名免费试听



相关精品阅读推荐


九章算法 | 帮助更多中国人找到好工作


《面向对象设计专题班》

美西 9月23日 周日 10:00-12:00 a.m
北京 9月24日 周一 01:00-03:00 a.m


《九章算法班》

美西 9月29日 周六 18:30-20:30 p.m
北京 9月30日 周日 09:30-11:30 a.m


报名登陆官网 www.jiuzhang.com

或点击文末“阅读原文”

登录查看更多
0

相关内容

系统设计是新系统的物理设计阶段。根据系统分析阶段所确定的新系统的逻辑模型、功能要求,在用户提供的环境条件下,设计出一个能在计算机网络环境上实施的方案,即建立新系统的物理模型。
打怪升级!2020机器学习工程师技术路线图
专知会员服务
96+阅读 · 2020年6月3日
【资源】100+本免费数据科学书
专知会员服务
105+阅读 · 2020年3月17日
谷歌机器学习速成课程中文版pdf
专知会员服务
143+阅读 · 2019年12月4日
可解释推荐:综述与新视角
专知会员服务
108+阅读 · 2019年10月13日
五轮onsite,两轮BQ:求职亚麻,BQ实在太重要!
九章算法
7+阅读 · 2019年9月16日
Lyft独家面试资料首次公开
九章算法
6+阅读 · 2019年8月28日
网上搜不到的Airbnb面试资料
九章算法
12+阅读 · 2019年8月22日
系统设计班 | 限时半价,随时报名随时观看
九章算法
9+阅读 · 2019年5月4日
备战AI求职季 | 100道机器学习面试题(上)
七月在线实验室
9+阅读 · 2019年3月16日
个人吐血整理的系统设计资料大全
九章算法
86+阅读 · 2019年3月6日
BAT机器学习面试题及解析(266-270题)
七月在线实验室
6+阅读 · 2017年12月13日
Directions for Explainable Knowledge-Enabled Systems
Arxiv
26+阅读 · 2020年3月17日
Arxiv
34+阅读 · 2019年11月7日
Arxiv
6+阅读 · 2018年3月19日
Arxiv
4+阅读 · 2016年12月29日
VIP会员
相关VIP内容
打怪升级!2020机器学习工程师技术路线图
专知会员服务
96+阅读 · 2020年6月3日
【资源】100+本免费数据科学书
专知会员服务
105+阅读 · 2020年3月17日
谷歌机器学习速成课程中文版pdf
专知会员服务
143+阅读 · 2019年12月4日
可解释推荐:综述与新视角
专知会员服务
108+阅读 · 2019年10月13日
相关资讯
五轮onsite,两轮BQ:求职亚麻,BQ实在太重要!
九章算法
7+阅读 · 2019年9月16日
Lyft独家面试资料首次公开
九章算法
6+阅读 · 2019年8月28日
网上搜不到的Airbnb面试资料
九章算法
12+阅读 · 2019年8月22日
系统设计班 | 限时半价,随时报名随时观看
九章算法
9+阅读 · 2019年5月4日
备战AI求职季 | 100道机器学习面试题(上)
七月在线实验室
9+阅读 · 2019年3月16日
个人吐血整理的系统设计资料大全
九章算法
86+阅读 · 2019年3月6日
BAT机器学习面试题及解析(266-270题)
七月在线实验室
6+阅读 · 2017年12月13日
相关论文
Directions for Explainable Knowledge-Enabled Systems
Arxiv
26+阅读 · 2020年3月17日
Arxiv
34+阅读 · 2019年11月7日
Arxiv
6+阅读 · 2018年3月19日
Arxiv
4+阅读 · 2016年12月29日
Top
微信扫码咨询专知VIP会员