# Step By Step Guide

**Step 1: Understand the Problem**

**Ask Clarifying Questions:** Start by asking questions to fully understand the requirements and scope of the problem. This shows your interviewer that you are thorough and detail-oriented.

**Example**: Are we designing this system for a global audience or a specific region?

{% hint style="info" %}
**Tips:**

* **Don't Rush:** Take your time to understand the problem fully before diving into the solution.
* **Focus on Requirements:** Ensure you know what the interviewer expects in terms of functionality and performance.
* **Engage with the Interviewer:** Show your interest and thoughtfulness by asking relevant questions.
  {% endhint %}

***

**Step 2: Define the Scope and Requirements**

**Functional Requirements:** Identify the core functionalities the system must have.

**Example**: The system should handle user authentication, data storage, and real-time updates.

**Non-Functional Requirements:** Determine performance, scalability, and reliability needs.

**Example**: The system should support up to 1 million concurrent users with 99.99% uptime.

{% hint style="info" %}
**Tips:**

* **Prioritize Requirements:** Focus on the most critical requirements first.
* **Be Specific:** Clearly define both functional and non-functional requirements.
* **Balance Needs:** Consider both user needs and technical constraints.
  {% endhint %}

***

**Step 3: Envelope Calculations**

**Estimate Load:** Calculate the expected load on the system based on the number of users and their interactions.

**Example**: Assume 1 million daily active users, each making an average of 10 requests per day, resulting in 10 million requests daily.

**Data Storage Requirements:** Estimate how much data will be stored and processed.

**Example**: If each request generates 1 KB of data, we need to store approximately 10 GB of data daily.

**Bandwidth Requirements:** Calculate the bandwidth needed to handle data transfer.

**Example**: With each request/response being 1 KB, we need a bandwidth of around 10 GB per day.

{% hint style="info" %}
**Tips:**

* **Be Realistic:** Use realistic assumptions and data for calculations.
* **Document Assumptions:** Clearly state any assumptions you make during calculations.
* **Prepare for Questions:** Be ready to explain and justify your calculations.
  {% endhint %}

***

**Step 4: High-Level System Design**

**Draw the Architecture:** Create a high-level diagram of the system architecture. Include key components like databases, servers, and external services.

**Example**: We'll use a microservices architecture with load balancers, a distributed database, and a CDN for content delivery.

**Explain Your Choices:** Justify the technologies and patterns you’ve chosen.

**Example**: We’re using microservices for better scalability and maintainability.

{% hint style="info" %}
**Tips:**

* **Keep It Simple:** Start with a simple design and add complexity as needed.
* **Use Standard Symbols:** Make sure your diagrams are clear and easy to understand.
* **Communicate Clearly:** Explain your thought process and choices to the interviewer.
  {% endhint %}

***

**Step 5: Detailed Component Design**

**Focus on Key Components:** Dive deeper into the design of crucial parts of the system.

**Example**: For user authentication, we’ll implement OAuth 2.0 with JWT tokens.

**Data Models:** Define the data schema and storage mechanisms.

**Example**: We'll use a relational database for transactional data and a NoSQL database for user sessions.

{% hint style="info" %}
**Tips:**

* **Modular Approach:** Break down the system into smaller, manageable components.
* **Consider Alternatives:** Discuss different design options and their trade-offs.
* **Ensure Consistency:** Keep data models and design patterns consistent across components.
  {% endhint %}

***

**Step 6: Scalability and Reliability**

**Handling Traffic:** Discuss strategies for scaling the system.

**Example**: We'll use auto-scaling groups and a global load balancer to handle traffic spikes.

**Fault Tolerance:** Explain how the system will handle failures.

**Example**: We’ll implement redundancy with multiple data centers and use a backup and restore strategy for data recovery.

{% hint style="info" %}
**Tips:**

* **Plan for Growth:** Design the system to handle increasing loads over time.
* **Redundancy is Key:** Implement redundancy to ensure high availability.
* **Use Proven Solutions:** Apply industry best practices for scalability and reliability.
  {% endhint %}

***

**Step 7: Security Considerations**

**Data Protection:** Talk about securing data in transit and at rest.

**Example**: We'll use SSL/TLS for data in transit and AES encryption for data at rest.

**Access Controls:** Describe how you'll manage user permissions and roles.

**Example**: We'll implement role-based access control (RBAC) to restrict access based on user roles.

{% hint style="info" %}
**Tips:**

* **Think Like an Attacker:** Identify potential vulnerabilities and threats.
* **Use Encryption:** Always encrypt sensitive data, both in transit and at rest.
* **Limit Access:** Apply the principle of least privilege to minimize risks.
  {% endhint %}

***

**Step 8: Monitoring and Maintenance**

**Monitoring Tools:** Explain how you’ll monitor the system's health and performance.

**Example**: We'll use Prometheus and Grafana for monitoring metrics and setting up alerts.

**Maintenance Plan:** Discuss how you’ll handle updates and maintenance without downtime.

**Example**: We'll use blue-green deployment for zero-downtime updates.

{% hint style="info" %}
**Tips:**

* **Automate Monitoring:** Use automated tools to track system performance and detect issues.
* **Proactive Maintenance:** Plan regular maintenance to prevent issues before they occur.
* **Stay Informed:** Keep up with the latest best practices and tools for monitoring and maintenance.
  {% endhint %}

***

**Step 9: Trade-offs and Considerations**

**Discuss Alternatives:** Mention any alternative solutions and why you chose your approach.

**Example**: We considered using a monolithic architecture but opted for microservices for better scalability.

**Acknowledge Trade-offs:** Be honest about the trade-offs of your design.

**Example**: While microservices offer scalability, they also introduce complexity in terms of communication and monitoring.

{% hint style="info" %}
**Tips:**

* **Be Honest:** Clearly explain the trade-offs and why you made certain decisions.
* **Balance Needs:** Consider all aspects, including performance, cost, and complexity.
* **Be Open:** Show that you are open to feedback and willing to adjust your design if needed.
  {% endhint %}

{% file src="/files/e8VKKIfnycTjHSiBo6au" %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://blog.sunilgudivada.dev/notebook/system-design/step-by-step-guide.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
