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. This course is intended for students whose original BSc curriculum included 2IPC0 Programming Methods and who did not take part in that course yet or who did but no longer can pass that course through its resit exam opportunities. Registration after permission from the academic advisors only. The course consists of the content and assessment of 2IRR00, and an additional formal specification assignment.