Why MIT switched from Scheme to Python (2009)

216 borski 186 7/25/2025, 4:38:16 PM wisdomandwonder.com ↗

Comments (186)

keithwinstein · 13h ago
This story has been reposted many times, and I think GJS's remarks (as recorded by Andy Wingo) are super-interesting as always, but this is really not a great account of "why MIT switched from Scheme to Python."

Source: I worked with GJS (I also know Alexey and have met Andy Wingo), and I took 6.001, my current research still has us referring to SICP on a regular basis, and in 2006 Kaijen Hsiao and I were the TAs for what was basically the first offering of the class that quasi-replaced it (6.01) taught by Leslie Kaelbling, Hal Abelson, and Jacob White.

I would defer to lots of people who know the story better than me, but here's my understanding of the history. When the MIT EECS intro curriculum was redesigned in the 1980s, there was a theory that an EECS education should start with four "deep dives" into the four "languages of engineering." There were four 15-unit courses, each about one of these "languages":

- 6.001: Structure and Interpretation of Computer Programs (the "procedural" language, led by Abelson and Sussman)

- 6.002: Circuits and Electronics ("structural" language)

- 6.003: Signals and Systems ("functional" language)

- 6.004: Computation Structures ("architectural" language)

These were intellectually deep classes, although there was pain in them, and they weren't universally beloved. 6.001 wasn't really about Scheme; I think a lot of the point of using Scheme (as I understood it) is that the language is so minimalist and so beautiful that even this first intro course can be about fundamental concepts of computer science without getting distracted by the language. This intro sequence lasted until the mid-2000s, when enrollment in EECS ("Course 6") declined after the dot-com crash, and (as would be expected, and I think particularly worrisome) the enrollment drop was greater among demographic groups that EECS was eager to retain. My understanding circa 2005 is that there was a view that EECS had broadened in its applications, and that beginning the curriculum with four "deep dives" was offputting to students who might not be as sure that they wanted to pursue EECS and might not be aware of all the cool places they could go with that education (e.g. to robotics, graphics, biomedical applications, genomics, computer vision, NLP, systems, databases, visualization, networking, HCI, ...).

I wasn't in the room where these decisions were made, and I bet there were multiple motivations for these changes, but I understood that was part of the thinking. As a result, the EECS curriculum was redesigned circa 2005-7 to de-emphasize the four 15-unit "deep dives" and replace them with two 12-unit survey courses, each one a survey of a bunch of cool places that EECS could go. The "6.01" course (led by Kaelbling, Abelson, and White) was about robots, control, sensing, statistics, probabilistic inference, etc., and students did projects where the robot drove around a maze (starting from an unknown position) and sensed the walls with little sonar sensors and did Bayesian inference to figure out its structure and where it was. The "6.02" course was about communication, information, compression, networking, etc., and eventually the students were supposed to each get a software radio and build a Wi-Fi-like system (the software radios proved difficult and, much later, I helped make this an acoustic modem project).

The goal of these classes (as I understood) was to expose students to a broad range of all the cool stuff that EECS could do and to let them get there sooner (e.g. two classes instead of four) -- keep in mind this was in the wake of the dot-com crash when a lot of people were telling students that if they majored in computer science, they were going to end up programming for an insurance company at a cubicle farm before their job was inevitably outsourced to a low-cost-of-living country.

6.01 used Python, but in a very different way than 6.001 "used" Scheme -- my recollection is that the programming work in 6.01 (at least circa 2006) was minimal and was only to, e.g., implement short programs that drove the robot and averaged readings from its sonar sensors and made steering decisions or inferred the robot location. It was nothing like the big programming projects in 6.001 (the OOP virtual world, the metacircular evaluator, etc.).

So I don't think it really captures it to say that MIT "switched from Scheme to Python" -- I think the MIT EECS intro sequence switched from four deep-dive classes to two survey ones, and while the first "deep dive" course (6.001) had included a lot of programming, the first of the new survey courses only had students write pretty small programs (e.g. "drive the robot and maintain equal distance between the two walls") where the simplest thing was to use a scripting language where the small amount of necessary information can be taught by example. But it's not like the students learned Python in that class.

My (less present) understanding is that >a decade after this 2006-era curricular change, the department has largely deprecated the idea of an EECS core curriculum, and MIT CS undergrads now go through something closer to a conventional CS0/CS1 sequence, similar to other CS departments around the country (https://www.eecs.mit.edu/changes-to-6-100a-b-l/). But all of that is long after the change that Sussman and Wingo are talking about here.

amirhirsch · 9h ago
Hi Keith! Another consideration was that the core computer programming skills needed to be taught more broadly to basically everyone and not just course 6 students.

Source: I shared an office with Keith next to Hal and Gerry--he taught me Java! Fun anecdote: we had to move RMS's stuff to the new CSAIL building because he had broken his arm punching a wall.

globalnode · 8h ago
Ive broken my hand punching a wall, its not nice :/. Also I hated scheme in first year uni, my brain just did not get the pattern matching required... Australian uni's probably just copied the syllabus from US ones at that time.
amirhirsch · 4h ago
I misremembered the story and checked on details: the arm broke in a fall while he was travelling several months prior to the move and it was Gerry joking that he punched a wall so he wouldn't have to move stuff.
ykonstant · 12m ago
>the department has largely deprecated the idea of an EECS core curriculum

From my perspective, a tragedy.

PeterStuer · 1h ago
"And why Python, then? Well, said Sussman, it probably just had a library already implemented for the robotics interface, that was all."

I was from the same "Nouvelle AI"/Robotics cohort as Leslie Kaelbling. Autonomous Robotics in AI back then was a fairly small community, so everyone (at least in the nato and friends) knew each other from conferences and workshops.

Having written kernel and interface libraries for those type of robot systems in those days, it was not that much work that it would need to be an issue determining language choice.

My uninformed guess based on what lived in the community at the time would be that the teachings were so focussed on the ideas of physical grounding, control paradigms and systems, "the world is its own best model" and reaction against the symbolic reasoning systems that came before, that Scheme/Lisp had to go because it was an icon of the symbolic paradigm, and that in the new 'subsymbolic' world we did not pay attention to the programming language at all, because basically it was all data/signal flow and intercoupled and layered differential equations from sensors to actuators anyways.

fsckboy · 11h ago
MIT "units" of class divided by 3 = other American university credits. 3, 4, and 5 credits would be 9, 12 and 15 units; generally 15 units includes lab time, although there are more or less pure lab classes too.

credits are hours spent in class per week, and units are ostensibly hours of class plus homework, except it's a lie, there is much more homework than that.

dang · 12h ago
This comment so obviously belongs on https://news.ycombinator.com/highlights that it's maybe a good occasion to mention that https://news.ycombinator.com/highlights exists. Thanks!

(and sorry for offtopicness)

twoodfin · 11h ago
Wow, no idea highlights existed. Glad you used this opportunity to …uhh… highlight it via this great post.

I was at MIT just before this switch, and treasure having gotten to take these deep dive courses, even if .002 and .003 kicked my ass.

6.004 (followed up by 6.033) is probably the course that really drove my career into systems dev.

gjm11 · 10h ago
Neat. Is there any way to search the highlights?

("What are the most noteworthy things that have been said on HN about ...?" "I remember reading an excellent comment that had something to do with ..., but all I can remember is that it used the word ..." "Do I have any comments in the highlights?")

lukasb · 6h ago
Would love an RSS feed.
aleph_minus_one · 12h ago
Thanks for this detailed explanation.

A semi-off-topic side question:

> the students were supposed to each get a software radio and build a Wi-Fi-like system (the software radios proved difficult and, much later, I helped make this an acoustic modem project).

What was the reason why the software radios proved difficult?

josh2600 · 8h ago
Not OP but in general sourcing software and hardware radios in that time was very difficult. There weren’t good open-source implementations and everything had to be sorta reverse engineered which meant that anyone with the skill to do that was selling it for a lot of dollars.

Source: did 10 years in telecom land.

zahlman · 11h ago
> There were four 15-unit courses, each about one of these "languages":

The description you offer is strange to me. The Lisp family of languages are multi-paradigm (arguably paradigm-independent) and can hardly be called "procedural". The core material of SICP revolves around considering the "means of combination" and "means of abstraction" offered by a programming language — concepts that sound to me like they have far more to do with "structure", "architecture" and "functionality" than with "procedure".

StellarScience · 8h ago
You're absolutely right that "procedural", at least as I understand the word in 2025, is a poor label for 6.001.

6.001 taught 'define' and 'let' but didn't teach 'set!' until week 6 or so. So we learned functions, variables, scopes, recursion, lambdas, strings, numbers, symbols, lists, map, filter, flatten, and more - all without ever modifying a variable. That's very "functional".

Once we learned that it was possible modify existing variables, we learned object-oriented programming; objects were just lambdas with closures that took messages indicating which function to call. We then learned a fake assembly language written in scheme that had both an interpreter and a compiler, also written in scheme. While "procedural" feels wrong, I'm not sure what label one could apply to all this...

Jtsummers · 7h ago
Given their definition of procedural, the term makes sense. The book is about processes and procedures that describe how they're executed or things are computed, versus describing what is computed (mathematical sense, declarative or more declarative, closer to some popular meanings of functional programming today).

They define functional programming as "[p]rogramming without any use of assignments". Which would be a subset of procedural programming in the sense that they mean it.

They also contrast imperative and functional programming (the first being with assignments and mutations, the latter without). Both imperative and functional programming can reasonably fall under procedural programming using their definitions.

kragen · 7h ago
It's very "functional" in the "functional programming" sense, but not at all in the sense that 6.003 is about the "functional" descriptions of LTI systems (i.e., that the "signal" output of a "system" is a function of the input, which you can do things like take the Laplace transform of). "Procedural" is the term used in the class's textbook, and the "functions" in Scheme are called "procedures" in the Scheme standard.
twoodfin · 8h ago
Wizardry!
nathan_douglas · 7h ago
I'm a bit disappointed by some of the responses you received and that you were apparently downvoted.

Here's some text from Chapter 1 of the book that might make this clearer:

> Procedures, as introduced above, are much like ordinary mathematical functions. They specify a value that is determined by one or more parameters. But there is an important difference between mathematical functions and computer procedures. Procedures must be effective.

> As a case in point, consider the problem of computing square roots. We can define the square-root function as √x = the y such that y≥0 and y^2 = x .

> This describes a perfectly legitimate mathematical function. We could use it to recognize whether one number is the square root of another, or to derive facts about square roots in general. On the other hand, the definition does not describe a procedure. Indeed, it tells us almost nothing about how to actually find the square root of a given number. It will not help matters to rephrase this definition in pseudo-Lisp:

    (define (sqrt x)
      (the y (and (>= y 0)
        (= (square y) x))))
> This only begs the question.

> The contrast between function and procedure is a reflection of the general distinction between describing properties of things and describing how to do things, or, as it is sometimes referred to, the distinction between declarative knowledge and imperative knowledge. In mathematics we are usually concerned with declarative (what is) descriptions, whereas in computer science we are usually concerned with imperative (how to) descriptions.

[There's more after this, but it is off-topic for our purposes.] IMHO you're not wrong and you shouldn't've been downvoted. I think there's just an issue with semantic drift and evolving terminology and map-is-not-the-territory and so forth going on.

kragen · 10h ago
SICP is fundamentally about the notion that programs are primarily a means of communication between people, being written by people for other people to read, and only secondarily a thing for computers to execute. And it really opened my eyes to the landscape of programming paradigms that exist—indeed, it continues to do so!

But your comment is completely off-base.

In Circuits and Electronics, as I understand it, the "structures" being discussed are circuit schematics, things like this keyboard I designed last month https://tinyurl.com/23tdsm4c. While SICP does talk about circuit schematics, I don't think anyone would claim that S-expressions are a reasonable alternative way for people to read and write such things.

You're completely confused about Signals and Systems, because you said "functionality", a word which refers to the kind of "functional" a machine might be. In that context, saying that something is "functional" means that it works. But the "functional" that describes Signals and Systems is the mathematical idea of a "function", which is a not-necessarily-computable relation of each possible input to one (possibly not distinct) output. The kinds of "functions" we're talking in S&S are the kinds of functions where you can take the Laplace transform or plot the frequency and phase response. It isn't about functionality at all!

While S-expressions are perfectly capable of expressing ideas like these, and indeed SICM investigates those possibilities in much more detail, SICM hadn't been written yet, and SICP and 6.001 touch on them only briefly. Following SICM I think even its authors were doubtful about whether Scheme was a good medium for working with those ideas.

I don't know anything about Computation Structures, so I can't really say anything about it. Maybe you're right that it would fit perfectly well into 6.001. Apparently it survived the purge; https://ocw.mit.edu/courses/6-004-computation-structures-spr... says:

> This course introduces architecture of digital systems, emphasizing structural principles common to a wide range of technologies. It covers the topics including multilevel implementation strategies, definition of new primitives (e.g., gates, instructions, procedures, processes) and their mechanization using lower-level elements. It also includes analysis of potential concurrency, precedence constraints and performance measures, pipelined and multidimensional systems, instruction set design issues and architectural support for contemporary software structures.

swannodette · 9h ago
> Following SICM I think even its authors were doubtful about whether Scheme was a good medium for working with those ideas.

Hrm https://mitp-content-server.mit.edu/books/content/sectbyfn/b...

kragen · 7h ago
This looks awesome! Maybe they were joking.
zahlman · 9h ago
> But your comment is completely off-base.

I think it is rather your reply that is off-base; or else I have not made myself sufficiently clear.

My point was simply that the words used to describe the other courses are better fits for what SICP teaches than "procedural", which is a poor fit for describing Lisp-family languages and would make more sense applied to other contemporary languages like COBOL and FORTRAN (and of course typical Algol-family languages).

I understand perfectly well what "functional" means in the context of signals and systems. I took such a course in undergrad, 20+ years ago. But I was using abstract nouns there, rather than adjectives (and writing "function" rather than "functionality" would not really have resolved the issue).

The material in SICP deeply explores the functional programming idiom. A big part of the point of using a Lisp dialect is that functions are first-class (I've watched the OCW lectures; there's a whole section discussing what that means and entails) objects, which enables higher-order functions.

Nothing in my comment is about modelling anything to do with electronics in software.

Jtsummers · 8h ago
You may want to take your issue with the use of the word "procedural" up with the authors of SICP:

> Underlying our approach to this subject is our conviction that “computer science” is not a science and that its significance has little to do with computers. The computer revolution is a revolution in the way we think and in the way we express what we think. The essence of this change is the emergence of what might best be called procedural epistemology—the study of the structure of knowledge from an imperative point of view, as opposed to the more declarative point of view taken by classical mathematical subjects. Mathematics provides a framework for dealing precisely with notions of “what is.” Computation provides a framework for dealing precisely with notions of “how to.” [Emphasis in original]

-- Preface to the First Edition

kragen · 7h ago
Your comments are clear enough; they're just mistaken.

Lisp dialects generally do not support mathematical functions, despite supporting the functional-programming idiom, which is inspired by mathematical functions. Rather, they support procedures, which in most Lisps are called "functions". In Scheme, however, the Lisp they chose for the course, they are called "procedures", an intentional choice to avoid creating precisely the kind of confusion you are experiencing. Lisp "functions", like procedures in most other languages, can fail to terminate, can raise an error, can have side effects, and can depend on mutable state.

Mathematical functions cannot do any of these things. If they could, it wouldn't make much sense to take their Laplace transforms!

The five chapters of SICP (I recommend http://sarabander.github.io/sicp/html/index.xhtml) are:

- 1 Building Abstractions with Procedures

- 2 Building Abstractions with Data

- 3 Modularity, Objects, and State

- 4 Metalinguistic Abstraction

- 5 Computing with Register Machines

— ⁂ —

You said:

> Nothing in my comment is about modelling anything to do with electronics in software.

You are mistaken about that. The part of your comment that is about modelling something to do with electronics in software is the part where you replied to a comment saying:

> ... four "deep dives" into the four "languages of engineering." There were four 15-unit courses, each about one of these "languages":

> - 6.001: Structure and Interpretation of Computer Programs (the "procedural" language, led by Abelson and Sussman)

> - 6.002: Circuits and Electronics ("structural" language)

> - 6.003: Signals and Systems ("functional" language)

> - 6.004: Computation Structures ("architectural" language)

Your comment in reply said:

> Lisp (...) can hardly be called "procedural". The core material of SICP revolves around (...) concepts that (...) have far more to do with "structure", "architecture" and "functionality" [sic] than with "procedure".

That is, you were explicitly asserting that the core material of SICP was concerned with "structure", "architecture", and "functions" in the sense of the core material of those courses, rather than only or even primarily procedural abstraction. However, two of those four courses—specifically, 6.002 and 6.004—were concerned almost exclusively with modeling electronics. (An awful lot of the "systems" in 6.003 are also electronic, but that's beside the point.) However, as you know, 6.001, SICP, and Lisp are concerned exclusively with modeling things in software.

Modeling electronics in software is a reasonable thing to do, and Lisp is a reasonable medium to do it in, but you need to understand the structural, architectural, and (at least for analog electronics) functional angles on the electronics in order to do that. None of that is part of SICP or 6.001, and Lisp is not a reasonable medium for describing electronic systems from at least the structural and functional angles. You need schematics, pole-zero diagrams, and Bode plots. If you remembered what you studied in that course 20+ years ago this would be obvious to you.

losvedir · 10h ago
Thanks for this history, very interesting! I guess I can see the reasoning there, but as an Econ major who took 6.001 for fun, it makes me a little sad. That class was mindbending and so interesting.
hawaiianbrah · 11h ago
Thanks for the history. I was an undergrad at the time and remember having a choice between 6.001 and 6.01. I don’t think I formally switched into course 6 yet and by the time I did, 6.01 was the only option.
ggm · 9h ago
A useful reminder that economics plays as much, if not more import in what is taught and how it is taught, as any pedagogical drive. If attendance drops, universities can pivot. Gotta get the bums on seats.

20 years ago Cisco came shopping in Australia for ee grads who could do microcode. The US degree mills had stopped teaching students how to code an edge case for most jobs, and the router and switch vendor had to find places who still did that.

MontyCarloHall · 15h ago
Isn't this just part of the broader trend of CS departments switching away from teaching computer science to teaching computer engineering, which in turn is part of the more general trend of colleges becoming more vocational?

LISP dialects like Scheme are excellent for teaching pure computer science because they are the closest thing to executing lambda calculus expressions. Whereas Python is excellent for teaching applied computer engineering, because it's essentially executable pseudocode for imperative languages, and imperative languages are the most common language a computer engineer encounters in the real world.

Karrot_Kream · 14h ago
When this kind of switch was happening in CS departments, as a graduate student I was part of a "movement" that advocated for switching away from things like Scheme to Python for introductory classes in my elite CS institution. (We focused on other things as well such as more interdisciplinary research, which was where I was more passionate, but that's a separate matter.)

My reasoning at the time in this order was:

1. Widely used tools and practices offer a flywheel of usefulness that can help motivate undergrads to learn about computation. Once you learn Scheme, well now you've learned Scheme. But at the time if you had learned Python you could then use something like Python's system and socket APIs to play around with the lab or personal Linux systems. On the web side, there was web.py or Flask (haha this was the late 2000s/early 2010s) to motivate yourself to keep going. The student could spend their summer building apps and tools so that they appreciate computation for more than just its "aesthetic" beauty.

This was a time when CS wasn't all that prestigious on its own and salaries weren't as high as they are now, so many folks who banged their head against Scheme or MMIX or LC3 would just churn to the EE or MechE departments.

2. As a grad student it was almost trivial to set an exam paper that could weed out most of the class. This was especially trivial at the introductory class level where Scheme would be taught. If the concern was rigor it was very simple to maintain the rigor in other ways.

3. For better or for worse many undergrads had no intent of going to grad school, and many of the undergrads taking our classes weren't even students of computer science. They were electrical engineers or industrial engineers who wanted to learn enough programming to automate things in their field but were more interested in their actual areas of concentration.

In the years since my thinking around this evolved, but I still share the same conviction I did then. Probably moreso given the sheer ubiquity of Python now.

dawnofdusk · 13h ago
I think the solution is to have, as is the case in math/physics, an honors intro CS sequence compared to the regular intro CS class. The latter would be the recommendation for all non-CS majors, and the former would be for CS majors. I've always thought that those who are focusing on more vocational training should not be in what is called the CS program, maybe there are other majors called "software development" or "data science" or the like. Undeniably most prospective CS students are not aiming to go into academia, but we shouldn't adapt to this majority and then leave behind those who do want to do more academic things.

My background is in physics, where this sort of dual-track curriculum is well-established, and the physics taught to physics majors is very different from that taught to engineers. Unfortunately the difference is often boiled down to rigor or difficulty (and this will be reinforced if it's physics professors that have to teach both of the tracks), but in reality it is a value-neutral split which is based on pragmatism. CS should have one too.

Karrot_Kream · 12h ago
We did end up making this switch later on due to growing class sizes anyway. That certainly helps focusing the class. We ended up focusing on computation more for the CS sequence and on the nuts and bolts of getting a program working for the non-CS sequeunce.

But my rationale for moving to Python still stands. In fact, I know several brilliant ML researchers who write code that would never come close to making it to production. The things we optimize for are different. Production code in a tech company needs to be readable, maintainable, explainable, and scalable. An ML researcher's code needs to support their research. These different perspectives are still why I think focusing on a wider appeal language like Python over something like Scheme still makes sense.

FWIW our CS program mandated a programming languages class and the first third of the class was taught in Scheme.

dawnofdusk · 7h ago
>FWIW our CS program mandated a programming languages class and the first third of the class was taught in Scheme.

This is important but doesn't replace having a dual-track intro sequence. The reason one has "physics for physics majors" isn't because physics majors need to learn some of this complicated stuff ASAP. They definitely don't, and I don't doubt students in the program will eventually get a well-rounded education. But it's a good idea to give incoming students a taste of what the field is like as soon as possible, so they can see if they like it or not. (Essentially it's a "weeder", but for the students' sake so they can self-select on interest and not just instructional staff's sake of being elitist.) Probably some (but not all) professors/postdocs/grad students would scramble to teach the more advanced sequence as it is likely more engaging for them than the current intro curriculum.

To be clear I don't think an advanced intro CS can't be in Python on principle, but such a class probably introduces multiple languages to some degree: they could be toy assembly languages or real ones in addition to the majority of the course content in Python.

senderista · 7h ago
Similarly for math. I had to take a linear algebra class as a math major that was mostly populated by engineering majors and it was painful (given that they were allergic to proofs).
GZGavinZhao · 11h ago
Brown CS actually does this! Accelerated Intro to CS is taught in Racket, I believe.
fn-mote · 12h ago
The only point I really have an issue with is #2, where the focus seems to be on “weeding out” students as a sign of rigor. I would much prefer that some kind of pedagogical motivation replace this point.

Edit: I take that back.

> Once you learn Scheme, well now you've learned Scheme.

(Not from SICP but How to Design Programs): The claim is that you’ve learned how to THINK about programming. You understand how to organize and test your code so you can make a larger project.

I think the dismissal of a Scheme-like language as a dead end is shallow, and includes a large assumption about the (lack of an) ecosystem of the language. I think saying more will turn this into a rant.

em-bee · 13h ago
help motivate undergrads to learn about computation. Once you learn Scheme, well now you've learned Scheme. But at the time if you had learned Python you could then use something like Python's system and socket APIs to play around with the lab or personal Linux systems

that's a good point actually. i had scheme, modula and others i don't remember in my undergrad classes. i remember almost nothing from that time. but at the same time i met some students running an LPmud, where i learned LPC, and then i discovered roxen and pike (which is based on LPC) which i used in all my volunteer and fun programming work. in other words all my motivation for learning stuff came from the outside.

simpaticoder · 13h ago
>Once you learn Scheme, well now you've learned Scheme.

There is something really joyful in learning a new language and then implementing a well-known protocol, like HTTP, in that language. You can pick either the agent or server side, and check your work with other well-known agents and servers. In my experience this tends to happen when students like the language they've just learned, regardless of the direction their given by staff. In fact, I'd almost consider it definitional of what it means to like a language - that you'd consider implementing a well-known protocol in it in your free time.

Karrot_Kream · 12h ago
Maybe this is due to my interests (I specialized and published in distributed systems) but it's always been the opposite for me. Implementing HTTP/1.0 or IRC clients is one of my favorite ways to learn a new language (albeit it's a bit heavy on the IO which can be unfair to functional languages that model effects.) My interest in network software is that I can standup the software and have it participate in the network immediately. It's the application that leads me to appreciate the language not the other way around. My interests in theorem proving and program verification came from debugging heisenbugs in the wild and wasn't motivated by the algorithmic complexity or mathematic sympathy.

But I dabbled in PLT in my grad days and have no doubt that there are folks who have your mindset as well.

Izikiel43 · 12h ago
> There is something really joyful in learning a new language and then implementing a well-known protocol, like HTTP, in that language.

That's probably the minority of students though

tombert · 13h ago
I just completed the WGU Masters in "Computer Science".

I put the scare quotes around "Computer Science", because outside of a single algorithms and data structure course and a single AI course (which was extremely high level), it was purely engineering stuff. One assignment had me deploying stuff with AWS, I was designing wireframes of potential "apps" I could create, and I had to write one HTTP server.

It was kind of fun and it was nice that I was able to complete it quickly, but it really shouldn't be called "Computer Science", it should be called Software Engineering. There's nothing wrong with software engineering, I just view it as distinct-but-related from CS.

kec · 14h ago
Computer Engineering is its own discipline, typically lumped with Electrical Engineering, which is more about system architecture and design and only touches on programming at a low level such as device firmware.

What I think you're really lamenting is the devolution of CS education to vocational programming.

lupusreal · 14h ago
I think he meant software engineering.
leoc · 8h ago
“Software Engineering” tends to be about project management: schedules and organisation, estimation, defect rates and so on. For vocational training on existing IT systems (including some coding), which I assume is more what the course focused on, then “Management Information Systems” or “Information Technology” would be the more traditional names IIUC.
zozbot234 · 11h ago
> Whereas Python is excellent for teaching applied computer engineering, because it's essentially executable pseudocode for imperative languages

It's not that simple, Python is a fiddly, complex, high-level language that has accreted features in a very ad-hoc way. This makes it very hard to teach and learn in a way that's expected to pay even the most cursory attention to actual rigor. You could probably define a Baby Python subset of the language that's just as simple and rigorously defined as Scheme and teach that, but this isn't how the new MIT intro courses have been designed.

leoc · 7h ago
> You could probably define a Baby Python subset of the language that's just as simple and rigorously defined as Scheme and teach that

Pyret https://pyret.org/ started out with more or less that ambition I think. IIRC its author had previously tried to work with Python (and its dev team) but gave up.

gowld · 9h ago
Python was invented as a language for newbies. It's come a long way!

https://en.wikipedia.org/wiki/History_of_Python#Version_1

> During Van Rossum's stay at CNRI, he launched the Computer Programming for Everybody (CP4E) initiative, intending to make programming more accessible to more people, with a basic "literacy" in programming languages, similar to the basic English literacy and mathematics skills required by most employers. Python served a central role in this: because of its focus on clean syntax, it was already suitable, and CP4E's goals bore similarities to its predecessor, ABC.

https://en.wikipedia.org/wiki/ABC_(programming_language)

> It is intended for teaching or prototyping

bmitc · 4h ago
It was an attempt but a bad one.
SoftTalker · 14h ago
Yes. One of the biggest complaints that computer science departments used to get from students is that they weren't learning any languages that employers are using.
nextos · 14h ago
I always found this to be a shortsighted complaint. Getting exposed to languages where computation models are clear gives you an excellent background to switch to the language du jour and become a master. Going through e.g. HtDP or CTM makes it easy to transition to Python and write excellent code, whereas traversing the opposite path is going to be tough.
delecti · 13h ago
I agree, but those don't need to be the languages you use in all classes. I learned a few assembly and academic languages (MIPS and LISP) in classes for those two topics, and it was absolutely useful to learn how to think in terms of those languages. The vast majority of our classes were Java though, and that's also been the vast majority of what I've done since graduation. (I think my school has since moved to Python as well)

So I graduated with that really helpful knowledge about why modern languages work how they do, but also a lot of practical experience of actually using those modern languages too.

nitwit005 · 11h ago
Sure, it's possible to catch up, but we're talking about at least four years of potential experience. That means spending years catching up, which can seriously impact you career.

Not a unique problem to software either. My sister in-law is a mechanical engineer. Her first employer was upset she didn't know anything practical, and only knew theory. She had to spend years catching up.

nextos · 11h ago
Some technical universities in EU solve this problem by having full-time practical courses e.g. in January and June. For example, as a CS freshman you can build a really solid background in functional programming by going through a sequence of SML or Haskell courses in Autumn and Spring and spend January and June learning trendy technologies in depth. It's the best from both worlds.
daedrdev · 5h ago
Having taking a course based on HtDP as my first serious coding course in college, it was good at teaching many concepts, but it felt very verbose and was aggressive in its hiding of features that weren't that difficult to grasp.
vouaobrasil · 12h ago
I don't agree with that. I think Python is a better first language. The better students will get through the program just fine, especially if they really want to learn computer science in depth. And the average ones will at least learn something useful.
billy99k · 11h ago
If you understand the fundamentals, you can easily switch between languages.
ajkjk · 13h ago
even better is learning the languages you want to learn

why are you paying a school to teach you something adjacent to what you want to learn so you can learn the thing you need yourself?

aleph_minus_one · 11h ago
> why are you paying a school to teach you something adjacent to what you want to learn so you can learn the thing you need yourself?

Because some topics are easy to learn by yourself, and some are not, so the latter ones are better learned in a college setting.

kelipso · 11h ago
Learning a language definitely belongs in the first category. Learning computer science goes in the latter category.
ok123456 · 14h ago
There were plenty of less rarefied CS departments that were concerned about this, and they taught C, C++, or Java in their introductory classes.

Ultimately, it doesn't matter. It's your first language, not your last.

zelphirkalt · 13h ago
I learned programming before entering a degree in this stuff and I think learning a badly designed language as first language made me lose a few years, and additionally, if I weren't so driven to learn more, I probably still wouldn't know more than many others, and might have never explored the field of functional languages. If I hadn't started reading SICP and exploring Scheme and others, I wouldn't know half of what I know now about computer programming.

Sticking to only some Algol family language makes people have a severely limited perspective on things.

olddustytrail · 14h ago
How many people do you know who are monolingual?
bluGill · 14h ago
Human languages and programming languages are not comparable. You will need a lot more effort to become fluent in a second human language than in second programming language. Even if the human language is Esperanto (designed to be really easy for speakers of European languages), and the programming language is C++ (perhaps the most inconsistencies and foot guns) the programming language will need a lot less effort to learn to a high level.
em-bee · 11h ago
having actually learned esperanto and become a fluent speaker in just half a year, i am not so sure. esperanto grammar is trivially easy compared to any other language (the rules fit on a postcard in regular sized print), but if you'd take any other language, i'd agree.
exe34 · 13h ago
Multiple computer languages are probably more like learning vocabulary in different domains of life and learning to write for different media.
olddustytrail · 13h ago
They're not directly comparable because humans have an inbuilt ability to learn human languages.

The vast majority of people on the planet know more than one human language and know zero computer languages. It's literally the opposite of what you're claiming.

zelphirkalt · 13h ago
That's very superficial and wrong.

It makes a huge difference, whether you have to learn thousands of new words, irregular grammar and (after learning thousands of concepts in the first language) learning a few hundred new concepts, or you learn a computer-understandable language, that has maybe, if very inelegant, 100 keywords, and 100 concepts, most of which you will probably not use often.

Compared to these numbers, the fact, that something is a natural language, has very little influence on the outcome. It is the sheer effort needed to learn a natural language, that makes the difference.

bigfishrunning · 11h ago
Learning to program may be hard, but learning programming languages is relatively very easy. In other words, your second programming language is so much easier to learn then your first was.

I regularly use several programming languages, and tend to pick up a new one every year. I've been spending the last six months studying my second spoken language; I promise you human languages are much harder to learn.

wat10000 · 12h ago
They’re not directly comparable because programming languages are much simpler and much easier to learn. Becoming a good programmer is hard, but that’s not due to difficulty of learning a programming language. Once you’re a good programmer, new languages are easy. A decent programmer should be able to do something useful in a new language in a week or less, and be reasonably competent in a month or two. See how long it takes anyone to learn a human language to that level.
isaacremuant · 10h ago
Have you thought through what you said?

You also have an inbuilt ability to learn a computer language. What even is an inbuilt ability?

Programming languages are something you read and write and execute. You can learn many and their definition is precise and limited. It's very easy to be able to pick a programming language and use it in relative low amount of time.

Human languages are absolutely different. You can't easily pick them up and they carry cultural context, regional variations, and a lot of ambiguity and history. Definitions of those languages tend to be complete or prescriptive but descriptive and evolving. The languages are written, spoken, read and listened to. The variation in all of those is immense.

Do you acknowledge any of this or will you double down in the most absurd of points?

ok123456 · 14h ago
Only knowing the language you were required to know to pass a bunch of tests when you were 18 is a negative signal.

If someone is interviewing and they only have Java listed, and their school is known for teaching Java for their introductory classes. They're probably not that strong of a programmer.

_proofs · 11h ago
programmers, and good ones imo, are almost always polyglots on some level, and i tend to think have a better than average ability to even pick up natural languages.

programming languages have a small, manageable and finite set of vocabulary, idioms, and constructs that most languages share but express differently depending on their intended use. a programmer fluent in programming will be able to pick up most languages. how those pieces are cobbled together to form more complicated abstractions becomes the skill obv.

that does not mean they'll be an expert right away, but it does mean they are usually competent enough at minimum to dive in and work with it just like any other tool -- they know they'll need a screwdriver, maybe a hammer, so they look up what it looks like and how it is used.

my daily drivers are python, cmake/Makefiles, c++, and c, with a sprinkling of bash, powershell.

i've worked with microsoft stacks C#/SQL, JavaScript, and i've written a ton of Lua. i've studied concepts and swe fundamentals in languages i don't really write code in and transcribe into code i do intend to write code in. i learned mostly using Lua first, then i picked up c++.

these are just the tools of my job overall. my main skill is communication and learning imo, and knowing which tools are better suited for a task at hand depending on requirements and limitations (mine or technical or both).

djoldman · 13h ago
I think someone who learns computer science well from the theoretical side can pick up a new language quickly. After all, if it's turing complete, it's turing complete, they're all the same at that level.

Problems creep in when the person doesn't learn CS well, chooses an approach that is deeply reliant on overly complex/opaque libraries without good documentation, or the like.

90s_dev · 14h ago
To be fair, if you learn computer science well enough to thoroughly understand Scheme, I don't think it'll take more than a few weeks during the summer to learn Python.
kstrauser · 14h ago
I disagree. You can learn the language itself pretty quickly. Finding your way through the expansive standard library will take longer. Getting a good handle on the package ecosystem is a lifetime learning project.
acuozzo · 14h ago
Knowing your way around the ecosystem of one programming language does not build up the intuition necessary for identifying O(n²) (or worse!) algorithms and choosing/writing O(log(n)) (or better!) ones instead.

Computer Science has little to do with science, but what it teaches you is certainly closer to science than just building a huge mental index for a bunch of work done by other people.

There's certainly value in that skill, but it has no place in a Computer Science curriculum.

This would be like taking Astrophysics students and telling them to study the details of all of the different kinds of telescopes they can buy.

kstrauser · 13h ago
That's not really what we were talking about here. The context was that compsci students want to learn marketable skills, and the claim was that if the student had learned Scheme in class, they could quickly pick up Python. And that's true, for the language itself. But knowing only the language, like never importing code you hadn't written yourself, doesn't go far along the road to marketability.

I'm not arguing that compsci should be job training, not at all. My disagreement is solely with this specific claim.

But FWIW, while I understand your analogy, an astrophysics department that didn't tell the students that there are these things called telescopes, and here's why you might use one over the other for various situations, and that they're how you're going to get the observation data you'll test your theories against, would be doing a disservice.

trothamel · 12h ago
> Knowing your way around the ecosystem of one programming language does not build up the intuition necessary for identifying O(n²) (or worse!) algorithms and choosing/writing O(log(n)) (or better!) ones instead.

I'll disagree with this, at least in terms of Scheme versus Python.

Python is visually close enough to other languages that the skills you develop to quickly see O(n²) algorithms easily transfer to many other languages. Scheme is very different visually, and so the intuition doesn't transfer as well. Sure, it's possible your intuition is wrong, but when scanning a program intuition can help in the first pass.

anthk · 10h ago
Scheme has (trace), at least most interpreters (and his cousing Common Lisp) have some tracing and pretty-printing features. Far more powerful than anything Python could offer.

Oh, and of course it has functions like sdraw or draw-cons-tree when you can print the contents of a list in seconds as an ASCII-ART chart:

https://www.t3x.org/s9fes/draw-tree.scm.html

The file it's in the public domain.

Try that with Python.

trothamel · 10h ago
Python has the pprint module, which takes care of this for you, and for more datatypes than are done here. (I don't see how this would handle a hashmap in a sensible way.)

But I'm not sure how this addresses what I was saying, which is that the intuitions about algorithms you get working on Python are easier to transfer to popular languages like C++, Java, Javascript, Rust, etc..

charcircuit · 12h ago
You can learn about algorithmic complexity in python. Why not just focus on one language to keep things more focused.
kokx · 8h ago
This depth you are never going to get in a college education anyway. Especially not since programming isn't (and shouldn't be) the only thing you learn in a Software Engineering / Computer Science bachelor.
zelphirkalt · 13h ago
Those are things though, that you can easily make up for, for the most part, with good web search skills, or these days, AI prompting skills.
SL61 · 13h ago
One of the big shifts in academia over the past couple decades is that, for any number of reasons, students today are less likely to self-study or tinker outside of classes and internships. The increased prevalence of basic bootcamp-style classes like "Let's Build a Rails App" in CS programs is because departments can no longer assume that students will explore things like that in their spare time.
sokoloff · 12h ago
What good does that do, though? Make it harder to tell the intrinsically motivated students from the “I’m just here to get a job when I graduate”? It seems like it harms the former.

Is that what we need from universities? Is that helping employers? Helping strong or intermediate students?

SoftTalker · 5h ago
It's what universities have become. They are expensive, grandiose trade schools operating out of very distinguished-looking Collegiate Gothic designed buildings.
toolslive · 10h ago
indeed. The problem with being expose do to something so much more clean/elegant/powerful than the languages employers are using is that you no longer want to do it. It's like having tasted good whisky. You no longer think Jack's acceptable.

These days, employers more or less get what they wanted. We're doomed.

zelphirkalt · 13h ago
That's kind of a useless argument. Universities often also don't teach people any web development. In many cases a graduating student has never worked on any real project. If the university's idea is, that the student can learn those things in their free time, then surely asking someone to learn a little bit of Python or another language is not too big an ask either. So which one is it? Learn that stuff at home on your own time, or university should teach it, because it is needed on the job? Then what other things are they not teaching that is used on the job?
billy99k · 11h ago
When I was in college, we had our base software development courses and could choose web development as an elective. Our class taught .NET.
cess11 · 14h ago
I'm not so sure someone who's good with Scheme will be bad with Python or Java.

On the contrary, I suspect that such a person is likely to be better suited to build software in either of the latter two.

I also suspect that Python is not a particularly good first language for someone who aims for a professional career building software.

masklinn · 14h ago
> I'm not so sure someone who's good with Scheme will be bad with Python or Java.

The problem likely has always been the companies / HR rather than the students.

> I also suspect that Python is not a particularly good first language for someone who aims for a professional career building software.

It's not a particularly bad one either, certainly better than Java.

IIRC a secondary benefit is that it allows overlap between some of the basic CS, and the CS/CE courses for non CS track students

icedchai · 11h ago
When I went to university in the 90's, Scheme was used in a couple of early courses. I had already learned C and Java on my own, but greatly enjoyed how Scheme made me think about problems differently. (I didn't learn Python until much later when I was out of school.)

As long as students are exposed to multiple languages, I think starting w/Python is fine. Every language has its issues.

Jtsummers · 14h ago
> I'm not so sure someone who's good with Scheme will be bad with Python or Java.

They won't be. But students don't understand that, they want to learn marketable skills and are 18 years old. They haven't figured out that if your skills transcend language choice you will be more marketable even if it means you have to spend a few weeks learning a new language for a new job. They lack maturity, which isn't surprising given their age and experience, and so they complain.

zer0zzz · 13h ago
I always found scheme to be a clean slate where no one’s high school experience benefited them in the first year.

My program did Java for the second course, which was very popular in industry and I loathed it.

I do think Python is not so bad to standardize on because it’s stood the test of time and is one of the most popular ways to write code for many disciplines and has applications outside of computer science so it helps everyone that takes the cs requirement even if they aren’t a cs major.

What im saying is Python can even serve as a better version of spreadsheets for folks that aren’t cs.

ajkjk · 13h ago
I think it's absurd to start with Scheme. A graduate who knows Python but not Scheme has a hope of doing something with computer science. A graduate who knows Scheme but not Python is basically unable to use computers at a technical level. The only choices here are "Python" or "Scheme + Python".

(Yes, of course, they could teach themselves Python at that point---but if we're talking about things that people can teach themselves, they can teach themselves the whole curriculum and both languages; the debate here is over what the university should hold them accountable to learn).

Jtsummers · 13h ago
> I think it's absurd to start with Scheme. A graduate who knows Python but not Scheme has a hope of doing something with computer science. A graduate who knows Scheme but not Python is basically unable to use computers at a technical level.

What language you start with and what languages you know on graduating are going to be different. It takes 4 years to get through most bachelors programs (without taking summer terms, very high course loads, or coming in with a bunch of transfer credits). It's no more absurd to start with Scheme than to start with Python when there are at least 7 semesters remaining to learn more.

If a graduate only knows what they learned in CS 1, they aren't a CS graduate even if they got that slip of paper. They conned the school, or the school conned them.

Hammershaft · 12h ago
It's easier to explore deeper concepts learning with scheme because the language is such a simple and introspective encapsulation of generalized computer science concepts.
wat10000 · 12h ago
I and about a million other programmers started with BASIC. My second language was Pascal. I don’t imagine I’d be very employable if that’s all I knew, but it turns out that you can learn many programming languages and it’s not all that much effort after the first two or three. There’s no reason to think the language you start with should be one that you could get paid to use.

And no, I wouldn’t recommend starting with BASIC. But starting with Scheme seems like a great choice.

Daishiman · 11h ago
BASIC has a thriving hobby scene and there were compilers available for many platforms even if they weren't for "serious" computers. Scheme by comparison has essentially no community.
darksaints · 14h ago
Colleges becoming more vocational is a consequence of colleges becoming more expensive for students. If you are paying all of that money for college, you better get a good job out of it. I don't see that as a bad thing necessarily, but it would definitely be nice if we had better paths for those who want to end up in research.

I'd argue that SML (or derivative thereof) would make for a better teaching language, for both the lambda calculus aspect and the type theory aspect.

Jtsummers · 14h ago
> I'd argue that SML (or derivative thereof) would make for a better teaching language, for both the lambda calculus aspect and the type theory aspect.

https://news.ycombinator.com/item?id=13098598

A critique along those lines which suggests KRC and Miranda which are in the same vein as SML.

marsten · 10h ago
I attribute the curriculum shift to something slightly different, which is the changing perception of CS as a career.

When I was in college in the late 1980s, CS was not perceived as the moneymaking career it is today. Accordingly the kids who went into CS were typically the nerds and hackers who truly loved the field.

Many kids now perceive CS as a safe, lucrative career option akin to becoming a doctor or lawyer. It attracts many students who are smart but perhaps not as intrinsically excited about the field. The universities adjusted their curricula to what these students care about: Less beautiful theory, and more practical training.

A similar thing happened in statistics. At one time it was hardcore stats nerds. Now "data science" has brought a ton more people into the field and the teaching methods have changed dramatically.

throwaway328 · 13h ago
I suspect you might be observing two correlates and picking one as the cause of the other in a way that is ahistorical.

Specifically, it seems to me that colleges becoming more vocational and colleges becoming more expensive are both natural outcomes of the neoliberalisation of all things. I am aware that some students now rationalise their educational investments with the logic you describe above, but I think it's a post-hoc rationalisation.

You can get a good job without going to college, and you can get a good education without paying a gazillion bucks.

A side point, but calling it "vocational" seems a bit euphemistic too. Learning carpentry is a vocation. Getting a business degree is not equivalent to learning carpentry. I might say colleges have become commercialised, rather.

gowld · 9h ago
College becoming more vocatioanl is a consequence of colleges becoming more accessible to a much larger population, beyond the already wealthy.

Community colleges are the cheapest colleges, yet the most vocational.

The most expensive colleges are the Liberal Arts Colleges and the Ivy League, which are the least vocational.

souldzin · 14h ago
Are functional languages more computer science than imperative languages?
remexre · 14h ago
Formal reasoning about functional programs in terms of their (denotational) semantics is normal in a functional programming class (e.g. it's about a quarter of our mandatory-for-undergrads FP course).

Formal reasoning about imperative programs in terms of their (e.g. axiomatic) semantics is only in a grad-level course, and the programs you can reason about are really, really limited compared to the functional ones. (The last time I TA'd the FP class, one of the homeworks involved proving a simple compiler correct. When I took the grad course, I think the most complicated program we proved correct was selection sort.)

I think "reasoning about programs" is more computer-science than "writing programs," and choosing an imperative language signals that you're not emphasizing the former.

dehrmann · 6h ago
It's one way of modelling the broad notion an algorithm, but it isn't the only one, and it's odd to treat it as the one true expression of computer science when essentially all modern computing follows a different model.
zahlman · 10h ago
> Whereas Python is excellent for teaching applied computer engineering, because it's essentially executable pseudocode for imperative languages

Python offers quite good multi-paradigm support and could absolutely be used to explore many key concepts from SICP (granted, nothing is as meta-programmable as the Lisp family, since AST manipulation in other languages requires additional steps to actually obtain an AST). In particular, since Python's object model includes functions, higher-order functions are possible (and indeed, `map` is a builtin, and `reduce` is in the standard library after previous demotion from builtin status). Nowadays of course it's fashionable to litter the code with manifest type hints, which are a distraction to that sort of pedagogy. However, they are still entirely optional, have zero-to-generally-irrelevant effect at runtime, and can simply be disregarded.

kevin_thibedeau · 13h ago
"Computer engineering" isn't vocational. It's an entire sub-specialty involving hardware theory and application. "Programming" is the vocational shift which was traditionally outside the purview of academic curricula. You're not engineering anything if you don't have a repeatable process that will deliver expected results. Programming alone doesn't meet that bar.
wolpoli · 11h ago
I took Scheme for my second programming course, after C++. I think Scheme is simpler to understand. It also allowed students to explore various concepts that weren't available in C++. I enjoy the course.

But since I never took compiler theories and other courses on programming language, I never bumped into many of those concepts again except for those where modern languages adopted the same feature, and I ended up having to relearn them anyway. Hence, I would also argue that these days, most students would have been better served starting with a practical language.

pk455 · 13h ago
> most common language a computer engineer

Depends on your definition of a computer engineer. Dealing with strings in Python vs. dealing with character arrays in C is a world of a difference.

The decision to use Python feels like a solid compromise between giving the students a stair step to applied computer science work, while stripping away the cruft and language-specifics that would distract from implementing the more theoretical learning material

Kwpolska · 12h ago
Depends on which part of the theory you care about. Lists in Python are a magic structure that can grow and shrink at will. That's a bit too high level to be useful for learning the theory.
aleph_minus_one · 13h ago
> Isn't this just part of the broader trend of CS departments switching away from teaching computer science to teaching computer engineering

Computer engineering is similar as hard as computer science (don't start the discussion which one is harder ;-) ). What CS departments instead switch to is teaching some shallow, applied programming knowledge.

NewsaHackO · 14h ago
Executable pseudocode is an oxymoron.
ted_dunning · 14h ago
And so is Python in many ways. The shoe fits.
gjm11 · 10h ago
An oxymoron is a word or phrase that contradicts itself (the word comes from Greek bits meaning "sharp" and "soft"). It doesn't make any sense at all to say that Python is an oxymoron. Python-the-language isn't the kind of thing that can be an oxymoron; "Python"-the-name obviously isn't one because it doesn't have two parts that could contradict one another.

Does your comment mean anything other than "I don't like Python very much", and if so what?

unethical_ban · 14h ago
"essentially", come now.

The point is that python's syntax reads a lot more plainly and logically for learning than something like Java.

NewsaHackO · 13h ago
I am confused, what is the relevance of the word essentially?
unethical_ban · 13h ago
Do you agree or disagree that Python is more readable/closer to pseudocode than say Java or C++? Less syntactic sugar, no need to define namespaces/classes, more intuitive for declarations, etc.
NewsaHackO · 11h ago
Would you consider essentially dry water to be semantically correct phrase?
unethical_ban · 10h ago
I understood the meaning of their phrase and explained it. You assert that the original phrase is incomprehensible and meaningless. We see things differently.
williamcotton · 11h ago
I think you mean software engineering. Computer engineering is computing hardware, CPUs, etc.
dartharva · 14h ago
> the more general trend of colleges becoming more vocational

Things would be so much better if this were actually true..

wslh · 14h ago
> LISP dialects like Scheme are excellent for teaching pure computer science because they are the closest thing to executing lambda calculus expressions.

Assembler too. For example, Knuth's [M]MIX in The Art of Computer Programming.

That said, this is an introductory programming course, and there are separate courses focused on algorithms (which are not the same as programming). I agree with the article: programming has changed dramatically, while the core of algorithms remains largely unchanged.

raverbashing · 14h ago
Lambda Calculus is one of those things that look good on paper as a theory construct but in practice it's not a great abstraction.

And honestly you could go your whole career without touching it, maybe only for the naming of an anonymous function.

Boolean logic, graphs, FSMs, set theory, mathematical proofs, pretty much all user here or there. Lambda calculus? Unless you're one of those Haskell fans, meh.

Koshkin · 10h ago
varenc · 15h ago
I was one of the last batches of students on the old Scheme curriculum. I absolutely loved it! Understanding that all loops could be done via recursion, and what a side effect is, is what fundamentally made me fall in love with CS. I've heard good things about the new, and now newer, curriculum but I know I wouldn't have had the awakening I did if it weren't for scheme.

RIP SICP

---

ps another fun story: we had some test where we were allowed to bring in 1 page of reference notes. And turns out the entire scheme specification is short enough to fit on a double sided page if condensed. So my friend, mostly in jest, brought the whole Scheme specification to the test with him and figured every possible question could be answered that way!

cactusfrog · 8h ago
I worked an MIT programmer who bragged about the Scheme curriculum. He was also the worst programmer that I’ve worked with. He really liked clojure and would constantly complain about Python syntax, and ended up quitting abruptly when his hand spun Datomic based system was rejected.

I think there is a trap in thinking that a strange way of being taught puts one at an advantage. It is really annoying to work with people who believe they are more enlightened than others.

agordhandas · 5h ago
That kinda defeats the purpose of why scheme was the language of choice in the first place! The goal was for us to fall in love with programming, not a programming language.
chuckadams · 14h ago
> turns out the entire scheme specification is short enough to fit on a double sided page if condensed

I think this only held for R4RS and earlier. You can fit War and Peace on one page if you condense it enough.

TMWNN · 10h ago
>You can fit War and Peace on one page if you condense it enough.

"I took a course in speed reading, learning to read straight down the middle of the page, and I was able to go through War and Peace in 20 minutes. It's about Russia." —Woody Allen

proverbialbunny · 29m ago
>In 1980, good programmers spent a lot of time thinking, and then produced spare code that they thought should work. ... But programming now isn’t so much like that, said Sussman. Nowadays you muck around with incomprehensible or nonexistent man pages for software you don’t know who wrote. You have to do basic science on your libraries to see how they work, trying out different inputs and seeing how the code reacts.

Is that how people read code these days? I've always been weaker at reading code, but great at writing it. Iama Data Scientist, which explains why; I haven't had to read tons of code throughout my career. The topic kind of scares me. His description scares me even more.

jillesvangurp · 32m ago
A good computer science program should expose students to lots of different languages and teach them that they are all different for valid reasons. There are many different paradigms and there is a rich history of languages at this point.

The issue with Scheme is that it has very little relevance outside of academia. It's fine for making students learn that as an exercise to teach them that there are different ways of doing things and some of those ways can be wonderful. But you need to learn more than just that to become a proper computer scientist or software engineer.

Python is a useful language to know just because of how useful it is. But it's not a great language to teach functional or object oriented programming. I would actually use different languages for teaching those concepts. Back when I studied, those languages where Gofer and Smalltalk. Gofer is a Haskell dialect/predecessor. Haskell already existed but wasn't that common yet. Scheme was already old news in the early nineties.

I actually learned Java during the summer of 1995 as a second year student as a preparation to teach it to first year students. My university was progressive like that. I learned C in my first year. They switched to C++ the next year. By the fourth year I had been exposed to Prolog, Java, Delphi, C, C++, Gofer, Smalltalk, Modula, Pascal, Lisp (in various variants) and probably a few other things that I've since forgotten.

One of the wonderful courses we got taught us all about the UNIX command line (mostly HP UNIX at the time, and a little bit of Solaris). Things like pipes & filters, regexes, AWK, etc. Different courses would expose you to different tools and languages. I followed a few courses on expert systems and bayesian belief networks. That just required you to deal with the lisp dialects used for that. The people giving these courses were proper researchers too. And they just used what they would use themselves.

I did not fully appreciate it at the time, but Utrecht university had a wonderful computer science faculty with some amazing people. I learned functional programming from a young enthusiastic Erik Meijer who later joined Microsoft, Facebook etc. and built things like F#, LINQ and a few other things.

ted_dunning · 14h ago
The last sentence was the key:

    And why Python, then? Well, said Sussman, it probably just had a library already implemented for the robotics interface, that was all.
That is the essence of Python's strength ... the eco-system. And the comment about engineering becoming the art of trying to reason about half-documented toys from the huge grab bag of packages is exactly on point relative to the risk and challenge of this transition.
KenSF · 14h ago
The move away from Scheme has always saddened me. The first thing we learned in 6.001 was abstraction and invariance. These are still the core of writing good software. I still use these principles every day. There is a purity to Scheme. It is a beautiful light-weight language anyone can learn over a weekend. It does nothing magical for you which means you get to / have to build everything you want and you must understand how it fits together.
eggdaft · 12h ago
I agree. I was taught Scheme and I later taught it. It was a much cleaner and suitable language for teaching computer science than Python. Students could completely understand the language and how it worked by the end of a semester.

Scheme is much closer to mathematics, which made it much more suitable for teaching strong mathematicians arriving without coding experience. It also made the hackers more rigorous and broadened their minds from the imperative "do this then that" mindset.

There's a notable difference between those first taught scheme and those first taught Python. Of course, both can go on to learning Python or FP or whatever. But that foundation needs to be there to teach truly great coding for most mortals.

mrexroad · 15h ago
Ga Tech used to teach Scheme as an intro to CS course. I vividly remember sitting in lecture and being struck w/ the implications of functional programming as the professor said you could pass functions into functions and modify them. It was as formative of a moment as my 2nd Grade teacher showing us a really complex looking (at the time) rainbow flower in LOGO (she had one of few color Mac classic), and showing us it was simply the work of drawing the path of one petal, then repeating same “work” after changing two values (starting angle and color).
cs_throwaway · 12h ago
It is possible that this doesn't work anymore.

I distinctly recall the following episode when I last taught intro CS in Scheme: I revealed first-class functions. After lecture, the brightest kid in class came up to me and said something to the effect of, "What's the big deal? You can do this in Python."

zahlman · 10h ago
That should be the beginning of the formative experience for that kid rather than the end. Yes, you can. How often do you? What are you missing by not thinking about problems in that way more often? What idioms could be unlocked that way? (How many Python programmers out there are aping wholly unnecessary "design patterns" created for C++ or Java? Or rather: shouldn't a design pattern be about the design rather than the implementation? What is a design, in the pure abstract, really?)
cs_throwaway · 6h ago
Don’t worry, aforementioned kid is doing just fine, machine learning PhD IIRC. There is a lot of other remarkable stuff in modern computing.
ylee · 11h ago
>It was as formative of a moment as my 2nd Grade teacher showing us a really complex looking (at the time) rainbow flower in LOGO (she had one of few color Mac classic), and showing us it was simply the work of drawing the path of one petal, then repeating same “work” after changing two values (starting angle and color).

I also well remember the epiphany I felt while learning Logo in elementary school, at the moment I understood what recursion is. I don't think the fact that the language I have mostly written code in in recent years is Emacs Lisp is unrelated to the above moment.

temporallobe · 14h ago
This is just an introductory language and if you’re in a CS program, you’ll definitely move on to more advanced ones. It actually makes sense to switch to Python since it’s far more ubiquitous and accessible than Scheme. Scheme is not widely used in commercial software development, but still enjoys a presence in academia. Python has strong presence in both.

On the other hand, Pascal was my “introductory” programming language (I already knew BASIC pretty well at that point), but it certainly wasn’t the only one in my program - we did Perl, Prologue, C, C++, etc.

In a professional software development career, it certainly won’t be the last language you’ll learn.

materielle · 13h ago
But this is the problem. Our premier academic institutions shouldn’t merely exist as job training programs for big tech.

If anything, tech is still one of the better off fields in the university.

Look at history or literature programs for where this is heading. I’d imagine that most literature majors don’t even read at all these days. As recent as 50 years ago, the requirement involved hundreds of pages of reading per week, over a sustained 4 year period.

Honestly, just close down the university at this point, if all it wants to do is print out degree certificates for social signaling in the job market.

Jtsummers · 13h ago
oldpersonintx2, your account is shadowbanned.

Which colleges did you send your kids to, what kind of degrees (just bachelors? undergrad and grad?), and how many kids?

The $800k figure without that context tells us nothing. If that's for 2 kids to get a BA/BS/BE, you got ripped off. If it's for 4 or 5 kids it makes much more sense when examining current costs.

oldpersonintx2 · 13h ago
> But this is the problem. Our premier academic institutions shouldn’t merely exist as job training programs for big tech.

meanwhile, in the real world...I just finished putting all my kids through college

I spent $800k. EIGHT HUNDRED GRAND.

I'm laughing at your naive take

if schools want THAT MUCH money, they must provide something actionable in the real world

if you want to pretend university is like some ancient greek academy, enjoy paying for the toga

lokar · 13h ago
This is one of many divides in the field that makes many general discussions hard.

There are many people who think of themselves as a “X programmer” (and perhaps Y and Z), and managers/companies looking for them.

Then there are people who think of themselves as software engineers, and the language does not really matter (and companies that hire for that).

If often see the two camps talking past each other.

temporallobe · 8h ago
I certainly consider myself a software engineer first and programmer second, and you’re right, the language doesn’t matter. I recently got a position developing in Python having never really used it professionally, but it’s so similar to other interpreted languages I knew so I was able to jump right in and start making meaningful contributions. Often we are expected to learn new languages, which is exactly how I picked up the 10ish languages I can confidently say I’m good in, despite never having been formally trained in those. Most common languages don’t stray from certain basic principles anyway.
jedberg · 13h ago
I learned so much about computer science by doing my intro course in Scheme. Concepts that have helped me throughout my career. Concepts that I feel just cannot be expressed or understood nearly as well with Python (and I love Python, almost all my professional and personal coding is in Python).
dang · 14h ago
Related. Others?

Ask HN: How has MIT's switch from Scheme to Python worked out? - https://news.ycombinator.com/item?id=24960481 - Nov 2020 (1 comment)

Why MIT uses Python instead of Scheme for its undergraduate CS program (2009) - https://news.ycombinator.com/item?id=18782101 - Dec 2018 (136 comments)

Why MIT Switched from Scheme to Python (2009) - https://news.ycombinator.com/item?id=14167453 - April 2017 (97 comments)

Ask HN: Python or Scheme? - https://news.ycombinator.com/item?id=2523432 - May 2011 (11 comments)

Videos for MIT 6.00 - Python Version - https://news.ycombinator.com/item?id=1045114 - Jan 2010 (1 comment)

Why MIT now uses python instead of scheme for its undergraduate CS program - https://news.ycombinator.com/item?id=842333 - Sept 2009 (38 comments)

Python based MIT 6.00 | Intro to Computer Science and Programming - https://news.ycombinator.com/item?id=819734 - Sept 2009 (6 comments)

Chiming in on the MIT Scheme to Python Switch - https://news.ycombinator.com/item?id=622261 - May 2009 (7 comments)

Why Did M.I.T. Switch from Scheme to Python? - https://news.ycombinator.com/item?id=602307 - May 2009 (65 comments)

Why MIT switched from Scheme to Python - https://news.ycombinator.com/item?id=530605 - March 2009 (128 comments)

MIT replacing Scheme with Python for Intro CS class - https://news.ycombinator.com/item?id=75401 - Nov 2007 (16 comments)

---

Berkeley version:

Scheme vs. Python (2011) - https://news.ycombinator.com/item?id=9973156 - July 2015 (118 comments)

SICP (Python Version) - https://news.ycombinator.com/item?id=3718364 - March 2012 (18 comments)

SICP taught in Python 3 - UC Berkeley online - https://news.ycombinator.com/item?id=3491142 - Jan 2012 (25 comments)

SICP in Python - https://news.ycombinator.com/item?id=3141996 - Oct 2011 (49 comments)

CalChris · 12h ago
Berkeley seems to want to slice the baby in half. cs61a teaches in Python but then retains the implementation of a Scheme interpreter. They don't use SICP anymore. They use John DeNero's online text, Composing Programs.

https://cs61a.org/

https://www.composingprograms.com

BTW, my complaint about Scheme in 61a was that after the class, the department never used it again. They didn't even have the decency to use Guile or some standard Scheme. Instructional Computing had some hacked up something Scheme.

omnicognate · 13h ago
> Nowadays you muck around with incomprehensible or nonexistent man pages for software you don’t know who wrote. You have to do basic science on your libraries to see how they work, trying out different inputs and seeing how the code reacts.

Probably the best way, and maybe the only way, to learn this is by doing it. That's how I learned it, with no formal training in programming.

What I learned from SICP and Sussman's other books I would never have figured out any other way. I don't think the world is really as different as Sussman says it is here, and I think the programming world lost something special with this change.

The book lives on anyway, and he'll always be one of my heroes.

zahlman · 10h ago
Absolutely agreed. This situation reminds me of discourse on learning natural languages, where people are constantly told that there is no substitute for time spent deliberately on immersion. But you won't accurately figure out grammatical structures that way; you'll get distracted by the parts you understand and fail to assemble them into a whole.

University (and earlier!) courses ought to focus on the kinds of things that actually require direction to learn.

bastawhiz · 7h ago
One of the less obvious benefits of teaching a mainstream language (or a "hobby" language—the kind you might pick up on the weekend for some hacking) is all the folks who don't go on to graduate with a CS degree. Will Scheme teach interesting ideas? Of course. Will someone who doesn't code for a living download a scheme compiler and write a script five years after graduating? Not a chance. Ten years? There's no universe.

Front-loading the mainstream language means you're not just teaching CS fundamentals, you're giving someone a tool that they can readily pick up and use in their real life for real tasks. It's the same as having home maintenance as a component of your basic high school shop class instead of how to rebuild a carburetor: unless you're working with carburetors for a living, that's an unlikely skill that you'd reach for. But knowing how to correctly hang a picture, replace an electrical outlet, or patch drywall is something almost anyone can put to good use ten, twenty, thirty years on.

em-bee · 6h ago
Front-loading the mainstream language means you're not just teaching CS fundamentals, you're giving someone a tool that they can readily pick up and use in their real life for real tasks. It's the same as having home maintenance as a component of your basic high school shop class

basic programming should be taught in high school too.

jhancock · 3h ago
Good writeup...it's two answers in one ;)

I've come full circle from the first answer given. I wanted to get into neural nets a couple years ago. I chose Clojure because I knew I would be interfacing with components I didn't understand and wanted a system that helped me explore.

cs_throwaway · 5h ago
A lot of this boils down to what you can convince the prof to teach. For most professors, teaching CS1 is a service and does not advance their research. Fewer faculty today are willing to learn Scheme just because it may be marginally better for students, according to some people.
AlanYx · 14h ago
There's probably a middle ground somewhere. IMHO, SICP leans a little too heavily on the homoiconicity of Scheme for its choice of exercises. Which is intellectually nifty but it could also include exercises from something like Crafting Interpreters (Nystrom) where you would build up step-by-step to an interpreter of a non-Scheme-like language, using Scheme.
shawn_w · 12h ago
Eh, being able to skip parsing allows a fairly short book to spend more time on its real focus than it otherwise would.
subtextminer · 11h ago
Related: when UT Austin computer science dropped Haskell for Java for it's first course in 2001.

Dijkstra on Haskell and Java https://chrisdone.com/posts/dijkstra-haskell-java/ "A fundamental reason for the preference is that functional programs are much more readily appreciated as mathematical objects than imperative ones, so that you can teach what rigorous reasoning about programs amounts to."

bytefish · 2h ago
I know, that I am just a single data point, but Scheme took the fun out of programming in my computer science studies. Of course I do understand, that it makes teaching lambda calculus obviously a lot easier and is a better vehicle for teaching theoretical computer science concepts, than say, Python.

But at the same time Scheme is limited to academia and has near zero practitioners outside academia. So the Scheme ecosystem is tiny compared to Python or Java.

Yes, you could argue, that "Computer Science" is not mere "Software Development" and academia shouldn't bow down to industry and shouldn't be a tool to provide "programmers". But again it's also important for motivation to apply the language, algorithms and concepts in other fields. Learning also has to do a lot with motivation and experimentation.

And this is a "hot take", but I always had the feeling back then, that courses are often bound to the professors curriculum and sometimes their books, so I am not surprised about resistance to changing the language.

That said, I was glad, when the Scheme lectures were over. Now I am a Software developer for more than a decade and have to admit, that learning Scheme didn't make me a better programmer at all. If I'd stayed in academia I might have a different opinion.

djtriptych · 15h ago
build a scheme interpreter in python = best of both worlds??

I love SICP - easily in my top ten most influential CS books. But I've basically never seen a real Scheme job. I do think it's reasonable to at least try to instill both foundational and marketable skills early.

ferguess_k · 15h ago
Considering the target students of MIT CS department, I'd argue that they could simple start from an interpreter class in Python.
programjames · 7h ago
As in, write a Scheme interpreter in Python?
warbaker · 10h ago
16 years later, I'm still disappointed about this decision. The justification for it is just awful: "6.001 had been conceived to teach engineers how to take small parts that they understood entirely and use simple techniques to compose them into larger things that do what you want. But programming now isn’t so much like that, said Sussman. Nowadays you muck around with incomprehensible or nonexistent man pages for software you don’t know who wrote."

This is just false. Engineering is still about taking small parts you understand entirely and using simple techniques to compose them into larger things you want. Sussman's justification is an abject surrender to shitty complexity. Engineers need to develop a taste for simplicity and elegance, especially at the beginning of their education.

Incidentally, an overlooked advantage of teaching in Scheme is that it levels the playing field, as pre-undergrad programming classes almost never use functional languages.

pledess · 10h ago
His top students were capable of entirely understanding Scheme within a day or so (but not capable of entirely understanding all of Python and all of PyPI). He wanted students to be even better than that. He wanted them to lead productive and resilient collaborations even when they didn't or couldn't entirely understand the small parts.
zahlman · 10h ago
Given a day, top students can understand enough of Python to write enough code to get the point about how programs rely on abstraction and composition.

(Of course, the latter part of the course, describing the implementation of the runtime, would need considerable rethinking.)

zahlman · 10h ago
> Engineering is still about taking small parts you understand entirely and using simple techniques to compose them into larger things you want.

Engineering fundamentally is still about that. But what people seem to do with computers nowadays mainly involves composing already-large parts that they absolutely do not understand. Often with disastrous results.

ayhanfuat · 14h ago
I think it was also one of the first freely available courses for learning Python. It’s been more than 10 years since I took that course on edX and I still appreciate it. Robot vacuum exercises were a lot of fun.
dvrp · 13h ago
Because Worse Is Better!
davideg · 12h ago
Brown CS (back in 2004) gave you a choice: you could either take a 2-class intro sequence that started with Scheme and eventually OCaml before moving into OOP with Java, or you could start with Java from the get-go and make cool/flashy projects like Tetris by the end. Both course sequences were supposed to bring you to roughly the same place by the end.

I took the Scheme path and feel great about having a deep theoretical foundation in CS, but I know plenty of folks who started with the fun/shiny stuff and became amazing software engineers. So all in all I'm really glad they gave us a choice.

I will admit that there were people in my classes who didn't really understand what they were getting themselves into and possibly would have benefited from starting with Python or Java and getting more inspired about building cool projects. It really was a YMMV ¯\_(ツ)_/¯

unixhero · 10h ago
I hated learning Scheme on their free open courseware. Yet I loved that it was free :)
jbanes · 14h ago
Did anyone notice this announcement was from 16 years ago? I very much doubt this is the current state of the MIT coursework.
ltbarcly3 · 15h ago
When I read this I just feel like Sussman is getting out of touch and maybe a little disillusioned. From the wording he seems annoyed about the change, isn't even sure why it was made "probably because there's some library for robots", has gone from someone who would have a complete understanding of complex systems to someone who sounds more like a frustrated beginner. "Doing basic science on libraries to see how they behave" instead of grabbing the source and looking at it - he is expressing the view of someone who wants to complete their ticket in Jira without too much effort and go home for the night rather than someone with an actual curiosity and enjoyment of what they are doing.
mhh__ · 15h ago
Decline.
anthk · 15h ago
Scheme it's far easier to grasp. With SICP you basically rewrite a Scheme within a Scheme. And you teach Calculus to the interpreter to solve further problems.

Online SICP: http://sarabander.github.io/sicp/

terminalbraid · 14h ago
anthk · 11h ago
Yep, and there's a Texinfo version too. With Chicken, 'sudo chicken-install srfi-203 ; sudo chicken-install srfi-216; Emacs, Geiser and this ~/.csirc, you can run SICP exercises on really constrained environments.

~/.csirc

   (import scheme)
   (import (srfi 203))
   (import (srfi 216))
Texinfo version:

https://zv.github.io/sicp-in-texinfo

Run Emacs. Press

   Ctrl-u Ctrl-h i 
and choose the sicp.info.gz file.

Then, run:

Alt-x

package-refresh-contents

Alt-x

package-install

geiser-chicken

wait.

Run Alt-x geiser, and if it ask you which Scheme interpreter to run, choose 'chicken'.

Later,

press Ctrl-x f

to choose a file, create a new one called "hello.scm".

Write in that file:

(display "Hello world").

Run Ctrl-c Ctrl-c

and then the Scheme code in that file will be evaluated. To choose the running Chicken interpreter, press

Ctrl-x b

and choose the Geiser buffer.

Run Ctrl-h t for the Emacs tutorial, it will be handy.

If you want the same tutorial in Spanish, Japanese, French...

press

Ctrl-u Ctrl-h t

and just input your language, press [TAB] to autocomplete.

Happy Hacking.

glimshe · 15h ago
To do that with Scheme/SICP, you actually have to understand the CS principles behind it. Not as much with Python, which is likely why it became a more popular choice.
anthk · 15h ago
The point of Scheme SICP is that it will teach you these CS principles.
postepowanieadm · 15h ago
Shouldn't that be the point?
zdragnar · 14h ago
I remember when universities wouldn't teach languages higher level than C/++ because "the languages changed too quickly and the 4 year degree would be obsolete by the time the students graduate". Instead, they focused purely on the low level engineering aspects of the software meeting the hardware, with only advanced classes focusing on things like AI research (pre-LLM days) or modelling fluid dynamics on specialized hardware.

Of course, this is also why most companies worth working at didn't care if you had a CS college degree or not to build a wordpress website or a SOAP/REST API. Aside from some very basic lessons learned from experience (generally understanding computational complexity and maths) most software jobs didn't need any knowledge of assembly at all, or how to write an interpreter or a garbage collector.

JackFr · 14h ago
I spent years knowing nothing but C and I’d say it handicapped me in many ways. (I recall insisting that it would be impossible to do anything without assignment.)

After getting my eyes opened a little bit, I read SICP and it was mind blowing. I read a little Haskell, wrote a little Clojure and a lot of Scala. And even though the day job now is Java and Python, I’m much better off for having bothered to learn it.

glimshe · 11h ago
That's what I'm trying to say. SICP teaches you to think differently and "grok" the CS concepts. This isn't always the case with other approaches, which can be much more reliant on blind copy-and-paste and library functionality.
morkalork · 15h ago
I fondly remember doing a course in my CS degree that was basically working through SICP as a class, taught my an ancient but very fun and enthusiastic tenured professor. When he retired I think the curriculum was updated to JavaScript (??) or as the new professor called it "scheme in drag". I'm glad to have taken the original course..
jerrycruncher · 12h ago
Honestly, the new professor wasn't too far off. I've often referred to "The Little Schemer" as "the best javascript book that isn't about javascript."