Gas station without pumps

2010 December 31

What should high school computer education be?

Filed under: Uncategorized — gasstationwithoutpumps @ 15:13
Tags: , , , , ,

As a comment on the ComputingEd blog, Brian Law asked

Given that many high schools have computer science programs—perhaps more here in Ontario than in the United States—what should they be teaching, versus what should be taught in CS1&2 at university? If in CS1, we’re teaching the basics of computation … , then what are we teaching in high school? You spoke of the difficulty in trying to change high school curricula in the United States, but hypothetically, if you had the power to, how would you structure the CS curriculum spanning both the secondary and post-secondary levels of education?

I put this comment aside over  a month ago to think about, but I still don’t have a good answer.  I don’t even have a good answer for “what is computer science?” though I earned my PhD in it 28 years ago.

Note that the “how would you structure the CS curriculum” question is quite different from “what should computer programmers learn first?” The question is more about the shape of the whole curriculum: What does everybody need to learn? What do the college-bound need? What do the future scientists and engineers need? What do the future computer programmers need?

As with other fields (such as statistics or math) there is a big difference between what the expert practitioners need to learn and what everybody needs to learn.  The best early training for a mathematician is quite different from providing the math skills that the average person needs. I would expect it to be the same for computer science. I think that I could do a decent job of designing a curriculum to lead an interested teen or pre-teen into computer programming and give them a good foundation for becoming a computer scientist, programmer, or engineer. In fact, I did design a university-level computer engineering curriculum 25 years ago and helped tweak it for the next decade.  More recently, I helped design a bioinformatics curriculum (which still needs tweaking: it is overloaded with chemistry courses, thanks to an inflexible pre-req structure and biochem-last design by the chemists).

I’m less certain of my ability to design a curriculum for those who don’t want to learn to program.  I have yet to be convinced that programming skills can be taught.  They can certainly be learned, at least by some people, but existing lower-level computer programming classes seem to act more as filters for selecting those who can learn than ways to change people without programming skills into competent programmers.  Of course, I see much the same thing in any activity that calls for clarity of thought (proofs in mathematics, writing research papers, debugging programs, designing experiments, … ).

Why should everyone learn some computer science anyway?

  • Computers are ubiquitous in modern society, so everyone should have some awareness of how to use them, what they can and cannot do, and the risks involved in using them.  This is the argument for “computer literacy” and is essentially the same argument as that for universal driver’s ed.  It is a good argument, and it can be met with essentially no computer science content, just good consumer education.My son’s high school provides this level of computer training in their 9th grade core course (which also includes health education).  I don’t know what is taught, since my son refused to take the mandatory course.  Luckily the school has a credit-by-exam mechanism in place, and he took the final exam to get credit for the course.  The resulting B will undoubtedly lower his GPA, but who cares—it’s better than having him sit impatiently through a class in which he would learn essentially nothing.  (The B resulted from such dated questions as the correct ratio of breaths to chest compressions in CPR—which is now taught as chest-compressions-only.)
  • Computer programming teaches clarity of thought.  To program, one has to be very explicit about what you want the computer to do—vague hand waving doesn’t do it. This is the argument usually used for requiring proof-based geometry classes.  Just like for geometry, I don’t quite buy the argument.  It is certainly the case that both computer programming and proofs in geometry require clarity of thought and good problem-solving skills, but it isn’t clear that they teach these skills. They do test the skills, in ways that most high schoolers have not previously been challenged, so they are valuable for helping polish the skills.I believe that computer programming is better than geometry for developing both problem-solving skills and precision thinking.  For one thing, the computer automatically checks many of the details and provides weird behavior when assumptions are violated, giving students much more feedback about their work than even the most diligent of geometry teachers.  The problems that can be addressed in a beginning programming class are also much more likely to be interesting to high-school students than geometric proofs are, increasing the incentive to put in the effort needed to solve hard problems.

    Although programming may not teach clarity of thought, it has a valuable role in helping students explore the limits of their own ability to do detailed analytic and synthetic thought.  For the average student who has no inclination to go into science or math, I would require one of geometry OR computer programming.  For those on the track to a STEM career, I would require both.  The programming course should be taught at about the same point in the curriculum as geometry is usually taught: after students have had a little algebra and are familiar with one notion of what a variable means.

    The high school my son goes to has no computer programming classes, though they have a decent math program that includes AP Statistics, AP Calculus AB, and AP Calculus BC.

    For this level of instruction, I would want to use a language that imposes as few extraneous requirements on the students as possible, exposing the basic concepts in simple ways.  I would also want the assignments to be very inspiring—fun even for those who have no particular desire to learn to program.  The Scratch programming language and the BYOB extension to it are good tools to put in the center of such a course.  I believe that this is the level that the new AP Computer Science: Principles course is aimed at (see my previous post on that course).  Quite frankly, it is not a college-level course, and giving it AP credit strikes me as ludicrous: like giving AP credit for high-school geometry.

  • Computer programming is a useful and well-remunerated vocational skill.  If one views programming as primarily a vocational track, then courses that teach HTML, CSS, Javascript, PHP, Adobe Flash, and other currently common tools for building web sites are appropriate.  Such courses often teach no programming, or teach programming in a way that does not develop clarity of thought or provide a useful foundation for further study. Cut-and-paste copying of other people’s program fragments is usually all that is taught of computer science.  The students are usually (self-)selected for skill in visual art and graphics design, rather than for precise thinking.

    My son’s high school has two courses that sort of fall into this category: Web Design and Computer Animation & Graphics.  The courses use WYSIWYG tools and do not delve into how things work very much.  There is definitely a place for this sort of training, just as there is a place for teaching engine repair and machine shop techniques.  Indeed, the courses are part of the same department as the automotive shop classes.

    The skills taught in shop classes and web design classes can be very useful for a future scientist or engineer, but are usually taught in a way that closes off such a career rather than opening it up.

  • Computer programming can be a track for a professional degree, if followed by 4 or more years of training in college.  Although the AP CS:Priniciples course mentioned above could spark a student’s interest in programming, it is really not enough for those who plan to go into computer science or programming-heavy fields.  I would follow it with a course in a different programming language (for example, moving from BYOB to Python), to encourage students to abstract the notions away from the specific representation in a single programming language.  I would still keep high school students to fairly small projects, so a rapid-prototyping language like Python is more suitable than a language that requires substantial scaffolding like Java or C++.  All that declaration of variables and compile-time type checking is very valuable in a big project, but is useless pedagogical overhead in small projects.

    This second course should be at the junior or senior high school level, but is most likely going to remain in colleges for the near future, as US high schools are not likely to hire competent computer science teachers in significant numbers in the next decade.  This course is probably all most STEM students need unless they get into a computational branch of science or engineering.

  • Once students have gotten the basics of variable assignment, iteration, recursion, and simple data structures, they are ready for abstract data types, information hiding, and the rest of the core programming skills.  These should be first-year college courses (currently they are more likely to be 2nd or 3rd year courses).  Those few who want to become computer scientists (as opposed to programmers, computer engineers, bioinformaticians, … ) should go on to take a fair amount of computer theory courses, while those wanting to become programmers should take courses in which they learn useful graph algorithms, dynamic programming, numeric optimization, documentation skills, and other advanced programming skills.  All should learn at least 5 different programming languages, from at least three different schools of thought on how programming languages should be designed (that is not 5 slight variants on block-structured languages).


  1. Love this train of thought. I appreciate your point that it is possible to learn clarity of thought, but unclear how (or whether) it should/can be taught. Is it possible that the way to teach it is, actually, to stop un-teaching it? There are an awful lot of activities in the lives of most children that require them to suspend their critical thinking. Maybe lack of critical reasoning, apparently impervious to counter-instruction, is the result.

    On that note, have you seen Conrad Wolfram’s TED talk on the subject? ( I’d be curious to know your thoughts.

    What should everyone know about computers? I agree with your point about consumer education. Too many high school credits seem to spend time teaching students how to format word-processed documents in a particular software package. The result seems to be that people outside of CS-related fields see computers in a sort of neo-animistic light (a semi-magical device with its own whims, with no clear boundaries on what can and cannot influence them). This leads to wasted time and money as well as a snowballing of distorted thinking. It also results in consumers being highly manipulable by marketers (computer getting slower and slower? Throw out your computer — you need the brand-new whatchama-thingy).

    I can’t help but think that good consumer education involves at least looking under the hood. Your comparison to driver’s ed is apt. A good driver’s ed course should allow you to know the function of the engine and the fuel tank, and to recognize them when you see them. It should also teach you to top up your oil, know the meaning of the trouble lights, and be able to speak the “lingo” at least enough to understand your mechanic in simple matters and make yourself understood. So should a decent “intro to computers” allow you to at least know that it is possible to change hard drives without throwing out your computer, if not how to do that yourself. A bit of exposure to digital rights management, copyright law, and alternative copyright schemes would probably also be useful.

    “The skills taught in shop classes and web design classes can be very useful for a future scientist or engineer, but are usually taught in a way that closes off such a career rather than opening it up.”

    Emphatically agreed. I’d love to hear your recommendations on this.

    Comment by Mylene — 2011 January 1 @ 16:54 | Reply

    • I’ve not seen Wolfram’s TED talk. I find videos of lectures extremely irritating (such a slow way to convey info!). Interestingly, I don’t have the same reaction to written documents (I read much faster than people lecture), nor to live lectures (though I will sometimes fall asleep in them if the lecturer drones). I’ve seen critiques of Wolfram’s talk and they have not led me to think that I would have any interest in hearing his ideas. If there is a transcript of his talk, or he has done an essay on the subject, I’d be willing to read it.

      I don’t have any useful ideas on how to make web-design and shop classes into routes into engineering rather than out of that career path. Part of the problem is that the university-entry requirements combined with high school graduation requirements fill the 4 years of high school with almost no room for “extras” like shop class or web design. You may only be able to take those classes if you give up on university entry.

      Comment by gasstationwithoutpumps — 2011 January 1 @ 18:14 | Reply

  2. Incidentally, Brenner’s Why Require the Study of Computer Science makes an argument for the first position in my post, and suggests a “Programming and Public Policy” course for high schoolers.

    Comment by gasstationwithoutpumps — 2011 January 2 @ 10:46 | Reply

  3. Thanks for the follow-up — the paper by Brenner is a wonderful vindication, and the post from Quantum Progress was also worth reading. My take is that QP is agreeing fully with Wolfram, while extending some of his points.

    Wolfram does not necessarily advocate teaching programming instead of calculating. He explicitly rejects uses of computers that make learning, especially learning math, less conceptual. His argument is roughly that when we are teaching things that require computation, we should use computers for the computation and students’ brains for asking the right questions.

    Wolfram addresses a number of other ideas.
    – Why is interest in math is falling while the mathematical nature of society is increasing?
    – Why do we teach math at all? Especially, why it is compulsory and such a large part of the grade school curriculum?
    – Is the reason we teach math today the same as the reason we taught it 50 years ago, before computers were ubiquitous?
    – Why do so many people cling so tenaciously to the computational view of math? How can those points of view best be refuted?

    If you find yourself, as I often do, trying to convince people that math does not equal computation, you may find useful arguments here. If you don’t need arguments of this sort, the video probably has no more to offer you.

    I especially liked Wolfram’s suggestion that we confuse the order of invention of technologies with the order in which they are best taught. For more details, the full transcript is provided at the same URL as the talk.

    Comment by Mylene — 2011 January 3 @ 11:07 | Reply

    • Thanks for the pointer to the transcript—I’d missed it only previous glances at the TED site. I’ve now read the talk, and he doesn’t say anything too startling. I think his basic point (that it is more important to teach programming than to teach arithmetic) is probably valid, but he neglects the big problem: we have very few people who know programming and almost none who know how to teach it. He may have a good endpoint in mind, but he has no way of getting there.

      Comment by gasstationwithoutpumps — 2011 January 3 @ 11:33 | Reply

  4. […] have a previous post about what I think high school computer science should be, but I’ve not figured out how to get teachers competent and willing to teach it.  Statistics […]

    Pingback by Shoehorning computer science into K–12 « Gas station without pumps — 2011 January 14 @ 08:11 | Reply

  5. […] have previously posted in Computer Languages for Kids and What should high-school computer education be? about my fondness for Python as an early teaching language (after […]

    Pingback by Online Python Tutor « Gas station without pumps — 2011 March 5 @ 21:34 | Reply

RSS feed for comments on this post. TrackBack URI

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: