This course is about the study of fundamental design concepts, design notations, and architectural design methods for large-scale software systems. Several design methods are presented and compared, with examples of their use. Concepts such as information hiding data abstraction, concurrency, and object-oriented software construction are discussed in depth. Students participate in a group project on software design.