Developing software is a complex undertaking that is performed in an environment of constant change and uncertainty. In the Introduction, I likened this to a coral reef, not only because of the complexity of the software ecosystem and the need for constant change, but also because of the fragility of existence. It is very hard to build or inhabit a software ecosystem that thrives over the long term.
Very little software is written once, installed, and then never changed over the course of its lifetime. And yet, the most prevalent development practices used in the industry treat change as an afterthought. Competition, the changing ecosystem, and the fact that users (and society in general) are becoming increasingly reliant on software, ensure that the software must change and evolve over time. The resulting combination of increasing complexity, need for change, and desire to control costs is a volatile one because very few software organizations and teams are equipped with the mindset, discipline, and practices to both manage and respond to complexity and change.
The answer to all the stresses placed on software organizations and teams lies in sustainable development, which is the ability to maintain an optimal pace of development indefinitely. In sustainable development, teams are able to be proactive about changes in their ecosystem. Their ability to be proactive is enabled by their attention to doing the work that is of the highest value to customers with high quality and reliability and an eye toward continual improvement despite increasing complexity. These teams are in a virtuous cycle, where the more the team is able to improve themselves and how they work together, the greater their ability to deal with increasing complexity and change.
The next chapter describes unsustainable development and its causes. This is important to understand before considering how to achieve sustainability.