What we should be teaching in CS
I’m really not going to argue specifics here. I’m not going to say, use this language or that language or start with objects or don’t start with objects. I think valid arguments can be made for any of those things. But I had an interesting conversation with a senior on Friday, who interned in a CS-oriented lab. And she groused a bit about how much she didn’t know about computing. And she meant computing writ large, not programming per se, which she ultimately sounded pretty comfortable with.
She was thrown by things like the file structure of her computer, terminal and unix commands, other IDEs besides the one we used, the idea of libraries and modules, and APIs. I touch on all these things, but I don’t go into much detail. I asked my student if she thought I should put some of these things in CS I or wait until CS II. I explained how I didn’t want to overwhelm students too much. She hemmed a bit, but we both came around to the idea that yes, these things should be included sometime in the first year of CS.
I forget that most students don’t understand what a path is, what those folders in the Finder or Explorer window really mean and don’t know at all how to interact with their computer via command line. I had my CS I students read In the Beginning…Was the Command Line but I didn’t follow that up with any activities to show what the command line is. I have done this with Middle School, but clearly I need to do this with older kids as well.
Computing is big. There’s a lot to it and a lot of different directions to go in. In my whole program, I try to cover a lot of those directions, from working at the hardware level (via Arudino) to programming robots, creating graphics, manipulating images, making games, and even web programming. Any one of those areas can involve knowing different kinds of things. File systems are hugely important to web development, but less so when working with Arduinos or robots. Math is extraordinarily important with working with data, graphics, and games, but not always with web programming or robots. And I allow a lot of flexibility for my students. They can pursue whatever area they want through their projects.
So what’s the baseline? Where do we start and how far do we need to go? What are the basic building blocks we need to insure our students can build further? And will those blocks change over time? One of the problems facing HS teachers is that colleges right now have no expectation that students have had CS before enrolling in an intro class. But I suspect they do have expectations for the students they expect to succeed. Whether this is fair or not is another question, but I suspect it’s true that professors have a baseline. I’d guess at some of the following:
- The ability to install software in specific locations on your computer, even if those locations are “hidden”.
- The ability to use an IDE, probably multiple.
- The ability to use several different operating systems including a flavor of Linux.
- Some basic commands like ls and cd
- The ability to understand file name endings like .py, .js, .csv, .c
- To know what a path is and how to find a full path name.
There’s probably more, but basically, I’d say most CS profs expect their students to know the inner workings of their computer and perhaps the internet relatively well. Because they’re curious about these things and they want to know more. Otherwise, they wouldn’t be in the class. But for many students, they might not be curious or have had any reason to be curious. Double-clicking on an icon is just fine with them, thank you very much.
So I’m going to find a way to put this baseline into the course. We take apart the physical computers early on. Now, I think we need to take apart the virtual computer and find out more about how it ticks. I think I’ve taken for granted either that students will learn these things on their own or that they already know them. Not anymore.