When the Architecture Survives the Rewrite
Reusing an architecture turned out to mean replacing most of its machinery and discovering which parts had actually been architecture all along.
Reusing an architecture turned out to mean replacing most of its machinery and discovering which parts had actually been architecture all along.
Productivity breakthroughs remove old constraints, then expose the work required to keep independently moving parts aligned.
Dependency injection helps early, but at scale it can preserve coupling instead of preventing it. The real issue is not wiring, it is boundaries.
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.