Introduction
“Software is eating the world” ~ Marc Andreessen
Software touches so many aspects of all our lives. Every time we travel, buy goods or communicate remotely with each other we invoke an invisible cascase of software services.
These services, each created by teams of developers, analysts, testers and other professionals, form the backbone of our modern way of life, and without them we’d be plunged back into some simpler time - a technology ice-age - where the instantaneous automated transactions we’re used to would slow time down to a crawl.
Given the importance of software in keeping going the fast-paced lifestyles we have become accustomed to, you’d think that we’d have mastered the process by which software is conceived, created and delivered. However, this is far from the truth: software has remained a complex, unruly beast which has proved very hard to tame no matter what management theories have been used to try to control it.
“Thinking is very hard work. And management [fads and] fashions are a wonderful substitute for thinking.” ~ Peter Drucker
As the utility of the software products and services increases, so does their size and subsequent internal complexity. With complexity comes risk, inertia and resistance to change and, in over twenty years of experience in the software industry, I’ve not come across one organisation that does not have a software problem - be it one of scale, quality or creativity.
So why is delivering valuable, dependable and adaptable software so difficult? What patterns can we see in the past seven decades of software development that could help us improve? What have we forgotten and need to relearn from the past? What lessons can the software industry take from other industries that are successfully managing the complexity problem? Beyond process, practice and tools, what are the founding principles for successful software delivery? This book aims to answer these questions.