I decided to try to give them a taste of the real world by breaking the class into four teams who would be creating the same little system. Within each team, each student owned a part of the system. Each week, each student would have a different assignment: to enhance his or her part of the system. The team members would peer-review each others' code and otherwise collaborate to achieve success -- just like in the real world.
Then, the last week of class, we would commandeer a computer lab and the four teams would race to see who could integrate their system the quickest.
Most of the components of the class worked as intended.
Teamwork -- Each team had a leader (appointed by me) who was free to lead the team as he/she saw fit. One team excelled -- mainly due to excellent leadership, and one team failed miserably -- mainly due to non-leadership.
Collaboration -- A significant part of each student's grade was based on their participation in peer reviews and other team-oriented work. I encouraged them to seek help from each other on their assignments (short of doing the work for each other), and some benefited from doing just that.
Enhancement -- After the first assignment, each student was enhancing existing code, rather than writing from scratch, and those enhancements involved working around the programming decisions that they themselves had made. So 10% of the course time was spent writing a new program from scratch, and 90% was making enhancements to existing code -- just like real work.
Will a team of rank novice programmers, after working on their individual components for weeks on end, be able to integrate those components into a working system in less than three hours?
If I had had the insight to ask myself that question, or the fortune of having someone else ask it, the answer would have been so glaring as to send me running from my original plan. Of course they won't be able to do it! Even professionals with years of experience struggle with this sort of "big bang" integration.
So what was supposed to be the crowning end to my real-life-like course turned into an exercise in frustration. Not one of the four teams was able to even come close to a working system. They struggled through problem after problem until after two hours I mercifully called a halt to the exercise.
I focused their frustration squarely where it belonged -- on the "Big Bang" integration process. Then I explained that we should have been integrating the components of their system regularly through the course instead of waiting until the end. I told them that integration is always a problem, and that the failure they were experiencing was not of their own making.
It would have been batter if I had structured the class so they could experience the right way to integrate their systems. I only hope that they left that last class having learned something useful.