我们要先搞懂系统设计是什么

划重点,这里讲的系统设计都是系统设计面试,而非是工业上的设计系统。系统设计,其实就是一个“吹牛逼”的行为,在和面试官你来我往的沟通中,用“嘴皮子”创建一个系统,讨论系统。

我简单总结了一下系统设计面试相关问题的问法:

设计某某系统 Design XXX System

  • 设计微博 Design Twitter
  • 设计滴滴 Design Uber
  • 设计微信 Design Whatsapp
  • 设计点评 Design Yelp
  • 设计短网址系统 Design Tiny URL
  • 设计NoSQL数据库 Design NoSQL ……

设计一个功能实现对用户访问频率的限制

  • 设计一个功能实现统计某个具体事件的历史发生次数
  • 设计删除一个 Tweet 的功能
  • 设计邮件系统中将所有邮件标记为已读的功能 ……
    某某系统的技术选型比如缓存用Redis 还是 Memcached网关用 Spring Cloud Gateway 还是 Netflix Zuul2 。 ……

所谓知己知彼,百战不殆,弄清面试官的意图很重要。

系统设计面试不是希望你在30min左右设计出一个完整的系统,而是考察你在面对一个复杂的问题时,如何把它进行拆解、细化、运用现有的系统知识完成一个具体的项目,实现工作中leader需要你实现的功能。

在系统结构设计 System Design 2022版中
包含了秒杀系统与订单系统、网站系统、协同实时编辑系统、限流器与实时数据系统、即时通讯系统、视频系统、爬虫系统等18个常见的系统,覆盖了系统设计全面的面试题型。

课上还会提供系统设计的通用解题步骤,并独创了系统设计训练方式,通过编程掌握核心技术点。让系统设计面试像刷题一样有迹可循。

第一节的免费试听课程就会讲到设计Twitter和系统设计的通用解题法则,不妨去感受一下,简单入个门。

毕竟系统设计面试不是希望你在30min左右设计出一个完整的系统,而是考察你在面对一个复杂的问题时,如何把它进行拆解、细化、运用现有的系统知识完成一个具体的项目,实现工作中leader需要你实现的功能。

想明白了这点,对于你之后的解题很有帮助,所以我才说系统设计就是“吹牛逼”。

——

那么系统面试时应该怎么准备?

1.首先多找些常见的系统设计题,弄清楚题目的具体要求

举个例子,比如你准备面Facebook,他们常考的一个design find nearby places。这个题目搜一下过去两年的面经会发现到处都是,根据网友们的描述大致可以总结出这一题最核心考点是什么。

接着你就可以根据自身经验能力,把各个方案做一些比较和总结,最后再准备一些拔高的的知识点。整个面试如果能有条有理深入浅出的讲完就行了!

2.利用自身的能力对系统进行抽象设计

当面试官给出了系统设计题目之后,一定不要立即开始设计解决方案。 你需要先理解系统设计的需求:功能性需求非功能性需求

不要上来题目刚出还没怎么思考呢,就大谈特谈。

例如不要在面试官说首先考虑10w量级的用户,先把系统搭建起来然后再看scale之后。他花大量时间blabla说了一堆市面上比较fancy的技术,实际上只会暴露出你对这些技术的不了解。

整体看下来特别像孔乙己在高谈阔论茴的四种写法。这样并不会让你在面试时获得高分,因为面试的核心是看你怎么解决问题,并不是让你造火箭,更何况绝大部分人也造不好。

对于绝大部分非天才非大牛的L4来说,面系统设计不要试图答成L6的水平,面试时你可以画出系统的抽象架构图,这个抽象架构图中包含了系统的一些组件以及这些组件之间的连接。

3.想好了再回答,不要太绝对,及时反思

思路清晰,表达流畅,有重点有逻辑有主线会很加分,系统设计没有标准答案,重要的是你和面试官一起交流的过程。

一般情况下,你会在和面试官的交流过程中,一步一步完成系统设计这个过程中,你会在面试官的引导下不断完善自己的系统设计方案。

系统设计没有最好的设计方案,只有最合适的设计方案。

刚开始设计的系统不需要太完美,可以慢慢优化。

使用稳定的、适合业务的技术,不必要过于追求新技术。

系统设计应当追求简单避免复杂。

——

不打无准备的仗

神书DDIA

不用多说。书里很多的理论证明,还有各种细节上的讨论,比如phantom read的具体情况,其实对于准备系统面试来说,并不是非常有帮助。

更多的反而可能是写在各章summary里的,那些对于名词和术语的总结,还有对于为什么某些东西在系统设计里很重要的简单分析

搭配这些,和一些网上的读书笔记,就能让你对这些东西有一个比较合适的理解。

值得注意的是,我们来到senior-staff这个级别的系统设计面试的话是不够的,我甚至觉得它里面的一些有点复制粘贴意思的trade-off分析,和它不分场景都上来先算capacity的做法,其实容易把人带进沟里。

Youtube或者一些独立站上有不少看起来几十万阅读量的up主上传了很多系统设计的视频,也是深度不足且细节问题一堆,都是没有太多实战经验的人,基于一个类似的模版反复套用在不同系统上进行分析,最多会追加一两个针对该系统的特色的设计。

九章的面向对象设计入门课可以算得上是广受好评,主要讲解4种题型的设计模式,用实例讲解设计模式和常考的面向对象设计真题,包括Strategy,Singleton,Factory,Adaptor等。

覆盖到希望深入了解设计模式的学习者,现在可以免费试听:

  • 什么是面向对象设计(OOD, Object oriented design)

  • OOD面试中常见的面试题总结、分类

  • 如何评判一次OOD面试的表现是好是坏

  • OOD面试应对方法

  • SOLID原则

  • 5C解题法

  • 设计模式讲解 Design Pattern - Strategy

  • 高频OOD面试题讲解 - 电梯设计 Elevator Design

练手的项目

我单独拿这个出来说,是因为哪怕你学习到位,方法论总结到位,但是如果你要直接上阵,你还是不知道那套方法论在实践的时候会变成什么样,所以我的建议是多练习实操项目,至少有一个能拿得出手的系统项目。

所以我再推荐几个可以跟着学习的系统设计。

1.mall

mall项目致力于打造一个完整的电商系统,采用现阶段流行技术实现。

作为一套电商系统,它包括前台商城系统后台管理系统,基于SpringBoot+MyBatis实现,采用Docker容器化部署。前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心等模块。后台管理系统包含商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等模块。

2.打车系统

这是一个仿滴滴打车的Android出行项目,主要针对滴滴等出行平台一直饱受质疑的“人车不符”问题,以及当前越发火热的国际化和出海战略,并且给出行项目增加了下面几个功能:

1. RFID识别验证功能:在司机证件或者车内识别硬件里嵌入RFID识别芯片,乘客使用手机读取到芯片信息,并且通过网络(okhttp3)发送到出行平台数据库进行验证。如果不是合规的“人”或“车”,则不能完成订单并向平台或监管单位汇报当前位置。

2. 海外版功能:点击切换当前语言。

3. 司机证件号码识别功能:读取司机证件上的证件号码,也可以用来与出行平台数据库的信息进行核实比对。

3.Twitter后端项目

设计Twitter本质上就是在考高并发的信息流系统,其涉及的技术难点非常多,项目的难度也更能检验面试者水平,而且从L3~L5都能问到。

对于初级程序员(SDE1),可以把“设计Twitter”拆解出单独设计一个关注功能来问

对于高级程序员(SDE2+),面试官通常会要求面试者实现设计登陆、发推、点赞、关注、取关等一系列功能

这些技术难点在Twitter后端项目首节试听课中都有详细介绍,整个项目涉及万行代码,最后可以按工业化要求产出的可上线产品。现在可以免费试听。

5.电商秒杀系统 - Spring项目实战

实战高并发最好的项目之一,课程是由阿里巴巴资深架构师主讲,负责每年双十一淘宝系统的维护。

对于长期在中小厂工作,缺乏高并发经验的程序员非常适用,课程会从项目基础架构搭建、数据库表分析及创建、MyBatis 整合与逆向生成等开始讲起,逐步完成一个电商秒杀系统。

首节试听课上会讲解秒杀系统的重难点、常用的技术架构,现在开放了免费试听。

要规避的问题

比如完全不明白一个系统是怎么样end-to-end工作的。这个就无解了,只能回炉重练。实际上这样的候选人非常罕见。

没有主线,过度发散,很容易被带偏。

这是非常常见的问题,很多候选人其实是知道怎么设计的,该有的知识也有。但是说话没个章法,一会说这一会说那,整个设计半个小时下来看不到什么逻辑性。Interviewer随便问个问题很容易就被带偏然后花好几分钟去描述一个其实不是很重要的东西。感觉什么都讲了但是好像又没讲什么,那就只能fail了。

花太多时间在不重要的地方上。

这也是个很常见的问题。一个题目出出来都是有重心的,如果他重点问你设计数据结构,你就不要在authentication上花一点点时间。面试的时间有限,每一题要考哪些signal都是提前设计好的。比如一共要考察10个点,在45分钟的时间budget下,你答的点越多越好。我见过太多candidate花大量时间去说一些不在我考察范围内的事情,这本质上就是把你有限的时间资源都浪费掉了,最后时间到了我只能收集到一两个点的signal,那当然容易是no hire。

如何找到重心?一靠经验,二靠准备。网上有海量面经,下功夫精细准备10个题,后面基本上就了解要考什么了。上面也有讲。

——

写在最后

不论如何准备,你都会碰到意料之外的。在实行经验的时候,也可能随时被要求谈不同的部分,这些都是没办法提前准备好,只能在大量的面试和练习之下,自然而然养成应对的本能。然后每一次面试结束,做好总结归纳,

系统设计面试,说到最后还是面试,还是让对方在短时间内建立起你对的良好印象的一步。能够应对面试官的需求,改变你的套路,也是交流沟通的重要一环。

希望能对苦于系统设计的各位,提供一些帮助。也欢迎各位随时提问,知无不言,言无不尽

——

部分资料来源:猴子也能懂的系统设计套路

千字长文讲解系统架构,系统设计看这篇就够了相关推荐

  1. 想染指系统架构?看这篇就够了

    https://juejin.im/post/58f45b058d6d8100648a69f0 原文地址:github.com/donnemartin/system-design-primer 译文出 ...

  2. 搞透Kafka的存储架构,看这篇就够了

    阅读本文大约需要30分钟.这篇文章干货很多,希望你可以耐心读完. 从这篇文章开始,我将对 Kafka 专项知识进行深度剖析, 今天我就来聊聊 kafka 的存储系统架构设计, 说到存储系统,大家可能对 ...

  3. 万字长文讲解编码知识,看这文就够了!| 原力计划

    作者 | Aledsan 责编 | 王晓曼 出品 | CSDN博客 基础概念 1.字符 字符指类字形单位或符号,包括字母.数字.运算符号.标点符号和其他符号,以及一些功能性符号.一般来说我们称某个字符 ...

  4. 万字长文讲解编码知识,看这文就够了!

    作者 | Aledsan 责编 | 王晓曼 出品 | CSDN博客 基础概念 1.字符 字符指类字形单位或符号,包括字母.数字.运算符号.标点符号和其他符号,以及一些功能性符号.一般来说我们称某个字符 ...

  5. 【建议收藏+千字长文+动图演示】Windows10系统有哪些提升使用效率的神奇操作

    声明: 1)该文章全部由本人手打整理,图片全由本人录制,侵权必究. 2)此属于第一版本,若有错误,还需继续修正与增删. 文章目录 声明: 0.前言 多图预警,千字长文预警,收藏预警,动图预警

  6. 三万五千字长文!让你懂透编译原理(六)——第六章 属性文法和语法制导翻译

    三万五千字长文!让你懂透编译原理(六)--第六章 属性文法和语法制导翻译 长文预警 系列文章传送门: 万字长文+独家思维导图!让你懂透编译原理(一)--第一章 引论 万字长文!让你懂透编译原理(二)- ...

  7. uiautomation遍历windows所有窗口_万字长文!滑动窗口看这篇就够了!

    大家好,我是小浩.今天是小浩算法 "365刷题计划" 滑动窗口系列 - 整合篇.之前给大家讲解过一些滑动窗口的题目,但未作系统整理. 所以我就出了这个整合合集,整合工作中除了保留原 ...

  8. Java应用系统监控看这篇就够了

    Java应用系统监控看这篇就够了 文章目录 业务背景 系统监控发展历程 技术方案 日志监控技术方案 Grafana+阿里云SLS日志服务 分布式链路追踪技术方案 阿里云jaeger方案 开源框架sky ...

  9. 史上最全!用Pandas读取CSV,看这篇就够了

    导读:pandas.read_csv接口用于读取CSV格式的数据文件,由于CSV文件使用非常频繁,功能强大,参数众多,因此在这里专门做详细介绍. 作者:李庆辉 来源:大数据DT(ID:hzdashuj ...

最新文章

  1. ClassFlow推出全新课堂活动轨迹功能
  2. iOS 的组件化开发
  3. 第4章 最基础的分类算法-k近邻算法
  4. button常用属性_web阶段常用单词明细表,你值得拥有
  5. 常用数据结构及复杂度
  6. Myeclipse debug时出现跳行问题的解决
  7. JAVA实现inotify一样的功能_WPF实现INotifyPropertyChanged
  8. qt glsl渲染rgb
  9. 每天执行一次批处理_关于静态批处理/动态批处理/GPU Instancing /SRP Batcher的详细剖析...
  10. RenderSettings 渲染设置
  11. x射线计算机断层成像_医疗保健中的深度学习-X射线成像(第4部分-类不平衡问题)...
  12. SHA256算法原理详解
  13. 群晖 android软件,群晖-手机端常用App
  14. Python练手小程序—生成优惠券码写入mysql数据库中
  15. Verilog学习——T触发器
  16. IOS开发-ERROR ITMS-90096: Your binary is not optimized for iPhone 5
  17. HbuilderX导入项目运行到微信小程序代码杂乱问题
  18. Jetson nano 使用ROS 实现串口通信,并且解析通信协议(C++)
  19. 《机器学习实战》萌新读书笔记 ② — — 第三章 决策树 内容提要、知识拓展和详细注释代码
  20. 再次使用vue-awesome-swiper做异形轮播

热门文章

  1. windows os x linux比较,windows、Linux与OS X相比,哪个系统更适合写代码?
  2. 使用行列式公式求多边形面积
  3. linux 注释批处理,Linux_批处理 正则表达式(findstr) 整理,语法 findstr [/b] [/e] [/l] [/r] [/s] - phpStudy...
  4. 青少年编程教育平台后台—登录注册(界面设计)
  5. oracle中begin end的作用,如何在SQL * Plus中使用begin/end运行Oracle查询?
  6. 浅谈互联网一件新机(改机)发展历史
  7. sketch常用快捷键键盘对应
  8. 西湖大学张岳老师NLP课程笔记1 Introduction
  9. VS2017 编译 EDK2 Stdlib
  10. 计算机 先进事迹范文,计算机,先进事迹范文.doc