Skip to main content
← Notes
Design observation

Good design works before the error

A considerate system does not wait for users to fail before explaining the rules. Visible constraints, timely feedback, and natural mappings make the correct action the easiest one.

The Design of Everyday Things · Don Norman

Table of Contents

Many systems treat error handling as a clearer message shown after failure. That is better than silence, but it still arrives after the mistake. Better design moves forward in time and helps people understand their options and consequences before acting.

Make possible actions visible
#

When an interface shows outcomes but hides state, users must guess at the next step. Visibility means showing where they are, what can be done, which actions are unavailable, and what will happen after completion.

Explaining why a button is disabled is better than rejecting the click. Showing format requirements while someone types is better than listing every problem after submission.

Constrain meaningless choices
#

Good constraints do not merely restrict people; they remove choices that cannot succeed. A date picker omits impossible dates, destructive actions are separated from routine ones, and mutually exclusive options cannot be selected together.

When the structure expresses the rule, the user does not have to hold every rule in memory.

Make feedback timely and useful
#

After an action, the system should quickly show whether it was received, is still running, or has completed. An animation without state meaning makes waiting harder. A failure message without a recovery path does not help the user continue.

Useful feedback answers three questions: what happened, why it happened, and what can be done next. Recoverable errors should preserve completed work whenever possible.

Treat repeated errors as system evidence
#

When many people fail at the same point, the problem is rarely a lack of care. Repeated mistakes indicate a mismatch between the system’s clues and the user’s expectations.

Good design cannot remove every error. It reduces unnecessary mistakes and makes unavoidable ones easy to notice, understand, and recover from. Its work begins before failure.