https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md
github.com/donnemartin/system-design-primer
目的
学习如何设计大型系统。
为系统设计的面试做准备。
学习如何设计大型系统
学习如何设计可扩展的系统将会有助于你成为一个更好的工程师。
系统设计是一个很宽泛的话题。在互联网上,关于系统设计原则的资源也是多如牛毛。
这个仓库就是这些资源的组织收集,它可以帮助你学习如何构建可扩展的系统。
从开源社区学习
这是一个不断更新的开源项目的初期的版本。
欢迎贡献!
为系统设计的面试做准备
在很多科技公司中,除了代码面试,系统设计也是技术面试过程中的一个必要环节。
实践常见的系统设计面试题并且把你的答案和例子的解答进行对照:讨论,代码和图表。
面试准备的其他主题:
学习指引
如何处理一个系统设计的面试题
系统设计的面试题,含解答
面向对象设计的面试题,含解答
其它的系统设计面试题
第一步:描述使用场景,约束和假设
把所有需要的东西聚集在一起,审视问题。不停的提问,以至于我们可以明确使用场景和约束。讨论假设。
谁会使用它?
他们会怎样使用它?
有多少用户?
系统的作用是什么?
系统的输入输出分别是什么?
我们希望处理多少数据?
我们希望每秒钟处理多少请求?
我们希望的读写比率?
第二步:创造一个高层级的设计
使用所有重要的组件来描绘出一个高层级的设计。
画出主要的组件和连接
证明你的想法
第三步:设计核心组件
对每一个核心组件进行详细深入的分析。举例来说,如果你被问到设计一个 url 缩写服务,开始讨论:
生成并储存一个完整 url 的 hash
MD5 和 Base62
Hash 碰撞
SQL 还是 NoSQL
数据库模型
将一个 hashed url 翻译成完整的 url
数据库查找
API 和面向对象设计
第四步:扩展设计
确认和处理瓶颈以及一些限制。举例来说就是你需要下面的这些来完成扩展性的议题吗?
负载均衡
水平扩展
缓存
数据库分片
论述可能的解决办法和代价。每件事情需要取舍。可以使用可扩展系统的设计原则来处理瓶颈。
预估计算量
你或许会被要求通过手算进行一些估算。附录涉及到的是下面的这些资源:
使用预估计算量
2 的次方表
每个程序员都应该知道的延迟数
相关资源和延伸阅读
查看下面的链接以获得我们期望的更好的想法:
怎样通过一个系统设计的面试
系统设计的面试
系统架构与设计的面试简介
https://apps.ankiweb.net/ 卡堆,帮助快速记忆 AnkiDroid
https://zhuanlan.zhihu.com/p/41251789
https://zhuanlan.zhihu.com/p/61564332
https://pan.baidu.com/s/16JFHGO9Yk1hlUD1d84iCGA#list/path=%2Fsharelink3091266325-210474336702130%2FAnki%E5%85%A8%E7%89%88%E6%9C%AC%EF%BC%88%E6%9B%B4%E6%96%B0%E4%B8%AD%EF%BC%89&parentPath=%2Fsharelink3091266325-210474336702130
https://www.zhihu.com/question/336597351