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.
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).