9 January 2024 / Working notes

Why I’m writing this down

I keep notes while I work, mostly because I'll have to explain a decision again months later. This journal is where I'll put the implementation details, failures and changes of mind I think are worth coming back to.

A hand drawing in a spiral notebook at a marble-topped table.
Photo: Kaizen Nguyễn (opens in a new tab)

A technical decision can look obvious while everyone still remembers the conversation, and then a few months later the same choice looks arbitrary. The code shows what got built, but it rarely shows the deadline, the systems that were already there, the options we ruled out or the risk we were most worried about at the time. Without that, someone reopens the question. Sometimes that's the right call because things have changed, but you can only tell if the old reasoning is still around to compare against. I'm not trying to defend every old choice here. I just want enough of the reasoning kept that a later review is actually useful.

Writing down "use option A" leaves most of the decision out. What job needed doing? What couldn't change? What did we know? What would have made another option better? For most notes I'll try to capture:

  • the situation, and the user or operator it affects
  • the decision, including where it stops
  • the alternatives I took seriously
  • the checks I'd use to tell whether it works
  • any risk or assumption that needs another look

This is a lot less formal than an architecture document, on purpose. A short entry written while the detail's fresh is far more likely to exist than a perfect one I plan to write later. The date matters too, because tools change, prices move and integrations pick up new capabilities, so a decision should be read against what was available when it was made.

Failures are the part I most want to keep. Successful work leaves things behind (deployed code, accepted designs, procedures), but a failed attempt usually disappears. The branch gets abandoned or the config gets changed until the problem goes away, and the next person only sees the end state, so they can quite reasonably try the same thing again. A failure note doesn't need a big post-mortem. It needs what I changed, what happened and enough detail to tell a bad idea apart from a bad test. Partial failures count as well, like a feature that passes its happy path while support can't see what happened, or an import that finishes and quietly skips records.

I'll also try to leave the changes of mind in. If I liked one approach in January and another in March, I should be able to say what changed. That doesn't mean publishing every passing thought, though. The topics will move around software delivery, applied AI, data and integrations, and I'll mostly be looking at details like state transitions, permissions, retries, evaluation cases and what support can see, since that's usually where an implementation starts to make sense.

Private work stays private, so I'll describe a pattern without naming the organisation or the people, and anything that can't be pulled apart from that context safely doesn't go here. That's the reason I'm writing this down at all. A few months on, the code will still show what got built, and I want these notes to hold the reasoning, the failures and the changes of mind that would otherwise go with the conversation. Before I publish one, I'll check whether someone could use it to make the decision again, repeat the test or recognise the same failure, and if they couldn't, I'll add what's missing or keep it as a private working note.

Got a take on this?

Share it on X. I read the replies.

All blogs