Software Design Reference Assessment · Entry diagnostic

Assessment · Entry diagnostic

Where should you start?

Twelve scenarios, two for each of the six judgments this course is built on. They are not a test of what you have read; each one is a decision you would make in a review. At the end you get a starting phase and a lesson number, and an honest account of how little twelve questions can prove.

Time: 25–35 minNo preparation Jump to your route

Answer from judgment, not from memory of a rule. Each question has feedback on every option, including the one you pick — the reasoning is the point, and it is worth reading even when you were right. Your answers are kept in this browser, so you can leave and come back.

How the routing works, and what it cannot tell you

The six skills are ordered by the phase that teaches them. You are routed to the earliest skill where you did not get both questions right, and the recommendation is that skill’s home lesson.

That rule is deliberately strict, and worth arguing with. One wrong answer out of two is weak evidence — it could be a misread question. We treat it as “not yet consistent” anyway, because the two errors have very different prices: re-reading a phase you already knew costs a few hours and reinforces it, while skipping a phase you did not know costs you every later lesson that assumes it. When the evidence is thin, the cheaper mistake wins.

Three honest limits:

1 · Find a structural problem

Home: Phase I · Core Designer. Two questions.

A sign-up handler, three months after it was first written.

def register_user(email: str, plan: str, db: Database) -> str:
    if "@" not in email:
        raise ValueError("that is not an email address")
    user_id = db.insert_user(email, plan)
    price = 0 if plan == "free" else 1900
    StripeClient().create_subscription(user_id, price)
    SmtpMailer().send_welcome(email)
    logger.info("registered %s on %s", user_id, plan)
    return user_id

Reading for structure first, which finding would you lead a review with?

A reporting class from an internal tool.

class ReportBuilder:
    def build(self, rows, fmt, mailer, s3, logger):
        body = self._render(rows, fmt)
        s3.put("reports/latest." + fmt, body)
        mailer.send("ops@example.com", body)
        logger.info("report built")
        return body

One assertion about rendering needs four stand-ins to run. That signals:

2 · Protect a domain invariant

Home: Phase I · Core Designer. Two questions.

A subscription model and the only place its seat cap is checked.

class Subscription:
    def __init__(self, plan: str, seats: int) -> None:
        self.plan = plan
        self.seats = seats


def add_seats(sub: Subscription, extra: int) -> None:
    if sub.plan == "free" and sub.seats + extra > 3:
        raise ValueError("the free plan is capped at three seats")
    sub.seats += extra

As written, the rule that a free plan never exceeds three seats is:

Same subscription model.

Which change makes that seat cap impossible for any caller to bypass?

3 · Identify a leaking boundary

Home: Phase II · System Designer. Two questions.

A repository port, as it appears in the domain package.

from typing import Protocol


class OrderRepository(Protocol):
    def find(self, order_id: str) -> Order: ...
    def save(self, order: Order) -> None: ...
    def query(self, sql: str) -> list[dict]: ...

This port stops being replaceable because of:

A module inside the domain package.

# domain/pricing.py
import stripe


def charge_for(order: Order, customer: stripe.Customer) -> stripe.PaymentIntent:
    cents = order.total().cents
    return stripe.PaymentIntent.create(amount=cents, customer=customer.id)

The most damaging consequence of this module, as written, is that:

4 · Compare an architectural trade-off

Home: Phase III · Master Designer. Two questions.

A checkout writes an order, then calls a fraud-scoring vendor. The vendor’s published p95 is 900 ms and its contracted monthly availability is 99.5%. Checkout’s own driver says 400 ms at p95 and 99.95% availability.

The strongest reason to move the fraud call off the request path is:

A shop shows a stock count on the product page and reserves stock at checkout. Both read from one replicated store.

The most defensible split of consistency across those two reads is:

5 · Turn a vague requirement into a quality-attribute scenario

Home: Phase IV · Initiative Lead. Two questions.

The brief says: “the returns portal must be fast and reliable.”

Which rewrite of that requirement is usable as a design driver?

A draft driver reads: “If the carrier API is down, the system stays available.”

What is this availability scenario still missing?

6 · Replan an initiative after evidence changes

Home: Phase IV · Initiative Lead. Two questions.

Three weeks before the pilot, research shows customers cannot tell which items are eligible; drop-off at the eligibility step is 38%. The plan assumed the policy was self-explanatory.

What is the first replanning move here?

An accepted ADR chose a synchronous carrier call, assuming a 400 ms p95. Measurement in the sandbox puts the carrier’s p95 at 2.4 s.

How should that change be recorded?

Your route

Answer the twelve questions above and your route appears here.

Whatever the route says, skim the phases you skip. Each phase page on the index lists its lessons as capabilities. Read the list; if a line describes something you cannot demonstrate on your own code today, read that lesson even though the diagnostic let you past it.

What to do with this

If your route isStart hereAnd take this assessment when you finish
Phase I · Core Designer 0001 or 0011 Phase 1 assessment
Phase II · System Designer 0015, or 0023 for the boundary run Phase 2 assessment
Phase III · Master Designer 0027 for the whole phase, or 0031 for the system trade-offs Phase 3 assessment
Phase IV · Initiative Lead 0039 — the returns-resolution case starts here and runs to the capstone Phase 4 assessment
Phase V · System Architect 0051 Phase 5 assessment

Working through the code lab alongside the lessons is what turns the recognition this page measured into something you can do on a codebase. Retake this diagnostic’s harder twin, the exit diagnostic, at the end.