Carnegie Mellon University

Research Areas

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

Architecture & Designarch icon

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.

Faculty
David Garlan
Eunsuk Kang
Bradley Schmerl
Mary Shaw

Example Research
ABLE Group
A Contract-Based Framework for System Decomposition

APIs & Frameworksapi icon

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?

Faculty
Heather Miller
Brad Myers
Josh Sunshine

Example Research
API Usability

Autonomous Systemsassurance icon

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.

Faculty
Jonathan Aldrich
David Garlan
Claire Le Goues
Bradley Schmerl

Example Research
Model-Based Adaptation of Robotic Systems
Explainable Systems: Improving Confidence in Autonomous System
Runtime Safety Monitoring of Intelligent Vehicles

Distributed Systemsassurance icon

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.

 

Faculty
Heather Miller

Example Research
Programming language support for eventual consistency
Composition and correctness of eventually consistent datatypes
Composition of serverless functions
Verifying configurations of microservices

 

Requirementsrequirements icon

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.

Faculty
Travis Breaux

Example Research
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 security icon

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.

Faculty
Jonathan Aldrich
Travis Breaux
David Garlan
Rohan Padhye
Eunsuk Kang
Bill Scherlis
Bradley Schmerl

Example Research
Self-Protection/Security-Related Self-Adaptation
Modeling and Analysis of Cross-Layer Security Attacks

Software Notations and Tools

Analysis & Assurance analysis icon

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.

Faculty
Vincent Hellendoorn
Eunsuk Kang
Christian Kästner
Claire Le Goues
Heather Miller
Rohan Padhye
Bill Scherlis

Example Research
TypeChef
Alloy*: An Analysis Engine for Higher-Order Logic Specifications

Developer Tools tools icon

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.

Faculty
Vincent Hellendoorn
Brad Myers
Rohan Padhye
Bradley Schmerl
Joshua Sunshine
Bill Scherlis

Example Research
ACME Project
Support for Exploratory Programming
Natural Programming

Languagesconfig sys icon

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.

Faculty
Jonathan Aldrich
Heather Miller
Brad Myers

Example Research
Obsidian: a Safer Blockchain Programming Language
Usable Design-Driven Assurance in the Wyvern Language
Natural Programming

Software Creation and Management

Software Data Analysis data analysis icon

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.

Faculty
Vincent Hellendoorn
Jim Herbsleb
Claire Le Goues
Joshua Sunshine
Bogdan Vasilescu

Example Research
Repository Badges on npm
Statistical Name Recovery

Organizationsorg icon

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.

Faculty
Jim Herbsleb
Claire Le Goues
Joshua Sunshine
Bogdan Vasilescu

Example Research
Breaking APIs
Diversity in Online Software Teams