32 Comments

Robin, a homeschool friend just pointed me to this post. I didn't know about you until today. I'm a TJ parent too and homeschooled my daughter for 8th grade.

You write: "He was a teacher after all, and I’m just a parent." No, you are never just a parent. We get ourselves into a lot of trouble when we concede that school always knows best and we are just the parent. Many of us TJ parents have come to the realization that it's the kids who make the school what it is. A lof of parents live under the illusion that TJ is stacked full of the most awesome teachers on earth. Surely there are some outstanding ones, worth their weight in gold. But the overall perception is well over-rated.

Expand full comment

"One exception is the use of type systems."

A pretty glaring exception if you ask me. Could Haskell be taught with the same approach?

BTW, there are subsystems of Java which are simple enough that they can be explained in full, such as Featherweight Java.

Expand full comment

I think there are things wrong with teaching Java in the first place. (I notice your son writes his games in Python. Maybe he's onto something.)

One of the most common problems with beginning students of computer programming is that they do not treat the programming language as a system they fully understand (because they don't), but rather as a system that contains mysteries (rules about implicit typecasting and the order in which to execute the initialization code of various classes etc.) they'll never understand. This leads to voodoo programming, defined in the Jargon File as "The use by guess or cookbook of an obscure or hairy system, feature, or algorithm that one does not truly understand." To add insult to injury, the approach to software design that comes with languages like Java is full of things that have the smell of ancient rituals with origins long forgotten, at best—or tax forms to be filled out in triplicate, at worst. The introductory student has no concept of the problems (often deficiencies in the language) that led to the invention of the Factory Visitor Singleton and the like. Hence, once they leave the classroom, they'll think of such things as bureaucratic fluff and omit it and they are left to rediscover the virtues of modularity all over again.

How, then, do I propose that Computer Science be taught? Structure and Interpretation of Computer Programs, the classic MIT textbook.

Abelson and Sussman make a point of "making the magic go away." (I was told by the person responsible in past years for the smoke effect that at some point during the semester teaching from their book at MIT, one of them used to show up to class wearing a wizard's hat, which would then disappear in a puff of smoke.) They use a language so simple that they can explain all of it. You learn not one, but several mental models of what is going on, in increasing levels of detail, culminating in an interpreter of the language written in itself (sounds scary? it fits on the blackboard!) and (admittedly in a usually omitted last chapter) a compiler. Scheme has no structured data types or classes or any of that, but in the course of the book, all of those are constructed as facilities within the language, the student gets to see precisely how they work, and why.

A student that understands SICP understands most of what we can teach about programming. (One exception is the use of type systems.) Of course a CS major may also want to know about Fibonacci heaps and shading algorithms and neural networks and branch prediction and TCP and how to schedule processes in O(1), but none of those are about how to program so much as about what to program, which is a different question.

So why do high schools teach Java? Because colleges teach Java. Why do colleges (though not, by and large, the best CS schools) teach Java? Because someone has gotten it into their head that computer programming is not a new way of thinking, but a thoroughly practical clerical task, a sideshow to the real thing, be it the Analysis of Really Clever Algorithms, or Corporate Data Processing, or what-have you. And that attitude translates into teaching the "industry standard" cruft and the complaint that if you teach students using a language they actually understand, like Scheme or Machine Code (cf. Harvard) or even Python (but that one's dangerously close to voodoo-land already), then they'll have to "learn it all over again." I even know of colleges that teach C++. I have two degrees in Computer Science, I have written several compilers, and programmed in a dozen different languages, and I cannot wrap my head around C++: I do not understand why on earth we expect freshmen to be able to look at a 3-page Standard Template Library error message. If I had to teach CS1 (and not being likely to ever have to do so is frankly the greatest of my regrets in switching from CS to economics) I would want sophomores to tell next year's freshmen, "computers aren't mysterious black boxes; once you've taken CS1, you'll understand it's all really fairly simple; it's a big heap of NAND gates and all the rest is but conveniences to help us think about them."

There may be another reason, which is that teaching CS well has two drawbacks: it requires better teachers than teaching it poorly, and it fails to give those students who will just never get it the impression that they've actually understood it about as well (or as poorly) as the ones who do. As for the latter problem, I can't really see a solution. As for the former, I think we need to realize that there simply aren't enough good CS teachers to go around, or rather, that most schools cannot afford them, given how much they can often earn in industry. That is why it's important to keep thinking about ways to improve textbooks, languages, and other low-marginal-cost educational tools.

End of rant.

Expand full comment

Agreed. "Book learning" just has a nice association as being opposed to experienced street smarts.

Expand full comment

So how embarrassed is your son, already?

Expand full comment

My high school didn't teach any computer science content, at all. The only computer class they had was called "Keyboarding".

Expand full comment

Second Babar. The moral is to beware of teachers, not books. A good book can be written by one of the top minds in the field. If I end up talking to average practitioners in a field for some reason, I'm usually dismayed at how little they understand compared to the textbook authors.

Expand full comment

Your son is fortunate indeed to attend such a superb school. And I am not surprised that it may be difficult for them to find teachers who are truly smart enough to work there.

Where I grew up in the late 80's the public high school and magnet school had no trouble finding qualified teachers for CS classes. They were able to offer me 4 years of CS classes and I arrived at college well ahead of my classmates.

I'm sure they are able to find competent teachers in NoVa as well.

Expand full comment

I'm still at a loss as to why you'd even ask your son's AP teacher about modular programming other then to preen since any practicing Software Engineer knows there is a time and a place for all the different programming paradigms.

They are teaching Computer Science not Software Engineering in preparation for college where they will most likely continue to teach your son Computer Science not Software Engineering. There he maybe exposed to SE in some courses, but most of his classes will be focused on Computer Science.

You should be more upset at them teaching your son a subpar CS curriculum at the arguably the best public high school in the US then a half right answer to your vague question.

If an AP CS class is really CS 101 and they can't deal with the lack of abstraction C has while learning the basic CS principals then they aren't the best computer science public high school students the US has to offer.

Expand full comment

Frankly, I'm quite impressed that object-oriented computer programming is now actually being taught in high school (well ok, I realize that you are talking about a truly superior school). But still... wow! There is no shortage of students at my local university who have a lot of trouble programming even the simplest computations, in even the simplest sequential computer languages, let alone the modern object-oriented ones. Modular code? That's "software engineering," for goodness sakes! How about merely understanding the concept of conditional branching? Or even... binary numbers? Your son is fortunate indeed to attend such a superb school. And I am not surprised that it may be difficult for them to find teachers who are truly smart enough to work there. :).

Expand full comment

I'm an undergrad CS student at a public American university. The quality of instruction is often poor as well. Many professors have little knowledge of current real-world software or industry, yet have no trouble making authoritative statements when they shouldn't.

However, modularity was emphasized quite a bit in the (required) software engineering course. I did think that the course was infected with what I call "object-oriented worship": the importance and capabilities of object orientation were overstated, and some features of modern OO-capable programming languages were treated as if they were a direct result of that language being OO-capable.

I consider modularity to be much more than simply writing multiple classes / functions and splitting different parts of a program into different files.

Expand full comment

As far as complaining in public, I try to resist. You see I was a basketball fanatic and though I was not very talented my study of game and huge amount of practice made me good enough to get a scholarship offer to play at a small college. I read every basketball book that I could find. Well watching what my sons coaches say and do drives me crazy and I want to voice my objections but basketball in not important.

What is important to your son is that he get as high a grade in his programming class as possible. There will be plenty of time for him to unlearn what he was taught.

Expand full comment

Talk about a thankless job...

I understand snot-nosed teenagers nitpicking their teachers; it is the stupid arrogance of youth. A parent should know better.

Expand full comment

I fear too many kids see the key to success as scoring on tests and classes and doing politically-correct extra-curricular activities, instead of taking on substantial projects where they learn a bit more about how things really work. I’m somewhat (but only somewhat) glad I went to a college that was too easy for me, and that the girls showed me little interest, making me invent and pursue my own projects.

But credentials/signals can be very important better to recommend that students understand that school is a long test to be beat anyway possible short of cheating. For example by attempting to get the easiest graders that give the least work. Then they can use their own time to learn.

Expand full comment

i don't take issue with the post except for one detail. what does this have to do with "book learning"? i can't think of any programming book that makes a statement like "modularity happens automatically because we use objects". on the contrary: it seems like you have an issue with ignorance, or inexperience, in teachers. i'd wager that this teacher hasn't read much, nor carefully, about programming.

Expand full comment

That teacher probably has some big gaps in his knowledge of software engineering. But, think of how much income he has foregone in order to teach. I bet the averge Java hacker in industry pulls in way more bucks in a year.

Expand full comment