System Design
Low-Level Design vs High-Level Design: What Interviews Actually Expect
Most candidates walk into a “system design” round with one big question: *Are they going to ask me high-level design (HLD) or low-level design (LLD)?* The co...

Most candidates walk into a “system design” round with one big question: Are they going to ask me high-level design (HLD) or low-level design (LLD)? The confusion is understandable—job descriptions are vague, interviewers use the terms inconsistently, and online resources mix everything together.
This guide breaks down LLD vs HLD from an interviewer's perspective: what each actually means, what depth is expected at different experience levels, and how to structure your answers so you don’t over-design or under-design.
We’ll focus on practical interview expectations, not textbook definitions, and use concrete examples you’re likely to see in a real low level design interview or high level design interview.
What Do Companies Mean by HLD vs LLD?
Before diving into techniques, it’s important to align on vocabulary. Different companies use different terms, but in interviews, HLD vs LLD usually breaks down like this:
High-Level Design (HLD): System Architecture
Scope: System boundaries, major components, data flow, scaling, reliability.
Typical questions:
- “Design Twitter’s news feed.”
- “Design a URL shortener.”
- “Design a ride-sharing system like Uber.”
You’re expected to talk about:
- API endpoints and contracts (at a high level)
- Major services (User Service, Feed Service, Notification Service, etc.)
- Data storage choices (SQL vs NoSQL, caches, queues)
- Inter-service communication (REST, gRPC, messaging)
- Scaling strategies (sharding, load balancing, replication)
- Reliability (failover, retries, idempotency)
You are not expected to write code or talk about class hierarchies in detail.
Low-Level Design (LLD): Detailed Design / Object Modeling
Scope: Classes, interfaces, data models, interactions within a service or module.
Typical questions:
- “Design a parking lot system.”
- “Design a rate limiter library.”
- “Design a notification service within our system.”
- “Design a logging framework.”
You’re expected to talk about:
- Class diagrams and relationships
- Core interfaces and key methods
- Data structures and invariants
- Design patterns (Strategy, Observer, Factory, etc.)
- How to handle extensibility and changes
You’re usually not discussing global system scaling or distributed systems in detail (unless the LLD question is for a distributed component).
How Interviewers Decide: HLD or LLD for Your Level
Most companies roughly align expectations with experience:
- 0–2 years (junior):
- More LLD-style questions
- Focus on clean code, OOP, and basic abstractions
- 2–5 years (mid-level):
- Mix of LLD and smaller-scope HLD
- Design a single service end-to-end
- 5+ years (senior and above):
- Primarily HLD for large systems
- Some LLD for critical components (e.g., rate limiter inside an API gateway)
If you’re unsure what a question is asking, you can clarify early:
“Do you want me to focus more on the high-level system architecture, or go deeper into class design and interfaces?”
That 10-second clarification can save you from spending 20 minutes on the wrong level of detail.
Side-by-Side: HLD vs LLD in an Interview
Let’s take a concrete example: Design a URL shortener (like bit.ly).
How This Looks as a High-Level Design Interview
You’d focus on:
-
APIs
POST /shorten→ returns short URLGET /{shortCode}→ redirects to original URL
-
Components
- API Gateway
- URL Shortening Service
- Data Store (for mapping short code → long URL)
- Cache (for hot URLs)
- Analytics/Logging Service
- Background jobs (for cleanup, expiration)
-
Key design decisions
- How to generate unique short codes at scale (hashing, base62, ID generators)
- SQL vs NoSQL for storing mappings
- Using a cache (Redis) to reduce DB load
- Handling high read traffic (CDN, replication)
- Basic fault tolerance and monitoring
You’d likely draw a system diagram with boxes and arrows, and talk about scale (e.g., 100M URLs, 1B redirects/day). This aligns well with the The Ultimate System Design Roadmap: 120 Topics to Master Every Interview which covers key concepts in high level design.
How This Looks as a Low-Level Design Interview
Same problem, but scoped differently:
“Design the core library for generating and managing short URLs. Assume this will be used within a service; focus on classes, interfaces, and extensibility.”
You’d focus on:
-
Classes and interfaces
UrlShortenerServiceCodeGenerator(interface, with implementations)UrlRepository(interface for persistence)UrlValidatorRateLimiter(maybe, if within scope)
-
Key methods
String shorten(String longUrl)Optional<String> resolve(String shortCode)String generateCode(Long id)
-
Patterns
- Strategy pattern for code generation algorithms
- Repository pattern for persistence
- Possibly Decorator for adding caching
-
Data structures
- Use of maps, sets, queues where applicable
- Invariants like uniqueness of codes
This kind of detailed design and pattern usage is similar to what you’d find in Master Design Patterns: 2 templates for Coding Interviews, which helps prepare for LLD questions focusing on design patterns.
Visual: Comparing HLD vs LLD Focus

How to Approach a High-Level Design Interview
A good high level design interview answer is structured, scoped, and iterative. Here’s a reliable template.
Step 1: Clarify Requirements and Constraints
Ask questions to narrow the problem:
- Functional:
- Who are the users?
- What are the core operations?
- Any strict latency requirements?
- Non-functional:
- Scale: QPS, data size, traffic patterns
- Availability and consistency needs
- Latency vs throughput trade-offs
This is where you demonstrate product thinking and system design expectations awareness.
Step 2: Define APIs and High-Level Use Cases
Outline main APIs and user flows:
- REST endpoints with request/response shapes
- Synchronous vs asynchronous flows
- Basic error handling and status codes
You don’t need every parameter, but enough to show you understand the contract.
Step 3: Propose a High-Level Architecture
Draw and explain:
- Clients → API Gateway → Services
- Databases and caches
- Message queues / streams
- External dependencies (payment gateways, third-party APIs)
Talk through data flow for a key use case:
“When a user posts a tweet, the request hits the API gateway, goes to the Tweet Service, which stores the tweet in a primary DB, publishes an event to Kafka, and the Fanout Service consumes that to update followers’ timelines…”
Step 4: Dive into Data Modeling
Briefly outline:
- Core entities and relationships
- Choice of SQL vs NoSQL
- Partitioning/sharding strategy (if relevant)
- Indexing and query patterns
You don’t need full schemas, but show awareness of access patterns.
Step 5: Address Scale, Reliability, and Trade-Offs
This is where seniority shows:
- Caching strategy (what, where, and invalidation)
- Rate limiting and backpressure
- Replication and failover
- Idempotency and retries
- Consistency vs availability decisions
You don’t need to cover everything; prioritize based on the problem. For example, for a payments system, consistency beats eventual convergence.
How to Approach a Low-Level Design Interview
A strong low level design interview answer is about modeling, abstractions, and code-level reasoning.
Step 1: Clarify Scope and Requirements
For “Design a parking lot”:
- Is it multi-level?
- Do we support different vehicle types?
- Do we need billing logic?
- Is concurrency in scope (multiple entry/exit gates)?
Clarify what to exclude to avoid getting lost.
Step 2: Identify Core Entities and Operations
List nouns and verbs:
- Entities: ParkingLot, Floor, Slot, Vehicle, Ticket, Payment
- Operations: park, unpark, findSlot, calculateFee, getStatus
This becomes the basis for your classes and methods.
Step 3: Define Classes, Interfaces, and Relationships
Think in terms of responsibilities and collaboration.
For a simplified parking lot:
JAVA
You’re demonstrating:
- Cohesive classes with clear responsibilities
- Use of interfaces for extensibility (
FeeStrategy) - Reasonable data structures (
Mapfor active tickets)
Step 4: Discuss Design Patterns and Extensibility
Explain why you chose certain patterns:
- Strategy for pluggable fee calculation
- Factory if you need configurable creation logic
- Observer if you notify external systems on events (e.g., “lot full”)
Interviewers care less about naming patterns and more about thinking in abstractions.
Step 5: Consider Edge Cases and Constraints
For LLD, this often includes:
- Concurrency (multiple threads calling
park/unpark) - Error handling (no slots available, invalid ticket)
- Persistence (how would you store/recover state, conceptually)
- Testing strategy (how you’d unit test core components)
You don’t need to implement everything, but you should mention how you’d handle these concerns.
Visual: LLD Flow Within an HLD Context

Common Mistakes in System Design Interviews (HLD & LLD)
1. Mixing HLD and LLD Randomly
- In an HLD round: spending 15 minutes on class names and method signatures.
- In an LLD round: drawing distributed system diagrams and talking about Kafka for a simple library.
Fix: Ask the interviewer what level they care about, and stick to it. If you need to go deeper, they’ll ask.
2. Jumping into Solutions Without Clarifying Requirements
- For HLD: Designing a super-scalable system without asking about scale.
- For LLD: Modeling a complex hierarchy without understanding supported features.
Fix: Spend the first 3–5 minutes clarifying requirements and constraints. This is not optional; it’s part of the evaluation.
3. Over-Engineering
- Adding Kafka, Redis, and microservices for a simple CRUD app.
- Adding 10 interfaces and 5 patterns for a small module.
Fix: Start simple, then say: “If we need to support X in the future, I’d extend the design like this…” Interviewers value evolutionary design.
4. Ignoring Trade-Offs
- Saying “We’ll use NoSQL” without explaining why.
- Choosing inheritance over composition without justification.
Fix: For every major decision, briefly mention at least one alternative and why you didn’t choose it.
5. Poor Communication and Structure
- Thinking silently and then dumping a design.
- Not narrating trade-offs.
- Not checking in with the interviewer.
Fix: Treat the interview as a collaborative design session. Talk, draw, ask, adjust.
Best Practices for High-Level Design Interviews
1. Use a Consistent Framework
A simple, repeatable structure:
- Requirements (functional + non-functional)
- API & high-level use cases
- High-level architecture (components & data flow)
- Data model & storage choices
- Scale & reliability (caching, sharding, fault tolerance)
- Deep dive into one or two critical paths
You don’t have to follow this rigidly, but it gives you a baseline.
2. Quantify When Possible
Even rough numbers show maturity:
- “Let’s assume 10M DAU, 100M posts/day, average post size 1KB…”
- “So we’re storing ~100GB/day of data, or ~36TB/year before replication.”
This leads naturally into decisions about storage, partitioning, and caching.
3. Make Trade-Offs Explicit
Use phrases like:
- “We could do X or Y. X gives us lower latency but weaker consistency; Y gives us stronger consistency but higher write latency. Given this is a payments system, I’d choose Y.”
- “Starting as a monolith is simpler; we can extract the feed generation into a separate service once we hit scale X.”
This is exactly what system design expectations look like for mid-level and senior roles.
Best Practices for Low-Level Design Interviews
1. Start With the Domain Model
Write down:
- Key entities (nouns)
- Key operations (verbs)
- Relationships (one-to-many, many-to-many)
Then map that to classes and interfaces. This avoids “class soup” with no clear responsibilities.
2. Favor Composition Over Deep Inheritance
Instead of:
JAVA
Prefer:
JAVA
You’ll be asked how to add new behaviors; composition makes that easier.
3. Use Interfaces to Isolate Change
Examples:
Storageinterface withsave,loadmethods → implementations for in-memory, SQL, NoSQL.NotificationChannelinterface → Email, SMS, Push.
This shows you understand extensibility and testability.
4. Talk About Complexity Where Relevant
If you design a rate limiter:
- Mention data structures (e.g., sliding window using deque)
- Time complexity of
allowRequest() - Space complexity relative to QPS and window size
You don’t need full proofs, just awareness.
Example: LLD for a Token Bucket Rate Limiter
This is a common LLD-style question (also sometimes appears as a deep dive in HLD).
Requirements
- Allow up to N requests per second (configurable).
- If the bucket is empty, reject or delay requests.
- Support multiple clients (identified by key).
- Thread-safe in a single process (distributed can be “future work”).
Design
Core idea: Token Bucket algorithm.
JAVA
For multiple clients:
JAVA
You’d then discuss:
- Thread safety (
synchronizedonTokenBucket, concurrent map) - Potential memory growth (LRU eviction for inactive clients)
- How to extend to distributed (Redis + Lua scripts, etc.)
This is exactly the kind of depth expected in a low level design interview.
Visual: Step-by-Step Design Flow

How to Practice Effectively
You can’t cram system design in a week, but you can practice the process.
- Pick a problem (e.g., “Design a food delivery app”).
- First, do an HLD pass:
- Requirements, APIs, components, data, scale, trade-offs.
- Then, choose one component (e.g., “Order Management Service”) and do an LLD pass:
- Classes, interfaces, patterns, data structures.
This “zoom in / zoom out” practice builds the exact skill interviewers look for: moving comfortably between HLD and LLD.
If you’re already doing DSA prep, you can complement that with structured system design practice and mock interviews. Tools like Thita’s AI Interview Practice: Free Mock Interview Simulator with Real-Time Feedback for Technical Interviews and Master Design Patterns: 2 templates for Coding Interviews can help you simulate both algorithmic and design rounds with targeted feedback.
Key Takeaways: What Interviews Actually Expect
-
HLD vs LLD is mostly about level of abstraction:
- HLD: systems, services, data flow, scale, reliability.
- LLD: classes, interfaces, data structures, patterns.
-
Clarify scope early:
- Ask whether the interviewer wants architecture (HLD) or object design (LLD).
- Confirm assumptions and constraints up front.
-
Use structure, not heroics:
- For HLD: requirements → APIs → architecture → data → scale → trade-offs.
- For LLD: requirements → entities/operations → classes → patterns → edge cases.
-
Don’t over- or under-design:
- Start simple, then discuss how you’d evolve the design as requirements grow.
-
Think and speak in trade-offs:
- Technology choices, patterns, and modeling decisions should all be justified.
If you internalize these patterns and practice them out loud, both high level design interviews and low level design interviews become far more predictable—and much less intimidating.