In my last post, I mentioned the agile manifesto. Agile software development methodologies are very fashionable these days...almost too fashionable. These methods for developing software are a response to the 'Big Design Upfront' methodologies where you design the software system first and then you start coding. The main problem with the BDU approach comes from the fact that the system requirements often change after the design is completed and/or while the coding is in progress. When that happens, the cost of re-design is high and some part of the design might even become obsolete. Furthermore, since you never know how your product will evolve, why design from the start? What the agile community is suggesting is to do minimal design first and then let the software design adapt with the new requirements and with the product natural evolution using refactoring (code level re-design) techniques and/or short design sessions. There is more to agile than that and most practices they suggest makes sense...I would not program without unit tests for example! But something is missing...something called conceptual integrity.
Conceptual integrity is considered, by Frederick Brooks (author of the must read book The Mythical Man Month), as the single most important characteristic for a software system. So what is it? He argues that when developing a software system, the system architecture should use a limited set of well defined concepts. It is like when painting an apartment, you choose a limited set of colors that go well together. He even suggests to reject features that would not fit the conceptual integrity of the system. Why is it so important? Because from the system architecture integrity emerges simplicity and straightforwardness and these brings ease of learning, ease of use and ease of maintenance. It's a bit like the manifesto thing...once the core concepts are defined, future design and implementation decisions are dictated by the design itself.
When evolving the software the agile way, the concept of the system as a whole is somewhat lost. Even though each piece of code is neat and well designed, the multiplication of concepts and the lack of system integrity brings complexity. Then, the learning curve gets steeper, new features require hours of discussion and even a simple change is utterly complex.
Side note: If you want to read an interesting criticism of agile software methodologies, read this entry from Steve Yegge blog.



