Prerequisites (or, When to Say No)
How much should Software Carpentry assume students know before they start? Or to put a sharper point on it, how much should this course require students to know? To date, we have said that students should have at least one prior programming course, and have to understand loops, conditionals, functions, arrays, and simple file I/O: the kinds of things that are usually (but not always) covered in a CS-1 course, and hopefully remembered thereafter. To make this more concrete, we've said that students should be able to solve this problem in the language of their choice:
Write a program that reads a rectangular matrix of numbers from a file, transposes that matrix, and writes the result to another file. The values in the matrix are separated by spaces, the number of rows and columns is not known in advance, and the program is not allowed to overwrite its input file. For example, if the program is invoked as
transpose input.dat output.dat, it reads this:0 1 2 3 4 5 6 7 8 9
input.dat, and writes this:0 5 1 6 2 7 3 8 4 9
Many of the students who took this course this fall online or at UCAR, the Met Office, or in London could have done this, but a substantial minority wouldn't have been able to. We therefore have three choices:
- Teach basic programming. We don't like this because it makes the course less useful to people who already know the basics, and because it's harder to teach the basics at arm's length than second-order stuff.
- Ignore the problem (basically, tell the students "sink or swim"). We don't like this because it feels like setting people up to fail. We also don't want people to come away feeling "programming isn't for me" or (even worse) "I just can't do it", which is often what happens in "sink or swim" scenarios.
- Give potential registrants a proficiency test like the one above, and encourage people who don't have the background knowledge we require to go elsewhere for now and then come back to us. We don't like this because there often isn't an "elsewhere" for those people: courses like the University of Toronto's CSC120 are pretty rare, and most free online material has a low signal-to-noise ratio or assumes too much background knowledge. (If that wasn't the case, Software Carpentry would consist primarily of links to other people's stuff...)
So, what should we do? Please vote by posting comments...