Why DI Becomes a Liability at Scale
Dependency injection helps early, but at scale it can preserve coupling instead of preventing it. The real issue is not wiring, it is boundaries.
Dependency injection helps early, but at scale it can preserve coupling instead of preventing it. The real issue is not wiring, it is boundaries.
Clear architectural boundaries do more than organize code. They change onboarding, code review, delivery rhythm, and how teams think about ownership.
A scoped message channel can keep components independent without turning your app into a global event bus, as long as orchestration and state mutation stay centralized.
A small set of boundaries that keep an iOS codebase loose: AppContext orchestrates, AppServices do work, AppState stays value-only, and ViewContext becomes the view’s contract.
How small boundary violations compound over time, and why many iOS codebases begin to resist the very teams trying to evolve them.
Modern hiring systems optimize for risk avoidance and checklist matching, often filtering out the engineers best equipped to deliver long-term impact.
Technical debt can be tracked. Drift cannot. Understanding the difference changes how teams build, refactor, and stay aligned.
What happens when technical mastery stops being enough, and senior engineers begin shaping how teams build, not just what they ship.
How architectural leadership, not headcount, separates stable teams from struggling ones.
A two-week iOS codebase audit should not be a long report. It should surface real bottlenecks and deliver a plan the team can act on next sprint.