6898: Advanced Topics in Software Design

Time & Place | Overview | Schedule | Readings | Projects | Tasks | Lecture Notes | Final Projects | Photos

Course catalog entry
6.898 Advanced Topics in Software Design (H)
MW 2:30-4, Room 66-160
Professor Daniel Jackson
Prereq.: 6.170, 6.042J

Topics are likely to include: modelling languages (Alloy, JML); programming language constructs for expressing design (functors, typeclasses, units, mixins, aspects); classification of problems and solutions (problem frames, analysis patterns, design patterns); decoupling theories (axiomatic design, design structure matrices, module dependences).

Time & Place

Class meets twice a week, Mondays and Wednesdays, from 2:30-4pm, in 66-160 (Landau Building). First class is on Wednesday, February 6.

I highly recommend Matthias Felleisen's course at Northeastern Topics in Programming Languages: Type Theory which you might also want to attend if you're taking this course.

I also recommend the reading group on program analysis that Alan Donovan's running this term.

If you're interested in program analysis, you might also want to look at some of the recent work in the software design group on using Alloy to find bugs in code. There's an early paper here; for drafts of more recent papers, contact Mandana Vaziri (vaziri at lcs.mit.edu).


This course is intended for graduate students wanting to do research in software design, and for students whose research involves software development and who want to deepen their understanding of software design issues. We'll investigate some new ideas in software design by studying recent papers and experimenting with the ideas by writing some programs and models.

Students will be expected to attend lectures, read papers, do two written exercises (each of 2 weeks' duration), and one research project individually or in small teams. Each student will be asked to act as class scribe for one class.

The main topics will be:

  1. Abstract Modelling. We'll learn how to use the Alloy modelling language to write succinct but precise descriptions of program behaviour, and to analyze them automatically. We'll also look at component specification languages, such as JML. We may consider some of the problems that arise in specifying classes in the presence of inheritance.
  2. Patterns. We'll look at approaches to capturing recurring patterns or idioms in specifications and designs: Martin Fowler's analysis patterns, Michael Jackson's Problem Frames, and the Gang of Four design patterns.
  3. Programming Language Mechanisms. We'll study a variety of mechanisms that have been developed in programming languages for expressing the structure of modules and their relationship to one another: signatures, functors and sharing constraints in Standard ML; typeclasses in Haskell; open classes and mixins; and Flatt and Felleisen's units.
  4. Decoupling Theory. David Parnas's early work on decoupling has had enormous influence on how we think about program structure, but there's been surprisingly little work in the computer science research community on the nature of module dependences and decoupling. We'll revisit Parnas's early papers on the uses graph and information hiding. Then we'll read excerpts from recent books on decoupling in the larger context of engineering: Nam Suh's axiomatic design, and Baldwin and Clarke's theory of modularity. My hope is to develop some new ideas about decoupling for modern software designs in the style of these theories.


There will be three projects. The first two will be exercises intended to familiarize students with new ideas; the third will be a research project.

  1. Modelling Exercise. Building and analyzing models of some simple algorithms and systems in Alloy. Likely to include a distributed algorithm and a name resolution scheme.
  2. Programming Exercise. Designing and constructing a small program in Haskell, ML or Jiazzi to experiment with new ideas in module structuring. Likely to involve construction of an API for binary relations and instantiation in an application that finds subway routes.
  3. Research Project. Students will work alone, or in groups of 2 or 3. Can pursue any research topic of interest related to the course content (sample problems will be suggested), apply course ideas to an existing program (for reengineering or analysis), or build a new program based on course ideas.