I believe today (because I am always learning and adapting) that the principles outlined in this book are key ingredients to attaining sustainability. At the very least, teams who are willing to take on the challenge of sustainability will have an excellent headstart on their journey by adopting the mindset outlined and carefully considering and adopting each of the practices with a goal toward continual improvement.
I have tried to develop and follow a few key themes in this book:
Software development is a complex undertaking. The software industry needs to mature, but in order to do so, we need to match the development methods we use with the complexity of the software technology ecosystem, which forces the need for continual change.
The methods that are still predominantly taught in school and employed in industry are code-then-fix, or the waterfall method. These methods are inadequate to the task because they are change-adverse and are either too lax (code-then-fix) or impose too much ceremony and process (waterfall).
The principles and practices employed in this book are directly from agile development. Agile methods are intended to provide just enough ceremony and process to allow teams to get their job done in a lightweight manner. Unfortunately, some people associate agile development with being not disciplined when in fact agile development requires a great deal of discipline, as should be obvious when reading this and other agile books.
Agile development requires specific project management practices and an emphasis on technical excellence and collaboration. It is too easy to apply agile project management practices such as iterative development and forget that the state of the software being worked on (e.g., maintainability, design and architecture, etc.) and whether the development team includes users (and/or user representatives) and business people that collaborate on the project also greatly influences agility.
Although my background is one where my focus is on producing shrink-wrapped software products, a product could be any kind of software: a web site, IT system such as a database backend, firmware, consulting project, etc.
Too many projects can't cope with the complexity of the software development undertaking. The result is unsustainable development, where teams are largely only able to respond to changes in their ecosystem. They have little control and are almost always in catch-up mode. The most effort goes toward adding features and fixing bugs. These projects respond to complexity with complex solutions that are unreliable (i.e., buggy), brittle (break easily), and unable to support future change.
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.
Sustainable development requires acknowledging the need for change. This means adopting a different mindset and being uncompromising in four key areas: a working product every day, continual refinement, defect prevention over detection, and an emphasis on lightweight but continual design. Sustainable development results, where it is possible to be proactive about change.
The first principle of sustainable development is having a working product every day. A working product, even if it is not functionally complete, gives teams flexibility and allows them to be much more responsive to changes in their ecosystem (user requirements, competitive threats, sales opportunities, etc.) and proactive when opportunities arise. This flexibility is crucial in sustainability.
The second principle of sustainable development is defect prevention. Defect prevention is a change in mindset for virtually all teams, where instead of using the code-then-fix mentality to development, the team does everything in its power to prevent defects reaching customers. Central to defect prevention is the practice of ruthless testing, where computers are relied upon to do the repetitive and boring testing tasks that people do today. This allows people to concentrate on the more creative aspects of testing, such as testing organizations using the product in realistic ways as the product is developed.
The third principle of sustainable development is design emphasis. Design matters, and good design is required to ensure that the product is designed to promote future maintainability and modifiability, both of which are crucial elements in sustainable development. Teams also need to understand how to design what they are working on. Simple design, refactoring, and design patterns all play important roles in design. Every project and team has to find the right balance between iterative design and up-front design. When they do up-front design, however, it is not done in the traditional way that is heavy on documentation, but rather through lightweight collaborative design sessions and the use of design patterns. Design experience and domain expertise is vital in ensuring that teams do not rely on up-front design and design patterns too much because there should always be a bias toward iterative design.
The final principle of sustainable development is continual refinement. Continual refinement applies to how the project is planned and tracked through iterative development. Equally important is that continual refinement is required for how the project is approached, so that the team can continually enhance its development processes and collaboration.
The discipline of iterative development is still useful in applications where continual change is not necessary, possible, or desired. These are projects such as software used in medical analysis (where people can get hurt if there is a defect) or projects with set milestones that must be met in a certain order. This is because even if there is little change in the iteration plans, the simple discipline of being able to plan and track progress is highly valuable.
Because culture change is most often required to achieve the necessary mindset, I have included a chapter as a starter toward achieving the change.
I hope you, the reader, find this book useful.