Software Design Reference Assessment · Exit diagnostic

Assessment · Exit diagnostic

The same six judgments, harder

Twelve scenarios matched one for one against the entry diagnostic: same six skills, different situations, and every one of them a step further in. Take it after the capstone, and compare.

Time: 30–40 minTake it after the capstone Jump to your route

What makes these harder is not vocabulary; it is that the obvious answer is usually a real finding that is not the biggest one. Several questions contain two defensible options, and the feedback says why one of them wins. If you disagree with a verdict after reading its reasoning, that disagreement is worth more than the score — write it down and take it to your peer reviewer.

How the routing works here

Identical rule to the entry diagnostic: six skills in phase order, two questions each, and you are routed to the earliest skill where you did not get both right. The difference is what the route now means. At entry it said “start reading here”. At exit it says “this is the phase whose judgment did not survive a harder version of the same question”, and the remedy is usually practice rather than re-reading — the code lab for Phases I–III, the decision-change simulations for IV.

The honest limits from the entry diagnostic all still apply, and one more joins them: you have now seen this instrument once. Recognizing the shape of these questions is a skill this test cannot distinguish from design judgment. Treat a clean sweep as necessary rather than sufficient, and let the capstone rubric carry the weight.

1 · Find a structural problem

A reporting entry point that has taken on two options.

def build_report(rows: list[Row], options: dict) -> bytes:
    if options["format"] == "pdf":
        renderer = PdfRenderer(options["page_size"])
    else:
        renderer = CsvRenderer(options["delimiter"])
    if options.get("compress"):
        return gzip.compress(renderer.render(rows))
    return renderer.render(rows)

The coupling this signature creates is best named:

Over eighteen months utils.py has reached 400 lines and appears in 62 of the last 80 pull requests.

The most useful first move on that file is:

2 · Protect a domain invariant

An account object that enforces its own rule.

class Wallet:
    def __init__(self, balance: Money) -> None:
        self._balance = balance

    @property
    def balance(self) -> Money:
        return self._balance

    def withdraw(self, amount: Money) -> None:
        if amount > self._balance:
            raise InsufficientFunds()
        self._balance -= amount

Two concurrent withdrawals of the whole balance both succeed. That happened because:

The rule “a customer may have at most three open returns” is enforced inside the ReturnRequest aggregate, by counting the customer’s open returns through a repository query.

The weakness in that design is:

3 · Identify a leaking boundary

A repository method that streams results.

class SqlOrderRepository:
    def find_open(self, customer_id: str):
        with self._session.begin():
            for row in self._session.stream(select(OrderRow)):
                yield Order.from_row(row)

What leaks across this boundary?

The domain publishes LabelRequested(order_id, carrier_response_code=202).

What has leaked, and in which direction?

4 · Compare an architectural trade-off

Team A owns pricing. Team B needs a new price component. Either B sends a pull request to A’s module and waits for A to review and release, or A exposes a plugin point that B configures.

The plugin point trades:

A report takes 4.2 s, of which about 90% is one N+1 query. The proposal is a materialized view that takes it to 0.3 s and adds a refresh job. Three analysts run the report about twelve times a day.

The strongest argument against the rewrite is:

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

A driver reads: “the eligibility endpoint responds in under 300 ms.”

This has a number and is still not a driver, because:

Two drivers conflict: a decision returns within 800 ms at p95, and no return is accepted without a fraud check, which takes 2 s at p99.9.

What does ranking these two drivers actually decide?

6 · Replan an initiative after evidence changes

Four weeks into the pilot: median resolution is 3.1 h against a target under 4, and support contacts are down 31% against a target of 25%. The manual review queue is averaging 68 a day against a guardrail of 50, and fraud loss is up 0.4 points.

The right move is:

The order team says its wave-schedule API will be six weeks late. Your delivery map has a fallback — a 15-minute-stale dispatch export — with a trigger date of week 3. It is week 5.

The most important thing to do first is:

Your route

Answer the twelve questions above and your route appears here.

Entry against exit

The scores alone will not tell you much — twelve questions is a small sample and the two sets are not calibrated against each other. What is worth writing down is the second and third columns. Fill this in from memory of taking the entry diagnostic and from what you have just done; if you cannot remember, that is itself a finding about how far back it was.

SkillAt entry: what did you reason from? Now: what did you reason from?Evidence it changed
Find a structural problem …… a review comment you wrote at work that named a source of change
Protect a domain invariant …… a rule you moved into an object, and the call-site checks you deleted
Identify a leaking boundary …… an interface you rewrote so no vendor or storage word appears in it
Compare an architectural trade-off …… a decision where you wrote the arithmetic and the accepted cost down
Write a quality-attribute scenario …… an adjective you turned into a number that something now tests
Replan after evidence changes …… a decision you superseded, with both records still readable

The fourth column is the one that matters. A diagnostic score is a claim about a Tuesday afternoon; a superseded ADR with its predecessor intact is evidence. If a row’s evidence column is empty, that skill has been read about and not yet practiced, whatever the questions said.

Where to take this next. Two or three rows with real evidence are the raw material for the interview narrative and the contribution section of the portfolio guide, which is also where the rules on anonymizing workplace artifacts live. The rubric is the vocabulary for describing what changed.

After the exit diagnostic

There is nothing left to score. What is left is the practice that makes any of it durable: