Have to disagree I'm afraid. Software that 'works' is not good enough. Good software meets the following criteria - Performs its function with minimal bugs - Code Easy to understand by any average developer that may work on it in the future (if advanced techiniques are used that the average developer would not understand they should be commented to at least provide a jumping off point to learn that technique) - Designed in such a way that changes to requirements can be applied with minimal impact (loose coupling) - Designed in such a way that any single modification need only be made in a single location (DRY principle) - Designed in such a way that any fairly generic bit of functionality can be re-used without too much hassle - Exhibits reasonable performance in terms of speed and memory usage (according to requirements) - Future proof to a fair degree (in terms of scalability and according to requirements) and thats not to mention the little nuances such as naming conventions and comment styles