Breadth courses in computer science
- by Hélène Martin
I currently teach three levels of high-school computer science courses – Exploring Computer Science, Creative Computing and AP Computer Science A. I’ve learned a lot building and teaching all three, of course, but Exploring has been the most eye-opening. While the national direction for high school and lower-division or non-majors college computer science courses appears to be away from programming and towards breadth courses, I’ve found teaching a motivating, rigorous and interesting breadth course very, very hard. (see Berkeley/Dan Garcia’s course The Beauty and Joy of Computing, the push for a new “Principles of Computer Science” AP course, the CSTA’s Exploring Computer Science curriculum for examples of recent trends)
So what?
My biggest problem with teaching a breadth course has been answering what I believe is the most important question for a teacher — “so what?” Sure, it’s interesting for my students to know about binary, but what does it really gain them? I focus on giving them an understanding of file size, image compression and the like — practical things — but my justifications often ring untrue even to me. My students have drives that have multiple hundreds of gigabytes of capacity and Internet connections that transfer multiple megabits a second… why should they care about compression? I talk to them about lossy vs. lossless compression so they can make good choices when, for example, editing their digital photos, but I really don’t think a computer science course is the right place for that kind of learning! We need photography, art, marketing instructors who can relay that information in context. Relatedly, it’s cool for students to know about binary search, but how is that actually useful if they can’t implement the algorithm?
What drew me to computer science was its incredibly powerful tool — programming. As a kid, I wanted to build cool things and programming was much cheaper and instantly gratifying than metal-working or sculpture. In a programming course, the “so what?” is clear: you can build stuff. Not only that, but you can build things that are relevant to your every day life and that enhance products you already use. I feel I have very little problem justifying what we’re learning in my programming courses because binary makes sense to discuss when we discover floating-point accuracy issues and binary search makes perfect sense when we’re trying to implement a simplified music library program.
I agree that programming is a tool — only a means to an end. But it’s such a fantastic way of describing and formalizing important computer science concepts such as abstraction, complexity, etc. Why shy away from it?
I have a rather pessimistic answer to the latter question: programming is too hard. Unfortunately, many high school students have little to show for their years of coursework. In order to reach those students, courses have to be made easier. It’s natural, then, that programming courses wouldn’t be particularly successful when competing with business communications, marketing and other “light” career and technical education options. Thankfully, the school in which I teach is excellent and many students are not only ready for challenging courses but even exhibit frustration at course offerings that don’t challenge them.
Rigor
A breadth course in computer science is part history, part ethics, part anatomy… it’s hard to characterize. What I’ve found is that rigor is extremely hard to achieve when topics aren’t covered in much depth. In a typical breadth course, students spend something like two weeks discussing “algorithms.” Of course, they don’t learn much programming, so they can’t really implement them. So what can they actually do with the information? Relatedly, how can an instructor check for true understanding?
I’ve found writing exams for Exploring Computer Science a frustrating experience since I don’t cover any one skill in enough depth for them to really have much to demonstrate to me. I don’t like definition questions like “what is an algorithm” because that just encourages shallow memorization with little staying power. What I’m interested in is, of course, reasoning about computational problems but it’s unclear to me how to do this when we don’t have a common language for expressing algorithms.
Overall, I have bright and motivated students who generally end up learning what I’d like them to and are thoughtful about what we discuss but I worry that this style of course, while more approachable for weaker students, also does little to encourage them to challenge themselves.
A programming course requires students to flex all their brain muscles. To be successful, they need to have strong quantitative reasoning skills, they need to use the scientific method and they need to be writers and designers. Conversely, their quantitative and scientific reasoning skills are strengthened while they explore new types of writing and designing. There’s built-in rigor.
Materials
There are tons of programming books from the classic K&R from which I first started learning C to my personal Java favorite (no bias here, of course), Building Java Programs. Not only that, but there are plenty of great online resources — Nifty Assignments, Fred Swartz’s Java Notes, full course outlines with slides, full assignment sets and so on. It’s of course a challenge to pick and choose the most effective assignments and use resources in a coherent way, but overall, pulling together a compelling beginning programming course should not be too hard.
What is there for a breadth course? Certainly, many colleges have experimented with such courses and textbooks exist including Computer Science: an Overview, Computer Science Illuminated or Invitation to Computer Science. I haven’t been too impressed by these books though I have to admit I haven’t reviewed them in any sort of depth. My general impression has been that a significant chunk of content is obsolete by print time, that the concepts are presented too abstractly for students to really care and that transitions from topic to topic are rarely smooth.
When it comes to assignment ideas, a lot of what the textbooks cited above do are a mix of web publishing and “web scavenger hunts.” I always feel uncomfortable with these types of tasks — are they computer science? Unfortunately, that’s what I end up with myself. In fact, next Tuesday, my students will be spending an hour looking up definitions and sources for various aspects of software engineering. It beats lecture, but how can they use the content without knowing to program themselves?
CSTA has recently been promoting a very interesting attempt at formalizing an introductory high school CS course called Exploring Computer Science based on some research conducted by Jane Margolis, an education researcher. People I have a lot of respect for including Joanna Goode and Gail Chapman have worked on creating a curriculum to address lack of access to rigorous computer science courses. I was so excited about this I pitched teaching the course to my administration and got four semester-long sections of it this year. Unfortunately, when it came time to actually teach the course, I found most of the activities inappropriate for my students — childish, decontextualized, untestable. I’m sure it works ok for their demographics, but it’s not something I can pull much from. There went my primary source of materials.
Steering clear
Overall, I’ve had great fun with both AP CS in Java and Creative Computing in Python and the students have, too. Exploring has been much harder for me, though, and much less of a hit with students. Next year, I’m hoping to teach only one section of Exploring Computer Science and keep getting students excited about computer science through learning an exciting new skill — programming.