The architecture decisions that age well
Some choices are cheap to change later and some quietly harden into constraints. Knowing which is which is most of the job.
Read perspective
Get in touch Opinionated, practical writing about the decisions that shape software projects — including the ones that are easy to get wrong.
Some choices are cheap to change later and some quietly harden into constraints. Knowing which is which is most of the job.
Read perspectiveThe interfaces people rely on all day are judged by a different standard from the ones they visit once. That standard is legibility under fatigue.
Read perspectiveFull rewrites fail at a rate that should worry anyone proposing one. The alternative is slower to start and far more likely to finish.
Read perspectiveThe infrastructure bill is the part everyone models. It is rarely the part that causes the overrun.
Read perspectiveTeams that release often are usually accused of moving fast. In practice they are the ones taking the smallest risks.
Read perspectiveSoftware estimates are treated as commitments the moment they are written down. Here is how to keep them useful without pretending to a precision nobody has.
Read perspectiveDebt taken deliberately to hit a date is a strategy. Debt accumulated because nobody was looking is a different thing entirely, and the two need different responses.
Read perspectiveThe migration itself is rarely the hard part. What takes the time is discovering everything the old system was quietly doing that nobody documented.
Read perspectiveTeams that build accessible interfaces tend to build better ones generally. The correlation is not a coincidence, and it explains why bolting it on afterwards never works.
Read perspectiveMicroservices are frequently proposed as a cure for symptoms they do not treat. A look at what actually causes slow delivery, and when splitting genuinely helps.
Read perspectiveA forty-minute test run does not cost forty minutes. It changes how often people run tests, how large their changes get, and how quickly they find mistakes.
Read perspectiveMost interfaces are designed around the path where everything works. Users spend a surprising amount of their time on the other paths, which are usually an afterthought.
Read perspectiveSome problems have a correct answer that can simply be computed. Reaching for a model there adds uncertainty, cost, and an explanation problem you did not need.
Read perspectiveMost documentation is wrong within months because it describes things that change. The parts worth writing are the parts that do not.
Read perspectiveSpeed is treated as an optimisation to schedule later. It behaves far more like a feature: it changes what users do, and it is easiest to build in early.
Read perspectiveBuyers are routinely asked to choose between systems they cannot assess technically. There are still reliable signals, and most of them are not about features.
Read perspectiveCommunication overhead grows faster than capacity does. Understanding the shape of that curve explains a lot of otherwise baffling project outcomes.
Read perspectiveThree tools, three different questions. Teams that conflate them end up paying for all three and answering none of them well.
Read perspectiveChange is treated as a failure of analysis. It is usually the correct response to learning something, and the plan should be built to absorb it.
Read perspectiveBreaches rarely involve novel techniques. They involve credentials, unpatched software, and permissions nobody reviewed — none of which a new tool fixes.
Read perspectiveWhen two teams arrive with different numbers, the tool is usually blameless. The disagreement is upstream, in definitions nobody wrote down.
Read perspectiveLaunch is treated as the finish line, so the period where a system is most fragile is also the period with the least planned support.
Read perspectiveInternal APIs get designed as implementation details and then acquire consumers who cannot be broken. The habits that prevent that are cheap if adopted early.
Read perspectiveThe second system is meant to fix everything wrong with the first. It usually arrives late, missing behaviour the old one had, and with new problems of its own.
Read perspectiveEvery unusual technology choice spends a limited budget. Spending it where it does not create advantage leaves nothing for where it would.
Read perspectiveDiscovery often ends with a deck and a warm feeling. It should end with artefacts that change what gets built and what it is expected to cost.
Read perspectiveEach component is finished on time. Then they have to talk to each other, and weeks disappear into problems nobody assigned to anyone.
Read perspectiveAlerting systems fail quietly. They keep firing, people keep dismissing them, and everyone assumes the system is being watched.
Read perspectiveTreating mobile as the desktop design rearranged misses the point. The constraint that matters is attention, not width.
Read perspectiveSettings feel free to add and are almost impossible to remove. Each one multiplies the number of states your software can be in.
Read perspectiveReview used as a defect-detection gate is slow and not very effective. Used to spread knowledge and question approach, it is neither.
Read perspectiveDashboards get commissioned, built, demonstrated, and abandoned. The pattern is consistent enough to be avoidable.
Read perspectiveOn-call burns people out when the load is invisible and the alerts are noisy. Both are fixable, and fixing them improves reliability too.
Read perspectivePrototypes that become production systems carry every shortcut taken while learning. The value was in the question, not the code.
Read perspectiveSwapping the strings is the easy part. Dates, names, addresses, sorting, and text length break far more often, and they break silently.
Read perspectiveA meeting that recurs indefinitely without producing decisions is usually compensating for something structural that nobody has fixed.
Read perspectiveFlags decouple deployment from release, which is genuinely valuable. Left in place, they multiply code paths nobody is testing.
Read perspectiveA name that is slightly wrong quietly misleads every person who reads it afterwards, and the cost compounds across a codebase.
Read perspectiveBacklogs grow because closing an item feels like a decision and leaving it feels free. The accumulation has a real cost.
Read perspectiveA cache is a deliberate agreement to serve data that may be wrong. Deciding how wrong, and for how long, is the whole design.
Read perspectiveMonitoring built around infrastructure health reports success while the product is unusable. What to measure instead.
Read perspectiveA novel interaction has to be learned. A familiar one is understood instantly, and users did not come to admire your originality.
Read perspectiveAvoiding every proprietary service costs real capability. The useful question is what each dependency would cost to unwind.
Read perspectiveShare the goal, the challenge, or the idea. We will help turn it into a clear digital path.