System Design#
Learn how to design scalable, reliable, and maintainable software systems. This path covers the building blocks of distributed systems and the patterns used to combine them.
Sections#
- Fundamentals — client-server, latency, throughput, availability, SLAs, back-of-the-envelope math
- Networking and Protocols — DNS, HTTP, TCP/UDP, WebSockets, REST vs gRPC
- Load Balancing — algorithms, L4 vs L7, health checks, DNS-based, sticky sessions
- Caching — strategies, invalidation, CDNs, Redis patterns, cache stampede
- Databases at Scale — replication, sharding, partitioning, read replicas, connection pooling
- Message Queues and Async — pub/sub, event-driven architecture, Kafka, SQS, backpressure
- Microservices — service boundaries, communication, data ownership, saga pattern, service mesh
- Storage and CDNs — object storage, block storage, file systems, CDN edge caching
- Reliability and Resilience — fault tolerance, circuit breakers, retries, bulkheads, chaos engineering
- Observability — metrics, logs, traces, alerting, SLOs/SLIs, dashboards
Prerequisites#
- Basic programming in any language
- Understanding of databases (SQL and NoSQL concepts)
- Familiarity with networking basics (HTTP, DNS, TCP)
What You’ll Be Able To Do#
- Design systems that handle millions of users
- Make informed tradeoffs between consistency, availability, and partition tolerance
- Choose appropriate technologies for specific requirements
- Communicate architecture decisions clearly in design documents and interviews