
Explore objectives, problem statements, and trade-offs of low-level system design, and develop initial class diagrams, encapsulation, APIs, and robust test cases for interview success.
Design a ride sharing system where drivers offer rides and riders request rides, compute ride amount by distance, seats, and per km rate, and build an extensible OO design.
design the ride booking classes, including ride, person, driver, and rider, with constructors, getters and setters, an enum for ride status, and a fare calculator using a per km rate.
Design the Rider class for booking rides, managing a current ride and a vector of completed rides, with createRide, updateRide, withdrawRide, and closeRide APIs and status checks (created, withdrawn, completed).
Evaluate a ride sharing app through build and run tests in Eclipse, validating create, update, withdraw, and close ride workflows with expected fare results.
Learn to support multiple rides per user by using an allRides list for ongoing and completed rides, while preserving fare calculations.
Design an interactive interface to handle ride requests by calling relevant class functions, enabling create, update, withdraw, and close rides with two or more drivers and riders.
Designs a system interface that mediates rider interactions, tracks drivers and riders, enforces one ride per rider at a time, and exposes create, update, withdraw, and close ride APIs.
Designs a meeting scheduler API that books a room for a given start and end time, returning the booked room name and the meeting history.
Design the meeting class with start, end, and room fields, implement getters for start and end, and use a parameterized constructor with a member initialization list to initialize room.
Implement a scheduler class as a public interface that tracks rooms in a vector and provides a book(start, end) function to reserve an available room or report full.
Apply the core logic to schedule meetings by testing for clashes with existing calendar entries. Enforce the criteria end1 <= start2 or end2 <= start1 to allow scheduling; otherwise reject.
Test the room booking system with Atlas, Nexus, and Holycow using the scheduler to handle slot conflicts and bookings. Verify 'no rooms available' outcomes when all rooms are occupied.
Extend the meeting scheduler from a single day to multi-day bookings by adding an integer day parameter and an added API layer for cross-day time slots in military time.
Extend the application to book meetings across days by introducing a day parameter and per-day storage with an unordered_map, updating Scheduler and Room classes, tests, and calendar logic.
Design a Jira-like task planner with sprints and tasks, including subcategories (story, feature, bug) and a story subtract field, with sprint and task management apis.
Model sprint, task, and user classes from the task planner diagram, with begin and end times, a mandatory name, and a vector of tasks. Implement constructors, addTask, and printDetails.
Implement a Task class with a unique auto-generated id, a user reference, and enums TaskType (Story, Feature, Bug) and TaskStatus (Open, In_Progress, Resolved, Delayed, Completed), plus getters and setters.
Define the user class to manage a user’s tasks and sprints, exposing APIs to create tasks and sprints, add or remove tasks from sprints, print tasks, and update task status.
Design the user class with addToSprint() taking sprint and task references, returning a boolean after verifying ownership. Overload Sprint's == operator to compare begin, end, and name.
Design user class to enable removing tasks from a sprint by handling a const getTasks() getter, using a copied taskList, and adding eraseTask in the Sprint class with id comparisons.
Build, run, and test the APIs by simulating two users creating tasks and sprints, changing task statuses, and validating 0 or 1 outcomes.
Explore a low level system design perspective for bowling, detailing players, scores, frames, strikes and spares, lanes, sessions, and APIs like roll, create session, and declare winner.
Implement the game session by building the GameSession class with a unique id, alley, and a players vector, and add setters, getters, and a declareWinner function.
Design the Game class for a bowling system using an unordered_map. Implement session management with alleys, createSession, roll, declareWinner, and makeActive.
Design the player class by implementing name and score getters and a static MAX_ROLLS_ALLOWED of 23 for the rolls array. Include isStrike, isSpare, roll, and updateScore to manage score.
Design the player class to implement bowling scoring logic with strikes and spares, frame progression, 10th-frame bonuses, and winner determination in low level system design.
Run the code to simulate four players Thor, Loki, Hela, and Odin, perform rolls and scoring, and verify winner declaration and alley occupancy error handling.
Explore low level system design for a multiplayer snakes and ladders game, detailing rules, board layout, turn order, win conditions, and data structures for players and mappings.
Design and implement the base game classes for snakes and ladders, including constructors and getters for snake and ladder, and a player class with unique id, name, and current position.
Define the game class that manages players, current turn, and a winner pointer, with an unordered_map for snakes and ladders, and implement roll and nextPlayer logic.
Test the snakes and ladders code by fixing a pointer error, building, running custom player tests, and planning to continue and rank players after a 100-point finish.
Explore problem definition for building an expense sharing app like Splitwise. Learn split types and balance calculations and review essential classes such as User, Expense, and Splitwise.
Design the User class as part of three classes—the User, Expense, and Splitwise classes—for a splitwise-style app, implementing id, name, userExpenseSheet, totalExpenseSoFar, and helpers like getUniqueId, addToUserExpenseSheet, getters, and printTotalBalance.
design the expense class with an integer id, optional description, a split type (equal, exact, percent), and percent and exact distributions, plus a creditor and defaulters for precise debt tracking.
Designs the Splitwise class with a users vector and a userIds unordered_set, exposing registerUser, addExpense, and printBalanceForAllUsers, while verifyUsers and calculateExpenses enforce validity and balances.
Explore designing a Splitwise class with calculateExpenses handling equal, exact, and percent splits, including a divideEqually routine using truncation and per-head calculations, plus fixes to errors and operator overload.
Explore how to implement Splitwise style expense splitting: iterate defaulters, locate creditors, update expense sheets, and support equal, exact, and percent splits with validation.
Register four users, create expenses with equal, exact, and percent splits, and validate balances and error handling in a Splitwise design.
Optimize code from the ground up by swapping vector for list, unordered_set for unordered_map, and mapping userIds to User addresses to achieve constant-time expense calculations in a Splitwise-like system.
Learn to simplify expenses by reducing transactions and minimizing cash flow, and design an API to compute the minimum expenses after simplification.
Expose an api in the Splitwise class, build a vector of balances, and use a greedy minmax strategy to settle debts between debtors and lenders, simplifying expenses.
Examine designing the facebook comment system, enabling post comments and replies with one-level nesting, editing and deleting, and automatic alignment when deletions occur, with user authorization.
Design the comment class with id, parentId, userId, postId, description, and a nested comments vector. Implement constructor, getters, setters, getUniqueCommentId, and addComment for nesting.
Design the post class with a unique id generated by getUniquePostId, a vector of comments and nested comments, and public APIs to add, edit, and delete comments.
Design the user class to manage a unique id and optional name, and expose APIs to add, reply to, edit, and delete comments on posts, coordinating with the post's methods.
Fix the error in addNestedComment by renaming the local comm variable to avoid confusion with the parameter, then demonstrate adding, replying, editing, and cascading delete of comments on a post.
Design a sales management system that tracks stock and units sold at store, city, state, and all-India levels, with city-based prices and in-memory data structures.
Explore designing the store class with food and beverage inventories, enums for items, unit sold maps, pricing, unique id generation, and purchase operations for food and beverages.
Design the City class by managing a unique city id, shared price maps for food and beverages, and a vector of stores, with constructors, getters, and purchase foods and beverages.
Designs the state class to manage a vector of cities, generate unique ids, expose id and cities getters, add cities, and support purchaseFood and purchaseBeverage by city id.
Design the system class that tracks states (and cities) with a vector, provides addState and purchaseFood/purchaseBeverage APIs using stateId, and includes a debugging getter during refactor to system.
Explore the buy flow by debugging the purchaseFood function, building and running the system, and validating burger inventory, sales tracking, and out-of-stock handling across store, city, and state.
Define a text editor system focusing on data structures and algorithms within a low-level design interview. Implement an in-memory notepad with display, insert, delete, copy, paste, undo, and redo APIs.
Design the Notepad class with an allContent string vector and undo/redo stacks to manage history, exposing constructor, display, insert, Delete, copy, paste, and undo/redo APIs.
Define the Notepad public APIs, including display() and an overloaded print(n, m), with rigorous bounds checks, insertion, deletion, copy, paste, and undo/redo support using stacks.
Build and run the Notepad program, then run custom tests that exercise insert, delete, undo, redo, and copy-paste lines while displaying content and handling redo limits.
Software Engineering interviews focus on the coding and software designing skills in an interview. These are fondly known as Algorithm and Design rounds respectively. The Algorithms round check the raw coding skills of a candidate, by the application of Data Structures and Algorithms mostly practiced in school, while the Design round tests the System design skills, which can be High Level Design [HLD] or Low Level Design [LLD].
Low Level Design is also known as Object Oriented Design [OOD] or Object Oriented Analysis and Design [OOAD]. From interns to Senior Software Engineers, top companies dedicate at least one round in the entire interview process for system design. For candidates having less than 3 years' of experience, Low Level Design plays the most crucial role because these candidates are inexperienced, hence not supposed to have knowledge of High Level Design. Candidates having experience of more than 3 years usually face the system design interviews with a mix of both HLD and LLD.
This course Low Level System Design focuses on the low level aspects of the design. The only way to get better at interviews is by practicing lots of similar problems. In this course, based upon my research, a list of most frequently asked questions in interviews is compiled. Not only is this useful for the interviews, but also for general problem solving and application design.
Every problem is broken down and discussed in a comprehensive manner:
Making the problem statement clear of any ambiguity. Terminologies related to the problem are explained and expectations well laid out.
Class Diagram construction serves as a road map for coding the problem
The coding is done in the most elegant manner such that the users learn to approach the problem top-down. This is important because even if the class diagram is in place, it's imperative to know the sequence of class construction in program, for a smooth experience.
Wherever applicable, the code is optimized further. Trade offs related to optimization are also discussed.
At last, test case construction is shown to make the candidate wary about writing good test cases, and their impact on the application.
All this is done while following industry best practices. Proper time utilization during the interview is also talked about intermittently, and ways to deal with a situation when the candidate is stuck at a problem for a long time. The coding is done in C++ but the code is language agnostic to a great extent.
The course also sports Closed Captions [English Subtitles] for all the videos. They are hand-crafted, not auto-generated. This feature is helpful when the student is having problem with the accent, there's a lot of background noise present, or when you want to make detailed notes from the explanation.
After taking this course, you
Will be in a better place to face LLD interviews.
Can participate in design discussions related to such problems
Write better code than before
Have a proper theater to break the problem into pieces and deal with them independently
Guaranteed Takeaway
If you understand all the problems presented in this course, there won't be any fear of solving LLD questions. You'll be asking the right questions about the problem, and will be confident to jab at any design.