# Tradeoffs

Must consider some tradeoffs when designing a system.

This is the first part when starting a project, because this is where you will pick which tools, definitions, architechtures will be used to develop and serve the product/idea.

## Tradeoffs to think about

Some of the tradeoffs to be thought and considered.

### Scalability vs Complexity

* Raising scalability usually add more complexity.
  * Like using `load balancing`, `horizontal scaling`...

### Consistency vs Availability (CAP theorem)

* In distributed systems, [Broken link](https://kdongs.gitbook.io/kdocs/system-requirements/broken-reference "mention") says that it is impossible to garantee Consistency, Availability and Partition Tolerance (CAP theorem).

### Latency vs Throughput

* Optimizing for low latence (quicker reponse time) may reduce the throughput (amount of work done in a period of time).

### Security vs Usability

* More strict security measures may protect more the system, but also may reduce end user usability.

### Memory storage vs Disk storage

* Memory storage (like caches) will offer quicker access to data, but it is more limited and more costly.
* Disk storage is usually more abundant and cheaper, but with slower access.

<br>

## Stages

### 1. Finding out the Requirements

* To better understand the system we are developing.
* FRs and NFRs. (here)

### 2. Defining the Usecases

* Given the functionalities definined in the FRs, what can the user do with them.
  * How can the user interact with the application.

### 3. Do the Solution Design

* Choosing the tradeoffs.
