Carnegie Mellon’s Institute for Software Research (ISR) hosts an active research group with a highly interdisciplinary approach to software engineering. Indeed, we believe that interdisciplinary work is inherent to software engineering. The field of software engineering (SE) is built on computer science fundamentals, drawing from areas such as algorithms, programming languages, compilers, and machine learning. At the same time, SE is an engineering discipline: both the practice of SE and SE research problems revolve around technical solutions that successfully resolve conflicting constraints. As such, trade-offs between costs and benefits are an integral part of evaluating the effectiveness of methods and tools.
Emerging problems in the area of privacy, security, and mobility motivate many challenges faced by today’s software engineers, motivating new solutions in SE research. Because software is built by people, SE is also a human discipline, and so research in the field also draws on psychology and other social sciences. Carnegie Mellon faculty bring expertise from all of these disciplines to bear on their research, and we emphasize this interdisciplinary approach in our REU Site.
Below, we list broad areas of software engineering research that we anticipate summer students could work on, but note that we anticipate that this list may evolve as the summer approaches!
- Automatic Bug Repair (Mentor: Claire Le Goues): Develop new methods for automatically finding and fixing bugs in real-world programs, e.g., using search-based approaches like genetic programming to "evolve" fixed programs from buggy versions or leveraging SMT-solver-based code search to find provably correct fixes for a given defective piece of code.
- API Usability (Mentors: Brad Myers and Joshua Sunshine): Improve application programming interfaces (APIs) by applying human-computer interaction (HCI) principles and methods.
- Computer-Supported Cooperative Work/Social Coding (Mentors: Jim Herbsleb and Bogdan Vasilescu): Understand how developers work in groups, and how they use related computing technologies to support that work, using research techniques from data analytics and ming to interviews and other qualitative studies. For example, how is GitHub and its associated tools changing modern software development?
- Information Visualization and Programming Language Design (Mentors: Keenan Crane, Jonathan Aldrich, and Joshua Sunshine): Build a new system and domain-specific language (Penrose) to automatically generate professional-quality mathematical illustrations from high-level mathematical notation.
- Privacy, Security (Mentors: Jonathan Aldrich, Lorrie Cranor, Travis Breaux): Design new programming languages that make it easier to enforce security policies; analyze how companies collect, use, and share personal information; develop techniques that make privacy and security usable and accessible by everyday consumers.
- Program Analysis (Mentors: Claire Le Goues and Christian Kästner): Improve software quality by developing techniques that can either execute or simply study the source code for real-world programs and find bugs and other opportunities for optimization and improvement.
- Requirements Engineering (Mentor: Travis Breaux): Help developers plan new and exciting applications that leverage our personal tastes, preferences and behaviors, by developing new models and methods to analyze how companies collect, use and share personal information.
- Secure Programming Languages (Mentors: Jonathan Aldrich and Joshua Sunshine): Extend the Wyvern programming language, exploring new features for security and adaptability.
- Software Architecture and Self-Adaptive Systems (Mentors: David Garlan and Bradley Schmerl): Improve software quality with new software architecture design tools, notations, and methods; increase system resiliency, availability, and security through architecture-based self-adaptive systems; and reason about the design and implementation of cyber-physical systems and the internet-of-things.
- Variational Computing/Configurable Systems (Mentor: Christian Kästner): Study the myriad ways that software variation manifests (program modifications e.g., patches, program parameters, security options, or features), and develop techniques to help developers reason about the effects of software variations and help with understanding, debugging, and testing highly-variable software.