|
A few days ago, I came across this write-up by Gordon Brander, which sparked some thoughts about Apple's app development environment and the broader challenges of ecosystem evolution. When Apple laid the foundation for Xcode, they couldn't have anticipated its future needs—supporting multiple platforms or accommodating Swift, their own programming language. Like any growing system, these early decisions created inefficiencies and required workarounds. As Brander astutely notes: Software can be rebuilt because software is a machine. But a software ecosystem is not a machine. It is a living system. When we attempt to rebuild the ecosystem, we're making a category error. We're confusing the software for the ecological process unfolding around it.
These inefficiencies often tempt developers to create alternative solutions—to fork the ecosystem. We've seen this pattern repeatedly with CocoaPods emerging to handle dependency management, Fastlane introducing new automation approaches, and Tuist proposing generated projects as a new abstraction. Even Apple itself created forks with SwiftPM, introducing another build graph and system, and with structured concurrency where they forked the concurrency paradigm by building a technical layer upon existing frameworks. These forks serve a vital purpose: they push ecosystems to explore new ideas and challenge established assumptions. However, they must respect the ecosystem's natural flow and work toward integration rather than isolation. CocoaPods exemplified this by demonstrating that dependency management was a widespread need, while maintaining an exceptional level of engineering excellence in guiding their innovation back into the ecosystem. Forking an ecosystem means fighting against its natural flow. As Brander references from Lewis Carroll's Through the Looking-Glass: Now, here, you see, it takes all the running you can do, to keep in the same place. If you want to get somewhere else, you must run at least twice as fast as that!
This reality is evident in Xcode's current challenges with AI-driven development. While tools like Cursor and GitHub Copilot for VSCode embrace these new paradigms, Apple's slower adaptation demonstrates the difficulty of keeping pace with evolving ecosystem demands. At Tuist, we learned this lesson the hard way. Our initial approach of generating project structures created features that served only a subset of developers, making our solution seem impractical for the broader ecosystem. For those building apps or developer tools, the path forward is clear: work with the ecosystem, not against it; embrace the platform's imperfections; build upon existing foundations rather than replacing them; shape through influence instead of intervention; and be patient—ecosystem evolution takes time. As Brander concludes: So, when a living ecosystem does emerge, we have to cherish it, foster it, despite shortcomings, inelegance, ugliness. All living systems are ugly and a little bit eldritch… squishy. That's how it is.
|