Learning Lab

Technical writing needs room for wrong guesses

4 min read

Technical writing is not only a path to the answer. It is also a map of the wrong turns that make the answer necessary.

A polished tutorial often removes every trace of uncertainty. Install the dependency. Create the file. Run the command. See the expected output. That sequence is tidy, but readers bring different versions, directories, assumptions, and partially completed projects to it.

The useful question is not whether the happy path works on the author’s machine. It is which mistake the reader is likely to make next, and whether the page gives them a way to recognize it.

put the misconception beside the rule

A beginner learning matrix multiplication may guess that the total number of values only needs to match. The actual constraint is narrower: the inner dimensions must match.

This works:

(2 x 3) dot (3 x 4) -> (2 x 4)

This does not:

(2 x 3) dot (2 x 4)

The failed case does more work than another paragraph of definition. It names the rule the reader was about to invent, then gives that rule a boundary.

choose failures that explain the boundary

Software examples have the same job.

If a command depends on the current directory, show the error from the wrong directory. If a package requires Node 22, put the version check near the install. If an API changed its response shape, show the mismatch rather than silently using only the newest shape.

const user = await getUser(id)
return user.name

This teaches the syntax of an asynchronous call. It leaves the boundary unresolved. What happens when the user is missing? Does the function throw? Is the caller allowed to read this record? Is this running on the server or in a client component?

A slightly less elegant example can teach those questions without turning the lesson into a production architecture lecture.

const user = await getUser(id)

if (!user) {
  return new Response("User not found", { status: 404 })
}

return user.name

The point is not to add every possible guard. It is to include the guard that changes what the example means.

diagnosis belongs in the article

“Check your configuration” is not a diagnosis. It is a signpost with no road.

If the command says "module not found", first run `pwd` and make sure
you are in the project root. Then run `ls` and confirm that `package.json`
is in the same directory.

That fragment gives the reader an observation, a likely cause, and a next action. It also models a debugging habit: inspect the boundary before changing code.

Readers do not only need the fix. They need the move that distinguishes one class of failure from another.

version assumptions should be visible

Technical writing ages faster when it hides its assumptions.

A version note does not need to become a changelog. It only needs to explain why a reader following the same words may see different syntax.

This example uses Tailwind CSS v4 syntax with `@import "tailwindcss"`.
If you are on v3, you will still see the older `@tailwind` directives.

That one note turns a mysterious mismatch into a version difference. It keeps the reader from debugging an error that the article could have named in advance.

output gives the reader a test

An example is easier to use when success has a visible shape.

Run the script and look for this line:

loaded 12 markdown files
generated 12 route entries

If the reader sees loaded 0 markdown files, they have a useful first hypothesis: file discovery. They do not have to guess whether the renderer, parser, or route generator failed.

Expected output is a small contract between the article and the person following it.

preserve the wrong turn that carries judgment

Editing should remove noise. It should not remove every clue that the problem had a shape.

I do not need a transcript of every failed attempt. I do want the wrong turn that teaches where to look.

I originally tried to solve this in the component, but the bug was in the
data loader. The component rendered exactly what it received.

That sentence contains a debugging lesson: inspect the data boundary before blaming the display. It also distinguishes a useful experience from a generic claim. The reader gets a reusable question rather than a performance of certainty.

A technical article becomes more trustworthy when it leaves room for the reader’s wrong guess, names the boundary it crosses, and provides a route back.

Jeremy London

About Jeremy London

Engineering leader and builder in Denver. I write about AI platforms, agents, security, reliability, homelab infrastructure, and the parts of engineering work that have to survive production.