1) Take a messy but correct program and add some functionality it was not originally designed for.
2) [Not known to the students in advance] Add some other kind of functionality it was not designed for.
Evaluate how the changes you made in part (2) made this task easier or harder. (3) Improve the design so that it is as easy as possible to add more functionality to it in future, without overdesigning (adding flexibility that will never actually be required).
Reinforces when and when not to attempt optimisation; kinds of performance tuning