Read Time: 5 mins
author: DJ Daugherty published on: 2026-07-08

Building Systems You’ll Still Be Proud of Five Years From Now

technology and craft consulting and professionalism

Software has a peculiar way of outliving our expectations.

Very few systems are introduced with the intention of becoming permanent. Most begin with a modest goal. They automate a tedious process, replace a spreadsheet, support a new customer, or satisfy a single business initiative. The language surrounding them reflects that temporary mindset. We’ll clean this up later. This is just version one. It only needs to last until the new platform is ready. Those statements are rarely dishonest. They simply reflect what the team believes to be true at the time.

Then something interesting happens.

The software works.

People begin depending on it. A second feature is added because the first one was successful. Another department asks if it can solve one of their problems as well. Integrations appear. Reports are built. Customers adapt their own workflows around its behavior. Before long, the application is no longer supporting the business. It has quietly become part of the business itself.

Five years later, everyone refers to it as a core system.

No one remembers that it was supposed to be temporary.

I have seen this happen more times than I can count. Applications that were expected to survive six months quietly celebrate their tenth anniversary. Internal utilities become mission-critical platforms. Small customer portals evolve into the primary way an organization serves its clients. Entire businesses end up depending on code that someone originally wrote on a Friday afternoon simply because it was the fastest way to get through the next release.

The remarkable part is not that software lasts longer than expected. The remarkable part is that we continue acting surprised when it does.

Perhaps that is because software is invisible. A bridge announces its permanence. A building demands respect the moment construction begins because everyone understands they are creating something intended to stand for decades. Foundations are inspected. Materials are chosen carefully. Small decisions are debated because correcting them later is extraordinarily expensive.

Software rarely receives that same consideration. It is easier to imagine that code is flexible enough to correct any mistake later. We convince ourselves that architecture can always be revisited, documentation can always be written next quarter, and technical debt can always be addressed after the next release. The fact that software is malleable gives us permission to postpone decisions that would feel irresponsible in almost any other engineering discipline.

Ironically, that flexibility is one of the reasons software becomes so difficult to change.

Every shortcut has a way of attracting another shortcut. Every duplicated rule eventually diverges from its twin. Every undocumented assumption survives just long enough for everyone who understood it to move on. None of these decisions appear significant when viewed individually. They are simply small compromises made by thoughtful people operating under real constraints. Yet software has an extraordinary ability to preserve those compromises long after the circumstances that justified them have disappeared.

Eventually the system begins to resist change, not because anyone intentionally designed it that way, but because years of perfectly understandable decisions have accumulated into something nobody fully understands anymore.

Organizations often describe these applications as legacy systems, as though age itself created the problem. I have never found that explanation particularly satisfying. Some of the healthiest systems I have encountered were more than a decade old. They were well organized, thoughtfully documented, and surprisingly pleasant to extend. At the same time, I have seen applications less than two years old that engineers approached with visible hesitation because no one could confidently predict what would happen after making even a small modification.

The difference was never the programming language, the framework, or whether the architecture followed the latest industry trend.

The difference was ownership.

Ownership is an overused word in our industry, but not because it lacks meaning. It is overused because we often confuse it with accountability. Accountability asks whether someone completed the work they were assigned. Ownership asks whether someone cares about the condition of what they leave behind.

Those are not the same thing.

A team can deliver every feature on schedule while steadily making the system more fragile. They can close every ticket, satisfy every sprint commitment, and still create software that becomes progressively harder to understand. Delivery measures whether work was completed. Ownership asks a much more uncomfortable question: What kind of system are we creating through the accumulation of all these decisions?

That question changes the conversation.

An engineer who expects someone else to maintain the software naturally optimizes differently from an engineer who believes they will still be responsible for it years from now. Naming becomes more deliberate. Documentation feels less optional. Temporary solutions are identified honestly instead of quietly becoming permanent. Design discussions become less concerned with what can be shipped by Friday and more concerned with what will still make sense after dozens of future releases.

Interestingly, very little of this requires writing more code.

It requires thinking differently about time.

One of the most valuable habits I have observed on exceptional engineering teams is their ability to mentally project themselves into the future. While discussing a design, someone inevitably asks a question that sounds almost out of place.

“What happens when we need to support ten times this volume?”

“What if another product needs this capability?”

“Will someone understand why we did this six months from now?”

Those questions rarely change the immediate feature being built. They change the quality of the decisions surrounding it. They expose assumptions before those assumptions become architecture. They encourage engineers to optimize for understanding rather than cleverness, because clever code almost always has a shorter lifespan than clear code.

This is one of the reasons I have become increasingly skeptical of organizations that celebrate speed without ever discussing longevity. Speed is valuable. Every successful company needs to deliver meaningful progress. But speed without stewardship simply shifts work into the future, where it becomes someone else’s problem until eventually it becomes everyone’s problem.

The most successful engineering organizations I have worked with were not the ones that avoided technical debt altogether. Such organizations do not exist. They were the ones that incurred debt deliberately, documented it honestly, and repaid it before interest consumed their ability to move. They treated shortcuts the same way responsible adults treat borrowed money. Sometimes borrowing is the right decision. Pretending the loan does not exist never is.

There is another aspect of long-lived systems that receives surprisingly little attention.

Every software system is eventually inherited.

Sometimes it is inherited by another team. Sometimes by a new employee. Sometimes by a consultant brought in to modernize an aging platform. Occasionally it is inherited by the very engineers who originally built it, now several years older and unable to remember why an important design decision seemed so obvious at the time.

Future maintainers experience our software exactly as we leave it. They do not benefit from the conversations that happened in conference rooms. They cannot read the whiteboards that were erased years ago. They never hear the reasoning behind a naming convention or an architectural compromise unless we choose to preserve it.

The system itself becomes our explanation.

Its structure communicates what we valued. Its consistency reveals whether we exercised discipline. Its clarity reflects how much respect we had for the people who would eventually continue the work after us.

That, more than anything else, is why I believe craftsmanship still matters.

Not because perfect software exists. It doesn’t.

Not because every application deserves months of architectural refinement before writing the first line of code. They don’t.

Craftsmanship matters because software is one of the few things we create that quietly accumulates the decisions of hundreds of people over many years. Every engineer contributes a small piece of that story, and every future engineer must read it. We owe them more than working code. We owe them code that communicates, systems that remain understandable, and decisions that still make sense long after the urgency that produced them has faded.

The systems we remember most fondly are rarely the ones that were delivered the fastest. They are the ones that continued serving people long after the original project plan had been forgotten. They adapted as businesses changed, welcomed new engineers without unnecessary friction, and earned the trust that only years of thoughtful stewardship can create.

When I look back on the projects that mattered most in my career, I don’t remember the sprint velocity or the release dates. I remember the systems that people were still happy to work on years later. Those are the projects that stand out because they represented something more than successful delivery. They represented a group of people who built as though someone they cared about would inherit the result.

As it turns out, someone always does.

Comments (0)

Leave a Comment

Comments are moderated.

No comments yet. Be the first to share your thoughts!