We identify four problems that must be addressed to improve the quality of teaching a software engineering course that mirrors the real world: We have to start teaching iterative and incremental design, we need to introduce students to the problems of negotiation, co-ordination and team-work, we have to learn how to re-use large complex systems across project courses and we must overcome the inadequacy of traditional means of dissemination of course materials. We identify the pedagogical implications of these problems that have to be addressed before we can hope to improve software engineering education. The ideas presented in this paper are currently investigated in the framework of a senior undergraduate course at Carnegie Mellon University.