Teaching Patterns and Software Design

In this paper we describe our experiences with reengineering an undergraduate course in software design. The course's learning outcomes require that students can model, design and implement software. These are inherently practical skills and rely on functioning knowledge. To facilitate a learning environment in which students can acquire the necessary deep level of understanding, we have designed the course by applying the educational theory of constructive alignment and a number of proven techniques for teaching, learning, and assessment. Fundamentally, we have embraced the active learning paradigm that recognises that student activity is critical to the learning process. In this paper, we describe several active learning techniques that we have used including role play, problem solving and peer learning. We also describe two novel assessment techniques we have developed, holistic assessment and formative examination. In addition we describe how students work with JUnit, a popular unit testing tool, not as users but as developers by applying design patterns to extend it with new functionality. Finally, we report on student assessment results and relay student feedback.