====== Description of the course ====== The course deals with the problem of designing software which can be used, understood and modified by people other than the original developer. Software design is in itself a large topic as design can deal with various classes of programs and systems: small, medium and large; batch; real time; distributed; and interactive (visual and graphical). Every design class has its own problems. In this course we will deal with the design of small to medium programs and small systems that work without time constraints. We will study the following design methods: top down design, bottom up design and abstract data types, object-oriented design and design by contract. A robust design method combines the advantages of each of the methods and uses them at appropriate times. Some of techniques we will look at will be: backtracking, exception handling, and the use of design patterns. The design methods and techniques can be applied to most programming paradigms but this course will primarily use object-oriented programming. Graphical documentation will use BON (Business Oriented Notation). Programming will be in Eiffel. Upon successful completion of the course you can expect to have a broad understanding of design issues and methods which will enable you to learn new design methods and techniques, and variations of them, of a formal, semi-formal and informal nature. Some of the methods discussed in the course scale up to large problems and are used across the spectrum of program classes. Topics *Core OO technologies (classes vs. objects, clusters, polymorphism, genericity, multiple inheritance, contracts, tuples and agents). * Plan-driven and Test-driven (i.e. unit testing a la JUnit) software development. *Design By Contract (DbC). * Design Patterns. *Architectural Diagrams (BON). * Tools: Integrated Development Environments (including Debuggers and Documentation Tools); Testing Tools.