CS 7580, Fall 2021, T/F 9:50-11:30am, Hastings Room 114
Course & Registration Information
Welcome! I am planning to post a complete reading list for this seminar over the next few months (by June/July). If there are any particular topics that you are interested in, please feel free to email me, and I’ll see about fitting them in. In the meantime, please see the syllabus posted on this website for more information.
Building, delivering and maintaining successful software products requires more than being good at programming. Software engineering encompasses the tools and processes that we use to design, construct and maintain programs over time. Software engineering has been said to consider the “multi person development of multi version programs.” Development processes that work well for a single developer do not scale to large or even medium-sized teams. Similarly, development processes that work well for quickly delivering a one-off program to a client cause chaos when applied to a codebase that needs to be maintained and updated over months and years. This class will explore recent research in software engineering, focusing particularly on automated approaches that help developers create higher quality software, faster.
The primary objective for this course is for students to learn different methods for analyzing software, with several applications in software engineering, particularly testing. We will study different analysis techniques, learn how they work by studying specific algorithms and tools, and discuss applications of the techniques. Our goal will be to explore the current research issues in this cutting edge area, to learn how to build software analysis tools, and to understand how these techniques can be applied to software development activities.
We will primarily focus on applications for testing software, including automatic test data generation. We will also consider using analysis techniques for other software related activities such as maintenance, reuse, metrics, and optimization. Some of the specific analysis techniques to be studied are parsing, software representation methods (control flow graphs, data flow graphs, program dependency graphs), symbolic evaluation, constraints, program slicing, software coupling, and testability.
This graduate-level course is intended for students who would like to prepare for research in software engineering and other adjacent fields of computer science (for example: security and systems). This course is also designed to be highly applicable to students who are not interested in pursuing a career in research, but who would like to become more productive software engineers in industry. If you are an undergraduate and are interested in taking this course, please contact Professor Bell to discuss registration options.
This seminar-style class will include a term project, worth 50% of your grade. The project will involve a hands-on application of the techniques and tools that we discuss in class, and can be completed either individually or in a group of at most two. Topics for the project will be discussed in the first three weeks of class, and your specific project topic will be finalized soon after. At a high level, project topics will include two tracks:
- Research track: These projects are intended for students interested in pushing the state-of-the-art in program analysis and software testing tools. These projects will involve creating a prototype tool that implements some new concept. Example research projects might include: extending Phosphor or optimizing or enhancing EvoSuite. If you would like to create a formal writeup of your research project, most of these projects will be suitable for publication in an academic workshop.
- Industry track: These projects are intended primarily for students who are interested in honing their programming and software engineering skills, by taking a state-of-the-art idea, and transitioning it to the state-of-practice. These projects will involve taking some idea that we talk about in class and implementing it in a popular tool, for instance, improving the flaky test detector built into Maven, optimizing the JaCoCo coverage tool, or hacking on the regression test selection system in Clover. These projects are intended to be of sufficient quality that you can submit a pull request to have your changes included in the open source tool. Think about next time you are on an interview and you are asked if you are familiar with (insert name of tool here), and you can say “Oh yes, and I have contributed code that made its way in to X.”