If I were teaching computer science, I'd start with a working piece of software, probably an HTTP server, and give the students a series of assignments.
Assumptions: The software is documented, has users, and bugs, avoiding breakage is important.
0. Set up and install the software on your own server. Verify and demonstrate that it can handle a request. You can add a new page to the site. Authorize a new user.
1. You've encountered a problem. Write a great bug report.
2. You've got an itch. You wish the software could do X. Come up with a plan for adding the feature, outlining the steps, and how you're going to test the new version. (Two versions of this assignment, one with X specified, and another where the student comes up with X.)
3. Write a doc showing the user how to turn on a feature in the product, with all the configuration options.
4. Here's a bug report. Find the problem and fix it, without breakage. How will you verify that there was no breakage. Document the change, and circulate the change note to the users of the product.
5. One of the features of your product is new and competitors are copying it. It's time to document the file formats and protocols it uses so your competitors can interop with you. Write the spec in clear language with numerous examples so users won't get locked-in to their products, or yours for that matter.
Most important, this would all be with an existing working piece of software that real people use. Most student projects are scaled-down versions of real-world projects. They don't behave like real communities. Esp because the users have expectations about how the software works.