Students should have a good working knowledge of programming-in-the-small. Experience in designing small systems is helpful. Design is a central activity of software development. This course covers several different methods and languages for expressing designs. Criteria for evaluating designs are introduced, and design methods are evaluated according to these criteria. The concepts of design verifiability and reusability are stressed.