# System Design Basics

Things to consider when designing a large system:

1. What are different architectural pieces that can be used?
1. How do these pieces work/interact with each other?
1. How can we best utilize these pieces, what are the right tradeoffs?

While investing in scaling ahead of time may not make business sense, it is important to think about it from the design perspective to save time and resources in the future, and to prevent the need for major redesign.

Some concepts that are useful in distributed systems: Consistent Hashing, CAP Theorem, Load Balancing, Caching, Data Partitioning, Indexes, Proxies, Queues, Replication, and choosing between SQL vs. NoSQL.
