Aims

There is an unfortunate temptation for developers to over-engineer projects. This is despite the KISS rule of agile development ("keep it sweet and simple"). So, throughout this project, the same question will be asked over and over again: "what is the simplest thing that works properly?"

Unit testing is one of the most critical aspects of agile development, even for a lone developer. If you get it right, confidence and satisfaction levels soar, as does the maximum size of project you can tackle. The biggest problem by far with unit testing is the psychological one of getting round to it.

Refactoring builds on unit testing. It consists of redesigning and reimplementing to add functionality in small stages. Unit testing allows components of the project to be refactored quickly and confidently, confirming that old functionality has been accurately reconstructed.

An important aspect of agile development which is surprisingly rarely mentioned in tutorials or textbooks or courses, is avoiding unnecessary cyclic dependencies. This allows components to be refactored in a specific order, with each being upgraded and unit tested in turn. A group of cyclically dependent components must either all be handled as one big unit, or over-complex mocking techniques must be used to separate their development. Tools such as depend or CDA can be useful to keep track of dependencies. So, in this project, cyclic dependencies will be avoided.

A project design is often cleaner and clearer if general issues which could potentially be reused in other projects are separated from issues which are specific to the current project. So, classes in this project are divided into framework and custom classes, with framework classes not depending on custom classes.

Some effort has been made to move complexities into framework classes, where that allows custom classes to be kept simple. But the framework is not fully general, polished, documented, or versioned, as it should be for a fully general purpose facility. Developers can use this framework, but they must be prepared to understand and adapt the framework classes.