The following is a handful of course offerings that I wish had been available to me as a university student. Consider it a thought experiment stemming from my (at present) limited development experience, and expand on the ideas in the comments or on Twitter if you like. I’d be excited to see some of these pan out if they haven’t already.
I might expand this as I gain real-world experience. I’ll repost if that’s the case.
Building Testable Software
Okay, not a really stretch… but I still wish this had been a dedicated course at my university (I believe it’s in the works now).
Prereqs: A CS 1 and possibly CS 2 course
Topics: Clean code, test types besides unit testing, testing libraries in one or two languages
Assignments: A truly TDD project (i.e. students must submit tests before they submit business logic), writing tests for a small legacy app, refactoring for testability
Grading: Can your peers / teachers understand your code? Do your code coverage decisions (or lack thereof) make sense?
Applied Data Structures
While every university student “learns” data structures, I don’t know that they learn how to put them to good use. It’s certainly not something I felt comfortable with upon graduation.
Prereqs: Intro data structures course, and maybe an intro algorithms course
Topics: Review of prerequisite material, common use cases for each data structure (taught via case studies perhaps), design considerations for each data structure, implementing data structures from scratch
Assignments: Compare fitness of different data structures for particular problems (via written analysis or implementation)
Grading: Can students sufficiently justify their choice of data structure / algorithm in a particular situation?
Programming Polyglot: 15 Languages in 15 Weeks
An elective with a fairly light workload, this would be a great option for aspiring full-stack developers, or just the curious and ambitious student. It would cover a lot of content and prioritize breadth of knowledge over depth. Languages could be grouped by class (static vs. dynamic typing, compiled vs. interpreted, etc.), or intentionally mixed up to keep students on their toes.
Prereqs: CS 1 and CS 2
Topics: Popular programming languages and utilities (ex. Bash scripting) Could also be a good vehicle to teach meta-learning skills.
Assignments: Basic interview style questions in several languages, comparing fitness of different classes of languages for different purposes
Grading: How fast can students learn? Can students “figure out” a new hypothetical language on the fly (i.e. on a test)?
Diabolical Designs: Bending and Breaking the Textbook
(my favorite on this list)
Understandably, many course projects are written with clear requirements and problems that easily map to concepts taught in lecture. This was not and is not the case for the side projects I started between semesters.
My suggestions for this one are intentionally vague. The nature of this material and the suggested assignments might necessitate a smaller class size or several strong TAs.
Prereqs: Some course with a substantial development project, and a databases course
- I realize that these might be difficult prereqs to get in four years…
Topics: Case studies of cut-and-dry “textbook” architectures that both did and didn’t work well, case studies of hybrid architectures that solve complicated problems, tradeoff analysis techniques
Assignments: Support or refute design decisions from case studies, and a project with no obvious choice of architecture / technologies – give students lots of freedom on this one
Grading: How well can students support their design decisions? How well does the project software meet requirements (or stand up to slightly abusive testing)?
Which of these do you like / dislike? Have a course idea of your own? Let me know!