Learning Lab

Technical writing needs room for wrong guesses

4 min read

Technical writing gets better when it leaves room for wrong guesses.

A lot of tutorials are written as if the reader will walk the same clean path the author walked in the final draft. Install the dependency. Create the file. Paste the code. Run the command. See the expected output. Real readers do not experience tutorials that way.

They miss a step. They use a different version. They paste into the wrong file. They already have a port running. They skim the one sentence that matters.

the mistake is part of the explanation

When I write or read technical material, I care less about whether the happy path works on the author’s machine and more about whether the article understands the mistake I am about to make.

For example, a beginner learning matrix multiplication often guesses that matching the total number of values is enough. It is not. The inner dimensions have to match. A good explanation names that wrong guess before the reader falls into it.

This works:

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

This does not:

(2 x 3) dot (2 x 4)

That small failure case saves a lot of confusion. It tells the reader what rule they were probably using and why it is wrong.

the example should fail in the right way

The same pattern applies to software tutorials.

If a command depends on the current directory, show what failure looks like from the wrong directory. If a package requires Node 22, show the version check before the install. If an API returns a shape that changed between versions, show the mismatch.

Clean examples are useful. They can also hide the thing the reader needs to learn.

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

That example teaches the shape of an async call, but it does not teach the boundary. Can getUser return null? Can it throw? Is the caller authorized to read the user? Is this code running on the server or in a client component?

The wrong guesses are where the real learning is.

const user = await getUser(id)

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

return user.name

This is less pretty. It is also more honest.

diagnosis is a teaching tool

A tutorial does not need every production concern. That would bury the idea. But it should include the failure that changes the meaning of the example.

Readers need more than the answer. They need the move that found the answer.

Bad:

If this fails, check your configuration.

Better:

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 is not glamorous writing. It is useful writing.

version changes should be named

Technical writing ages badly when it pretends tools do not change.

I do not want every tutorial to become a changelog. But if a topic is version-sensitive, the article should say what assumption it is making.

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

That sentence gives the reader a way to explain the mismatch. Without it, the reader may think they copied something wrong when the real issue is that they are reading across versions.

examples should be specific enough to fail

If the reader cannot tell whether the example worked, the example is decoration.

Run the script and look for this line:

loaded 12 markdown files
generated 12 route entries

That gives the reader a target. If they see loaded 0 markdown files, they know the bug is probably file discovery, not rendering.

editing should not remove the wrong turn

Every good tutorial is edited. That is fine.

What bothers me is when the editing removes every trace of uncertainty. The final article can make it sound like the author knew the shape of the solution from the beginning, when the real work involved dead ends and bad assumptions.

I do not need a diary of every mistake. I do want the article to preserve the important wrong turn.

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 teaches debugging judgment. It also makes the article sound like a person wrote it after touching the system.

Wrong guesses are not clutter. They are the shape of learning.

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.