Software Engineering (CPSC 439/539)
IEEE Standard 610.12 defines software engineering as "the application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software". This course introduces standard concepts of software engineering and exposes students to the process of writing good and robust software.
We first introduce standard models of the software development process: waterfall model, iterative model, extreme programming, agile software development. Through projects students get themselves familiar with specifications (what to build), design (how to build), architecture (detailed plan for the design) and design patterns (more detailed plans). We give a quick overview of UML.
A significant part of the course will be focused on improving software reliability, including testing, bug finding, and verification. We introduce delta debugging and automatic test case generation. We show how these methods can increase the correctness of the written code. To increase software reliability even further, we use formal verification to prove that a program works correctly for any input. We describe symbolic execution and generation of verification conditions. We further outline the main ideas of abstract interpretation and model checking.
Slides and Suggested Reading