Ultimate Low-Level Design (LLD) Interview Roadmap
A complete learning path from OOP basics to expert-level design patterns
☰ Jump to section
Low-Level Design (LLD) is the art of designing the internal structure of a software system - the classes, interfaces, methods, relationships, and design patterns that make a feature correct, maintainable, and easy to extend as requirements change. Where High-Level Design asks "what services do we need and how do they talk to each other," LLD asks "what does the code inside one of those services actually look like."
This roadmap takes you from OOP fundamentals to a repeatable framework for solving any LLD interview problem. It is organized as five phases, each building on the last. Work through them in order, and pair the reading with actual practice - LLD is a skill you build with your hands, not one you absorb by reading alone.
Practice as you learn: LLDCanvas gives you a UML canvas with 23 pre-wired design pattern templates and 110+ practice problems, so you can go from concept to working class diagram in the same sitting.
01Phase 1: OOP Fundamentals
Every design pattern and every SOLID principle is ultimately an application of four core ideas. If these are shaky, everything built on top of them will be too.
- Encapsulation - Bundle data and behavior together, and hide implementation details behind a controlled interface.
- Abstraction - Expose what a component does while hiding how it does it.
- Inheritance - Model "is-a" relationships between classes.
- Polymorphism - Let the same interface produce different behavior depending on the underlying type.
Encapsulation is the one interview candidates skip most often - they expose raw fields with public getters and setters and call it a day. Real encapsulation means the object protects its own invariants:
// Good: encapsulated with controlled access and enforced invariants
public class BankAccount {
private double balance;
public void deposit(double amount) {
if (amount <= 0) {
throw new IllegalArgumentException("Amount must be positive");
}
this.balance += amount;
}
public void withdraw(double amount) {
if (amount <= 0 || amount > balance) {
throw new IllegalArgumentException("Invalid withdrawal amount");
}
this.balance -= amount;
}
public double getBalance() {
return balance;
}
}Notice there is no setBalance(). The balance can only change through methods that enforce business rules - that is the difference between a data bag and a properly encapsulated object.
02Phase 2: SOLID Principles
SOLID is not a checklist to recite - it is a set of pressure-tests you apply to a class diagram. When an interviewer asks "why did you split this into two classes," a SOLID principle is usually the correct answer.
| Principle | One-line Summary | Full Note |
|---|---|---|
| Single Responsibility | One class, one reason to change | Read note |
| Open/Closed | Open for extension, closed for modification | Read note |
| Liskov Substitution | A subclass must be usable anywhere its parent is used, without surprises | Read note |
| Interface Segregation | Prefer several small, focused interfaces over one fat interface | Read note |
| Dependency Inversion | Depend on abstractions, not concrete implementations | Read note |
In practice, most LLD interview failures trace back to violating just two of these: Single Responsibility (a PaymentService that also sends emails and logs analytics) and Dependency Inversion (a class that news up its own dependencies instead of accepting them through the constructor).
03Phase 3: Design Patterns
Patterns are named solutions to recurring design problems. You do not need to memorize all 23 Gang-of-Four patterns before an interview, but you should be able to recognize the handful that show up constantly and implement them from memory.
Creational Patterns
Singleton guarantees exactly one instance of a class exists, with a single global access point. It shows up whenever you model a shared resource like a database connection pool or a configuration registry.
public class DatabaseConnection {
private static volatile DatabaseConnection instance;
private DatabaseConnection() {
// private constructor prevents external instantiation
}
public static DatabaseConnection getInstance() {
if (instance == null) {
synchronized (DatabaseConnection.class) {
if (instance == null) {
instance = new DatabaseConnection();
}
}
}
return instance;
}
}The double-checked locking above avoids paying a synchronization cost on every call after the instance is created - a detail interviewers love to probe on when you say "just make it thread-safe."
- Factory Method - Let subclasses decide which concrete class to instantiate.
- Builder - Construct a complex object step by step, useful when a constructor would otherwise need ten optional parameters.
Structural Patterns
- Decorator - Attach new behavior to an object at runtime without subclassing it.
- Facade - Offer a simplified interface over a complex subsystem.
- Composite - Treat individual objects and compositions of objects uniformly, ideal for tree-shaped data like a file system or a UI layout.
Behavioral Patterns
Observer defines a one-to-many dependency so that when one object changes state, all its dependents are notified automatically. It is the backbone of event systems, pub/sub, and UI state management.
public interface Observer {
void update(Event event);
}
public class EventBus {
private final Map<String, List<Observer>> subscribers = new HashMap<>();
public void subscribe(String eventType, Observer observer) {
subscribers.computeIfAbsent(eventType, k -> new ArrayList<>()).add(observer);
}
public void publish(String eventType, Event data) {
subscribers.getOrDefault(eventType, List.of())
.forEach(observer -> observer.update(data));
}
}- Strategy - Make an algorithm swappable at runtime by encapsulating each variant behind a common interface.
- Command - Encapsulate a request (and its undo logic) as a standalone object.
- State - Let an object change its behavior when its internal state changes, replacing sprawling conditional logic with state classes.
Struggling to remember which pattern fits which problem? LLDCanvas's pattern templates let you drag a pattern onto the canvas and see its class structure pre-wired, so you learn the shape by using it.
04Phase 4: The LLD Problem-Solving Framework
Interviewers are not grading whether you know every pattern - they are grading whether you can go from a vague prompt ("design a parking lot") to a coherent class diagram in 30-40 minutes without freezing. A repeatable framework removes the guesswork about what to do next.
- Clarify requirements (2 min) - What types of entities exist? What operations must the system support? What is explicitly out of scope?
- Identify core entities (3 min) - The nouns in the requirements usually become your classes:
Vehicle,ParkingSpot,Ticket,PaymentProcessor. - Define relationships (3 min) - Work out has-a, belongs-to, and implements relationships between the entities you just listed.
- Identify applicable design patterns (5 min) - Does a Strategy fit the pricing logic? Does a Factory fit spot allocation? Don't force a pattern where a plain class will do.
- Write the class structure (15 min) - Start with interfaces and abstract classes to lock in the contracts, then fill in concrete implementations.
- Handle edge cases (5 min) - Concurrency (two cars claiming the same spot), null checks, validation, and what happens when capacity is exceeded.
Timeboxing each step matters as much as the step itself. Candidates who skip step 1 and jump straight to code almost always have to backtrack once the interviewer clarifies a requirement they assumed incorrectly.
05Phase 5: Practice Problems by Difficulty
Reading about patterns builds recognition; solving problems builds recall under pressure. Work through the tiers below in order - each tier introduces a new wrinkle (concurrency, state machines, multi-actor systems) on top of the fundamentals from the previous one.
Easy
- Parking Lot - entity modeling and simple allocation strategy
- Vending Machine - a clean introduction to the State pattern
- Library Management - relationships and basic inventory tracking
Medium
- LRU Cache - data structure design under strict time-complexity constraints
- Elevator System - scheduling logic and concurrent requests
- Hotel Booking - inventory management with date-range overlaps
- ATM Machine - State pattern plus transactional integrity
Hard
- Splitwise - graph-based debt simplification across multiple actors
- Chess Game - complex rule validation and move-generation logic
- Stock Exchange - order matching and high-concurrency correctness
06Conclusion
LLD mastery rests on three things: deeply understanding OOP principles, internalizing patterns until you reach for them instinctively rather than by memorized checklist, and practicing enough problems that entity identification becomes automatic instead of a source of interview anxiety.
Follow this roadmap in order, keep the practice cadence consistent, and most engineers find they are solving LLD problems with real confidence within four to eight weeks.
Ready to put this roadmap into practice? Head to LLDCanvas's problem set and start with an Easy problem today - the fastest way to internalize a framework is to use it under a timer.
Frequently Asked Questions
ALLD focuses on the detailed design of a software component - class structure, interfaces, design patterns, and object relationships.
LLDCanvas Team
Engineering at LLDCanvas
Ready to practice?
Turn reading into results
110+ LLD interview questions, a live canvas, and timed Interview Mode.
Reader’s Notes (0)
Sign in to join the discussion
Sign inLoading notes…