codersguild / System-Design

It's just fascinating. How is modern software designed? 🤔 Some design-level considerations for scalability, maintainability eventual consistency, availability & reliability. 👨‍💻 Interview Prep. 👨‍💻

Home Page:https://codersguild.github.io/System-Design/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

System Design Bytes for Enthusiasts

System Design Discussions

I complied and collected some of the articles as a part of doing CS654A course at IIT Kanpur for a fantastic course on Advanced Software Architecture taught by Prof.Dr.T.V.Prabbhakar.

Modified from Zach system design repository. Added more links and topics to cover on both PS/DS & System Design Interviews. We will keep updating this posting from time to time. Some more awesome resource

How to "think" (and design) like a Software Architect at Silicon Valley Code Camp 2019

Visualising software architecture with the C4 model - Simon Brown, Agile on the Beach 2019

SYSTEM DESIGN IS NOT JUST FOR INTERVIEWS, IT CAN BE HOW YOU MANAGE YOUR LIFE. GIVE IT A THOUGHT

Disclaimer/Acknowledgements

I didn't write the articles myself. I love expanding my understanding of system design complexities and thus read many books, research papers, and articles that enhance my knowledge. I take the opportunity to thank everyone who found this repository useful. I would like to thank all the authors and developers who wrote the articles aggregated in this repository.

More Content Comming !

We are working to create good content to fulfil the needs of system-design noobs. Please feel free to share any resource or material at lahiri.devs@gmail.com.

SWEBOOK & PDFs

All-Time Favourites

How to prepare system design questions?

System design is a very broad topic. Even a software engineer with many years of working experience at a top IT company may not be an expert on system design. If you want to become an expert, you need to read many books, articles, and solve real large scale system design problems.

In order to practice designing a few systems, for the love or learning or preparing for interviews, you can use this practice platform.

This repository only teaches you how to handle the system design interview with a systematic approach in a concise way. You can dive into each topic if you have time. Of course, welcome to add your thoughts!.

Clarify the constraints and identify the user cases

Spend a few minutes questioning the interviewer and agreeing on the scope of the system. Remember to make sure you know all the requirements the interviewer didn't tell you about in the beginning.

User cases indicate the main functions of the system, and constraints list the scale of the system such as requests per second, requests types, data written per second, data read per second.

In a real world scenario, beyond a white-board interview setting one must understand the functional & non-functional requirements of an engineering project.

High-level architecture design

Sketch the important components and the connections between them, but don't go into some details. Usually, a scalable system includes webserver (load balancer), service (service partition), database (primary/secondary database cluster plug cache).

Component design

For each component, you need to write the specific APIs for each component. You may need to finish the detailed OOD design for a particular function. You may also need to design the database schema for the database.

Revist Basic PS/DS & Machine Coding Questions

Basics of OOPs, SOLID Concepts, algorithms and data structures will help a lot in clearing most tof the onsite interviews at large tech companies. Having a habit of solving problems on LeetCode or CodeFoces will definitely help in thinking faster and better in terms of approach to problem solving.

Here are some articles about system design related topics.

Of course, if you want to dive into system related topics, here is a good collection of reading list about services-engineering, and a good collection of material about distributed systems.

If you are going to have an onsite with a company, you should read their engineering blog.

The following papers/articles/slides can help you to understand the general design idea of different real products and systems.

Trends

There are some good references for each question. The references here are slides and articles.

Design a CDN network
Reference:

Design a Google document system
Reference:

Design a random ID generation system
Reference:

Design a key-value database
Reference:

Design the Facebook news feed function
Reference:

Design the Facebook timeline function
Reference:

Design a function to return the top k requests during past time interval
Reference:

Design an online multiplayer card game
Reference:

Design a graph search function
Reference:

Design a picture sharing system
Reference:

Design a search engine
Reference:

Design a recommendation system
Reference:

Design a tinyurl system
Reference:

Design a garbage collection system
Reference:

Design a scalable web crawling system
Reference:

Design the Facebook chat function
Reference:

Design a micro blogging site
Reference:

Design hotel booking platform
Reference:

Design a trending topic system
Reference:

Design a cache system
Reference:

Design LeetCode

Design a Payment System

Basic SRE Reference:

Design a React Native Application Reference :

Numbers from concerte implementations References :

Tips for OOD Interview

Clarify the scenario, write out user cases

Use case is a description of sequences of events that, taken together, lead to a system doing something useful. Who is going to use it and how they are going to use it. The system may be very simple or very complicated.

Special system requirements such as multi-threading, read or write oriented.

Define objects

Map identity to class: one scenario for one class, each core object in this scenario for one class.

Consider the relationships among classes: certain class must have unique instance, one object has many other objects (composition), one object is another object (inheritance).

Identify attributes for each class: change noun to variable and action to methods.

Use design patterns such that it can be reused in multiple applications.

Useful Websites

Distributed System Design

Misc

More Info

Feel free to contact Sumit Lahiri

About

It's just fascinating. How is modern software designed? 🤔 Some design-level considerations for scalability, maintainability eventual consistency, availability & reliability. 👨‍💻 Interview Prep. 👨‍💻

https://codersguild.github.io/System-Design/

License:GNU General Public License v3.0