Any book on Software Engineering will tell you that usually more time is spent in maintenance of a software than in any other effort for the project. This makes design of existing code very important, and its maintenance and improvement even more so. A code that is evolving over, say 5 years, is no longer half as good as the original design, which already was marred by pressing deadlines. Enter...