Why software teams ship working code that's impossible to maintain
Every enterprise system is a singleton. You build it once, with one architecture, one set of frameworks, one history. There's no control group. No way to replay the same business requirements with different technical choices under identical conditions.
This creates a dangerous asymmetry: if the system works, analysis feels unnecessary. If it doesn't work, you analyse. Success silences better questions.
The hidden cost of "it works"
Modern frameworks are extremely good at helping teams implement behaviour quickly. Spring Boot, dependency injection, annotations—they all reduce friction to delivery. Features ship. Users are served. The business functions.
But "it works" tells you nothing about:
- How difficult the system is to change
- Whether complexity reflects the domain or the tooling
- What maintenance will cost in two years
- Whether a simpler approach would have been better
The singleton pattern debate illustrates this perfectly. Singletons deliver correct behaviour—database connections work, configuration loads, state is shared. But they introduce coupling that makes testing difficult, create thread safety issues under load, and assume requirements won't change. Trade-offs that aren't visible until much later.
When delivery pressure meets singleton systems
Because each system is unique and irreversible, pressure accumulates in one direction: make it work now. The dominant question becomes "does this solve today's problem?" not "is this the right kind of solution?"
This isn't incompetence. It's rational response to pressure in systems where correctness is the only visible metric. But it quietly shifts optimisation from understandability to least resistance.
Behavior collapses into annotations. Constructors become wiring points. Objects lose responsibility and become data carriers. Each choice reduces friction today while erasing information about why the system behaves as it does.
What enterprises should watch
The real question isn't whether your system works. It's whether you're building understanding alongside functionality. Spring's dependency injection exists precisely because teams learned the hard way that singletons create problems you only discover under production load.
Worth asking: How much of your architecture is justified by "it works" versus "we understand why this is the right fit"? That gap is where technical debt lives.
History suggests the systems that survive aren't the ones that worked fastest. They're the ones that made their essential complexity visible.