For Prof. Larry Peterson's networking class, we had to build up a web server over the course of a semester. You built IP, and used that library to build TCP, and then served files over your TCP connection.
It was the first time I realized that bugs in earlier assignments don't magically disappear, and changed my thinking dramatically.
I had the same experience in my compilers class at USF. Each assignment added layers on top of old assignments (lexer -> parser -> type checker -> codegen). I think it's an excellent strategy for helping students understand the importance of maintainability. Also, forcing you to revisit past assignments will help implant the concepts.
It was the first time I realized that bugs in earlier assignments don't magically disappear, and changed my thinking dramatically.