Software Engineering is concerned with discovering techniques for improving the cost, correctness, and usability of software systems. Unfortunately, these goals are in continual tension with each other. Indeed, most commercial software systems fail on all counts, threatening the health of the software companies and the well-being of software users.