Course Syllabus

Quick Links

Course description

3 credit hours. The course treats the fundamental challenge of software quality through the entire software product life-cycle. The goal is to teach sound engineering principles to ensure and assure quality at each stage of the life-cycle with an emphasis in early stages on testing techniques, dynamic and static program analysis, and formal verification for high assurance systems. Practical application to software artifacts and algorithm implementation connects the course material to real world application in the field.

Real World Motivation

The true cost of software bugs is hard to quantify, but recent studies suggest they have somewhere near a $1.1 trillion dollar impact on the worldwide economy. In 2017 alone software bugs affected airlines, cars, banks, hospitals, homes, businesses, etc. It is easy to find many examples of software misbehaving without much effort. As computing becomes increasingly ubiquitous in society, its impact when it misbehaves is farther reaching and more costly.

Software testing, program analysis, or even verification are not able to route out all bugs in software. Even safety critical software that is extensively tested, analyzed, and verified contains latent defects yet to be discovered. Software is remarkably complex, even in simple applications, and trends show it becoming more complex with software stacks deepening and concurrency spreading through the cloud.

Software will never be 100% defect free; it simply is not possible to do except for trivial programs. Rather, testing, program analysis, and verification are tools in a sound engineering process to manage defects at an acceptable level. What is acceptable depends on the software system. Safety critical systems must ensure low defect rates while free apps not so much. In either case, testing, program analysis, and verification provide assurances on the quality and reliability of the software that are necessary to any sound engineering process.

This course teaches the core software testing, program analysis, and verification techniques for software engineering. These are safeguards in the engineering process to find critical defects early and to establish that reasonable practices have been followed through the software design life cycle to result in a reliable final product. The key questions that the course explores are:

  1. How can a programmer systematically generate test inputs from requirements, large input domains, or interdependent input sets?
  2. How can the programmer use the code itself to guide test generation?
  3. Are there ways to write and structure code so that it is less likely to have defects and is fundamentally easier to test?
  4. What does it mean to formally prove code correct and how is that done?

The Department Learning Outcomes list specific competencies expected at the end of the course. 

Current (and future) students should carefully review the Class Policies as well as the Study Habits and Teaching Philosophy for the course.

Please see the Schedule Outline or Course Summary below for more details on dates and topics.

 

Course Summary:

Date Details Due