What 20 Years of Software Projects Taught Me About Delivery
I’ve spent twenty years building software across consulting engagements, product companies, startups, and enterprise settings. Different stacks, industries, team sizes, and delivery pressures.
After a while, patterns become very clear.
These aren’t frameworks. They’re observations — things I’ve seen show up on every team that delivered well, and things I’ve seen missing from teams that didn’t.
Clarity is the bottleneck
At the start of most projects, the limiting resource isn’t engineering capacity. It’s clarity about what’s being built and why. The teams that move fastest are the ones who front-load that clarity — even if it feels like “not building” for a week or two.
The teams that skip it pay the tax later. Usually with interest.
Trust is load-bearing infrastructure
Software delivery is a team sport with high coordination overhead. The quality of the working relationships — whether people surface problems early, whether disagreements are aired or suppressed, whether estimates are honest or politically managed — determines the shape of what gets built as much as any technical decision.
I’ve seen technically mediocre teams ship good products because they trusted each other. And I’ve seen technically strong teams produce disasters because they didn’t.
Complexity is a cost you’re always paying
Every abstraction, every service boundary, every feature flag, every “we might need this later” decision has a carrying cost. That cost often isn’t visible until the system needs to change.
The teams that manage complexity deliberately — that consciously ask “does this earn its complexity?” — maintain the ability to move fast over time. The teams that don’t accumulate debt faster than they realize, until the system resists change.
Delivery is a skill
Not every senior engineer is good at delivery. Some are exceptional at design, architecture, or technical depth but struggle to translate that into consistent, iterative output that stakeholders can track and respond to.
Delivery is its own discipline: breaking work into pieces that move independently, communicating state clearly, managing blockers without stalling, shipping something and learning from it.
It can be learned. But it has to be treated as something worth learning.
The fundamentals don’t change
Across twenty years, through multiple waves of hype and disruption, the fundamentals have stayed remarkably stable. Clear thinking. Honest communication. Iterative delivery. Respect for complexity. Investment in the quality of the team.
Every new tool and methodology either supports these things or doesn’t. That’s still the most useful lens I have.
Leo Steffen