Today, the University of Toronto's Computer Science department has a three-course sequence in software engineering: CSC340 (Requirements Engineering), CSC407 (Software Architecture), and CSC408 (Software Engineering, which is a team project course). Nobody is happy with them: students in CSC340 haven't seen projects big enough to need formal requirements management, so they don't understand what all the modeling and paperwork they're being taught is for; there's a lot of overlap between that course and CSC407; and CSC408 comes too late in their degrees (typically, the last term of fourth year) to help them find summer internships. We're therefore thinking about replacing those three courses with three new ones. It's all very tentative at the moment, but the idea is basically this:
  • CSC301 (Agile Development) would teach techniques appropriate to rapid development of Version 1 of a new piece of software, starting from scratch. The course would be built around a series of two-week iterations using Extreme Programming or one of its cousins; topics would include requirements elicitation via user stories, group dynamics, estimation and prioritization, design patterns and refactoring, continuous integration, and professional ethics.
  • CSC302 (Large Systems Development) would turn attention to the things you need to do when faced with larger, legacy systems. Instead of starting from scratch, students would have to modify and extend something large that they've inherited; there'd probably be two iterations in teams of 6-8, with teams swapping code at the midpoint. Topics would include reverse engineering, modeling with UML, project, change, and risk management, traceability, and the CMM.
  • Finally, CSC403 (Advanced Topics in Software Engineering) would be cross-listed as a graduate course, and would cover component-based systems, fault tolerance, performance modeling, deployment, and other advanced issues.
We think the division between CSC301 and CSC302 would be a natural one, and that if students specializing in other areas (HCI, AI, etc.) only take one course, CSC301 would give them an adequate grounding for grad school or their first job. CSC403 is still up in the air a bit, though; it feels like an "everything we didn't put elsewhere" course. Crucially, students would be able to do both CSC301 and CSC302 before their PEY internship. So what do you think? What have we missed? What's in there that doesn't need to be? What did you get (or are you getting) in your degree that you think we should imitate?