The nature of software design and composition