I'm teaching two courses next term: CSC301 (Intro to Software Engineering) and a combination of CSC490 (undergraduate capstone project) and CSC2125 (graduate "topics in software engineering"). I'm hoping to do a better job with the former than I did this term, so I've started working on lectures. So far, the topics include:
It's a lot to cram into 26 lectures, some tutorials (which will probably consist of guest speakers from industry), and four assignments, but with help from Colin and Roy at Refresh Partners (makers of fine Facebook plugins), I think it'll work.
The combined capstone/graduate course doesn't have a well-defined syllabus yet. Students will work in pairs on real projects with real customers; the current list of proposals includes open source organizations, non-profits, academics from other departments on campus, and a few local companies. After the first class (in which I'll present the projects Ignite-style, and students will decide what to work on), the course will be held upstairs at Molly Bloom's (a local pub). I figure this will facilitate free and frank discussion ;-)
And of course, my grad students will be starting their thesis work. Samira wants to apply machine learning techniques to requirements management (see for example the work of Jane Huffman Hayes, or Anvik, Hew, and Murphy's "Who Should Fix This Bug?"), and Jeremy is interested in software project visualization (or "dashboards on steroids"), while Carolyn and Jon are still trying to nail down specific topics. It's going to be a lot of work, but I'm looking forward to it.
- what the data actually says about software engineering (drawn from Glass's Facts and Fallacies of Software Engineering and Endres & Rombach's Handbook of Software and Systems Engineering)
- software process and lifecycles (agile vs. sturdy, with emphasis on the former)
- design patterns: mostly from Head First Design Patterns---the format is condescending, but the content is excellent
- refactoring: drawn in part from Martin Fowler's Refactoring, but also from Mike Feathers' excellent Working Effectively With Legacy Code
- software quality: both heuristics and metrics, with some discussion of empirical studies in software engineering---my main reference is Spinellis' Code Quality
- UML (I'm not a believer, but it is part of the standard curriculum
- testing: I'm assuming students are comfortable with JUnit, so these lectures cover both how to make code testable (Feathers again) and the framework in Meszaros' xUnit Test Patterns. I will also cover the nine rules from Agans' Debugging, and borrow liberally from Whittaker's three books.
- tooling: some intermediate topics in version control (branching and merging), build systems (especially ways of supporting different configurations in a single build file), and ticketing
- the last ten yards (i.e., creating installers, deploying software, and making it work in production environments): my only reference so far is Nygard's Release It!---lots of other books wave their hands about these issues, or provide tutorials on how to use some vendor or other's installer creator, but I'm looking for something in between)
- security: I think Smith and Marchesini's Craft of System Security is at the right level, but I'm going to borrow from many others.
- ethical issues, particularly liability and licensure.