系统设计爱好者的简短文章
我收集并整理了一些文章,作为在IIT Kanpur攻读CS654A课程的一部分,这是一门由Prof.Dr.T.V.Prabbhakar教授的高级软件架构课程。
修改自Zach的系统设计库。添加了更多的链接和主题,涵盖了PS/DS和系统设计面试。我们将不时更新此帖。更多极好的资源
系统设计不仅仅是面试,它也可以是你管理生活的方式。好好想想
免责声明/致谢
我没有自己写这些文章
。我喜欢扩展对系统设计
复杂性的理解,因此阅读了许多书籍、研究论文和文章来提升我的知识。我借此机会感谢每一位发现此资源库有用的人。我要感谢所有撰写和开发了此资源库中文章的作者和开发者。
更多内容即将到来!
我们正在努力创建优质内容以满足系统设计新手的需求。请随时将任何资源或材料分享到lahiri.devs@gmail.com
。
软件工程知识手册 & PDFs
- http://swebokwiki.org
- https://cs.fit.edu/~kgallagher/Schtick/Serious/SWEBOKv3.pdf
- Aditya Malshikhare的系统设计基础
经典收藏
如何准备系统设计问题?
系统设计是一个非常广泛的话题。即使是一位在顶级IT公司拥有多年工作经验的软件工程师,也可能不是系统设计的专家。如果想成为专家,你需要阅读许多书籍、文章,并解决实际的大规模系统设计问题。
为了练习设计一些系统,无论是为了学习还是准备面试,你可以使用这个练习平台。
这个资源库只教你如何以系统的方式简洁地处理系统设计面试。如果你有时间,可以深入了解每个主题。当然,欢迎添加你的想法!
目录
[⬆] 系统设计面试技巧 & PS/DS
澄清约束条件并识别用例
花几分钟询问面试官并就系统的范围达成共识。 记住要确保了解面试官在一开始没有告诉你的所有要求。
用例表示系统的主要功能,约束条件列出系统的规模,如每秒请求数、请求类型、每秒写入数据量、每秒读取数据量。
在实际情况下,超越白板面试设置的场景中,必须理解工程项目的功能
和非功能
要求。
高级架构设计
绘制重要组件及其之间的连接,但不要进入细节。 通常,一个可扩展的系统包括web服务器(负载均衡器)、服务(服务分区)、数据库(主/从数据库集群加缓存)。
组件设计
对于每个组件,你需要为每个组件编写特定的API。你可能需要完成 特定功能的详细面向对象设计。你还可能需要为数据库设计数据库模式。
重温基本的PS/DS和机器编码问题
面向对象编程的基础知识,SOLID概念,算法和数据结构将大大有助于通过大多数大型科技公司的现场面试。养成在LeetCode或CodeForces上解决问题的习惯,肯定会帮助你在解决问题的方法上思考得更快更好。
[⬆] 系统设计的基本知识:
这里有一些关于系统设计相关主题的文章。
- 混沌工程
- 新栈博客
- CAP定理的图示证明
- Educative.io & 其他列表
- Node清洁架构
- 服务工程资源
- 如何在系统设计面试中大放异彩
- 系统面试
- SE Daily:Fiverr工程师Gil Sheinfeld
- 初级可扩展性
- 可扩展网络架构和分布式系统
- 每个人都应该知道的数字
- 分布式系统的谬误
- Tinder设计
- 可扩展系统设计模式
- 规模架构简介
- 跨数据中心的交易
- CAP定理的平白解释
- CAP常见问题
- Paxos简化
- 简单:一致性哈希
- 更多:一致性哈希
- NoSQL模式
- 新兴架构
- 扩展性、可用性和稳定性模式
- Koinex的简单发布-订阅设计:PushMan
- 网络架构101
- 生产中的测试:棘手的部分
- 分布式跟踪——我们做错了
- 分布式一致性哈希
- 系统设计白板
- 布隆过滤器:一种概率数据结构
- 基础:ML架构
- 设计中的安全
- Netlify的部署和路由基础设施如何工作
- 区块链的基本概述
- 机器学习流水线的架构
- ML参考架构
- 降低数据库成本
- 模式:思考微服务
- 反应式单体 - 如何从CRUD迁移到事件溯源
- Terraform软件
- FreeCodeCamp:DevOps课程
- 必要的一些Linux知识
- 开放源代码系统的架构
- 系统设计的快速ML知识:使用什么?在哪里使用?
- 快速:可观测性和微服务
- 系统设计面试
- 设计微服务
- 破解系统设计面试 - FreeCodeCamp
- 分布式日志简介
- Usenix——Gmail概述
- Jeff Dean谈谷歌的大规模深度学习
- 无限记忆转换器:在不增加计算负担的情况下关注任意长的上下文 来自Telecomunicações研究所的研究人员。
当然,如果你想深入了解系统相关主题,这里有一个关于服务工程的优秀阅读清单,以及关于分布式系统的优秀材料集合。
[⬆] 题外话博客:
- 机器学习系统的架构
- 分布式系统中的工程可靠性和容错性 - @@Ably
- Postman API 测试
- 微服务与小事物的经济学
- 服务网格终极指南 - 第二版:下一代微服务开发
- 云原生架构的采用,第三部分:服务编排和服务网格
[⬆] 公司工程博客:
如果你要与公司进行现场面试,你应该阅读他们的工程博客。
- InfoQ
- High Scalability
- 复杂系统:微服务和人类
- GitHub 博客
- Quora 工程
- Yelp 工程博客
- Twitter 工程
- Facebook 工程
- Yammer 工程
- Etsy 编码即工艺
- Foursquare 工程博客
- Airbnb 工程
- WebEngage 工程博客
- LinkedIn 工程
- Netflix 技术博客
- BankSimple 简单博客
- Square The Corner
- SoundCloud Backstage 博客
- Flickr 代码
- Instagram 工程
- Dropbox 技术博客
- Cloudera 开发者博客
- Bandcamp 技术
- Oyster 技术博客
- REDDIT 博客
- Groupon 工程博客
- Songkick 技术博客
- Google 研究博客
- Pinterest 工程博客
- Twilio 工程博客
- Bitly 工程博客
- Uber 工程博客
- Godaddy 工程
- Splunk 博客
- Coursera 工程博客
- PayPal 工程博客
- Nextdoor 工程博客
- Booking.com 开发博客
- Scalyr 工程博客
- Architect.io 博客
- Ably 工程博客
- DoorDash 工程博客
[⬆] 产品和系统:
以下文献/文章/幻灯片可以帮助你了解不同真实产品和系统的一般设计思路。
- MapReduce: 大规模集群下的简化数据处理
- Bigtable: 一种用于结构化数据的分布式存储系统
- Google 文件系统
- 用于松散耦合分布式系统的 Chubby 锁服务
- Dynamo: 亚马逊的高可用键值存储
- React 前端教程
- 使用 Redux 进行状态管理
- Angular 入门
- 第一个 Django 应用
- 使用 Django 和 React/Redux 构建一个 CRUD 待办应用
- MERN 堆栈教程 - 从头到尾构建一个 React CRUD 应用
- Memcached 简介
- Cassandra 简介与特性
- HBase 简介
- MongoDB 简介
- Redis 简介
- Storm
- Zookeeper 简介
- Kafka
- YouTube 架构
- Pinterest 扩展
- Google 架构
- Twitter 扩展
- WhatsApp 架构
- Flickr 架构
- Amazon 架构
- Stack Overflow 架构
- Pinterest 架构
- Tumblr 架构
- Instagram 架构
- TripAdvisor 架构
- Mailbox 扩展
- Salesforce 架构
- ESPN 架构
- Uber 架构
- DropBox 设计
- Splunk 架构
- AWS 的优点
- Azure 数据中心架构
- 搜索引擎架构的演变 - Highscalability
趋势
[⬆] 热点问题和参考:
以下是每个问题的一些优秀参考文献。这里的参考文献是幻灯片和文章。
设计一个 CDN 网络
参考文献:
设计一个 Google 文档系统
参考文献:
设计一个随机 ID 生成系统
参考文献:
设计一个键值数据库
参考文献:
设计 Facebook 新闻推送功能
参考文献:
设计 Facebook 时间线功能
参考文献:
设计一个函数来返回过去时间间隔内的前 k 个请求
参考文献:
设计一个在线多人卡牌游戏
参考文献:
- 如何创建一个异步多人游戏
- 如何创建一个异步多人游戏第二部分:将游戏状态保存到在线数据库
- 如何创建一个异步多人游戏第三部分:从数据库加载游戏
- 如何创建一个异步多人游戏第四部分:匹配
- HTML5 实时多人游戏
设计一个图搜索功能
参考文献:
设计一个图片分享系统
参考文献:
设计一个搜索引擎
参考文献:
设计一个推荐系统
参考文献:
设计一个 tinyurl 系统
参考文献:
- 大数据系统设计之 tinyurl
- URL 缩短服务 API
- Tiny URL 系统设计
设计一个垃圾回收系统
参考: - Baby's First Garbage Collector
设计一个可扩展的网络爬虫系统
参考:
设计Facebook聊天功能
参考:
设计一个微博客网站
参考:
设计一个酒店预订平台
参考:
设计一个热门话题系统
参考:
- Implementing Real-Time Trending Topics With a Distributed Rolling Count Algorithm in Storm
- Early detection of Twitter trends explained
设计一个缓存系统
参考:
设计LeetCode
设计一个支付系统
基础的SRE 参考:
设计一个React Native应用程序 参考:
从具体实现中获取数字 参考:
[⬆] 好书推荐:
- Big Data: Principles and best practices of scalable realtime data systems
- Real-Time Analytics: Techniques to Analyze and Visualize Streaming Data
- Building Microservices: Designing Fine-Grained Systems
- Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems
- Site Reliability Engineering - How Google Runs Production Systems (English, Paperback, Beyer Betsy)
[⬆] 面向对象设计指南:
面向对象设计面试技巧
阐明场景,写出用例
用例是对事件序列的描述,这些事件共同作用,从而使系统做一些有用的事情。谁将使用它,如何使用它。系统可能非常简单或非常复杂。
特殊系统需求,如多线程、读写导向。
定义对象
将身份映射到类:一个场景对应一个类,这个场景中的每个核心对象对应一个类。
考虑类之间的关系:某些类必须有唯一实例,一个对象拥有许多其他对象(组合),一个对象是另一个对象(继承)。
为每个类识别属性:将名词改为变量,将动作改为方法。
使用设计模式,使其可以在多个应用程序中重用。
有用的网站
- 101 Design Patterns & Tips for Developers
- A Solid Guide to SOLID Principles
- SOLID Design Principles Explained
- SOLID Principles made easy
- Becoming a better developer by using the SOLID design principles by Katerina Trajchevska
- Common System Design Interview Questions
- Common Machine Coding Interview Questions
[⬆] 分布式系统设计:
分布式系统设计
- Basics of Lamport Clocks
- Distributed Consensus : RAFT
- Distributed Consensus : PAXOS
- Two Generals Problem
[⬆] 项目尝试 :
杂项
- Scale like a Pro
- GoLang to Node.Js
- Documenting Software Architecture Decisions
- Choosing the correct storage solutions
更多信息
可随时联系 Sumit Lahiri