Skip to content

Breadth courses in computer science

2010 April 1
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.

5 Responses leave one →
  1. April 1, 2010

    I enjoyed reading about your struggles with breadth and depth, something I have come to struggle with also.

    Because I am the only computer lab teacher at my middle school, I teach many things, keyboarding, (which should have been done in elementary), introduction to MS Office, but I do have students build up web pages, and we had nine weeks of Scratch this year. I built up my course in Moodle so it will be easy for me to arrange topics and projects for my students. Unfortunately, most of my students generally chose the “light” way out of their final projects, only doing minimally challenging activities.

    So, I have some thinking to do to encourage more in-depth programming. Of course, I would like to work more in line with what high school teachers would like to have happen in an introductory unit. Lots of things to think about.

    Carl

  2. April 1, 2010

    I’m a big fan of breadth over depth and I don’t think it has to dumb down the class.

    Programming is the language of CS, but because it is a foreign language to introductory students, they aren’t fluent in it. Thus, they can’t really tackle interesting, deep, computational thinking problems while programming. My students understand searching and sorting just fine, thank you, through hands-on activities, describing algorithms in English (paragraphs, lists, flowcharts, their choice). I grade them on things like the quality of the thought they demonstrated in the writing – which is far more complete than any program they could write. I put questions on the exam like, “given the two sorting algorithms described [in English] below, which is more efficient and why? Defend your answer.” No code required, but a sophisticated understanding of the differences in efficiency – say, space vs. time – might be.

    I want my students to have an understanding of what kinds of problems computers solve well, how to think about problems and solutions in order to get a computer to solve them, and what kinds of problems computers don’t solve well. They’ll understand something like P vs NP way better through discussion and hands-on activities than they ever will by writing programs.

    Finally, even if we pretend that every student could succeed at programming if they just tried it with a good teacher, programming is not a transferable skill. Knowing how to write a search algorithm in Java doesn’t mean you can write a search-and-replace macro in Applescript. Knowing how to code an animation in Python doesn’t mean you can make an Open GL visualization in C. Either of those transfers requires hours of time, mostly in learning a new syntax and language requirements. Might learning programming help them to learn more programming later? Sure, but how many of them will learn more programming later, vs. ask someone else to program something for them? Understanding how to ask for what they want seems like a better skill.

    I agree with you that there’s no inherent reason for students to know any one particular piece of information, like lossy vs. lossless compression. The important thing is for them to THINK about the problems in computer science – that will prepare them to think about future problems they encounter, or even to anticipate those problems. (“After I got my new 300 megapixel camera, I ran out of space on my hard drive. It’s the weirdest thing! Stupid computers.”)

  3. Hélène Martin permalink*
    April 2, 2010

    Maybe we can respectfully disagree on some things, Michelle. =)

    I agree that learning, for example, search and sort concepts with non-programming examples and exercises has tremendous value and I have absolutely no doubt that your students understand it. I just think it takes a very zen student to accept that these ideas have any value without implementation. Does that make sense? Humans are massively parallel so we don’t do search and sort (among many other things) the way computers do so we can’t argue that it’s helpful in that regard. Heck, computers may not do search and sort the way they currently do in a few years. So in that sense, presenting search and sort divorced from implementation is not only extremely abstract but also a form of emphasizing a particular tool. Our search and sort algorithms are tools appropriate for carrying out a class of tasks on current computing architecture.

    I’m not entirely sure I agree that programming is not transferable. If the ‘big ideas’ are presented with enough generality initially, I don’t think switching languages needs to be too painful, as long as it’s done once students have enough background in one. What I would worry about is doing something like two weeks of Scheme, three weeks of assembly and two weeks of Python with students who have no existing fluency. I think that’s extremely dangerous because, as you say, students have no time to internalize language idiosyncrasies and can’t transfer any knowledge from one to the other.

    I agree 100% that students come in with programming being a foreign language. How could it not be? The conclusion I draw from that is that it’s important to treat it as such and to be very deliberate about isolating, explaining and practicing every concept from assignment to iteration to parameterization — even if it seems “obvious” to we experts. None of it is obvious and moreover it’s beautiful and useful and motivating. Of course, I recognize that this goes directly against constructivism and open-ended teaching and other things that I know you value — our disagreement may be somewhat more fundamental! I guess the way I see it, it’s possible to learn French by picking up phrases on an as-needed basis and doing a lot of reading but it’s probably faster and more gratifying to spend an hour a day with a native speaker who can logically sequence topics and force conversation.

    I’d like to hear a little bit more about your vision for a breadth course. The examples you mentioned are all reasoning about computation and I would argue that’s actually pretty narrow — programming without the formalism of a language (which is not a problem). When I say breadth, I mean a month of AI, a month of formal logic, a month of web publishing, a month of ethics etc.

    And again, just to be clear, I’m just reporting what I’ve seen in my classroom which certainly have to do with a lot of things including my pre-existing biases (though I would argue I was most excited and dedicated to Exploring). I think it’s pretty telling that I have over 100 students signed up for programming next year and something like 20 for Exploring Computer Science! One experiment worked very well and the other was no complete failure, but not as successful.

  4. May 16, 2010

    Great post. It sums up a lot of things I struggle with as well. Two quick ideas:

    1. Including entrepreneurship projects in a class like this could be appropriate. It’s not computer science but than again great software doesn’t pay for itself. There has to be some business model and there are roles in that business besides being a programmer. Everyone in an organization (especially programmers!) benefits from a deeper understanding of this reality. I also think there’s huge relevance in studying various licensing schemes, creative commons, GPL, etc. and in looking at case studies of software businesses. Chances are, no one else in their high school experience is going to be able to teach them about this as well as you.

    2. Your question: “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?” prompted another thought. The answer is no. But writing HTML could be a starting point for students to see how an input affects an output — the browser is an interpreter, and it follows a set of rules to parse the HTML and CSS and display results. I’ve found that because these languages are declarative, students have an easier time grasping the initial concepts, and then I can use that understanding to build up to more sophisticated concepts like the CSS selectors, etc. After a while, it can start to feel pretty computer sciencey, even though we aren’t implementing any algorithms.

Trackbacks and Pingbacks

  1. Everything Is Changing in CS Education

Leave a Reply

Note: You can use basic XHTML in your comments. Your email address will never be published.

Subscribe to this comment feed via RSS