Syllabus

This course is a research-oriented course where you are expected to produce research results on a specific topic of your choice, related to the overall theme of the course. To this end, you will carry out a number of tasks that a researcher in the field of computer science typically does. This includes, reading papers to understand the literature, identifying an important problem to solve, solving the problem, evaluating how good your solution is, and potentially repeating the process to find a better solution.

Consequently, this course assumes that you are interested in doing research in computer science, especially in the areas within this course's interest---systems and software engineering. If you are a grad student interested in doing research in these areas, or if you are an undergrad student who is thinking of going to grad school to do research in these areas, this course can be a good fit for you.

The overall theme of this course is techniques for reliably building systems software. Though this can be interpreted in many different ways, this course has specific topics of interest, such as fuzzing, property-based testing, symbolic/concolic execution, interactive verification, and automated verification, all applied to building systems software such as an OS kernel. This course also features Rust as another focus, due to its memory safety guarantees that can improve software reliability.

Upon completing this course, you will have gone through the complete cycle of research---identifying a research problem, doing a literature review, coming up with a solution, and evaluating the solution. In addition, you will have learned the aforementioned techniques (to a limited extent) and read a number of papers related to those techniques.

Although this course is open to anybody who meets the minimum prerequisites, it may not be a good fit for you for the following reasons.

  • This course is a research course, meaning that it is less structured. Though there are various structured learning components such as lectures and assignments, those are not the sole focus of the course. Rather, the course expects you to explore, experiment, and do your own learning on the way. It is ultimately your responsibility to make the most out of the course.
  • Rust is a relatively new language, which means that the infrastructure around it may not be mature yet. For example, though symbolic execution, property-based testing, or fuzz testing tools for Rust are mostly usable, they may still have some rough edges. This goes well with the spirit of the course that encourages you to explore and experiment. However, you may run into various issues as you use different tools and it may be necessary to pivot around.
  • The course content and schedule are fluid and can change. For example, if certain tools turn out to be unusable, the course content and schedule will adapt to that new piece of information.
  • This course is different from other courses where there are known, preset answers and your job is to find those answers. Instead, you need to identify a research problem yourself and solve it. The problems that you identify can be open-ended and may or may not be clear if there is a solution.
  • The course is new so it might have some rough edges itself.

Think carefully regarding the above before you commit to this course. You are welcome to take this course if the above are not an issue for you.