This is an HTML rendering of a working paper draft that led to a publication. The publication should always be cited in preference to this draft using the following reference:
Sustainable Software Development: An Agile Perspective
Upper Saddle River, NJ: Addison-Wesley, 2006
Our software engineering community has for decades flirted with the idea of applying the rigor of other engineering disciplines to the development of software. Sustainable Software Development boldly argues that this metaphor is unsuitable for arguing about software. Buildings are expensive to modify and typically static, whereas software is cheap to modify and evolves over its lifetime. Instead, Tate argues that an appropriate metaphor is a coral reef: an ecosystem of developers, customers, suppliers, distributors, and competitors that lives on top of the software, in the same way as the reef’s organisms live around the coral. Interestingly both the coral and the software evolve together with their surrounding ecosystem.
The book distinguishes itself from other agile programming books by taking a wider view of the field covering not only the project management side of agile practices, but also developer collaboration and technical excellence. The book starts by arguing that the goal of sustainability comes into play by recognizing that a project’s progress depends on the competition between negative stresses (user requirements, disruptive technologies and business models, external dependencies, competition, and cost management) and positive controls (collaboration, methodology, expertise, decision making, leadership, culture, and simplicity). When the negative stresses outweigh the counteraction of a project’s controls the project enters into a death spiral of diminishing productivity. For example, as defects in a project mount (perhaps due to a rush to fulfill a deluge of user requirements) developers spend increasing effort in fixing bugs and less time implementing the actual user requirements. According to Tate, a project’s goal should be to apply the positive controls creating a virtuous cycle of sustainable development. Thus, in our example, by applying an appropriate methodology, such as automated testing, requirements are not considered done before they pass all tests. In the short term this course change will appear to decrease the project’s apparent productivity, but in the long term it will support the project’s evolution and, ultimately, sustainability. Tate contrasts the two ways as working harder versus working smarter.
The remainder of the book is organized around a chapter for each of the four guiding principles that should guide sustainable development: defect prevention, a working product, emphasis on design, and continual refinement. With another apt metaphor Tate advises developers to juggle the four principles of sustainable development while working on product features and fixing bugs. Developers and managers can apply the principles by adopting the supporting practices that Tate describes for each principle. In all cases the practices are pragmatic and clear of dogma. For example, although in common with other agile methodologists Tate argues for a minimal design, he cautions against postponing the design of elements that we will definitely require in the future.
Two appendices contrast sustainable software development with Extreme Programming the Software Engineering Institute’s Capability Maturity Model (CMM). An annotated reading list, an eclectic list of references, and an index conclude the book. The text is full of interesting ideas and illuminating sidebars discussing real-world cases, but as a result at times the reader can occasionally get lost among them, loosing focus of the argument and the course of thought. Some readers may also object to the way the waterfall model, which software engineers have considered as impractical for over a decade, is often (ab)used as a straw man for effortless punching. Nevertheless, this is a book that both developers and managers will appreciate and value. Its advice is important, understandable, and practical: a gift to the software engineering community.