From software architecture to the study of open source ecologies, Software Engineering research is applying rigorous scientific approaches to address real and meaningful technical challenges. Our work not only advances the state of the art, it changes the world.
Broadly, our research interests can be categorized into three cross-disciplinary categories:
Software Organization and Properties
Software design involves a sequence of decisions that determine the overall structure of a system and allocation of behaviors to its parts. Research in software design explores representations of design decisions and constraints, tools for reasoning about the impact of these decisions, and techniques for ensuring that the decisions are properly implemented. Software architecture is the study of design at scale, with emphasis on high-level structures and interactions that govern the overarching design and evolution of the system. Learn more about the history of Software Architecture at Carnegie Mellon.
A Contract-Based Framework for System Decomposition
Most programming today makes use of APIs and Frameworks, as a key enabler of code reuse. How should these APIs and Frameworks be designed, to maximize their quality, including usability, helping programmers avoid errors, and maintainability of the API and the resulting code? What tools (often plugins for IDEs) and documentation can best help programmers learn and use APIs and Frameworks?
Autonomous systems are systems that perceive information about the state of themselves and the environment they are running in, and adapt their behavior or structure to respond to changes in that state. Examples of autonomous systems are elastic cloud applications, robots and self-driving cars, and many control systems. The challenge with such systems is to develop software engineering techniques to (a) develop such systems in a principled and cost-effective manner, (b) assure that the systems work as expected as they make changes to their own behavior, and (c) build trust in their decisions by explaining them, or working with human operators. Research at CMU is looking into each of these aspects.
Nowadays, most software applications involve multiple devices. For example, a mobile app might interact with one or dozens of other cloud services, or a data scientist might search for insights in a dataset that sits in the memory spanning many computers. These applications are distributed systems, and are challenging and error-prone to develop. Research on programming for distributed systems focuses on ensuring the correctness of computations that span multiple compute nodes, improving the performance and reliability of these systems, and exploring new techniques for composing and reusing software abstractions in the design and implementation of these systems.
Programming language support for eventual consistency
Composition and correctness of eventually consistent datatypes
Composition of serverless functions
Verifying configurations of microservices
Modern information systems must conform to a complex set of requirements that include functional requirements to satisfy stakeholder goals, as well as, policy and legal requirements to conform to societal norms. Systems that cut across individual and societal needs include mobile and web-based applications developed using lightweight, agile methods, and traditional plan-driven designs in health, finance and aviation. In each category, requirements engineering is concerned with the use of different forms of expression, from natural language to formal logic, to describe and (semi-automatically) reason about problems and solutions at-scale. This topic combines research from natural language processing, formal methods, knowledge representation and judgement and decision-making to predict how systems are intended to operate and how and why they might fail to operate, correctly.
Composable and Usable Security and Privacy Requirements
Handling Risk and Uncertainty in Security Requirements Analysis
Harmonizing Multi-Jurisdictional Privacy and Security Policy.
Security and Privacy
In today's interconnected world, security and privacy are becoming ever more central to software. Our research helps to ensure that software's privacy policies meet the needs of users and serve the public interest; that software systems conform to these privacy and security policies; and that systems can adapt and continue to provide service even while under attack.
Software Notations and Tools
As software becomes a more critical part of the economy and of our daily lives, its developers and users need assurance that the software has desired properties. We are developing new analysis techniques and tools that verify new kinds of properties of both specification and code, and which scale to larger systems and more diverse configurations than ever before.
Claire Le Goues
Alloy*: An Analysis Engine for Higher-Order Logic Specifications
Developers use a wide variety of tools in the course of their normal work, across the entire software engineering life-cycle. These include compilers, debuggers, integrated development environments (IDE), and tools that do static analysis, visualization, web analytics, etc. These tools help developers enter code efficiently and correctly, understand existing code, and evaluate the code for an increasing variety of properties, including correctness across various dimensions, performance, and even the usability of the resulting design. Research focuses on increasing the range of what can be automatically evaluated, the quality of the resulting code and developers’ insights, and improving the usability of the tools so developers can use them successfully.
Programming languages are the most basic tool of the software engineer, and language research provides fundamental advances in our ability to express programs and their designs. S3D's research focuses on language and type system abstractions that provide strong theoretical guarantees while at the same time increasing the productivity of developers and helping them avoid introducing defects.
Software Creation and Management
Software Data Analysis is a field that analyzes the rich data available in software repositories (e.g., version control systems, archived communications, online communities) to uncover interesting and actionable information about software systems, software development projects, and the teams managing them.
Organizations focuses on the human and organizational aspects of software development: how people organize to develop software and how these organizations influence the structure and quality of the resulting software.