Using My Own Education
This year is different from the previous three in my teaching experience, because for the first time I’ll actually be teaching the thing I studied as an undergraduate: computer science. I took my first course (6.001) in this subject in 1997, when I was 19 years old. Today, just for perspective, I decided to look at the materials and notes I have from the course. I’m not expecting that my AP Computer Science students will be able to do what we did, but it’s nice to see how the course approached students with no prior programming experience. (By the way, 6.001 is available via OpenCourseWare if you did want to teach it verbatim.)
So here’s what jumped out at me, from the day 1 lecture notes:
Computer science is not really about computers, but rather is primarily focused on the concept of processes, and on ways to describe them.
Processes deal with Imperative or “How to” knowledge, as opposed to Declarative or “What is” knowledge.
In talking about “how to” knowledge, we will distinguish between a process, which is an actual mechanism by which a computation is executed and a procedure, which is a means of describing a process.
Our need to describe processes leads to a need for a language in which to execute that description, with its own vocabulary and rules of syntax and semantics…
Once we have developed this language for describing processes, we will want to use it to describe large and complex processes. To do this, we will need some solid engineering tools for controlling complexity.
And in that short space, we learn the concerns of the subject, some essential vocabulary, and the motivation for the techniques we will study. This is why the academic world comforts me.
We continued, in this first lecture, to learn that the three main components of any language are: primitives, means of combination, and means of abstraction. Examples of each were given (in Scheme, the chosen LISP dialect) and rules for evaluation were reviewed, culminating in code for a squaring function, which was then used to build a sum-of-squares function.
I didn’t do quite that much in the first week with my students. I’ve taken an approach that’s a bit more hands-on: Here’s a Hello World, let’s modify it. This comes at the expense, I think, of understanding at a fundamental level what the computer is doing. (I’m defining “fundamental level” here as registers in a processor. That’s probably about as much as you’d ever really want to break it down when learning about software, but which I recognize is just a convenient point of abstraction for all the hardware design — also “fundamental” to computation.)
Anyway, beause Java is a compiled language, I had to introduce the concept of compilation. (And I couldn’t resist raising the question of where this program-that-makes-programs, the compiler, came from… what is the ur-compiler?) It’s difficult, since my own understanding of computer science is so grounded in how I was taught, to know what the effect will be of approaching it from another starting point. My biggest concern is that I want to teach my students how to understand computation, not just how to write code. But learn Java they must, and so I’m going to forge ahead with explaining data types. At least checking in with this foundation of my own understanding will help me stay grounded as I field the inevitable questions and digressions.