The problem with software development is that the best design is only obvious after the first design has been built.