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.
A critical component of achieving these three goals is reducing the complexity of software systems through improved reasoning techniques, system structures, and analysis. A less complex system is less costly to build correctly and more predictable in use. The Software Engineering Group's primary thrust is to cope with the crippling complexity of large systems and the processes that produce them.
Software Design and Evolution
In the area of support for software development and evolution, the focus has been on the automation of key programming tasks to dramatically lower the bloated costs of software. To improve the programming task, a new generation of tools is using knowledge of a program's behavior to automate tasks. One example is a tool for assisting restructuring (remodularizing) a program without changing the program behavior, as a precursor to enhancement. Such a restructuring can localize future changes, hence lowering the cost of those changes. The current focus of this work is on visualization and user interfaces for high-level restructuring, and improving tool support for widely used programming like C, and automating other program enhancement tasks. These investigations are now pointing to new ways to think about software modularity.