Teaching good software design