People do not experience milliseconds directly. They experience uncertainty: did the click work, is the page stuck, and should they try again?
Show progress early
A blank page gives no information. Even a simple sequence helps:
- reserve the layout;
- show the most important heading;
- load primary content;
- fill secondary details;
- confirm completion.
The shape of the final page should be visible before every detail is ready.
Empty, loading, and error are different
| State | Meaning | Good message |
|---|---|---|
| Empty | There is no content | Create your first article |
| Loading | Content is being fetched | Loading recent articles |
| Error | The operation failed | Try again or read saved content |
These states should not share one generic placeholder. A reader needs to know whether patience, action, or a different route is appropriate.
Prevent duplicate actions
Disable or change the label of an action while it is running:
Ready -> Publish article
Submitting -> Publishing…
Success -> Article published
Failure -> Try again
Small feedback loops protect both the user and the backend from accidental repeated requests.
Performance is partly speed and partly communication about speed.