Companies expect engineers to "step up" and take on architectural responsibility, without defining what that means, giving them time for it, or providing guidance. The engineers absorb the cost silently: sprint goals slip, tech debt piles up, burnout follows, and when things break there's no map to fix them.
Deferring 2-3 sprints of foundation work to hit a deadline routinely costs months of development time later, once the system breaks and the team has no structure left to recover with.
The inherited mess
At my last job before consultancy, we inherited a codebase from a contractor: an AI-generated application with no thought for DRY, security, or performance. It worked on the surface. Underneath: duplicated code with no component abstraction, circular dependencies, memory leaks, console errors, no documentation.
We rewrote it. The stack was chosen for the business, not preference: Nuxt 4 with CSR (no SEO needed behind a login), reka-ui for accessible components, Tailwind for speed, TanStack Query for sane networking against a separate .NET API, and a docs/ folder that made the codebase navigable by humans and AI both.
Result: 80% of what the client had planned for one year, delivered in four months. That took 120% capacity, which isn't sustainable long-term, but the structure is what made it possible to push hard without the codebase collapsing under the team.
The pattern
Assessment. Audit for circular dependencies, memory leaks, console errors, duplication. Quantify it: how many pages, how much duplication, how many dependencies. Frame it to product as cost (fragility, onboarding friction, delivery speed), not aesthetics.
Foundation, 2-3 sprints of non-feature work. Pick the stack from business constraints: rendering strategy from SEO needs, component library from accessibility requirements, state management from data complexity, styling from team size. Write the docs. Build the first features as examples.
Scaling. Onboard against the docs and examples. Deliver features on the clean foundation. Maintain it with continuous small investment, not big rewrites.
The diagnostic
Recognize 3+ of these and your team is absorbing dysfunction instead of negotiating it.
Code-level:
- Degrading quality: workarounds, deprecations, circular dependencies, memory leaks, console errors, duplication
- No documentation
- No tech stack strategy driven by business needs
Process-level:
- Consistent sprint delays, team running at 120%+ capacity
- Engineers afraid to voice opinions or ship to production
- No one owns the architecture or prioritizes tech debt
- Onboarding takes weeks because knowledge lives in people's heads
Organizational:
- Product doesn't see tech debt because the product still works, until it doesn't
- Engineers don't understand business priorities; product doesn't understand engineering constraints
- Every tradeoff conversation ends in frustration because there's no shared language for the tension
The real cost
I've been on both sides: the team where "stepping up" was never defined, and the team where we built structure and delivered. The difference wasn't the engineers. It was the system around them.
The hidden cost of "stepping up" isn't just burnout. It's the features that didn't ship, the onboarding that took weeks, the incidents that could've been prevented. It's invisible until you build the structure to see it.
Top comments (0)