作为在阿里待了多年的技术老狗,曾经长期作为团队面试官也面过大大小小200+的面试来现身说法:光会CRUD已经没有会一个完整的可解决问题的系统设计香了......大厂的招人逻辑是:不要只会刷题的码农。所以,重技术原理和逻辑思维的系统设计题就成了筛人首选。
系统设计的最终考察标准是:面试者独立设计一个大型的系统,它在现实中是可work的,同时在高并发的情况下仍具有高可用性。
比如:实际面试里,系统设计题干很简单,往往就一句话:为暑期大促设计一个订票系统。很多没有系统设计经验的小白这个时候已经麻了......

别慌,先推荐一个系统架构设计2021版,包含18大系统架构设计知识点和面试题,涵盖了几乎所有大厂常见的高频设计题。以下,干货还是挺多的。


另外,它的刷题方式搞定系统设计的训练方式。万年刷题党的童鞋们也可以快速上手掌握系统设计核心知识点。第一节的免费试听课程就会讲到设计Twitter和系统设计的通用解题法则,可以去实操感受一下。

接下来的篇幅,我从面试前准备和面试中的应对给大家整一篇干货分享。感兴趣的同学,可以看下去。
系统设计面试前我们要有哪些准备?
一、熟悉基本知识
系统设计题目因为是开放式的,会考察到的技术领域会非常多,不仅仅是数据结构和算法。所以,你需要有很扎实的基本知识,这点非常重要。你一定非常熟悉算法,这点毫无疑问。
但是:以短网址服务为例,如果你不清楚散列,时间/空间复杂度分析,你将无法提出一个好的解决方案。
罗列了一些你在面试中可能会涉及所以你最好提前熟悉一下的东西。
- 抽象。系统设计面试是一个非常重要的话题。你应该清楚如何抽象系统,什么是可见的和不可见的其他组件,以及它背后的逻辑是什么。面向对象编程也是很重要的。
- 数据库。你应该清楚关于像关系数据库这样的基本概念。取决于你的水平(应届生或经验丰富的工程师),了解 NoSQL 可能是一个加分项。
- 网络。你应该能够清楚地解释,当你在浏览器中键入http://gainlo.co时会发生什么。例如应该清楚 DNS 查找和 HTTP。
- 并发。如果你能够识别系统中的并发问题,并告诉面试官如何解决这个问题,那将是非常棒的。有时候这个话题可能很难,但是需要了解一些基本的概念,比如说竞态条件,死锁是底线。
- 操作系统。有时你与面试官的讨论可能会非常深入,这时最好知道操作系统在底层如何工作。
- 机器学习(可选)。你不需要成为专家,但是一些基本的概念,如特征选择,通常 ML 算法的工作方式,最好熟悉它们。
二、 平时项目实操到位,面试才能稳如老狗。
真实的项目和实践永远是准备系统项目设计最好的方法没有之一。你实践的越多你面试时的发挥将会越好,因为这些系统设计的题目,大都来自现实生活中的产品,那些从事过项目的人,往往对这些问题与更好的理解......
如果你不知道要做什么,这里给你一些建议:
建立一个小型服务/产品来解决一个真正的问题 在 Github 上贡献开源项目 找到你喜欢的机器学习,网络等主题,并搜索一些你可以使用的项目 真正重要的是去做一些现实生活中的项目。你可能需要很长时间才能看到改进,但是在那个时候,你会注意到面试问题是多么的简单。而且,从长远来看,你将从中受益良多。
下面直接上几个我自己用过的实操系统:
讨论如何构建一套可靠的大型分布式系统。凤凰架构作者从事大型企业级软件的架构研发工作。作者系统性地整理自己的知识,将它们都融入既有的知识框架之中。
以“如何构建一套可靠的分布式大型软件系统”为叙事主线的开源文档,作者同时还建立了若干配套的代码工程,这是针对不同架构、技术方案(如单体架构、微服务、服务网格、无服务架构,等等)的演示程序。它们既是文档中所述知识的实践示例,亦可作为实际项目新创建时的可参考引用的基础代码。

设计Twitter本质上就是在考高并发的信息流系统,其涉及的技术难点非常多,项目的难度也更能检验面试者水平,而且从L3~L5都能问到。
对于初级程序员(SDE1),可以把“设计Twitter”拆解出单独设计一个关注功能来问
对于高级程序员(SDE2+),面试官通常会要求面试者实现设计登陆、发推、点赞、关注、取关等一系列功能
这些技术难点在Twitter后端项目首节试听课中都有详细介绍,整个项目涉及万行代码,最后可以按工业化要求产出的可上线产品。

3.mall
mall项目致力于打造一个完整的电商系统,采用现阶段流行技术实现。
商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心等模块。后台管理系统包含商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等模块。

实战高并发最好的项目之一,课程是由阿里巴巴资深架构师主讲,负责每年双十一淘宝系统的维护。
对于长期在中小厂工作,缺乏高并发经验的程序员非常适用,课程会从项目基础架构搭建、数据库表分析及创建、MyBatis 整合与逆向生成等开始讲起,逐步完成一个电商秒杀系统。
首节试听课上会讲解秒杀系统的重难点、常用的技术架构,现在开放了免费试听。

三、保持好奇心
多思考自己经常浏览的网站是怎么做的。比如:
- 你刷微博的时候可以思考一下微博是如何记录点赞数量的?
- 你看哔哩哔哩的时候可以思考一下消息提醒系统是如何做的?
- 你使用短链系统的时候可以考虑一下短链系统是如何做的?
- ......
四、技术选型
实现同样的功能,一般会有多种技术选择方案,比如缓存用Redis
还是 Memcached
、网关用 Spring Cloud Gateway
还是Netflix Zuul2
。 很多时候,面试官在系统设计面过程中会具体到技术的选型,因而,你需要区分不同技术的优缺点。
面试中怎么去回答系统面试题?
首先,一般你在系统面试现场会被问到这样的问题:
- 设计一个某某系统比如秒杀系统、微博系统、短网址系统、抢红包系统。
- 设计某某系统中的一个功能比如某视频网站的点赞功能。
- 某某系统的技术选型比如缓存用
Redis
还是Memcached
、网关用Spring Cloud Gateway
还是Netflix Zuul2
。 - 设计一个框架比如 RPC 框架、消息队列、缓存框架、分布式文件系统等等。

我们通过4个步骤来拆分:
Step1: Scenario场景(问清楚系统具体要求)
当面试官给出系统设计题目后,一定不要马上开始设计。 需要确定设计哪些功能,包括功能性需求和非功能性需求。承受多大的访问量?
为啥要问清楚功能性需求?比如:如果面试官让你设计一个Twitter系统,你总不能把Twitter所有涵盖功能如会员机制、推荐信息流等都设计进去吧,所以你要明确你要做的系统核心功能(缩小范围)!
为啥要问清楚非功能性需求?
比如秒杀系统的常见概念QPS(Queries Per Second),即一秒内需要处理的请求数量是多少?
所以,为了避免自己曲解题目的意思,可以先给面试官简单说说自己对系统的理解。
Step2:Service服务
我们需要在一个 High Level 的层面对系统进行设计。服务可以认为是逻辑处理的整合。对于同一类问题的逻辑处理归并在一个服务中,整个系统可以细分为若干个小的服务。

以秒杀系统服务设计为例:

Step3:Storage存储
数据是如何存储和访问的。为每个服务选择合适的存储结构,然后细化数据表结构。还是以秒杀系统数据库设计为例:

于是我们可以得到秒杀活动中,数据库之间的关系如图所示

Step4:Scale扩展,升级优化(解决缺陷,处理可能会遇到的问题)
完成系统的抽象设计后,你还需要思考当前抽象系统还有哪些需要优化的点,这一步是重点。
- 当前系统部署在一台机器够吗?是否需要部署在多台机器然后进行负载均衡呢?
- 数据库处理速度能否支撑业务需求?是否需要给指定字段加索引?是否需要读写分离?是否需要缓存?
- 数据量是否大到需要分库分表?
- 是否存在安全隐患?
- 系统是否需要分布式文件系统?
- ......
可以移步系统架构设计2021版,解锁详细细节。
知道面试官在考察你哪些方面,这些方面分值占比多少
如果这场考试的评分标准你都不知道,那是很危险的!
想要答好系统设计,首先要了解系统设计面试的评分标准。系统设计面试主要考察以下几个方面:
- 可行解 Work Solution 25%
- 特定问题 Special Case 20%
- 分析能力 Analysis 25%
- 权衡 Tradeoff 15%
- 知识储备 Knowledge Base 15%
在面试中,常见的错误是面试官给出问题后,候选人就开始怼各种关键词,什么Load Balancer,Memcache,NodeJS,MongoDB,MySQL……
怎么把控好一场完美的系统分析面试,可以移步系统架构设计2021 版,FLAG高级架构工程师教你做好系统设计。
最后,系统设计是表现你创造力的地方,充分的准备加足够的项目实操经验,面试时确保你了解该问题,并且直接、清晰地向面试官表达你的想法,你的表现肯定会得到面试官的认可。