Software Engineering (CPSC 439/539)


Regular MeetingsMon and Wed, 11:35-12:50pm in DL 220
Instructor Ruzica Piskac
Office hours: Monday 3:00-5:00PM in AKW 212, or by appointment
Teaching Fellow Ronghui Gu


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.

Course Material

Slides and Suggested Reading

  1. Jan 13, 2014: Course Overview (slides)
    W. Wayt Gibbs: Software's Chronic Crisis, Scientific American; September 1994 (link)
  2. Jan 15 and 17, 2014: Software Process (slides1, slides2)
  3. Jan 22, 2014: Requirements and Specification (slides)
    Writing Software Requirements Specifications (href)
  4. Jan 27, 2014: UML (slides)
  5. Jan 29, 2014: Design Patterns (slides)