  Programming problems can be solved in a multitude of functionally correct
ways, but the quality of these solutions (e.g. readability, maintainability)
can vary immensely. When code quality is poor, symptoms emerge in the form of
'code smells', which are specific negative characteristics (e.g. duplicate
code) that can be resolved by applying refactoring patterns. Many undergraduate
computing curricula train students on this software engineering practice, often
doing so via exercises on unfamiliar instructor-provided code. Our observation,
however, is that this makes it harder for novices to internalise refactoring as
part of their own development practices. In this paper, we propose a new
approach to teaching refactoring, in which students must first complete a
programming exercise constrained to ensure they will produce a code smell. This
simple intervention is based on the idea that learning refactoring is easier if
students are familiar with the code (having built it), that it brings
refactoring closer to their regular development practice, and that it presents
a powerful opportunity to learn from a 'mistake'. We designed and conducted a
study with 35 novice undergraduates in which they completed various refactoring
exercises alternately taught using a traditional and our 'mistake-based'
approach, finding that students were significantly more effective and confident
at completing exercises using the latter.
