Undergraduate programming languages class, like COMP 524.
Exposure to basic software engineering concepts and practices as taught in COMP 523.
Mathematical maturity, familiarity with mathematical logic, predicate calculus.


The overall goal of this course is to learn software engineering methods, both formal and informal, and to practice their use in designing, building, and validating (verifying, testing) practical software systems.

An auxilliary goal is to give the student a working knowledge of major ideas and concepts from the history of programming languages and software development, and to give some exposure to current topics in these research areas.

By the end of the semester, students will:



This class is designed to teach the disciplined process of software development, from formal specification through to working systems. The student will learn graduate level material that presumes an undergraduate preparation in programming languages and software engineering. The material, therefore, is heavy on formal methods for supporting software development, which are founded on formal semantics of programming languages. While we are leaving a deep treatment of formal language semantics for advanced courses, we will introduce some semantics and verification in support of commonly used specification methods. It also presents disciplined engineering practices such as design and testing, and developing system architecture via design patterns.

The "software" part of the class covers specifications, design, coding, testing methods, and a look at methods for continuous improvement of the software development process. The overall goal is to give a broad introduction to SE techniques used in practice, along with an introduction to formal methods in SE and their current limitations.

The "languages" part of the class gives practical experience with module-level coding in different language paradigms, covering modern object-oriented languages (like C++ and Java) and modern functional languages (like ML or Haskell).


This course combines "pencil pushing" exercises with practical software construction. The class will have a midterm exam and a final exam. Your grade will be based on your scores on these exams, as well as your successful completion of homework assignments and programming projects. You will be given the requirements for various software projects. You will write specifications for the software in one or more specification notations, and will implement the projects. Coding will be in an object-oriented language for some of the programs, and in a functional language for others. You will organize into small study groups (2 students per group) for learning and practicing the methods we cover. Homework assignments will be submitted from each study group, but your exams will be done individually. Your programming projects will also be done individually unless specifically indicated as a group effort.


Below is outdated but i did not yet want to remove it from the info

This is intended as a rough guide; actual topics covered and order of presentation may vary.

1 week
   class goals, overview, summary of OO and functional methods
   software engineering, formal methods, and the development process

2 weeks
   intro to a significant formal spec language (like Z)
   expressing a significant design as formal specs

(A) 6 weeks (overlap)
   realizing a design in an OO language (like C++)
   design patterns
   large system design issues
   language run-time issues
   issues in systematic testing of OO programs (e.g., using axiomatic specs)

(A) 6 weeks (overlap)
   formal axiomatic specs (predicate logic, Hoare triples, WP)
   axiomatic verification
   Abstract Data Types (ADTs)
   axiomatic definition of ADTs
   canonical forms
   implementation of ADTs
   proof of ADT correctness/consistency
   use of ADT axioms in axiomatic verification

(B) 4 weeks  (overlap)
   realizing a design in a functional language (like ML)
   language run-time issues
   issues in testing functional programs

(B) 4 weeks (overlap)
   lambda calculus
   denotational semantics (Mill's specs/verification) 
   type theory

1 week
   others topics, as time permits and/or instructor chooses
     -- temporal logic and model checking
     -- trace specs
     -- statistical methods and the Cleanroom development process
     -- mutation testing