
全网唯一资深面试官级深度的 32 课时系统设计集训营,覆盖 20 道高频题的精解,深挖以及得分点;解析答题模板,数据流以及面试技巧。用 23 节课帮你快速接近资深面试官的系统设计实力。
集训营适合各个级别的后端及全栈工程师,你将学会的不仅有高频题的正确解法,还有应对各类变体甚至新题的随机应变的能力。

集训营在往期直播课以及爱思官网的十万字的文字版课程基础上进行了大幅内容升级,包括
硅谷多家顶尖大厂近十年工作经验资深 Tech Lead,作为面试官进行面试近百场,对 Facebook 等大厂面试套路深有体会。作为受试者斩获 FLAGUAP 中绝大多数 offer。拥有多年系统设计面试辅导经验,已经帮助众多学生斩获一线大厂 offer,口碑优异。
第六期系统设计集训营将于2022年2月11日开始,持续5周,首节课免费试听,免费试听课将于美西时间 2/11 周五 6:30pm-8:30pm 开讲(美东时间 9:30pm-11:30pm,北京时间周六上午 10:30-12:30)。
每周1节直播课(每节2小时),3-4节录播互动课(每节~1小时)。
直播课每周五美西时间 6:30pm-8:30pm(美东时间 9:30pm-11:30pm,北京时间周六上午 10:30-12:30)。
直播内容将通过 Zoom 在线直播。直播回看提供 7 天内无限视频回看,1年内回看课程课件。录播互动课通过在线平台,2个月无限回看。
直播课进行中,通过 Zoom Chat 提问,罗辑会在每隔一小段时间集中答疑,保证课程节奏同时做到当堂解疑释惑,不让问题过夜。
整个课程期间,一旦有疑问,立刻通过爱思问答询问,罗辑本人作答,保证 24小时内回复。
课程原价 $999,限时优惠 $599。购买课程附赠价值 $60 的爱思一年免费会员,畅读文字版课程。购买课程加上老师亲授的一对一系统设计模拟面试服务打包优惠价 $949, 用个性化的指导让你短时间内快速提供。
现在起到 2/10/2022 购买课程的同学,额外附赠价值 $149 的软技能面试速成,帮你轻松应对面试中的软技能问题,薪水谈判不再怕。
欢迎拉小伙伴进入试听群,与拉入群的小伙伴组队报名每人享受 $100 优惠。
接收插班报名,并提供所有往期视频回看。
咨询购买课程请添加罗辑微信,注明 “系统设计集训营”,24小时以内会回复。
第一课【直播】面试官教你如何答好系统设计题 + 即时通讯服务 (Whatsapp)
第二课【录播】设计 Instagram & Twitter
第三课【录播】即时通讯服务 (Facebook Messenger)
第四课【录播】常见系统组件串讲一 - 数据库 & 缓存
第五课【录播】常见系统组件串讲二 - 消息队列 & API 设计 (Websocket, RESTful)
第六课【直播】基于地理位置的系统一 - Uber & Uber Eats
第七课【录播】基于地理位置的系统二 - Yelp
第八课【录播】网络爬虫 (Crawler)
第九课【录播】黑客版爬虫 (Botnet Crawler)
第十课【直播】电影订票系统设计 (Fandango, Atom) + 券商系统 (Robinhood)
第十一课【录播】分布式事务 Distributed Transaction
第十二课【录播】在线文本协作系统 (Google Doc)
第十三课【录播】云存储服务系统 (Dropbox)
第十四课【录播】搜索引擎设计 (Google, Twitter Search)
第十五课【直播】现场学员模拟面试点评
第十六课【录播】系统设计面试技巧与误区
第十七课【录播】在线视频网站设计 (Netflix) + CDN 设计
第十八课【录播】代码竞赛平台 (Leetcode)
第十九课【直播】实时监控系统 (Datadog) + 系统设计 Scalability 总结
第二十课【录播】Trending / TopK 系统设计 (Spotify Top 10 Music)
第二十一课【录播】搜索词条补全系统 (Autocomplete)
第二十二课【录播】分布式缓存设计 (Distributed Cache)
第二十三课【录播】限流器 (Ratelimiter)
]]>Meta, Twitter, Stripe, Salesforce 等等公司接连裁员,科技业人心惶惶。
我会用我经历过的3次裁员中学到的经验,教你看透公司裁员的蛛丝马迹,帮你调整心态面对可能的裁员,带你未雨绸缪快速求职。

| 日期 | 内容 |
|---|---|
| 10/27 | Chapter 1: Reliable, Scalable and Maintainable Applications |
| 11/3 | Chapter 2: Data Models and Query Languages |
| 11/10 | Skip for Layoff Special Topic |
| 11/17 | Chapter 3: Storage and Retrieval |
| 11/24 | Skip for Thanksgiving |
| 12/1 | Chapter 4: Encoding and Evolution |
| 12/8 | Chapter 5: Replication |
| 12/15 | Chapter 6: Partitioning |
| 12/22 | Skip for Holiday Season |
| 12/29 | Skip for Holiday Season |
| 1/5 | Chapter 7: Transactions |
| 1/12 | Chapter 8: The Trouble with Distributed System |
| 1/19 | Chapter 9: Consistency and Consensus |
| 1/26 | Chapter 10: Batch Processing |
| 2/2 | Chapter 11: Streaming Processing |
| 2/9 | Chapter 12: The Future of Data Systems |


还未买书的同学,欢迎大家通过以下链接购买 DDIA,在支持原作者的同时,支持爱思免费公开课!
欢迎同学们将公开课海报分享给有需要的小伙伴,感谢同学们支持本期公开课,我们周四不见不散!

爱思优秀学员 Michael 在过去几个月里拿到5家一线热门公司的 Senior Offer,包括 Google, Linkedin, Tiktok, Doordash 和 Roblox。爱思有幸请他来为大家分享系统准备 Senior 级别面试的心得体会,回顾他从面试前期准备到多家公司临场面试的经历,包含独家的面经分享,大家不要错过!
频道每周末更新,停留鼠标在视频左上角,立刻订阅吧~
]]>李同学在过去的几个月里在职跳槽陆续斩获 FB, Uber, Google, Stripe, Instacart, Doordash 六家公司的Senior Offer。本次免费讲座会回顾他从面试前期准备到多家公司临场面试的经历以及分享他对各家公司面试风格的第一手资料。
欢迎订阅爱思 Youtube 频道,独家内容,定期更新!
此次爱思免费讲座分享了对2022系统设计面试趋势的展望,给同学们高效复习系统设计提出行之有效的建议。吐血总结 Linkedin, Facebook, Google, Amazon, Airbnb, Doordash, Robinhood, Snap, Uber 等大公司新题。
随着世界上的数据越来越多,对于处理数据的需求也日益增加,越来越多的岗位对于SQL有了更多的要求,以至于很多面向数据的岗位都会在面试中对SQL进行考察。SQL的面试可能会让很多未曾接触过编程的人望而却步,而我希望通过这篇文章能够让更多的求职者了解SQL的面试和一些基本的思路。
我在工业界工作多年,一直从事数据库和SQL相关开发工作,想作为相关领域的从业者和面试官来聊一聊我对SQL面试和学习的一些看法和思考,下面会先以一道面试真题来介绍SQL的面试,之后会回答7个常见的SQL问题。
[Social Network] A user(user_id) could write a comment(content_id, type) to a post(target_id) or post(content_id, type) by him/herself. Table schema is shown as below.
| date | user_id | content_id | content_type (comment/post) | target_id |
|---|
Q: What is the comment distribution?
这是一道很典型的SQL面试题目,从这道题出发我们可以总结出很多做题的思路和技巧。
Q1: 什么样的职位会在面试中遇到SQL题目?
Q2: SQL的面试考察的内容有哪些?
SQL的面试内容大致分为以下几种:
Q3: 面试中的SQL和工作的SQL有什么区别?
Q4: 如何开始学习SQL?
Q5: 市面上面很多SQL,应该选哪个开始学?
Q6: 需要掌握哪些SQL知识?
[基础]:
[进阶]:
上面的这些内容基本上涵盖了面试中95%的知识点,当然还有很多其他内容在这面没有提及,例如query plan,query optimization,database schema design,primary/foreign key, etc.
Q7: 如何在SQL和职业上进阶?
本次免费讲座,我们将分享爱思系统设计课第三期优秀学员 Adrian 的成功求职经验。Adrian 同学在过去的几个月里在职跳槽陆续斩获 FB, Uber, Linkedin, Doordash 四家大厂的Senior Offer。本次讲座会回顾他从面试前期准备到多家公司临场面试的经历以及分享他独到的学习心得和方法论。
这是一道老题了,也是一道高频题,今天就用这道题来给资深面试官眼中的系统设计一文中答题流程做一个实例。

如果你想跟罗辑一起更深入地学习系统设计,有兴趣的同学报名参加爱思备受好评的系统设计集训营以及系统设计模拟面试服务,由作者本人为同学们教学,力求给大家带来最深入的系统设计高频题讲解以及最针对面试实战的技巧解析,帮助同学们举一反三,高效准备面试。


同学们不要死记硬背答案,而是体会一下一步步破题的过程。因为面试流程不唯一,真正碰到这道题的时候面试官的 follow-up 会不一样,大家还是要注重积累,本文试图尽量触及足够的广度,但也无法保证面面俱到。
先扩展一下这道题,这本质是道 New Feed 题,Design Facebook, Design Instagram, Design Twitter 都是一回事,不要被马甲迷惑。
想要直接看答案总结的可以跳到本文末尾,有完整的系统设计图。
那现在我们这就开始按照资深面试官眼中的系统设计中的流程来答题。
下面是一段虚拟的对话。
Interviewer: Today we are going to have a system design interview. Our goal is to design Instagram. You don’t have to cover everything. We can drill into specific topic when we get there. Are you familiar with Instagram?
Interviewee: Ya, I use it all the time. It’s photo sharing app. Before we start, can we take a step back? What’s the purpose of this “Instagram” we are building? Are we trying to compete with the real thing?
Interviewer: Let’s imagine that Instagram doesn’t exist yet and people don’t have a good app to share photos broadly.
Interviewee: Good to know. What features do we want to cover? I think we have two basic features - upload a photo, get a feed from followers and follow/unfollow . Sounds good?
Interviewer: Cool, that’s a good list. Let’s focus on the first two for the sake of time.
Interviewee: How about latency? I think this would be an important requirement too. I assume we want to have minimal latency - probably less than 0.5 second for loading feed.
Interviewer: That’s a good call out.
Interviewee: OK. (write on whiteboard). So functional requirement is to support 1) uploading photo and 2) retrieve feed from followers. Non-functional requirement is 1) Feed retrieve latency of less than half a second, 2) highly available. 3) highly reliable (data never lost). Non-requirement is follow & unfollow.
Interviewer: Makes sense.
Interviewee: Do we need to consider feed ranking?
Interviewer: Let's skip that for simplicity sake. Let's assume feed is ranked in reverse chronological order. Basically latest photo on top.
Interviewee: Sounds good.
从这段对话里受试者进行了以下三步。
说到这里,我们粗浅地了解了一下需求,还没有对 non-functional requirement 进行量化和细化,这就需要我们进一步做资源估算。
继续我们虚拟的对话。
Interviewee: I assume there are a lot of people want to use this service. Shall we assume the scale of the service is similar to the real one?
Interviewer: Yes. Let’s assume daily active user is 800M.
Interviewee: How often do people upload?
Interviewer: Let’s assume people post every 10 days.
Interviewee: Assuming daily active user makes 10 requests a day and post every 10 days. I think we can calculate the read/write QPS. (Write on whiteboard) I think read QPS is 800 * 1000 * 1000 * 10 / (3600 * 24), roughly 90k QPS and write QPS is 1/100th of that which is 900 QPS. Don’t think this will fit on one machine. (Laugh)
Interviewer: No, it won’t.
Interviewee: We will need a lot of storage here. Majority would be to store photos. Assuming we store all photos for 5 years and a photo is 1M, we will need 800 * 1000 * 1000 * 365 * 5 * 1M / 10 = 146000 TB = 146 PB. It will take one or multiple data centers to hold.
Interviewer: Sounds good. Let’s proceed with a high level design.
我们进一步地对非功能性需求进行量化和细化。
提示两点。
了解需求之后,我们可以开始画一个简单的图来说明我们的核心服务是如何构建的。
在上图中,我们并没有过多考虑 Scalability,而是提出一个小流量下可行的方案。在画图过程中,我们需要考虑的核心问题是 Push vs Pull. 上图中提出的是 Push 的方案。我们一边画图,一边就可以跟面试官提出这个 Trade-off. 我们提出我们意识到这是一个 Read-heavy application.
可以跟面试官确认 Push 的缺点是不是可以接受。
以下设计偏向于非纯 key-value store 的存储方案。如果想选用 key-value store,如Redis, 以下表的设计可以酌情做一些调整。
| post id | user id | image url | create time |
|---|
| user id | user name | profile photo url | join time |
|---|
| user id | author name | photo url | create time |
|---|
1) 这里 create time 是必须的,在返回 Feed 过程中我们需要按照这个排序。因为我们用了 async worker 来写 feed table, 我们无法保证先写进来的一定就是create time 更早的照片。2) 选用 user id 做 sharding key,使用 create time 来做 secondary index. 3) 使用 author name & photo URL 而不是 author id & photo id 避免了与其他表在读取时进行 JOIN。
| user id | follower id |
|---|
或
| user id | following id |
|---|
这边要说明 Trade off:
Push 方案里我们总是拿 user id 去找他被谁 follow 了,而 pull方案里我们总是拿 user id 去找他 follow 了谁。当然我们也可以两种都存来做一个 hybrid approach,下面会提到。
缓存, 数据库和对象存储分别用什么?
4.2.1 缓存 (Cache)
4.2.2 数据库 (Database)
Cassandra, MySQL ... SQL vs NoSQL? 在这道题上是个仁者见仁,智者见智的问题。我们至少要意识到这是 read-heavy application。SQL 这边有 MySQL ,做 key-value store 性能也不错,NoSQL 有 Cassandra, read-heavy, write heavy 都可以,保证eventual consistency.
4.2.3 对象存储 (Object Storage)
Amazon S3 是可以考虑的分布式对象存储。
我们来细化 Feed Service 的架构。
前面我们发现了 Push 带来的 Celebrity Fan-out 的问题。我们就在这个阶段提出 Hybrid approach . 简单来说,我们用一张新的 post table 去专门存超过一定 Follower 数量的 celebrity post,然后每次取 Feed 就直接从这张比较小的表里去找 celebrity 的 post,然后与 Feed table 合并排序。上述的方案会让我们的系统中包含两个 Post table,一个是 celebrity post,另一个是 non-celebrity post。一种更简化的方案是仍将所有的 Post 合并到一张Post table,但使用一个新的列,is_celebrity_post 来加以区分,在分片时,我们可以用这一列作为分片的依据之一。
注意这边 celebrity post 我们就不写到 Feed table 里了,顺便解决了每次 celebrity post 时,async worker 的负载大大增加的问题,使其更稳定。
这里值得讨论一个细节,我们能不能定一个 Follower 数量的限制,这样是不是就不用专门用一张新的 post table 去存了呢?其实不然,因为用户的 Follower 数量是会波动的,如果用户正好在那条线上,会造成 fan-out 时有时无的情况。当然,我们建了新的 celebrity post table 也会带来问题,就是如果有了新人一下子变很火,我们怎么把他们加入这个我们认定的 celebrity 的行列。方法很简单,其中一种是从普通的 post table 去 backfill celebrity post table,另一边从 Feed table 里去除他们的 post.
GET /v1/feed?count={count}&last_timestamp={timestamp}
现在我们思考一下 Feed API 这边写的 count 和 last timestamp 是什么用意呢?
答案是分页 (Pagination)。每一次 getFeed,我们不可能把所有的该用户的 Feed 一股脑的发回去,我们必须分成一段一段地发。那么问题来了,怎么才能取回第二页呢?
最直接的想法是在 getFeed 中发一个 page id 和 page count,告诉服务器我想从第几页开始取,每页是几张照片。这个做法是不对的,因为用户的 Feed 是会增长的,如果取第一页和第二页之间有了新的 post, 那返回的图片的 index 就会错位。
正确做法是传 last timestamp 和 page count,这样就解决了错位的问题。
POST /v1/images
以上 API 用于把图片本身上传到服务器端,换取一个 URL,S3 提供类似的功能。
POST /v1/posts
{
"image_url": image_url,
"description": "hello world"
}
以上 API 用于把 Post 上传到服务器端,包括图片链接以及文字介绍。将图片本身的上传和 Post 的上传分开允许我们在产品逻辑里将两者的发送时间分开(照片可以在文字介绍还没编写好之前就上传),另一方面允许我们更好地复用服务,特别是前者,图片上传服务可以被很多别的 API 利用。
这里没有将 User ID 放在 API 的输入当中是考虑我们不会去以他人名义发送照片或者取得他人的信息流,所以两个 API 可以默认用户是当前被 Authenticated 的用户,实现上可以从 Auth Token 里拿,而不必从 API 中拿。
我们来进一步按照以上四点来进一步优化我们的设计以满足我们在第一节中收集的需求 - Low Latency, High Reliability 和 High Availability.
Scalability 讨论在数据量和访问量增大的情况下,我们如何应对。这里我们梳理一下之前为了 Scalability 所作的选择。
以上这些设计让我们可以通过加机器的方法来应对与日俱增的数据量和访问量。
要构建一个在服务器众多的服务,我们难免会碰到硬件和软件的不稳定性。面对这些难以预测的问题,我们怎么才能让用户感受到一致并且理想的体验呢?那就是提高容错性。
提高容错性的目标是两点。
我们在这题的情景下分别检视每个系统组件,看看如何达到以上目标。
在前面的第三小节 High-level Diagram 中,我们在讨论push vs pull的时候选择push的核心论点是这个服务是 read-heavy 并且延迟必须足够低。在此后采取 hybrid approach 的优化后,系统延迟仍会低于 pull。
监控核心指标并设立警报。实际系统里的指标远不止以下,这里举一些重要的。
这道题面试官可以找到很多角度去深挖,这里就提一个比较常见的考点。问题是这样的 - Instagram 的 Feed Table 数据量单机无法承受的时候,你会怎样 Scale up?
最直接的想法是,对于每个 user id 做 hashing,分别放在不同的机器上。这样说答对了一半,面试官会跟进,问这样会不会造成有的机器很满,有的很空,如果某些机器又满了怎么办?
要解决这个问题的机制比较复杂,Cassandra 的设计给我们提供了很好的设计思路,我们可以使用 Consistent Hashing 的 Hash Ring 来解决 node re-distribution 的问题。
在面试的过程中,我们一边思考,一边改进我们的系统。最终的系统大概是这样的。
我们回顾一下最初写下的需求,看一下是不是都满足了。最后再跟面试官确认一次。
]]>系统设计是为了满足特定需求,定义计算机系统内构架,模块,接口和数据的过程。这是每一个后端或者全栈工程师的必修课,随着工作年限的增长和项目的扩大,系统设计在日常工作的重要性会不断增加。
如果你想跟罗辑一起更深入地学习系统设计,有兴趣的同学报名参加爱思备受好评的系统设计集训营以及系统设计模拟面试,由作者本人为同学们教学,力求给大家带来最深入的系统设计高频题讲解以及最针对面试实战的技巧解析,帮助同学们举一反三,高效准备面试。


跟算法面试类似的,面试官需要能从人群里分辨出谁更适合所招聘的职位。系统设计作为日常工作中会经常用到的能力,在考察中有很强的现实意义。可以想象,如果一个组里需要找资深工程师来帮助升级服务的构架,系统设计能力会决定岗位的归属。
系统设计面试可以看出受试人对问题多方面的理解,不同水平的受试人对于问题的广度和深度会有很大差异,很大程度上帮助面试官了解受试人的能力以及确定未来职位的级别。
当然,以上四点,根据同学们的实际情况,并不用在每一点上都给出完整的回答,面试官会在面试过程中指出深挖的方向,有可能是根据同学的专业或者职业背景,有可能是根据所面试的岗位,有可能是根据面试中同学提到的他熟悉的技术。
在面试生涯中,见过的最优秀的面试者比我的级别要高,让我印象非常深刻,四个字,深不见底。
面试的前半段,面试官会先从广度下手,要求受试者对题目的大框架给出一个完整的正确的解法。如果受试者给出了足够好的解法,那么面试官会从受试者的提过的某一个细部进行深挖,可能是深挖scalability,可能是改变一个需求要求重新做tradeoff,可能是某一个service的细节设计。因为其中的细节足够多,受试者一般很难准备得面面俱到,面试官可以比较清楚的画出受试者的能力边界。前面提到的这个受试者之所以让我感到深不见底,是因为我才疏学浅,画不出他的能力边界,不得不赞叹大神,在debrief中好好膜拜了一番。 说了这么多,还是想说平时的积累很重要,面试速成能够让你在广度上做的很好,深度方面还是要多花时间学习。
讲完了废话,讲一些可以操作性强的,我们结合考察内容,对优秀回答的特征做进一步表述。
这是正常面试的核心部分,非常重要,是面试通过的基础,其中deep dive非常考验真实水平。讨论过程中记住要保证设计的完整性,正确性以及取舍的充分沟通。答题点主要分成以下五大块。
估算非功能性需求,计算需要多少台机器,需要多少内存,硬盘,带宽和CPU的能力,量级正确即可(back of envelope calculation)。
面试中常见的错误是答题流程松散,在不必要的话题上浪费时间。我见过不计其数的受试者纠结于一个特定话题导致没有时间完成面试的主体部分。我们来看看怎么避免这类错误。
形成固定的答题流程的作用有二。一是引导面试官进入你的答题框架,二是用固定的流程保证不漏过重要的得分点。
虽然面试官在系统设计面试中有比算法面试更强的引导的责任,但是引导的行为只有在需要的时候才会发生。如果一场面试中,总是受试者提问,面试官回答,受试者滔滔不绝地讲,面试官连连点头,画面是不是很美?虽说前面的情景很理想化,但是如果我们能很好地把面试官想踩到的点按一个大概的顺序去踩到,不仅面试官会更少地打断受试者的思维,而且面试官也会在面试中很省力给你个好印象。当然,如果引导发生了,那么一定要根据引导来思维。
以40分钟的面试时间来算(掐头去尾除去自我介绍问问题),我面试的大概流程如下。
注意几点,4,5,6顺序没太大关系。8可以考虑成额外分数,答对大量加分,答错少量减分,如果没时间会跳过,也是少量减分。
看完这个流程是不是感觉分秒必争,要踩的点很多,没有时间浪费。这时候如果面试官听出来某一步骤有错误,就算是回头改对了,浪费的时间也会造成一些本能踩到的点因为时间不足踩不到,所以大家还是好好准备,刷算法题之余也把系统设计重视起来。
]]>
硅谷多家顶尖大厂近十年工作经验资深 Tech Lead,作为面试官进行面试近百场,对Facebook 等大厂面试套路深有体会。作为受试者斩获 FLAGUAP 中绝大多数 offer。拥有丰富模拟面试辅导经验,帮助众多学生斩获一线大厂 offer,口碑优异。
1小时系统设计模拟面试(英语)+ 30分钟深度反馈(中英可选)+ 反馈报告 + 微信答疑。 罗辑亲自教学,无外包,资历和教学质量远超同类服务。Zoom 远程音频,无地域限制。模拟面试结合本站资料复习,助你临门一脚,offer 连连!
想要更加高效准备又不知道该如何下手?从模拟面试中发现了不足却不知道该如何提高? 爱思为所有模拟面试用户赠送价值 $59.99 的一年网站会员,包含独家题解及配套资料,帮你事半功倍,经验值蹭蹭涨!
扫描二维码添加罗辑好友,注明“模拟面试咨询”。罗辑会帮助解答你的疑惑。一天之内回复。如急需模拟面试,请通过上方预约工具预约,锁定你的时间。咨询亦可发送邮件到 [email protected]。
“给你说声多谢!你的模拟面试很有帮助。让我避免通过正式面试来交学费。这次注意了掌控时间,发挥得更好。后面我的面试全都过了,觉得钱花得很值!”
“特别特别谢谢您的 mock interview,收获巨大无比,我觉得算是点醒了我,让我知道系统设计面试大概怎么回事儿,应该怎么准备和回答。之后所有面试都过了,真的太感谢您啦!”
“谢谢您的系统设计培训,并且发在网上的文章写得特别不错,是那种从零到一,启发式的文章。特别谢谢您,对这次跳槽特别的满意。”
| 师资 | 时长 | 学习资料 | 微信答疑 | |
|---|---|---|---|---|
| 爱思系统设计 | 爱思创始人 顶尖大厂资深面试官 | 1.5小时 | 赠送本站一年会员,畅读全部题解 | 随时 |
| 九章算法 | 一线大厂面试官 | 1小时 | 无 | 无 |