Your country

Tools that support it use your country for local currency, number formats, units and paper size. Your choice is saved only in this browser.

Type a name or a two-letter code. Use the up and down arrow keys to move through the countries, Enter to choose one and Escape to close.

System Design (High-Level Design)  Module 30 – Interview practice and study plans

How design rounds are assessed, level by level

The four dimensions a system design round is scored on, what each level from fresher to staff is expected to show, and how to score your own practice.

  • Intermediate
  • 25 minutes
  • Examples run with Python 3.14.8, Pyodide 314.0.7, Node.js 24.21.0 and quickjs 0.32.0
  • By MySmartCoPilot
Free: 25 minutes

What you will learn

  • Describe the four dimensions a design discussion is assessed on and the evidence for each
  • Explain how the expected scores change from fresher to staff level
  • Assess a recorded practice answer against the rubric, with evidence for every score
  • Identify the dimension that stands between an answer and the next level

Before you start

What you’ll learn · Before you start

What you will learn

  • Describe the four dimensions a design discussion is assessed on and the evidence for each
  • Explain how the expected scores change from fresher to staff level
  • Assess a recorded practice answer against the rubric, with evidence for every score
  • Identify the dimension that stands between an answer and the next level

Before you start

On this page

A design round has no answer key. Two candidates can draw different architectures for the same prompt and both do well, or draw the same one and be judged at different levels. What is assessed is how you work: while you talk and draw, the interviewer collects evidence, and afterwards weighs it against what the level being hired for expects. This track scores that evidence on four dimensions, each from 1 to 4 against written descriptions:

  • Problem navigation: finding the problem worth solving, with its numbers.
  • Solution design: a whole that works, from the operations to where the data lives.
  • Technical depth: the deep dives, the trade-offs and what happens when parts fail.
  • Communication: how you run the discussion and work with the interviewer.

The levels ask for more of the same four things, and above all for more independence. A fresher reaches a working design with help; a senior engineer drives the round and finds the hard parts without being asked; a staff engineer also weighs cost, operations and how the system will have to change.

A rubric for practice

The rubric in this lesson is this track’s own, written so that you can score practice rounds. Employers run their rounds in their own ways and change them over time, so it describes no company’s process. Use it to hear your answers the way a careful listener would.

Four dimensions, scored from evidence

An interviewer can score only what the round shows. A trade-off you weighed in silence, or a failure you thought of and never mentioned, leaves nothing to score, which is why this track keeps asking you to say your reasons aloud. Each dimension below says what it covers and what its evidence sounds like.

Problem navigation is finding the problem worth solving: the questions that change the design, the assumptions said out loud, the non-goals, and numbers that decide something. Its evidence sounds like “can an appointment be moved after it is booked?” or “that is about 23 reminders a second, so one queue is plenty”.

Solution design is a design that works end to end. Every functional requirement maps to an operation, each kind of data lives where it is read, and each main path can be walked along the diagram. The notation advice of the C4 model gives a quick test for the diagram: every line should point one way and carry a label more specific than “uses”.

Technical depth is going deep where the design is most likely to break: choosing that part, working it through with numbers, naming the alternatives and why they lose, and saying what fails, how you would notice and how the system recovers. A trade-off said well has the shape of an architectural decision record, which keeps one decision together with its rationale, its trade-offs and its consequences.

Communication is how the discussion is run: saying which step you are on, keeping the diagram in step with your words, checking in at decisions, taking hints and summarising what was decided. Unlike the other three, it is scored in every minute of the round.

A 45-minute round in three phases, each the main source of evidence for one rubric dimension, inside a frame for communication.Communication: scored in every minuteMinutes 0 to 10requirements, estimatesevidence of problem navigationMinutes 10 to 30API, data model, diagramevidence of solution designMinutes 30 to 45deep dives, wrap-upevidence of technical depthscope changes:navigate again

Where the evidence for each dimension comes from in a 45-minute round

Text description of the diagram

The diagram is a frame labelled "Communication: scored in every minute". Inside it are three boxes joined by arrows from top to bottom:

  1. Minutes 0 to 10, requirements and estimates: evidence of problem navigation.
  2. Minutes 10 to 30, API, data model and diagram: evidence of solution design.
  3. Minutes 30 to 45, deep dives and wrap-up: evidence of technical depth.

A fourth arrow leads from the deep dives back to the first box, labelled "scope changes: navigate again".

The phases in the figure follow the time boxes of a 45-minute round, and they explain a common surprise: a dimension can only score as high as the evidence the round leaves behind. Start the deep dives in minute 3 and the interviewer may see excellent depth and almost no navigation. Spend 25 minutes on requirements and the depth score has nothing to stand on.

What each score looks like

Every score is tied to a description of what the round shows, so that two people who score the same round reach the same number, and so that you can score yourself. Guidance on structured interviews from the U.S. Office of Personnel Management describes the most structured interviews as rated against benchmarks of proficiency, and reports that more structure goes with higher reliability and agreement between raters. Read each list from score 1 up, and stop at the highest score the evidence supports.

Problem navigation

  • Score 1: Drawing starts before any question; the requirements stay vague and no number is said.
  • Score 2: Some questions, but not the one that changes the design; numbers are said and decide nothing.
  • Score 3: The questions that change the design, the assumptions and non-goals said aloud, and at least one decision made from a number.
  • Score 4: The requirement that makes the problem hard is found, the scope is agreed with the interviewer, and it is revisited when something new comes up.

Solution design

  • Score 1: Boxes without flows: the main operations cannot be traced.
  • Score 2: The main path works, with gaps: a missing store, a requirement no operation serves, arrows that say nothing.
  • Score 3: Complete end to end: every requirement maps to an operation, data lives where it is read, and each main path can be walked.
  • Score 4: Complete and simple: no part without a reason, alternatives named with why they lost, and room left for the likely next requirement.

Technical depth

  • Score 1: Technologies are named without reasons; nothing is said about failures.
  • Score 2: Deep dives happen only when the interviewer leads them; trade-offs stay general (“it scales better”).
  • Score 3: The riskiest part is chosen without being asked and worked through with numbers, including what fails and how it recovers.
  • Score 4: Several deep dives at the level of mechanisms, such as races, ordering and capacity at ten times the load, and a clear view of where the design breaks first.

Communication

  • Score 1: Long silences or a monologue; the diagram and the words disagree.
  • Score 2: Easy to follow but unstructured: the interviewer has to ask for the plan.
  • Score 3: The steps are signposted, the diagram stays in step, decisions are checked with the interviewer and hints are taken up.
  • Score 4: The discussion runs like a design review: decisions are summarised, challenge is invited, and a changed problem is handled smoothly.

What changes from fresher to staff

Each level has a bar: the lowest score it expects on every dimension, given here in the order navigation, design, depth and communication. As a rough guide, fresher means up to about 2 years of experience, mid 2 to 5, senior 5 to 10 and staff 10 or more, but a level is about the scope someone can handle, not the time they have worked.

  • Fresher: 2, 2, 2, 2. The bar is a design that works for the main path, reached with prompts from the interviewer along the way. The interviewer expects to lead the deep dives; what counts is following them sensibly.
  • Mid: 3, 3, 2, 2. The design is complete without help, and its numbers drive it. Depth still comes when the interviewer points at a part, and a 2 in communication is enough.
  • Senior: 3, 3, 3, 3. The difference from mid is who leads: a senior answer picks the risky parts itself, puts numbers on them and says how they fail, while the interviewer mostly follows.
  • Staff: 4, 4, 4, 3. A staff answer has everything a senior one has, judged in a wider frame: what the system costs to run, how it is operated and changed, which parts other teams would own, and which decisions can wait. It must be clear, but the extra weight of the level is in that judgement, so the communication bar stays at 3.

Reading a level from four scores

The rubric reads a level as the highest one whose bar is met on every dimension. It never averages, because an average lets a strong dimension hide a weak one, and the weak one is exactly what the next practice round should target. The program below reads four answers:

The level four answers reach, and what each is short of Python · rubric_levels.py
"""Read the level an answer reaches from its four rubric scores.

This track's rubric scores a design round on four dimensions, each from 1 to 4. A level's
bar is the lowest score it expects on every dimension, and an answer reaches the highest
level whose bar it meets on all four: a strong dimension never makes up for a weak one.
"""

DIMENSIONS = ("navigation", "design", "depth", "communication")

# The lowest score each level expects, dimension by dimension (in the order of DIMENSIONS).
BARS = {
    "fresher": (2, 2, 2, 2),
    "mid": (3, 3, 2, 2),
    "senior": (3, 3, 3, 3),
    "staff": (4, 4, 4, 3),
}


def meets(scores, level):
    """True when every score reaches the level's bar."""
    return all(score >= bar for score, bar in zip(scores, BARS[level]))


def level_reached(scores):
    """The highest level whose bar every score meets, or None below the lowest bar."""
    reached = None
    for level in BARS:  # from the lowest bar to the highest
        if not meets(scores, level):
            break
        reached = level
    return reached


def show(name, scores, target):
    """One answer: its scores, their average, the level reached and what it is short of."""
    print(name)
    print("  scores:", ", ".join(f"{d} {s}" for d, s in zip(DIMENSIONS, scores)))
    level = level_reached(scores) or "below every bar"
    print(f"  average {sum(scores) / len(scores):.2f}, level reached: {level}")
    gaps = [f"{d} by {bar - s}" for d, s, bar in zip(DIMENSIONS, scores, BARS[target]) if s < bar]
    print(f"  short of {target}: {', '.join(gaps) or 'nothing, the bar is met'}")


show("Answer A, the reminder service", (3, 3, 2, 3), "senior")
print()
show("Deep and clear, but scoped late", (2, 4, 4, 3), "senior")
print()
show("Staff-quality design, said too quietly", (4, 4, 4, 2), "staff")
print()
show("A first practice round", (1, 2, 2, 2), "fresher")

Output

Answer A, the reminder service
  scores: navigation 3, design 3, depth 2, communication 3
  average 2.75, level reached: mid
  short of senior: depth by 1

Deep and clear, but scoped late
  scores: navigation 2, design 4, depth 4, communication 3
  average 3.25, level reached: fresher
  short of senior: navigation by 1

Staff-quality design, said too quietly
  scores: navigation 4, design 4, depth 4, communication 2
  average 3.50, level reached: mid
  short of staff: communication by 1

A first practice round
  scores: navigation 1, design 2, depth 2, communication 2
  average 1.75, level reached: below every bar
  short of fresher: navigation by 1

Recorded with Python 3.14.8 on macOS 26 arm64. To run it yourself: mise exec python@3.14.8 -- python3 rubric_levels.py

  • Answer A, scored in full below, averages 2.75 and reaches mid. One more point of depth would meet the senior bar.
  • The second answer averages 3.25 but reaches only the fresher bar. Its navigation score of 2 misses the mid bar of 3: a fine design for a problem that was never pinned down.
  • The third averages 3.50 and reaches mid. Its three design dimensions are at the staff bar, but a communication score of 2 misses the senior one, so a single point of communication stands between it and staff.
  • The last is the edge case: one score of 1 puts an answer below every bar, whatever the other three are.

Press Edit and put your own scores into a show(...) line to read your level.

Scoring a recorded practice answer

Score from a recording, not from memory: memory keeps the good moments and drops the silences.

  1. Record the round. Audio is enough. Keep the diagram you drew beside it.
  2. Score it after a break. A few hours later you hear what you said, not what you meant.
  3. Log the evidence with times. Play the recording once and write a line for each moment that shows a dimension: the minute, the words and the dimension. “Minute 4: ‘about 23 reminders a second, so one queue is plenty’ (navigation).”
  4. Score each dimension from the log. Read its list from score 1 up and stop at the highest score your logged moments support. A behaviour you cannot point to in the log did not happen.
  5. Compare with a second scorer. Swap recordings with a friend, or first score an answer whose reference scores you know, like the two below. The OPM guidance describes panels whose members rate on their own and then discuss large differences; do the same. Two points apart on a dimension means the two of you read its descriptions differently, so find the moments each of you counted.
  6. Choose one thing to practise. Take the dimension furthest below your target bar, practise it, and use a prompt you have not met before in the next round. The exercise of this lesson writes that choice as code.
Voice Recorder Record a practice round in your browser; the recording stays on your device.

Two answers to one prompt, scored

The prompt: design a service that reminds people of their appointments 24 hours before they start, by email or app notification. Below are moments from two practice rounds of 45 minutes. Score Answer A yourself before you read its scores.

Answer A

  • Minute 1. “Before I draw anything: can an appointment be moved or cancelled after it is booked, and does a moved appointment get a new reminder?”
  • Minute 2. “I’ll assume 2 million appointments a day, one reminder each, and that a reminder may arrive a few minutes late. Two-way replies are out of scope.”
  • Minute 4. “That’s about 23 reminders a second on average. Most appointments are in the morning, so I’ll plan for ten times that, around 230 a second: one queue and a few workers will do.”
  • Minute 9. “Three operations: create an appointment, move it, cancel it. Each one sets or clears the time its reminder is due.”
  • Minute 15. “One table of appointments, with the time each reminder is due, indexed, and a status: pending, sent or cancelled.”
  • Minute 21. Draws a scheduler that collects due reminders every minute and puts them on a queue, and workers that send them through the email and notification providers. Every arrow is labelled.
  • Minute 31. The interviewer asks what happens if a worker crashes after sending but before it marks the reminder sent. “Then it could go out twice. I’d add a lock so that only one worker handles each reminder.”
  • Minute 42. “The scheduler is the bottleneck, so we can run more of them.”
  • Throughout. Says which step comes next, and checks before the data model: “Does this cover cancellations for you?”

The scores: 3, 3, 2 and 3.

  • Navigation 3. The questions of minutes 1 and 2 change the design, because a moved appointment moves its reminder, and a number decides the queue. Not 4: nothing found what makes the problem hard, such as the morning peak meeting the sending limits of the providers.
  • Design 3. Every requirement maps to an operation, the due time lives where the scheduler reads it, and each path can be walked on the diagram. Not 4: no alternative was named, such as one delayed queue message per reminder, and nothing said why it lost.
  • Depth 2. The only deep dive came when the interviewer asked, and “a lock” names a tool, not a mechanism: after the crash the lock expires and the next worker sends again. A 3 would have chosen the risky part unprompted and worked it through. A missed reminder costs more than a repeated one, so the design sends at least once and keeps repeats rare: each reminder carries a key made of its appointment and due time, which a provider that supports such keys uses to drop a repeat, and the reminder is marked sent before its queue message is acknowledged. A last check of its status just before sending lets a cancellation that arrived in the meantime win.
  • Communication 3. Signposted steps and a check at a decision. Not 4: no summary of the decisions, and a one-sentence wrap-up.

Answer A meets the mid bar, and the program above names the gap to senior: one point of depth. The drill follows from it: in the next round, choose the risky part before the interviewer does.

Answer B

  • Minute 1. “So it’s basically a cron job. I’ll use a queue and a pool of workers.” Asked whether there are questions about the requirements: “Email or text message? Both, okay.”
  • Minute 5. “There will be millions of appointments, so it has to scale.”
  • Minute 8. Draws an API, a database, a scheduler, a queue and the senders, joined by arrows without labels. Moved and cancelled appointments are not mentioned.
  • Minute 18. Without being asked: “The dangerous part is sending twice or not at all. Each reminder gets a key, its appointment and due time, sent with the request so the provider drops a repeat. The reminder is marked sent before the queue message is acknowledged, so a crash means a retry, not a loss. A provider timeout is retried three times over ten minutes; after that the reminder is logged as failed for the clinic to see.”
  • Minutes 8 to 30. Long stretches of drawing in silence; at minute 25 the interviewer asks where things stand.
  • Minute 43. “I think that covers it.”

Score Answer B on the four dimensions now. The first four questions below ask for its scores, and a score within one point of the reference counts as right; the explanations give the evidence for each reference score.

Check yourself

8 questions about this lesson. Every answer and why it is right is on the page, behind “Show the answer”. Your score stays in this browser.

  1. Question 1 of 8 Answer B, problem navigation: what score from 1 to 4 does the evidence support?

    Type a number.

    Show the answer to question 1

    Answer: 2 out of 4 (anything from 1 to 3 counts)

    Reference score 2. B asked one question, email or text message, but not the one that changes the design: whether an appointment can be moved or cancelled after it is booked. "Millions, so it has to scale" is a number that decides nothing.

  2. Question 2 of 8 Answer B, solution design: what score from 1 to 4 does the evidence support?

    Type a number.

    Show the answer to question 2

    Answer: 2 out of 4 (anything from 1 to 3 counts)

    Reference score 2. The main path works, from the API through the scheduler and the queue to the senders, but moved and cancelled appointments have no place in it, no operation was named, and no arrow says what it carries.

  3. Question 3 of 8 Answer B, technical depth: what score from 1 to 4 does the evidence support?

    Type a number.

    Show the answer to question 3

    Answer: 3 out of 4 (anything from 2 to 4 counts)

    Reference score 3. Without being asked, B chose the riskiest part, reminders sent twice or not at all, and worked it through: a key for each reminder, marking it sent before the queue message is acknowledged, retries with a limit, and what happens after the last one. Not 4: there was one deep dive, and no numbers on capacity, such as the morning peak.

  4. Question 4 of 8 Answer B, communication: what score from 1 to 4 does the evidence support?

    Type a number.

    Show the answer to question 4

    Answer: 2 out of 4 (anything from 1 to 3 counts)

    Reference score 2. B was easy to follow while talking, but drew in silence for long stretches, the interviewer had to ask where things stood, and "I think that covers it" summarised nothing.

  5. Question 5 of 8 With scores of 2, 2, 3 and 2, which level's bar does Answer B meet?

    Choose one answer.

    Show the answer to question 5

    Answer: Fresher

    Fresher. The mid bar asks for 3 on problem navigation and on solution design, and B's depth of 3 cannot make up for either. B's strongest dimension is the one the mid bar asks least of.

  6. Question 6 of 8 Which of these moments are evidence of problem navigation?

    Choose every answer that is right.

    Show the answer to question 6

    Answer:

    • Working out that 2 million reminders a day is about 23 a second, so one queue is enough
    • Asking whether an appointment can be moved after it is booked

    The question changes the design and the number decides something, so both are problem navigation. Saying which step comes next is communication, and naming a product without a reason is evidence of nothing.

  7. Question 7 of 8 Why does this rubric read a level from the weakest dimension instead of the average of the four scores?

    Choose one answer.

    Show the answer to question 7

    Answer: A strong dimension would hide a weak one, and the weak one is what practice should target

    An answer that averages 3.5 can still miss the senior bar on one dimension. Reading the level from the weakest dimension shows that gap, which is the cheapest thing to fix before the next round.

  8. Question 8 of 8 You scored your own recording 4 on technical depth and a friend scored it 2. What do you do first?

    Choose one answer.

    Show the answer to question 8

    Answer: Find the moments each of you counted as evidence, and read the depth descriptions again together

    Two points apart means the two of you read the descriptions differently, or one of you counted something the recording does not show. Settle it from the logged moments; what you meant but did not say scores nothing.

Mistakes that cost points

  • Scoring what you know instead of what you showed. Knowing about idempotency keys scores nothing if the round never mentions them.
  • Averaging. Four scores that average 3 can still miss a bar by a point.
  • Rehearsing one prompt until it scores well. A score on a prompt you have practised measures how well you remember that answer, not how you handle a new problem.
  • Treating the rubric as a script. The interviewer steers, and how you take the steer is part of the evidence.

Interview questions

What does an interviewer assess in a system design round, if not the final architecture?

How you work, from what the round shows: whether you find the real problem and its numbers, whether you reach a design that works end to end, whether you go deep where it is most likely to break and say what fails, and how clearly you run the discussion. Two different architectures can both do well when each choice follows from the requirements and the reasons are said aloud.

Why do written score descriptions help two interviewers agree?

Each score is tied to something both of them can observe, such as asking the questions that change the design, rather than to an impression. They compare the same evidence with the same descriptions, so they disagree less, and when they do disagree, the difference points to particular moments of the round that they can discuss.

Key takeaways

  • A design round is scored from evidence on four dimensions: problem navigation, solution design, technical depth and communication.
  • Each score from 1 to 4 has a written description; score your own rounds from a recording and a timed log of evidence, never from memory.
  • A level is the highest bar met on every dimension, so an average can hide the gap that matters.
  • From fresher to staff the dimensions stay the same; what grows is independence and the width of the judgement.
  • After each practice round, work on the dimension furthest below your target, then use a prompt you have not met.

Exercise

Exercise · Easy · Python

Choose what to practise after a scored round

After a practice round is scored, the useful question is what to practise next. drill.py already holds the rubric's four dimensions and the bar of each level, as in the program above. Write two functions in it:

  • points_short(scores, target): all the points by which the scores fall below the bar of the level target. A score above the bar never makes up for one below it.
  • next_drill(scores, target): the dimension furthest below the bar; on a tie, the one that comes first in DIMENSIONS. Return None when every score meets the bar.

scores is a dictionary from each dimension to its score, such as {"navigation": 3, "design": 4, "depth": 1, "communication": 2}, and target is "fresher", "mid", "senior" or "staff". Both functions raise ValueError for a level that is not one of these, a missing dimension, or a score that is not a whole number from 1 to 4.

The sample tests import both functions from drill.py and run in your browser.

Starter code · drill.py

DIMENSIONS = ("navigation", "design", "depth", "communication")

# The lowest score each level expects, dimension by dimension (in the order of DIMENSIONS).
BARS = {
    "fresher": (2, 2, 2, 2),
    "mid": (3, 3, 2, 2),
    "senior": (3, 3, 3, 3),
    "staff": (4, 4, 4, 3),
}


def points_short(scores, target):
    """All the points by which the scores fall below the target level's bar."""
    # Replace this line with your code.
    return None


def next_drill(scores, target):
    """The dimension furthest below the target's bar (the first in DIMENSIONS on a tie), or None if it is met."""
    # Replace this line with your code.
    return None
The sample tests · test_drill.py
from drill import next_drill, points_short


def scores(navigation, design, depth, communication):
    return {"navigation": navigation, "design": design, "depth": depth, "communication": communication}


def test_bar_met():
    """nothing is short and there is no drill when the bar is met"""
    assert points_short(scores(3, 3, 3, 3), "senior") == 0
    assert next_drill(scores(4, 4, 4, 4), "staff") is None
    assert next_drill(scores(2, 2, 2, 2), "fresher") is None


def test_largest_gap():
    """the drill is the dimension furthest below the bar"""
    assert next_drill(scores(3, 4, 1, 2), "senior") == "depth"
    assert points_short(scores(3, 4, 1, 2), "senior") == 3
    assert next_drill(scores(4, 4, 4, 2), "staff") == "communication"


def test_tie():
    """a tie goes to the dimension that comes first in the rubric"""
    assert next_drill(scores(2, 3, 1, 2), "mid") == "navigation"
    assert next_drill(scores(4, 2, 4, 2), "senior") == "design"


def test_no_making_up():
    """every point below the bar counts, and points above it make up for nothing"""
    assert points_short(scores(2, 3, 1, 2), "staff") == 7
    assert points_short(scores(4, 1, 4, 4), "mid") == 2


def test_bad_input():
    """an unknown level, a missing dimension and impossible scores raise ValueError"""
    attempts = [
        lambda: next_drill(scores(3, 3, 3, 3), "principal"),
        lambda: points_short(scores(3, 3, 5, 3), "senior"),
        lambda: points_short(scores(0, 3, 3, 3), "senior"),
        lambda: next_drill({"navigation": 3, "design": 3, "depth": 3}, "mid"),
    ]
    for attempt in attempts:
        try:
            attempt()
        except ValueError:
            continue
        raise AssertionError("expected a ValueError")
A hint

Walk through DIMENSIONS and BARS[target] together with zip(), and work out each dimension's shortfall as max(0, bar - score). points_short adds the shortfalls up. next_drill keeps the first dimension with the largest shortfall, so replace the best one only when a shortfall is strictly larger. Check that target is in BARS, and that every score is there and between 1 and 4, before you use them.

The sample tests run on this device, in your browser (Pyodide): nothing is sent to mysmartcopilot.com. The first run downloads Python (about 13.5 MB), which is kept for the next runs. A check in your browser is feedback for you, not proof that the code is right for every input.

References

Related tools

Report a problem with this lesson

Quick answers and tool search

Type to search tools or to get a quick answer, for example 18% of 2500. Use the up and down arrow keys to move through the results, Enter to choose, and Escape to close.