
Decisions & frameworks
Keep the expensive decisions reversible
Code changes can be reversible while the records and promises they create are not. Spend care where a choice accumulates costly history.
Pattern Engine · Practical field notes
A decision can be easy to reverse in code and difficult to reverse in the business. A status label becomes a staff habit. A database field accumulates years of records. A product feature becomes a promise customers rely on.
The cost of changing course often grows through use. That makes reversibility worth considering before a choice becomes embedded, especially for data, permissions and external commitments.
Find where a choice becomes a commitment
Changing the color of a button usually leaves little history behind. Changing what “paid” means can affect invoices, reports and decisions already made. Both may be one-line code changes; their consequences differ sharply.
Look at what accumulates around a choice: records, integrations, training, contracts and assumptions in other people’s work. A reversible trial keeps those commitments bounded. A trial that becomes the official record has crossed an important threshold even if the interface still says “beta.”
This helps allocate effort. Test the uncertain choice that would create expensive history before polishing a detail that can change cheaply. The purpose is to learn early where learning later would require unwinding other people’s work.
Protect the valuable boundary
Consider a business choosing a service to send notifications. It may be useful to keep the business’s message rules separate from that vendor’s specific API. If the vendor changes, a limited part of the implementation can be replaced.
That does not mean building a universal abstraction for every possible provider. The boundary should address a credible dependency. Extra layers also need maintenance and can obscure a simple implementation. Tradeoffs helps make that cost visible.
Data deserves particular attention. Test whether important records can be exported with the relationships and attachments needed to use them elsewhere. A download button is not proof that migration will be straightforward.
Delay detail without delaying learning
If an uncertain choice is cheap to revise, use a small test and learn from it. If it would be costly to undo, test the risky assumption before building around it. For example, verify a critical integration before designing an entire process that depends on the vendor allowing it.
Define the question that the test will answer. A prototype should reduce a named uncertainty; otherwise, it can become additional work without changing the decision.
Record the conditions
Write down why the current option is reasonable and what would make you reconsider it. A usage threshold, a missing capability or an upcoming contract renewal can provide a useful review point.
Architecture decision records offer a practical way to preserve this context. Keep the record short enough that the next person will read it. Include the alternatives and accepted consequences, not just the selected product name.
Keep options proportionate
It is possible to spend more preserving every future option than the business could reasonably gain. Focus on the choices that control access to important data, limit essential integrations or create a costly dependence on one supplier or person.
For a bounded experiment, accepting a temporary limitation may be sensible. For a core operational asset, investing in a tested export or a clear interface may be worthwhile. The aim is to retain the ability to respond to plausible change, with enough simplicity to operate the system today.