Review these System Design Interview Questions page by page. Expand each answer when you are ready to self-check.
10 questions • 10 per page
Reviewed by:microstudy.ai editorial teamUpdated:
How to use this page
This System Design Interview Questions page is built for active interview practice, not passive scrolling. Read each prompt, answer it in your own words, then open the sample answer to compare structure, specificity, and business context.
The first page gives you 10 ready-to-practice questions and starts with prompts such as How do you answer a system design interview question step by step?; How would you design a URL shortener in a system design interview?; How do you design a rate limiter for a high-traffic API?. Use them to tighten your examples, remove vague filler, and rehearse a clearer answer flow before a real interview.
How do you answer a system design interview question step by step?
How would you design a URL shortener in a system design interview?
How do you design a rate limiter for a high-traffic API?
If you are short on time, work through the first page twice: once from memory and once with the answers open. That gives you a fast active-recall loop instead of a thin reading session.
Page 1 of 1
Question 1
How do you answer a system design interview question step by step?
Show answer
Core idea
A strong system design answer usually follows a clear structure: clarify requirements, estimate scale, sketch the high-level architecture, zoom in on bottlenecks, and then discuss trade-offs and failure handling.
This is a high-frequency interview topic because interviewers are testing your engineering process, not whether you magically guess one exact architecture diagram.
The strongest answers do not stop at a one-line definition.
They explain what problem the concept solves, what the operational model looks like, and how you would choose it or apply it in a realistic production setting.
That is usually what separates a memorized answer from an interview answer that sounds experienced.
How to explain it
A good way to explain it is to start with the simplest mental model, then expand into a concrete example.
For example, if the prompt is 'design a URL shortener', you would first ask about expected traffic, custom aliases, analytics, expiration, and availability requirements.
Then you would outline clients, API service, database, cache, and asynchronous analytics instead of jumping straight into random technology names.
When you do that, the interviewer can hear your reasoning instead of just hearing terminology.
In many interviews, that matters more than naming every possible product or edge case, because it shows you understand the underlying design rather than only the vocabulary.
Trade-offs
You should also make the trade-offs explicit.
The trade-off discussion usually includes how much complexity to add early, where to use caching, when to shard, whether consistency or latency matters more, and which parts can be asynchronous.
A calm minimal design with a sensible growth path usually sounds stronger than an overengineered answer full of buzzwords.
This is where a lot of candidates gain or lose points.
Senior-sounding answers are rarely about saying something is 'best'.
They are about explaining when something is appropriate, what pressure it removes, and what complexity it introduces in return.
Interviewers usually reward that kind of balanced reasoning.
Common mistakes
Common mistakes include skipping requirements, forgetting scale estimates, spending too long on generic boxes, or throwing in every distributed system term you know without connecting it to the workload.
Another frequent mistake is jumping too quickly to tools without first naming the requirement or access pattern that justifies the choice.
If your explanation stays tied to workload, reliability, latency, cost, or developer ergonomics, the answer sounds much more grounded and much more useful.
Interview takeaway
In an interview, close with a compact takeaway: A good final sentence is something like: start simple, justify every major component, and explain how the system evolves when traffic or reliability requirements increase.
You can also score points by mentioning observability, rate limiting, security, and operational recovery at the end, because that makes the design sound production-aware.
That final framing helps your answer feel complete and gives the interviewer a clear signal that you understand both the definition and the practical decision-making around it.
is available in our Telegram bot.
You can do this, and much more with our Telegram bot. Try for free!
How would you design a URL shortener in a system design interview?
Show answer
Core idea
A URL shortener design should focus on mapping short codes to long URLs, making redirects very fast, and handling code generation, expiration, and analytics cleanly.
This is a high-frequency interview topic because it combines API design, data modeling, caching, redirection latency, and abuse control in one compact problem.
The strongest answers do not stop at a one-line definition.
They explain what problem the concept solves, what the operational model looks like, and how you would choose it or apply it in a realistic production setting.
That is usually what separates a memorized answer from an interview answer that sounds experienced.
How to explain it
A good way to explain it is to start with the simplest mental model, then expand into a concrete example.
A simple example is: user submits a long URL, service validates it, generates a base62 code, stores the mapping, and returns a short link.
Later, a read-heavy redirect path looks up the code, checks expiration or deletion rules, and issues the redirect, often with analytics handled asynchronously.
When you do that, the interviewer can hear your reasoning instead of just hearing terminology.
In many interviews, that matters more than naming every possible product or edge case, because it shows you understand the underlying design rather than only the vocabulary.
Trade-offs
You should also make the trade-offs explicit.
The main choices are whether IDs are sequential or random, how to prevent collisions, how much redirect traffic should be cached, and whether click analytics should be synchronous or event-driven.
Most strong answers optimize the read path heavily because popular links may be requested far more often than they are created.
This is where a lot of candidates gain or lose points.
Senior-sounding answers are rarely about saying something is 'best'.
They are about explaining when something is appropriate, what pressure it removes, and what complexity it introduces in return.
Interviewers usually reward that kind of balanced reasoning.
Common mistakes
Common mistakes include forgetting abuse prevention, not discussing hot keys, overcomplicating the ID scheme, or blocking the redirect path on analytics writes.
Another frequent mistake is jumping too quickly to tools without first naming the requirement or access pattern that justifies the choice.
If your explanation stays tied to workload, reliability, latency, cost, or developer ergonomics, the answer sounds much more grounded and much more useful.
Interview takeaway
In an interview, close with a compact takeaway: The best summary is: fast lookup path, simple mapping model, clear short-code strategy, and asynchronous analytics or enrichment.
It also sounds strong to mention that a cache or CDN can reduce redirect latency while the database remains the durable source of truth.
That final framing helps your answer feel complete and gives the interviewer a clear signal that you understand both the definition and the practical decision-making around it.
is available in our Telegram bot.
You can do this, and much more with our Telegram bot. Try for free!
How do you design a rate limiter for a high-traffic API?
Show answer
Core idea
A rate limiter is a control mechanism that protects systems from abuse and overload by restricting how many requests a client can make within a time window or token budget.
This is a high-frequency interview topic because it shows whether you understand fairness, shared state, distributed coordination, and operational safety under load.
The strongest answers do not stop at a one-line definition.
They explain what problem the concept solves, what the operational model looks like, and how you would choose it or apply it in a realistic production setting.
That is usually what separates a memorized answer from an interview answer that sounds experienced.
How to explain it
A good way to explain it is to start with the simplest mental model, then expand into a concrete example.
A common example is limiting requests by API key or user ID with a token bucket or sliding-window algorithm backed by Redis.
The gateway checks the current allowance before forwarding the request, and returns HTTP 429 when the limit is exceeded.
When you do that, the interviewer can hear your reasoning instead of just hearing terminology.
In many interviews, that matters more than naming every possible product or edge case, because it shows you understand the underlying design rather than only the vocabulary.
Trade-offs
You should also make the trade-offs explicit.
The major trade-offs include accuracy versus implementation cost, local versus distributed enforcement, fail-open versus fail-closed behavior, and whether the policy should allow short bursts or strictly smooth traffic.
Placement matters too: gateway-level control protects downstream services earlier than app-level checks alone.
This is where a lot of candidates gain or lose points.
Senior-sounding answers are rarely about saying something is 'best'.
They are about explaining when something is appropriate, what pressure it removes, and what complexity it introduces in return.
Interviewers usually reward that kind of balanced reasoning.
Common mistakes
Common mistakes include describing only an algorithm but not saying where it runs, forgetting atomic updates in distributed stores, or ignoring how the system behaves if the limiter backend becomes unavailable.
Another frequent mistake is jumping too quickly to tools without first naming the requirement or access pattern that justifies the choice.
If your explanation stays tied to workload, reliability, latency, cost, or developer ergonomics, the answer sounds much more grounded and much more useful.
Interview takeaway
In an interview, close with a compact takeaway: The best summary is: define the principal being limited, choose a fitting algorithm, keep enforcement fast and atomic, and make failure behavior explicit.
Clear user feedback, retry hints, and metrics by endpoint or tenant also make the design feel much more realistic.
That final framing helps your answer feel complete and gives the interviewer a clear signal that you understand both the definition and the practical decision-making around it.
is available in our Telegram bot.
You can do this, and much more with our Telegram bot. Try for free!
How would you design a notification system for email, SMS, and push messages?
Show answer
Core idea
A notification system should separate product events from delivery logic so that user actions do not block on external messaging providers or slow template processing.
This is a high-frequency interview topic because it tests event-driven design, retries, fan-out, preference handling, and third-party integration strategy.
The strongest answers do not stop at a one-line definition.
They explain what problem the concept solves, what the operational model looks like, and how you would choose it or apply it in a realistic production setting.
That is usually what separates a memorized answer from an interview answer that sounds experienced.
How to explain it
A good way to explain it is to start with the simplest mental model, then expand into a concrete example.
A strong example is an order or comment event published to a queue or event bus.
A notification service consumes it, checks user preferences and quiet hours, renders the right template, and dispatches work to email, SMS, or push adapters that retry independently.
When you do that, the interviewer can hear your reasoning instead of just hearing terminology.
In many interviews, that matters more than naming every possible product or edge case, because it shows you understand the underlying design rather than only the vocabulary.
Trade-offs
You should also make the trade-offs explicit.
The trade-offs revolve around synchronous versus asynchronous delivery, per-channel provider design, retry policies, idempotency, and whether low-priority notifications can be delayed or batched.
Most good designs treat rendering, policy, and delivery as separate stages so each one can scale and fail independently.
This is where a lot of candidates gain or lose points.
Senior-sounding answers are rarely about saying something is 'best'.
They are about explaining when something is appropriate, what pressure it removes, and what complexity it introduces in return.
Interviewers usually reward that kind of balanced reasoning.
Common mistakes
Common mistakes include mixing business events directly with provider calls, not mentioning user opt-outs, forgetting dead-letter queues, or ignoring duplicate sends after retries.
Another frequent mistake is jumping too quickly to tools without first naming the requirement or access pattern that justifies the choice.
If your explanation stays tied to workload, reliability, latency, cost, or developer ergonomics, the answer sounds much more grounded and much more useful.
Interview takeaway
In an interview, close with a compact takeaway: The best summary is: decouple event creation from delivery, enforce preferences centrally, and use channel-specific workers with retries and observability.
Mentioning template versioning, bounce handling, and provider failover usually makes the answer sound especially practical.
That final framing helps your answer feel complete and gives the interviewer a clear signal that you understand both the definition and the practical decision-making around it.
is available in our Telegram bot.
You can do this, and much more with our Telegram bot. Try for free!
How do you choose between SQL and NoSQL in system design interviews?
Show answer
Core idea
The choice between SQL and NoSQL should be driven by access patterns, consistency needs, relationships, and scale shape rather than by fashion or generic claims about performance.
This is a high-frequency interview topic because interviewers want to see whether you can map storage technology to workload requirements instead of repeating clichés.
The strongest answers do not stop at a one-line definition.
They explain what problem the concept solves, what the operational model looks like, and how you would choose it or apply it in a realistic production setting.
That is usually what separates a memorized answer from an interview answer that sounds experienced.
How to explain it
A good way to explain it is to start with the simplest mental model, then expand into a concrete example.
For example, orders, billing, and relational account data often fit a SQL database because transactions and joins matter.
Sessions, profile lookups, counters, or extremely high-volume key-based access may fit NoSQL stores better when schemas are simpler and horizontal scaling is more central.
When you do that, the interviewer can hear your reasoning instead of just hearing terminology.
In many interviews, that matters more than naming every possible product or edge case, because it shows you understand the underlying design rather than only the vocabulary.
Trade-offs
You should also make the trade-offs explicit.
The trade-offs typically include transactional integrity versus partition-friendly scale, rich queries versus simpler access models, and operational simplicity in one area versus application complexity in another.
Many real systems use both: relational storage for source-of-truth data and other stores for caching, search, or high-volume specialized access patterns.
This is where a lot of candidates gain or lose points.
Senior-sounding answers are rarely about saying something is 'best'.
They are about explaining when something is appropriate, what pressure it removes, and what complexity it introduces in return.
Interviewers usually reward that kind of balanced reasoning.
Common mistakes
Common mistakes include saying NoSQL is always more scalable, ignoring relational constraints, or choosing a database before you have even described the read and write patterns.
Another frequent mistake is jumping too quickly to tools without first naming the requirement or access pattern that justifies the choice.
If your explanation stays tied to workload, reliability, latency, cost, or developer ergonomics, the answer sounds much more grounded and much more useful.
Interview takeaway
In an interview, close with a compact takeaway: The best summary is: pick the database model that matches the workload, and do not be afraid to use multiple storage systems for different parts of the architecture.
Interviewers usually like answers that start with the simplest correct storage choice and only add complexity when the scale or query pattern truly justifies it.
That final framing helps your answer feel complete and gives the interviewer a clear signal that you understand both the definition and the practical decision-making around it.
is available in our Telegram bot.
You can do this, and much more with our Telegram bot. Try for free!
How would you design a chat application like WhatsApp or Slack?
Show answer
Core idea
A chat system design should separate durable message storage from transient connection handling so the system can support real-time delivery, offline sync, and scaling at the same time.
This is a high-frequency interview topic because it brings together WebSockets, ordering, fan-out, storage, and device-state reconciliation in one problem.
The strongest answers do not stop at a one-line definition.
They explain what problem the concept solves, what the operational model looks like, and how you would choose it or apply it in a realistic production setting.
That is usually what separates a memorized answer from an interview answer that sounds experienced.
How to explain it
A good way to explain it is to start with the simplest mental model, then expand into a concrete example.
A typical example includes clients connected through real-time gateways, a chat service that persists messages, and delivery logic that sends them to online recipients immediately while also storing them for offline retrieval.
Group chat raises additional fan-out and ordering questions, while one-to-one chat is simpler but still needs durability and reconnect logic.
When you do that, the interviewer can hear your reasoning instead of just hearing terminology.
In many interviews, that matters more than naming every possible product or edge case, because it shows you understand the underlying design rather than only the vocabulary.
Trade-offs
You should also make the trade-offs explicit.
Trade-offs include conversation-level ordering versus global ordering, push versus pull for large groups, how to model read receipts, and how much ephemeral state such as typing indicators should live outside the durable message path.
Systems often accept eventual convergence across devices while preserving strong per-conversation semantics.
This is where a lot of candidates gain or lose points.
Senior-sounding answers are rarely about saying something is 'best'.
They are about explaining when something is appropriate, what pressure it removes, and what complexity it introduces in return.
Interviewers usually reward that kind of balanced reasoning.
Common mistakes
Common mistakes include ignoring offline delivery, assuming perfect global ordering, storing ephemeral indicators like typing state in the same path as durable messages, or failing to discuss multi-device sync.
Another frequent mistake is jumping too quickly to tools without first naming the requirement or access pattern that justifies the choice.
If your explanation stays tied to workload, reliability, latency, cost, or developer ergonomics, the answer sounds much more grounded and much more useful.
Interview takeaway
In an interview, close with a compact takeaway: The best summary is: keep message durability reliable, keep connection handling lightweight, and design ordering and fan-out around conversation boundaries rather than the entire system.
If you mention that transient presence data and durable chat history are different problem classes, the answer usually sounds much more mature.
That final framing helps your answer feel complete and gives the interviewer a clear signal that you understand both the definition and the practical decision-making around it.
is available in our Telegram bot.
You can do this, and much more with our Telegram bot. Try for free!
How do you design a cache for a scalable web application?
Show answer
Core idea
Caching means placing frequently accessed or expensive-to-compute data in a faster layer so reads become cheaper and latency drops.
This is a high-frequency interview topic because caching is one of the first scaling tools interviewers expect candidates to understand, but they also want to hear about invalidation and staleness.
The strongest answers do not stop at a one-line definition.
They explain what problem the concept solves, what the operational model looks like, and how you would choose it or apply it in a realistic production setting.
That is usually what separates a memorized answer from an interview answer that sounds experienced.
How to explain it
A good way to explain it is to start with the simplest mental model, then expand into a concrete example.
A common example is cache-aside: the application checks Redis for a hot object, falls back to the database if it misses, then stores the result in cache for future requests.
CDNs, in-process caches, and distributed caches can all play different roles depending on whether the data is static, shared, or extremely latency-sensitive.
When you do that, the interviewer can hear your reasoning instead of just hearing terminology.
In many interviews, that matters more than naming every possible product or edge case, because it shows you understand the underlying design rather than only the vocabulary.
Trade-offs
You should also make the trade-offs explicit.
The most important trade-offs are freshness versus speed, local caches versus shared caches, TTL-based expiration versus explicit invalidation, and the operational risks of hot keys or stampedes.
A great answer always says what should be cached and what should probably remain authoritative in the database path.
This is where a lot of candidates gain or lose points.
Senior-sounding answers are rarely about saying something is 'best'.
They are about explaining when something is appropriate, what pressure it removes, and what complexity it introduces in return.
Interviewers usually reward that kind of balanced reasoning.
Common mistakes
Common mistakes include talking only about speed, forgetting invalidation, caching correctness-critical data without a freshness model, or not explaining how the system avoids thundering-herd behavior after key expiry.
Another frequent mistake is jumping too quickly to tools without first naming the requirement or access pattern that justifies the choice.
If your explanation stays tied to workload, reliability, latency, cost, or developer ergonomics, the answer sounds much more grounded and much more useful.
Interview takeaway
In an interview, close with a compact takeaway: The best summary is: cache what is expensive and reusable, but design around staleness, invalidation, and overload during cache misses.
Mentioning staggered expiry, request coalescing, or serving slightly stale data during refresh often makes the design much more convincing.
That final framing helps your answer feel complete and gives the interviewer a clear signal that you understand both the definition and the practical decision-making around it.
is available in our Telegram bot.
You can do this, and much more with our Telegram bot. Try for free!
How would you design a file upload and storage service?
Show answer
Core idea
A good file upload design separates authentication and metadata management from the actual byte transfer so application servers do not become unnecessary bandwidth bottlenecks.
This is a high-frequency interview topic because the problem combines object storage, upload reliability, post-processing, access control, and CDN delivery.
The strongest answers do not stop at a one-line definition.
They explain what problem the concept solves, what the operational model looks like, and how you would choose it or apply it in a realistic production setting.
That is usually what separates a memorized answer from an interview answer that sounds experienced.
How to explain it
A good way to explain it is to start with the simplest mental model, then expand into a concrete example.
A realistic example is issuing pre-signed upload URLs so the client uploads directly to object storage.
After that, asynchronous workers can scan the file, generate thumbnails, transcode media, or extract metadata, while the application database tracks ownership, status, and permissions.
When you do that, the interviewer can hear your reasoning instead of just hearing terminology.
In many interviews, that matters more than naming every possible product or edge case, because it shows you understand the underlying design rather than only the vocabulary.
Trade-offs
You should also make the trade-offs explicit.
The trade-offs include direct upload versus proxy upload, synchronous validation versus asynchronous processing, private download authorization versus public CDN distribution, and multi-part upload strategies for large files.
Good answers keep the durable bytes in object storage and the business metadata in a database.
This is where a lot of candidates gain or lose points.
Senior-sounding answers are rarely about saying something is 'best'.
They are about explaining when something is appropriate, what pressure it removes, and what complexity it introduces in return.
Interviewers usually reward that kind of balanced reasoning.
Common mistakes
Common mistakes include routing all upload traffic through app servers without need, ignoring malware scanning or size validation, or forgetting resumable uploads and access-control design.
Another frequent mistake is jumping too quickly to tools without first naming the requirement or access pattern that justifies the choice.
If your explanation stays tied to workload, reliability, latency, cost, or developer ergonomics, the answer sounds much more grounded and much more useful.
Interview takeaway
In an interview, close with a compact takeaway: The best summary is: store bytes in object storage, keep metadata separately, offload heavy post-processing asynchronously, and secure access paths deliberately.
It also helps to mention lifecycle rules, checksums, and processing states such as uploaded, scanning, ready, or rejected.
That final framing helps your answer feel complete and gives the interviewer a clear signal that you understand both the definition and the practical decision-making around it.
is available in our Telegram bot.
You can do this, and much more with our Telegram bot. Try for free!
How would you design a news feed or social feed system?
Show answer
Core idea
A feed system is mainly about balancing write work against read work while keeping ranking, freshness, and fan-out practical at scale.
This is a high-frequency interview topic because this problem reveals whether you understand precomputation, ranking, and the cost of large fan-out patterns.
The strongest answers do not stop at a one-line definition.
They explain what problem the concept solves, what the operational model looks like, and how you would choose it or apply it in a realistic production setting.
That is usually what separates a memorized answer from an interview answer that sounds experienced.
How to explain it
A good way to explain it is to start with the simplest mental model, then expand into a concrete example.
A strong example is comparing fan-out-on-write and fan-out-on-read.
Normal users with moderate follower counts may work well with precomputed feed entries, while celebrity accounts often require hybrid treatment so one post does not create a massive write storm into every follower timeline immediately.
When you do that, the interviewer can hear your reasoning instead of just hearing terminology.
In many interviews, that matters more than naming every possible product or edge case, because it shows you understand the underlying design rather than only the vocabulary.
Trade-offs
You should also make the trade-offs explicit.
Trade-offs include write amplification versus read latency, chronological ordering versus ranked ordering, cacheability versus personalization, and how quickly deletes or edits propagate.
Most real systems combine a candidate-generation stage with ranking and merge logic rather than relying on one simplistic global store.
This is where a lot of candidates gain or lose points.
Senior-sounding answers are rarely about saying something is 'best'.
They are about explaining when something is appropriate, what pressure it removes, and what complexity it introduces in return.
Interviewers usually reward that kind of balanced reasoning.
Common mistakes
Common mistakes include ignoring large-follower hot spots, pretending ranking is free, or forgetting pagination, de-duplication, and deleted-content handling.
Another frequent mistake is jumping too quickly to tools without first naming the requirement or access pattern that justifies the choice.
If your explanation stays tied to workload, reliability, latency, cost, or developer ergonomics, the answer sounds much more grounded and much more useful.
Interview takeaway
In an interview, close with a compact takeaway: The best summary is: design the feed around the tension between expensive writes and expensive reads, then choose the hybrid that best matches the product's traffic pattern.
A neat way to sound senior is to say that the right model often differs between normal publishers and very high-fan-out accounts.
That final framing helps your answer feel complete and gives the interviewer a clear signal that you understand both the definition and the practical decision-making around it.
is available in our Telegram bot.
You can do this, and much more with our Telegram bot. Try for free!
What are sharding and replication, and when would you use them in system design?
Show answer
Core idea
Replication and sharding are different scaling tools: replication creates copies of the same data for availability or read throughput, while sharding splits different subsets of data across nodes for capacity scaling.
This is a high-frequency interview topic because interviewers often ask this because many candidates mix the two together without explaining what problem each one actually solves.
The strongest answers do not stop at a one-line definition.
They explain what problem the concept solves, what the operational model looks like, and how you would choose it or apply it in a realistic production setting.
That is usually what separates a memorized answer from an interview answer that sounds experienced.
How to explain it
A good way to explain it is to start with the simplest mental model, then expand into a concrete example.
A simple example is a primary database with read replicas for higher availability and read scaling.
If one database still becomes too large or write-heavy, the dataset may then be sharded by user ID or tenant ID so not all traffic hits one node.
When you do that, the interviewer can hear your reasoning instead of just hearing terminology.
In many interviews, that matters more than naming every possible product or edge case, because it shows you understand the underlying design rather than only the vocabulary.
Trade-offs
You should also make the trade-offs explicit.
The trade-offs are different in each case.
Replication brings lag, failover complexity, and stale-read concerns.
Good answers usually say they would prefer simpler scaling strategies first and introduce sharding only when a single node truly becomes the bottleneck.
This is where a lot of candidates gain or lose points.
Senior-sounding answers are rarely about saying something is 'best'.
They are about explaining when something is appropriate, what pressure it removes, and what complexity it introduces in return.
Interviewers usually reward that kind of balanced reasoning.
Common mistakes
Common mistakes include describing replication as horizontal partitioning, or saying 'just shard it' without naming a shard key, hotspot risk, or the operational consequences.
Another frequent mistake is jumping too quickly to tools without first naming the requirement or access pattern that justifies the choice.
If your explanation stays tied to workload, reliability, latency, cost, or developer ergonomics, the answer sounds much more grounded and much more useful.
Interview takeaway
In an interview, close with a compact takeaway: The best summary is: replication helps the same data survive failures and serve more reads, while sharding spreads different data across nodes to handle more total load and storage.
Mentioning that many large systems end up using both, several shards each with replicas, is a strong final touch.
That final framing helps your answer feel complete and gives the interviewer a clear signal that you understand both the definition and the practical decision-making around it.
is available in our Telegram bot.
You can do this, and much more with our Telegram bot. Try for free!
Want to practice these System Design Interview Questions with an AI bot coach for faster remembering and better retention?
Continue in Telegram to answer by voice or text, get instant scoring, ask follow-up architecture questions, and revisit weak system design concepts on a spaced schedule.