Modern programming languages offer powerful facilities for the design of object-oriented programs. These facilities must be used in a methodical way to avoid chaos and unmaintainable software. The design techniques concern both the way of working (design process) and the organization of the software itself. The course focuses on abstraction mechanisms (procedural, data), design patterns, and underlying design principles. Test-driven development (TDD) is used as design process.