System Design——什么是“SystemDesign”问题

应公司老大需要,开始学习System Design的知识,并做一个专栏整理。第一part是就hiredintech上的知识做一个基础学习,后续会再补充一些常见例子具体分析。这次也是我第一次开专栏,希望可以做好!

-------------------------------分隔符---------------------------------------------------------------------------------------

英文原文链接:https://www.hiredintech.com/classrooms/system-design/lesson/60


什么是System Design问题?当我们在设计某些高等级的软件系统的时候需要考虑这类问题,它可以是面向web的服务,REST风格的API,peer-to-peer的桌面应用等等。具体问题也会随着场景不同公司不同而各异。


一些例子:

  • 设计一个类似bit.ly的URL短服务
  • 如何实现Google Search
  • 设计一个允许玩家互相之间下棋的CS应用
  • 如何存储类似Facebook这样的社交网站的用户关系数据?如何实现当用户的好友与用户喜欢同样的东西的时候用户可以收到消息通知?


别害怕!

这些问题可能刚开始看有些令人无从下手,那如果在面试中被问道这个问题,怎么才能在20-30分钟内设计出Google Search的呢?同样的工作,可能许多聪明的人都要花好几年来做好它。所以在面试中面试官并没有期望你能够真正做到那一点(当然,要是你能做到就厉害啦!(╯‵□′)╯︵┻━┻)。

在面试中遇到这种问题的话,面试官更多的是考察你思考问题的过程和解决问题的方式。最好能够讨论得到的是一个high-level的结构设计,能够解决问题达到目标同时注意到系统的限制,考察点在于你所设计的系统的瓶颈和常见问题的处理方式。

对于System Design的问题,通常没有一个标准答案,解法也是多种多样的。注意面试官给定的条件或者实际的问题环境条件,尽量保证自己的答案能够覆盖所有的情况。


我们的方法

解决System Design问题需要正确的策略也需要对应的知识。策略的重要性在于能够发行并找到当下的切入点和关键点,相关知识储备在于把问题真正的解决。所以这一部分的学习从策略和知识两方面展开。


问题汇总

我们统计了当碰到System Design问题时,同学主要遇到的两大挑战和问题:

  • 当试图解决问题时没有章法,陷入困境
  • 对于如何恰当地设计有相当规模的系统缺乏坚实的理解

解决这两个问题是这一系列文章课程所期望的目标。


系统设计过程

首先要学会的一件事就是:将我们目前接触一个System Design问题时候混乱无章法的做法替换为条理清晰的处理方法。后面的章节中包含了从接手一个问题到完成它所需要经历的所有步骤。


设计可扩展式的架构

在有了正确的处理方法之后,第二步需要跨越的障碍是设计具有良好可扩展性的系统架构。

扩展性是系统设计过程中的第四步所需要考虑的。这一块是需要好好处理的,因为这一块往往是设计一个系统的重点,同样也是设计者最为头疼的一部分。

为了充实这一部分的知识储备,这系列的文章会介绍这方面的理论知识,同时会通过分析周围大型网站,比如Instagram, TripAdvisor, Salesforce.com, StackOverflow等来介绍。

猜你喜欢

转载自blog.csdn.net/wangqyoho/article/details/78284467