Designing (Mostly Improbable) Systems

6 min read

The Whole Story

Look, we've all been there - throwing hours into prepping for those system design interviews, churning through tutorial after tutorial only to realize, post-interview, that you're unlikely to use half of those learnings in your daily work. Don't get me wrong, it's critical know-how, but it skews towards the interview prep, deficit in the pure joy of learning.

So here's the deal. I decided to take a different approach with this blog series - "Blueprinting Improbables". Rather than focusing on what's needed to ace those interviews, it's going to be about me venturing into the fine art of designing complex systems. It's more of a personal journey, sharing the systems I create with you folks. I'm not saying it won't help you prep for interviews, but the primary focus? It's learning and understanding - no strings attached.

Now, for the geeky details. I'll be tinkering with around 28 different systems, each offering its share of challenges. To keep it interesting and versatile, I'll be using varying languages like Golang, Java, who knows maybe Python too if it's a good fit. Trust me, variety is the spice of coding.

Each system comes with a 2-week expiration date. From ideation to execution, I'll aim to wrap each up within this timeframe. During this roller coaster of a ride, I would also attempt to document the process - the highs of seamless development and, of course, inevitable challenges. Expect hand-drawn sketches or polished diagrams (and yeah GitHub links too).

Systems in the pipeline:

  1. Unique ID Generator (Go): Picture Twitter's Snowflake. The goal is to spit out unique, time-sorted IDs at a staggering rate of 1,000 per second with negligible collision chances.

  2. URL Shortener (Go): The noble mission here is reducing exceedingly long URLs to something short, sweet, and easy to remember.

  3. Authentication System (Java): A system that keeps track of users, their credentials, and ensures secure access to applications and services.

  4. Throttling Service (Go): Your go-to buddy to regulate and limit the number of requests coming in from clients, preventing overwhelming of your systems.

  5. API Versioning Service (Java): A handy system to handle different versions of your APIs, allowing you to gracefully introduce updates and maintain backward compatibility.

  6. Pagination Service (Java): Tackle those huge datasets efficiently by implementing a service that organizes and returns data in smaller, more manageable chunks.

  7. Search Autocomplete System (Java): Ever wondered how search engines predict and suggest things as you type? Get a glimpse into the magic of search autocomplete systems.

  8. Rate Limiter (Go): Prevent abusive traffic and ensure fair usage of your services with a rate limiter that lets you set and enforce limits on request rates.

  9. Fault-Tolerant Logging Service (Java): Build a logging system that can handle failures gracefully and ensure important log data is not lost during system crashes or errors.

  10. Caching System (Go): Speed up your applications by introducing a caching system that stores frequently accessed data and serves it up quickly, reducing the load on your primary data sources.

  11. Job Scheduler (Go): Develop a system that intelligently schedules and executes jobs or tasks at specified times or based on certain triggers, helping automate various processes.

  12. Load Balancing Service (Go): Distribute incoming network traffic across multiple servers to prevent overload on any single server, ensuring efficient utilization and scalability.

  13. A/B Testing System (Java): Explore the world of A/B testing by building a system that enables you to test different versions of a feature or design to determine its impact on user behavior and metrics.

  14. Feature Flagging Service (Java): Implement a feature flagging system that allows you to toggle specific features on or off dynamically, giving you control over feature releases and rollbacks.

  15. Distributed Task Queue (Go): Design a distributed task queue that can handle large volumes of asynchronous jobs or tasks, ensuring smooth task management and execution across multiple workers.

  16. Real-Time Analytics System (Go): Create a system that collects, processes, and analyzes data in real-time, providing insights and visualizations for monitoring and decision-making purposes.

  17. Real-Time Notification System (Go): Develop a system that delivers real-time notifications or messages to users or subscribers, enabling instant updates and communication.

  18. Security Auditing System (Java): Dive into the fascinating world of security by building a system that audits and monitors potential security vulnerabilities or threats within your applications and infrastructure.

  19. API Gateway Service (Go): Construct an API gateway that acts as a unified entry point for multiple services, handling authentication, traffic routing, and other common functionalities.

  20. Distributed Message Queue (Go): Explore the power of message queuing systems by designing a distributed solution that allows seamless communication and data exchange between distributed components.

  21. Leaderboard System (Java): Create a leaderboard system that keeps track of scores or rankings in a game or competition, allowing players to see their standings and fostering healthy competition.

  22. Payment Gateway (Java): Build a payment gateway integration system that facilitates secure and seamless online payments, supporting different payment methods and ensuring reliable transactions.

  23. Geo-distributed Storage System (Go): Design a distributed storage system that spans multiple geographical locations, providing reliable data storage and retrieval for global applications.

  24. Distributed Database System (Go): Delve into the complexities of distributed databases by developing a system that replicates and synchronizes data across multiple nodes, providing high availability and scalability.

  25. Distributed Synchronization Service (Go): Implement a distributed synchronization service that allows multiple processes or systems to coordinate and work together efficiently, ensuring consistency and avoiding conflicts.

  26. Event Streaming or Message Brokering Service (Go): Explore the power of event-driven architectures by building a system that effectively streams or delivers messages between different microservices or components within your system.

  27. OTP Generation System (Java): Create a robust OTP (One-Time Password) generation system that generates secure passwords for user verification or authentication purposes.

  28. Distributed Email Service (Go): Set up an email service that can handle large volumes of outgoing emails in a distributed manner, ensuring successful delivery and reliable email communication.

In each blog, I'll dive headfirst into the chosen system's nitty-gritty, sharing my takeaways and hiccups along the way. Remember, it's not just a blog. It's a journey, where I learn, create, and share, hoping you too will find some pearls of wisdom, or at least, have a great read. What's more? Each system design would be backed by a GitHub repository. So, welcome aboard my friends! Let’s do this together!