Course Overview

This course is a graduate seminar about software engineering. Its topics change from year to year as do the mechanics and emphasis. The course is designed to prepare students to do research in software engineering areas while deepening and broadening their knowledge. In general we look at current trends and current research to see what are and will be the “hot” topics in the field over the next few years.

This year we are going to emphasize two distinct topics. The first is practical formal methods in the form of program synthesis and symbolic execution. These topics have been around for a long time but advances in the field as well as more powerful machines have meant that these are starting to have practical applications for real software. The use of these technologies is becoming more prevalent and useful. They are going to be integral to new tools and techniques that will be the future of software engineering.

The second topic is empirical software engineering. You can’t publish a paper in software engineering today unless you have done a detailed formal evaluation. Such evaluations, often based on user studies, are difficult and error prone. Still, they are often useful and are becoming necessary. While empirical software engineering used to be a niche area, it is now mainstream and anyone working in the field has to be aware of the methodologies and approaches that are central to it.

Course Mechanics

Students are strongly encouraged to attend each class since in-class discussion is central to the class. For our study of practical formal methods we will start with recent papers (from ICSE 2016 and its associated conferences and workshops). You should choose one of these papers to focus one. The first thing you are going to do is to look for related papers on the same topic. These can be papers that are referenced (directly or indirectly), papers that cite other references, etc. You should build up a bibliography of related papers this way. You should then choose the 3 prior works that you deem the most important in understanding or leading up to the original paper. You will then be expected to give short (10-20) minute talks on these papers. These talks should include time for discussion. Towards the end of the course, once we have all the proper background, you will also do a presentation of the original paper, now in context. This work can be done individually or with a partner.

For our study of empirical software engineering, you will be expected first to choose a topic in software engineering that interests you. This can be debugging, navigation, editing tools, code search, bug repair, collaboration, repository mining, end-user programming or anything else that is covered in software engineering conferences and journals. Then you will be expected to develop a hypothesis related to this topic that can be tested empirically. You will present this topic and hypothesis in class to get feedback and suggestions. Next you will devise an appropriate experiment (or multiple experiments) to test your hypothesis. This can involve human studies but doesn’t have to. You will present your proposed experiment to the class as well. You will then have time to run the experiment(s), briefly giving a status report during the process. Finally, you will write up and present your experimental results and their significance toward the end of the semester.