Thoughts on the theory and practice of software design.