5 January 2005
From time to time people question whether a particular specialty can be used incremental way: "You can't do (security | user interface design | databases | internationalization | * ) with an agile project because this aspect has to be done up front."
When a question like that's put to me, I'm immediately on a sticky wicket because I'm not that knowledgeable on that specialty. Application design is something I think I can talk about, but security (for instance) isn't - and my questioner may well be a well regarded leader in that field.
Despite my acknowledged limitations in that field, I'm not about to say that you can only use planned design in that area. What I can say is that we don't really know whether you can do incremental design in that area. I've seen enough cases where people have said "you can't use incremental design for x" only to find you can. Application design is one, database design is another. So until people try incremental design out in a serious way, I'm very reluctant to rule it out.
Part of the difficulty of assessing this question is that it's too easy to do incremental design poorly. If you do incremental design in an uncontrolled way, you are most likely to end up with a design that is a mess - to make incremental design work you need something that makes the design converge into order. In Is Design Dead I referred to these as enabling practices. For software design I labeled testing, continuous integration, and refactoring as key enabling practices to get software design to converge and avoid software entropy. When we talk about something else, like UI design, the issue is finding what those enabling practices are. They may be similar or inspired by those in software design, or they may be something different. In database design, for instance, incremental data migration is a key enabling practice. Until you find a good set of enabling practices, incremental design is thin ice.
Despite that thinness, I do think that an incremental approach is so worthwhile, that it's worth experimenting to find the right way. Phased up-front design approaches fail far too frequently - furthermore they do a poor job in the chance of volatile requirements - which I see as a unavoidable factor, at least in enterprise software development.
The biggest reason, however, that I favor incrementalism is the oldest one - risk management. Without trying out your designs, you are too vulnerable to things not working out the way you think they would, too vulnerable to schedule slippages late in development. These risks are reason enough to look for ways to introduce incrementalism into more aspects of software development.