State-of-the-art, industrially tested, specification and design techniques are presented, illustrated on small examples, and applied to realistic problems. The objective of the course is to develop an understanding of the technical and organizational complexities involved in software development and to teach key concepts and techniques used to manage these complexities. The students are required to design and build systems through team effort. Emphasis is placed on emulating the realities of an industrial organization. The classes are conducted in an intensive workshop atmosphere. The projects cover the principal system development life-cycle phases from requirements analysis, to software design, and to final implementation. Issues relating to human factors, dependability, performance, operating costs, maintainability and many others are addressed and resolved in a reasonable manner.