I had a similar experience in my undergraduate program (and I graduated over 8 years ago). In second year, everyone has to take a software engineering course that consists of completing a full waterfall model group project. It was complete with interviews with the clients, every scrap of planning documentation, and of course the code itself. Each deliverable was due every 2 weeks and everyone had to work their ass off.
Future courses covered agile methods, version control, bug tracking, database design, and so on.
I actually feel a bit sorry for people who end up going through a program like Joel describes -- but certainly good schools are out there and they're teaching things programmers really need for the real world.
Every CS major has to take a software engineering class his or her final year, which consists of learning real-world methods for software development and completing a semester-long group project. It sounds almost exactly like what Joel describes. My group produced a few thousand usable lines of Java code, on a schedule, with documentation, requirements, and the whole nine yards:
http://egroup.definingterms.com/
An overview of the course is available online:
http://cs.calvin.edu/curriculum/cs/262/kvlinden/