Part VI · Chapter 12 · The Decisions · lesson 1
Which of these decisions can you take back?
13 min
Builds on Say what would change your mind, before you look at options
Part VI · Chapter 12 · The Decisions · lesson 1
13 min
Builds on Say what would change your mind, before you look at options
Five things on the whiteboard this sprint: the cloud provider, the database engine, the URL shape of the new public API, the queue library, and whether customer IDs are sequential integers or opaque strings.
Somebody has booked one two-hour meeting for all five.
Four of them are the wrong length of meeting. Before you read on: which of the five would be hardest to take back once real traffic is on it?
Predict
A decision is one-way to the extent that somebody else holds a copy of its output, or the information it threw away is gone.
That is the whole test, and it has nothing to do with how much the component cost or how senior the person who chose it was. Three things make a decision genuinely hard to take back:
Copies outside your control. Identifiers, URL paths, webhook payload shapes, exported files, published documentation, emails already sent, data shared with a partner. You can stop producing them. You cannot un-produce them.
Information you destroyed or never recorded. The event you did not log, the field you coarsened to save space, the precision you rounded away, the consent you did not capture at signup. Reversing this needs a time machine, not a migration. This is the category people miss most often, because it does not feel like a decision at the time — it feels like a schema.
Commitments with other people's names on them. A signed contract, a published price, an announced deprecation date, a three-year compute commitment, a promise in a security questionnaire. Reversible only by asking somebody outside your team, which means it is not on your schedule any more.
Notice what is absent from that list: technology. Almost every technology choice is reversible at a cost measured in engineer-weeks, and engineer-weeks are exactly the resource you are trying to protect by deliberating. That is the trap. The deliberation is drawn to the components, because components are what architecture arguments are made of, and the one-way decisions are hiding in the schema and the API surface, where nobody has booked a meeting.
Four classes, and the only field that matters is the third one.
Two-way and cheap. Undoing it is a pull request. The queue library is here. Decide it in the stand-up; a two-hour meeting costs more than the mistake.
Two-way and dear. Undoing it is a project — a migration, a dual write, a backfill, a cutover. Weeks to a quarter, all of it yours. This deserves a written criterion and a reversal trigger, not a month of argument.
One-way in effect. Undoing it requires somebody outside your team to act: a customer to change their integration, a vendor to amend a contract, a partner to re-import. The cost is not large; the schedule is not yours.
One-way. The information is destroyed, or the copies cannot be recalled.
The third and fourth classes are where the month goes. In most sprints they contain zero items or one.
Not the same thing
Undoing it is work your own team can plan, start and finish without anyone outside the company agreeing to anything, and nothing has been destroyed in the meantime.
Undoing it needs somebody outside your team to change something they control, or needs information that no longer exists anywhere.
Which is which? Put each one on a side.
Picking one relational engine over another for a service that has no users yet
Publishing the webhook payload shape to forty integration partners
Coarsening stored event timestamps from millisecond to hourly precision to shrink the table, with no archive of the originals
Announcing a deprecation date for an endpoint to customers in writing
Choosing which cloud region the first cluster lives in
Here is the part that changes how the meeting goes, and it is not "think harder".
You do not get good at making irreversible decisions. You get good at making them reversible. The month is not for being more certain. It is for buying back the undo button, usually cheaply, almost always with indirection.
The identifier case, concretely. Sequential integers internally, and an opaque external handle for anything that leaves the building, with a mapping table between them. Roughly a day of work at the start of a project. What it buys: the public identifier becomes something you issue rather than something you leak, so adding a second format, rotating one, or stopping the enumeration of your own customer count in your URLs all become ordinary two-way decisions.
The same move, elsewhere:
Every one of those is cheap at the start, dear in the middle, and impossible at the end. That curve — not the size of the component — is what deserves the month.
What would you do
This is twenty minutes and it is the artefact. List every decision your team currently has open — the ones in documents, the ones in a channel, and the ones somebody is quietly implementing. Then fill in four columns for each.
DECISION | HOW YOU WOULD UNDO IT | HOW LONG | WHO OUTSIDE THE TEAM MUST ACT
------------------+------------------------------+----------+------------------------------
queue library | revert the branch | 1 day | nobody
cloud region | migrate, transfer, cut over | 1 quarter| nobody
webhook field set | version 2, support both | forever | 40 partners, on their schedule
event precision | cannot: originals discarded | never | n/a
deprecation date | publish a new date | 1 week | every customer who planned for it
The fourth column is the one that does the work. If it says "nobody", the decision belongs in the stand-up however large it feels. If it names anybody, it belongs in a document with a reversal trigger, and the first question in that document is not "which option?" — it is "what indirection makes this reversible, and what does it cost?"
Then count the rows where the third column says never or forever. On a normal sprint's list the answer is zero or one. If you have five, either you are at an unusual moment — a public launch, a data model being set, a contract being signed — or you have mistaken expensive for irreversible, which is the error this lesson exists for.
Check
The two-class version of this idea is well known enough that most teams can recite it, and reciting it often makes things worse, for a mechanical reason: the sorting is done by whoever is most senior, in a meeting, from memory, and the cues available in a meeting are cost and prestige rather than copy count. So the cloud provider gets the quarter of deliberation, and the identifier format gets none, because it was one line in a migration decided by whoever typed the migration.
The cheap fix is the fourth column. "Who outside this team must act for us to undo this?" is a question a junior engineer can answer about somebody else's decision in ten seconds, it does not require knowing what anything costs, and it puts the schema change and the invoice line in the right boxes without anybody having to win an argument about importance.
The other half is to stop asking "is this reversible?" as though it were a property of the decision. It is a property of the decision plus the indirection you are willing to build, and almost every one-way decision in a young system has a one-day indirection that converts it. Finding that indirection is the actual senior skill here, and it is much more teachable than judgement.
The sort assumes you get to look at the decision before anything has acted on it, and there is a class of change where the undo button exists, works, and still cannot be pressed.
A schema migration that drops a column is a revert in Git and an impossibility in production. Relaxing a rate limit is one line to tighten again, except that customers built against the higher limit within a week, so tightening it is a breaking change you announced by accident. In each case the code is two-way and the effect is one-way from the moment traffic touches it.
So the crossing is this: when the first request that arrives under the new behaviour creates a copy, a dependency or a destroyed row, the decision became irreversible at deploy time rather than at decision time, and the four columns above are being filled in too late to help. Those changes need the thing this lesson has otherwise been quiet about — a staged rollout, a shadow write, a flag with a kill switch tested before it is needed — and the test for whether you need that machinery is exactly the fourth column, asked about the first hour after deploy rather than about next quarter.