If Alan Kay made an introductory technical course syllabus to teach real computer science to undergraduates, what would be on it?
I will add to and change this from time to time because there is not enough room in a Quora-sized answer to provide a good enough answer, nor enough time to really think things through as needed, but …
What if the intent here is “as a required course for all undergrads” and the question said “real music” instead “of real computer science”?
In both cases there would be a wide spread of knowledge and skills in the student body, from “no previous contact” to “been involved professionally”. I think one difference in the music case is that some of the very involved students would be “classically trained”, and that would almost never be the situation for incoming computerists.
And in any case, most of the students will represent more of a pop culture spread of knowledge. Because there is a lot of playing and other kinds of doing — composing — in music to go along with the theory, I think that it would be a must to have a number of introductory courses — some several years long — to give the less prepared students a chance to build up basic knowledge and skills as “practical doing” within a framework of “real music”.
There’s also a happy medium to content with prior experience: it is very often the case that “pop culture” skills that are deeply embedded but not comprehensive can be a big barrier to really learning a “real X”, especially one that involves various kinds of “literacy”, “reading”, and “writing”, and years of work. So starting pretty much from the word Go can be a real boon if there is enough time to develop the deep ideas in the best ways.
Just to pick one more of the many issues that need to be considered is that an undergraduate education is supposed to be much much more than training for a job; the main purpose of college is to take students who think they are trying to get from A to B and to help them acquire enough perspectives and knowledge to see the previously invisible Cs and Ds as possible alternate and often better goals for them.
In other words, the purpose is to aid qualitative changes, not just improvements. So important parts of this curriculum should include “ideas from civilization in general” (I will put this important area to the side for now).
This brings up the woeful fact that so many students enter college without much of what high school was supposed to help them learn — and this forces much too much of the time spent in the first years of college as “remediation” rather than “doing college”.
Finally, the actual process in most colleges is also anti-learning in many ways, especially the lecture-centered, subject/department-centered, grade-oriented processes. (This is one of the reasons I bring up “music” to help think about this question — at least in a good music college, it is not lost that a lot of the time has to be spent actually doing music — and getting better at doing music — not just hearing opinions about it.)
As for content in computing — which is very wide ranging these days — I would concentrate early on two main things — systems and meta and how they intertwine— and set up what is needed to get the students to a real first stage of fluency in thinking and doing with these ideas.
Both of these have easy starts to them, and both go really deeply into many of the centrally important topics, issues, and difficulties in the current states of the art. For example: simple-meta can be approached by designing and adding new language features in the spirit of the language; deeper-meta can be about changing some of the underlying primitives in important ways. Simple-systems can be about design and making computations, especially where scaling is involved; deeper-systems can start to look at how communications can be enhanced with “alien systems” via negotiation and other techniques that require various kinds of learning.
I would most certainly — with colleagues — invent and make a special programming language and environment to provide a smooth and simple enough vehicle for getting fluent in systems and meta: “Simple things should be simple, complex things should be possible”.
I’d take a different path from SICP, and use a different vehicle, but retain the idea of “safe and expressive meta” as a good route to represent meanings in ways that allow more profound meanings and processes to be created.
The important idea here is parallel to: “Physics is not Math, but you really need Math to really understand Physics”.
Similarly: “Computer Science is not Programming, but you need make systems via Programming in order to really understand Computer Science”.
The wide ranges of: learners, kinds of help needed, and motivations (including negative) that students bring to a required course have to be carefully heeded.
For example, it is very worth perusing the considerable lore that has now been gathered about teaching computing to wider ranges of students (for example from Mark Guzdial at Georgia Tech, now at U Michigan).
One indication is that entering undergrad students at an engineering school like GaTech are often very ill prepared along many dimensions, and many will have considerable difficulty grasping accurate enough understandings of mechanisms in programming languages in the entry-level courses.
In the old days, one might ask “how did they get into an engineering college without decent prep?” But today, colleges are much more like businesses, and for a variety of essentially monetary reasons will generally try to (a) admit to a level of bursting capacity, and (b) will try to “retain” the headcount rather than try to sort.
Because of the generally poor high school educations available, this is not necessarily a bad thing, but it has greatly changed the relationship of students to the thresholds of quality needed in many subjects.
In any case, this means that what I’d like to do in an introductory course for the students would really have to have a wonderful development environment to help them build good working models in their minds.
I think of help using a rule of thumb: some students don’t need much help, some will need help of “Type A”, some “Type B”, some “Type C”, and some you won’t be able to figure out how to help. The environment needs to do really well with A, B, and C.
This has many useful parallels with music learning. Some students will have very good pitch senses, others great rhythm senses, others great muscle and other memories, others a “feel” for harmonic theories, etc. It is generally the case in music that the budding musician will not have great skills in every part of music, and will wind up doing a lot of practicing developing what’s needed. So: you really can get much much better at hearing what is going on via “ear training”, at “tracking others to be ‘in a groove’ with them rhythmically”, to “know where you are and where you are going” while improvising, certain kinds of practicing will help the various musical memories to get deeper and faster, etc.
In Alan Kay's answer to How can one become a better thinker? I mention a little about learning and thinking better being partly the creation of “brainlets” to offload as much of the work as possible. The students need to understand that this is part of the process for really getting fluent in anything, and to understand what is needed to help the “brainlets” form and grow.
Dealing with the centrally important “one size does not fit all” problem is one of the most important parts of any course design. For one thing it argues against lectures-as-content — even if they were otherwise a good idea (they really aren’t!).
I think an “inspirational talk” every so often can be a great thing, but we shouldn’t confuse what is good about oral cultures — the emotions, romance, theater, and sense of belonging — with literate cultures — the much-larger better-organized multi-perspective self-paced, etc., Better Organization Of Knowledge.
Today we have the possibilities of: a DYNAmic Better Organization Of Knowledge, and we need to make this, and use it to the fullest.
Here’s another analogy to music learning. Generally, one has a private lesson with a teacher once a week (maybe twice, though that is pushing it). Most of one’s time in a week is spent practicing and learning. Almost without exception there are ongoing group experiences: orchestra, chamber music (including “piano band” if one is a keyboard player), chorus, etc. And there will be some courses e.g. in theory, composition, repertoire, etc.
We can see that the balance between a bit of private tutoring and considerable work on one’s own is very different from standard US practice, but is like the “tutor” system that has been used at a number of UK universities such as Oxford and Cambridge. The tutor acts as a guide and quality control, whereas the student has to do most of the digging and practicing and other forms of doing and learning (this is a good thing!).
As for the group experiences, this used to be easier and more common in computing’s “deep past”. Major universities would get — or even better make a computer — and the students would form part of the larger design and building experiences for both HW and SW.
Even if a computer was purchased, the operating system and languages on it were usually pretty bad, and there was a lot of motivation to do a better, more useful set of tools.
(Today it is still true that the OSs and languages are not very good on purchased computers, but the perspective to see this has been pretty much lost, and the will — and even expertise — to design and make a better OS or language (or better subsystem) in university has been lost along with it). This has removed from students of today much of the “real” from “real computing”, and quite a bit of the fun.
I think for a course like this, as a stand-in for the “new computer” in the old days, I’d pick something (a) that is like a whole computer, that is (b) going to be used every day, (c) is badly conceived, (d) I’d help them see that “normal” does not necessarily mean “good” or “acceptable”, and (e) have them learn by doing the designs and building something much better.
How about the web browser as a target? (Yikes!). This could be doubly interesting because it runs on top of the Internet — perhaps the best large system ever done in computing.
This would be a bit tricky to set up, but quite interesting to see how this could be approached as a large group target. One would start by looking at what TCP does, and what it could do, and what the scaling of users — especially authors — implies about what is needed to deal with the major issues for both “reading” and “writing” and “extending” the new medium across billions of nodes and trillions of objects.
(It’s worth pointing out that quite enough was known about systems design in the 70s to make very a few good operating systems, programming languages, and the Internet itself. Unfortunately, essentially none of this knowledge is apparent in the designs of the Web Browser, and precious little for the Web itself.) The good news is that an amazing amount of this can be cleaned up and simplified by much better designs that run directly on IP (or on an extension of TCP/IP).
This makes a lot of sense to me because today “the computer” is “the Internet of computers” both connecting physical hardware together outside of the machines, and also connecting the virtual software together inside the machines, and all as one network idea.
<Hopefully not much more to come here>
---
I’m guessing that it would take a minimum of a year — more like two — to do the design and prep for this course. For one thing, it would take a while to design and make the programming language and environment that would be used, and it will take more time (and real effort) to have the environment also be able to supply the useful “helps” that many of the students will need.
Many parts of the curriculum will need to be tested, so some of the design and testing can be done as projects in other courses, and with the equivalent of the paid students who are used as test subjects in psychology experiments.
Our experience in doing past curricula in schools is that it takes about 3 years to get even one that is adapted from already tested materials to jell and work. Part of this is to give the teachers time and experience to get comfortable with both the subject matter and the rhythms induced between this and the spread of students who will need to helped in various ways. Since — here — we are planning to do the teaching ourselves, we can probably cut off a year from the prep time. So let’s say “really two years”, and “maybe we could start with examples in one year of prep”.
So, here, I can only jot down some notes — even just “impulses” and “instincts” — that are occurring to me as I work through the ramifications of the question (these often don’t pan out, but I like to write them down as they occur).
The first big impulse is “start with something massively parallel in the spirit of StarLogo, NetLogo”, and “Kedama” (in Etoys), maybe with tinges of Elixer/Erlang thrown in.
Because “cognitive load” is a main factor with introductions to new things, we want to somehow both (a) have the manifestation of the design be fun and really interesting — so it will need to involve interactions between the elements — and (b) we would like to have this experience use few enough elements to avoid as much as possible “induced blindness from complexities”.
Examples like these will drive both the curriculum design and the design of the language and environment to try out ideas by using them, making them, etc.
The second impulse was “vacuum cleaner!” (I have a feeling that this will wind up further down the list, and that something more like “epidemic!” might be first. Still, what is actually going on with a vacuum cleaner is wonderfully opposite to what most people suppose, and the modeling of it is simple and easy to understand.)
<….. more ahead …..>
---
A mapping to the “outside world” is eventually important, but a main aim would be to have the pedagogical system not exhibit properties that make it difficult to think about and use certain important good ideas (this is a real problem in most language systems in use today, whether academic or commercial — i.e. they have given up too much meta for the sake of other considerations, some merely historical and/or “religious” baggage).
So: one of the main purposes of any early course in anything is to help the students gain enough knowledge and perspective to start to be able to criticize the current state of knowledge in the field that they are being required to learn.