Learn Low-Level Design (LLD): A Practical Roadmap

Low-level design (LLD) is the step where you turn a feature into concrete classes, interfaces and methods: which objects exist, what each one is responsible for, how they talk to each other, and how the code behaves under failure and concurrent use. It's also called object-oriented design. LLD is what interviewers test in machine coding and LLD rounds, and it's what separates code that works once from code a team can extend.

This roadmap covers the six skills to learn, in order, and a problem to build at each step.

Updated 17 October 2026


What is low-level design?

High-level design (HLD) decides which components a system has: services, databases, queues, caches. Low-level design decides how each component is built inside.

High-level design (HLD)Low-level design (LLD)
QuestionWhich services and data stores, and how do they connect?Which classes and interfaces, and how do they behave?
OutputArchitecture diagramClass model, interfaces, working code
Typical interview"Design Twitter" on a whiteboard"Build a parking lot / rate limiter" in code
Judged onScale, trade-offs, componentsResponsibilities, extensibility, correctness

Why learn LLD?

The LLD roadmap: six skills in order

1. Object-oriented fundamentals

Encapsulation, abstraction, inheritance and polymorphism, and above all composition over inheritance. Practise modelling a small domain as objects that each own their data and behaviour, instead of one class that does everything.

Build: an employee management system. Small entities, clear ownership, fast lookups.

2. SOLID principles

Use them as a review checklist, not a ritual. Every Cruscible problem starts from a contract interface, which is dependency inversion in practice.

3. Design patterns that actually come up

You don't need all 23 Gang of Four patterns. A handful cover most LLD problems:

PatternUse it when…Where to practise it
StrategyThe algorithm must be swappable at runtimeLoad balancer: four routing algorithms (round-robin, weighted, least-connections and more) behind one interface
StateBehaviour depends on a lifecycle with legal transitionsCircuit breaker (CLOSED → OPEN → HALF_OPEN), cab booking (ride state machine)
ObserverSeveral parts react to one eventExtension exercise: notify listeners when a deployment pipeline changes status
DecoratorYou need to layer behaviour (logging, metrics) around a callExtension exercise: wrap your retry engine calls with logging without changing them
Factory / BuilderObject creation has rules or many optional partsExtension exercise: build validated bookings in railway reservation

Learn each one by recognising the problem it solves, not by memorising its UML.

4. Modelling: just enough UML

A quick class diagram (entities, key fields, relationships) and a sequence sketch of the main flow are enough to plan a 90-minute solution. Spend about 10 minutes here, then code.

5. Concurrency and correctness

This is where most "working" designs fail in practice. Two users book the last seat, a counter is incremented from many threads, a retry fires twice. Learn thread safety, atomic operations, locking and idempotency.

Build:

6. Practise by building and getting graded

Reading designs doesn't build the skill; shipping them does. Work through problems from easy to expert, and treat each as a timed round:

LevelProblemsMain skill
EasyRetry engine, employee managementClean modelling, backoff and jitter
MediumLRU cache, rate limiter, circuit breaker, task queue, parking lotO(1) data structures, state machines, concurrency
HardLoad balancer, URL shortener, cab booking, railway reservationPluggable algorithms, persistence, booking under contention
ExpertDeployment pipeline with rollbackMulti-step workflows with failure recovery

On Cruscible, each problem gives you a contract interface. Your code runs in an isolated container against real PostgreSQL, Redis or a key-value store, and is scored on functional correctness, performance and code quality. Java, Python, Go, Node.js and TypeScript are supported.

Browse all LLD problems →

How to approach any LLD problem

  1. Clarify requirements. List the operations and the rules, and agree on what's out of scope.
  2. Find the entities. Nouns become candidate classes; check each has one clear responsibility.
  3. Define the interfaces first. Method signatures and return types, before any implementation.
  4. Build the main flow end to end. The thinnest version that works.
  5. Harden it. Edge cases, concurrency, failure handling, then the extension the interviewer asks for.

Common mistakes

Frequently asked questions

How long does it take to learn low-level design?

With steady practice, most developers get comfortable with the fundamentals and common patterns in a few weeks. Fluency comes from building ten or more systems end to end.

Which language is best for LLD?

Any object-oriented language works. Java is the most common in LLD interviews and resources, but Python, Go and TypeScript are equally valid if you're faster in them.

Do I need to learn high-level design first?

No. LLD is often easier to start with, because you can practise it in code and check your work. HLD builds on the same thinking at a larger scale.

Is LLD only for senior engineers?

No. Many companies include LLD or machine coding rounds for early-career roles, because it shows how you structure code.


Related: Machine coding round guide · AI-enabled coding interviews · How to practise system design: a roadmap