Software Engineering

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.

Requirements Engineering

Empirical studies show that most of the difficulties in producing large complex systems stem from problems with the requirements, which define what the system is supposed to accomplish. Consequently, methods for acquiring and analyzing requirements can have very large economic leverage. Studies also show that social, political and cultural factors very often lie behind failures in large system development efforts. Our research in requirements is concerned with the use of social science methods and video to develop requirements that will allow the system to succeed in the environment where it will actually be used.

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.

Testing and Analysis

In the area of software testing and analysis the focus has been on the development of methods for ensuring the dependability of software. Previous work involved the development of a systematic, but informal method for analyzing software that was successfully used to verify the functional avionics on a Navy airplane. This project, called the QDA (Quick Defect Analysis) project is now involved in the analysis of Ada programs. Current work has also resulted in the development of a new approach to the measurement of software dependability called trustability. A program has trustability T if we can be T confident that it is free of faults. The trustability research has both theoretical and practical aspects, and includes the development of a trustability measurement support tool.