# Topic covered
* When should you start learning System Design?
* High-Level Design (HLD)
* Low-Level Design (LLD)
* Differences Between HLD and LLD
* Macro vs. Micro Architecture and Design
* LLD and HLD Roadmap

The Software Development Life Cycle (SDLC) goes through various phases like requirements analysis, feasibility study, design, coding, testing, etc. Each phase is further divided into tasks with properly defined objectives and results.

Design Analysis is the phase where the actual architecture, working model, and execution process of building a software product is laid down.

Two crucial steps in these phases are High-Level System Design and Low-Level System Design.

3.1 When should you start learning System Design?

3.2 High-Level Design (HLD)

High-Level Design (HLD) provides a comprehensive overview of the software development process along with the system architecture, applications, database management, and complete flowchart of the system and navigation.

It’s a blueprint that consolidates the various steps and modules, their objectives, variable components, results, architecture, and timeline to develop the software. HLD translates a business plan into a software product or service.

3.3 Low-Level Design (LLD)

Low-Level Design (LLD) deals with the planning, coding, and execution of the various components, modules, and steps in the HLD, at an individual level.

Each module in an HLD has a unique LLD document that provides comprehensive details about how the module will be coded, executed, tested for quality, and integrated into the larger program. LLD provides actionable plans by deconstructing HLD components into working solutions.

3.4 Differences Between HLD and LLD

HLD

  • Functional and Non-functional requirement
  • Costing Limitation
  • Trade OFF
    • Scalability
    • Performance
    • Availability
    • Consistency

LLD

  • Machine coding interviews
  • Object Oriented Interviews
  • UML Diagram, Class Diagram, Data Models
  • SOLID Principles

Macro vs. Micro Architecture and Design

HLD is a macro-level design that provides a bird’s eye view of the software development process. It includes diagrams, flowcharts, navigational details, and other technical requirements that will form the crux of the development process.

In addition to flowcharts, diagrams, navigational information, and technical requirements, LLD also has comprehensive information about the step-by-step execution of each component of the HLD. It deals with software development at the micro-level.

Every component of an HLD has a unique LLD document.

Development Chronology

HLD precedes the LLD phase. Once the HLD is in place and approved for execution, work on the individual LLDs can begin. HLD begins once the planning and requirements stages are dealt with and has no other dependencies.

On the other hand, LLD needs to be executed in a particular order. Some modules must await execution until others have been completed.

LLD falls under the Design phase of the SDLC, whereas the HLD falls under the Analysis phase of the SDLC.

Target Audience

HLD documents have the target audience of managers, clients, and software development teams.

Software engineers, coders, testers, and developers working on the project are the target audience for LLD documents.

3.5 LLD and HLD Roadmap

  1. Software Design and Architecture Roadmap: /tags/software-design-roadmap/

  2. UML Diagram: /tags/uml-diagram/

  3. Software Design and Architecture: /tags/software-design/

  4. System Design: /tags/system-design/

# 4. System Design
### WEEK 1
* System Design Introduction
* Client - Server Architecture
* Monolith & Microservices
* gRPC
* Network Protocols
* Proxies

### WEEK 2
* Scalability
  * Horizontal, Vertical Scaling
  * Load Balancers
* Caching
* Asynchronism
  * Message/Task Queues
    * Publisher subscribe model
  * Message Broker
    * PubSub (Kafka, RabbitMQ)

### WEEK 3
* Performance
  * Latency, Throughput, Bandwidth, Response Time
* Consistency, Availability, and Partition Tolerance (CAP)
* CAP Theorem
* Failure & Fault Tolerance


### WEEK 4
* Memory & Storage Systems
  * RAM, ROM, HDD, SSD
* Databases Types
* Database Replication
  * Synchronous replication
  * Asynchronous replication
  * Single-Master Replication
  * Multi-Master Replication
* RAID - Redundant Array of Independent Disks

### WEEK 5
* Database partitioning
    * Vertical partitioning (aka Normalisation)
    * Horizontal partitioning (aka Database Sharding)
* Hashing
    * Consistent hashing

* Specialised Storage Paradigms
* DB Migration
* Indexing
* Service Routing
* Peer to Peer

### WEEK 4

* Capacity Estimation
* Configuration
* Rate Limiting
* Paging & Filtering
* Resiliency
* Logging & Monitoring
* API Design
* Security

### WEEK 5
* End to End example
* Interview Prep Tips

https://github.com/karanpratapsingh/system-design

https://github.com/donnemartin/system-design-primer

Form LLD from HLD

Books

.

# Books
1. DESIGNING DATA INTENSIVE APPLICATIONS

2. System Design Interview – An insider's guide

3. Solutions Architect's Handbook Kick-start your solutions architect career

4. FUNDAMENTALS OF SOFTWARE ARCHITECTURE AN ENGINEERING APPROACH

5. Operating Systems: Three Easy Pieces

Reference