A stack of UML diagrams

As time goes on in the life of a software project, the codebase grows and complexity increases. This along with hacky bug fixes, tacked-on functionality and quick improvements can turn a project into a large multi-functional, inter-meshed disarray.

Needless to say, this makes feature tracking, versioning, bug isolation and maintenance difficult and limits code reuse potential. While it is best if planning and good design practices protect a project from growing into such a state, the need for rapid development is sometimes more pressing than the need to get design details perfect.

Despite the perfectionist in me shuddering at the mess, I see that a product with a flawed design that functions well and that customers are happy with is better than a product that is internally perfect but never delivered. Iterative development and a quick release cycle are the way to go. Learnings gleaned during one iteration can quickly go into the next.

Just don’t forget to track the areas of code that need improvement so that they do get reviewed in future releases. Keep chipping away, keep improving. With time your codebase will make you happy again.