Emerging design
If development is the process of introducing dependencies, then design is the art of managing those dependencies.
So, design will be effective when applied after development has begun. That is, design emerges from the swamp code.
This type of emergent design is ideal in an agile environment. With techniques such as refactoring, unit testing, and pair programming at our disposal, all we need do is periodically look at our work from a different perspective and have the courage to acknowledge its shortcomings and we will be in a great position from which to emerge a better design.
Here are some tools that I've found helpful for emerging design:
- ispace – an eclipse plugin for visualizing dependencies
- JDepend – dependency metrics
- Bob Martin’s Module Dependencies fixture for Fitnesse – dependency validation