What Makes For Good, And Bad, Software Design