Hacker News new | ask | show | jobs
by mjdiloreto 547 days ago
I was a student at Northeastern (where Matthias Felleisen was a professor) from 2016-2020, so I have first-hand experience with exactly this system of teaching.

The combination of the "program design" process and the simplicity of the teaching language (student Racket) made the introductory courses at Northeastern excellent. I found that students who already had lots of programming experience hated the initial courses, but those of us with limited experience really excelled. For me, it really validates that Dijkstra quote about Basic programmers being psychologically injured.

The second introductory course used Java, but it mostly covered all the same topics as the first Racket-based course, just using Java constructs. It was a much more gentle introduction to the extra complexity of "real" programming languages, but the program design process was identical.

As I understand it, Northeastern is unique in its CS pedagogy, and there's only 1 other school I know of (WPI) that uses Racket as its teaching language. I will always be grateful for my time there.

8 comments

A sad development is that the current administration is attempting to strangle the curriculum Felleisen et al. have developed over the last 2+ decades in favor of returning to the "old way" of teaching he criticizes in this essay. Their motivation is in large part—though not exclusively; ideological elements also enter into the picture—a consequence of Northeastern recently snapping up various bankrupt colleges worldwide and wanting to homogenize the curriculum across these new satellite campuses. Sadly, this means homogenizing down. Apparently, training faculty in this curriculum is too much for them.
This is so sad. I got an incredible CS education at Northeastern. I’m very successful in my career, and for someone who didn’t know how to program before college, I found that the CS curriculum pioneered by Felleisen prepared me far better than graduates of other colleges. The curriculum was tough and I spent many nights banging my head against homework assignments. But, everything eventually “clicked” and I graduated feeling confident, empowered, and humbled.

Not a single CS major in my graduating class got a 4.0, and I refer to this with honor and respect. The curriculum taught us how to think, how to problem-solve, and how to design programs. It felt like the curriculum was created to foster _understanding_, not to crank out high GPAs.

I’m so disappointed that the Northeastern admin is trying to force such an excellent CS program into something more “accessible” a-la a boot camp. That’s not a knock against boot camps, which should be a low-cost way for people to get their foot in the door for this amazing profession! But, for a 4-5 year university costing $60k per year, I would expect to be challenged, learn theory, become versed in things I’ll never use on the job, and come out a well-rounded SE.

Felleisen may be a bit cantankerous, but he sure as hell knows how to approach CS education, and I can’t thank him enough for the opportunity I had to learn via his approach.

I've been advocating the use of a LISP in the feedback committee of a local CS school I'm in... Some start the course with quite strong JS/Java/C#/Python skills, and some have zero exposure to programming.

A LISP would in most cases:

* level the playing field for all pupils

* focus on learning the concepts over learning the language (I argue LISPs are almost syntax-free)

* while not delving into type systems just yet!

The level playing field is interesting.

My initial thought is that's a great idea. But then I start to think about how college classes are supposed to build on what you already know. Your math department doesn't begin with addition, the English department doesn't start with picture books.

Perhaps the real issue is forcing everyone with experience to start over at the beginning.

> Your math department doesn't begin with addition

Adition is a mandatory topic in school, so you can assume students know it when they get to the university.

Anyway one of my coworkers in the first year of the university asked 1/16 + 1/16 and after some tries from the students the best answer was 1/32.

> The level playing field is interesting.

I've been an assistant to a professor teaching introductory programming at a university. And we chose ML (later Haskell), as the first programming language, exactly because of this reason. Weaker students with no programming experience can build their knowledge on top of their mathematical knowledge from school. Whereas stronger students, with lots of programming experience, were challenged to reconsider their assumptions. Both groups did learn significantly.

> Your math department doesn't begin with addition

Well, ... actually, ... "Mathematik für Informatiker I" (mathematics for computer scientist I) did start with groups, then abelian groups, i.e. addition.

While I'd say Haskell is great (in general). I do have some reservations with using it as a intro lang, because the type system is almost a language of it's own. So you have two learn two things at the same time.

In LISPs you program the AST directly. No serious type system (usually). They are very "small" languages.

If you wanted native English speakers and second-language English speakers to be on a level playing field in a literature class, maybe you could teach the class using entirely Esperanto or Lojban translations of the works you are studying.
The language one speaks has nothing to do with literature class*, as the point is to teach reading comprehension, critical thinking, writing, and whatnot. The exposure of great works before college helps build a firm foundation on which to read and dissect more complex works.

* Obviously the works need to be readable in a language one knows. But it's not like the essence of literature classes change whether one speaks English or German or whatever. That's not the point.

It is easier to pass a literature class when you can already read the language the literature is in.
I attended the University of Delaware around the same time, where the CS honors program also started with Racket.

As someone self-taught with experience in imperative languages like Obj-C, Java, and Haxe, most intro courses would have been redundant.

Racket’s functional approach, however, required a significant mindset shift. It deepened my understanding of core programming principles and fundamentally changed how I approach problem-solving.

UConn had a Racket programming course for maybe a decade up until last year. Enough people complained that it was too hard and a weed-out course and the administration dropped it. Yet another blunder by the CSE department.
There shouldn't be a lot of people that knows the Basic Dijkstra was talking about in an undergrad course in 2016.
> There shouldn't be a lot of people that knows the Basic Dijkstra was talking about in an undergrad course in 2016.

please clarify.

few know basic in 2016?

few know Dijkstra said it in 2016?

in 2016 few knew that Dijkstra made the claim at some earlier point in time?

I don't understand what you want to say.

"In 2016, there should not be many undergraduates that are familiar with the version of Basic that Dijkstra was referring to when he made this quote in 1975"

see https://www.cs.utexas.edu/~EWD/transcriptions/EWD04xx/EWD498... for the original quote

thank you!
Dijkstra was talking about Dartmouth Basic in 1975:

  - Variables: Single letter, optional digit.
  - Control flow: FOR loops, GOTO for others.
  - Subroutines: GOSUB line, RETURN.
  - Parameters: Passed via global variables.
  - Functions: 26 (FNA–FNZ), one line each.
  - IF statements: One line only.
In terms of control flow, that's basically assembly, just with a friendlier syntax.
It's much worse than assembly. On all but the shittiest machines, you can store code pointers in RAM and registers, and in a subroutine call, the return address is stored somewhere you can read and change it (whether on a stack, in a register, or before the first instruction of the called subroutine). This allows you to implement object-oriented programming, switch/case, backtracking, and multithreading in assembly. You can't do that in BASIC.

Also, since the early 01960s, all but the most primitive assemblers have macros and named labels. One result is that they have an unlimited number of named functions with line number independence, as marcosdumay said. Many of them have a sufficiently powerful macro system to implement nested control structures like while loops and multiline if. Since the 01970s they've also had local labels. BASIC doesn't have any of that.

Modern assembly you give you named functions, line number independence, unlimited functions, places for carrying a value over RET... Basic had none of those.
> For me, it really validates that Dijkstra quote about Basic programmers being psychologically injured.

> I was a student at Northeastern (where Matthias Felleisen was a professor) from 2016-2020, so I have first-hand experience with exactly this system of teaching.

This maybe so, however you likely don't have first-hand experience with early, unstructured versions of basic to which Dijkstra was referring to in his quote. These early versions lacked control structures such as loops or even if-then-else functions. Later versions of basic evolved to support modularity, OOP, local variables and everything else. Dijkstra tended towards hyperbole and exaggeration IMHO.

> Dijkstra tended towards hyperbole and exaggeration IMHO.

No.

Dijkstra being Dutch was famously blunt, vigorously contrarian, uncompromising perfectionist and extremely honest.

A summary of his life and works; The Man Who Carried Computer Science on His Shoulders - https://inference-review.com/article/the-man-who-carried-com...

"... blunt, vigorously contrarian, uncompromising perfectionist and extremely honest."

Or what HR would call as "not a team player".

Ha, Ha! Teamwork is vastly overrated in the Industry. Almost everything achieved by mankind is because one man put together a lot of knowledge in his own head and came up with insights. Even when they worked in Teams each man was an individual and did his own thinking.

Today "Teamwork" has come to mean playing politics, jockeying for influence, taking credit for other people's ideas and so on.

When was the last time anybody cared what HR had to say? I've never encountered an HR department whose primary role wasn't to indoctrinate or to create roadblocks for everybody else.
Hyperbole: exaggerated statements or claims not meant to be taken literally.

Do you really think these statements were meant to be taken literally?

"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."

Or this?

"the use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offense,"

I think that saying that Dijkstra was capable of making hyperbolic statements is rather kind in this case ;-)

All languages have Hyperbole to enable one to cut through noise and convey insight via forceful phrases. That is its proper use; only when it is used for mere egoistic reasons is it frowned upon.

Dijkstra was instrumental in inventing Structured Programming when Programming was literally anything goes spaghetti. This was the main reason his famous GOTO paper was such a hit. Given this background you can understand his comment about BASIC. This comment https://news.ycombinator.com/item?id=42461921 explains how bad Dartmouth BASIC was. Looked at in this light you can see how a person trying to establish structured programming might feel about that flavour of BASIC and his quote nicely captures that.

Dijkstra was also all about mathematical notation, precision and rigour. In fact the article i had linked to mentions that he was unhappy with all languages and hence taught his class at UT Austin using a language of his own design and notation. Now realize that COBOL at that time had all the unstructured faults of BASIC listed above plus an even worse handicap in that it was using Structured English rather than mathematical notation! To somebody who was all about mathematics this would be sheer torture and thus his quote.

Quote from previously linked article;

Dijkstra argued that computer programming should be taught in a radically different way. His proposal was to teach some of the elements of mathematical logic, select a small but powerful programming language, and then concentrate on the task of constructing provably correct computer programs. In his view, programs should be considered the same way as formulas, while programming should be taught as a branch of mathematics.

One should always think when reading an acknowledged great's quotes/phrases. This is not to say that they can never be wrong but this probability is generally quite low.

So he used hyperbole at least twice. Does that mean he tended to it?
In a rare moment of self-awareness I realise that I'm arguing on the internet.

The only point I can make is that I'm tending towards idiocy ;-)

Let us just agree with the facts: (a) I first learned to program in BASIC at 10 years old, (b) I am indeed psychologically damaged by the stigma promoted by Djikstra and (c) it's true that I struggled with pointers in C in first year university. So hey, he was probably right - both Djikstra and the OP. Honest enough for ya? ;-)

p.s. I lost two internet points trying to be Captain Defend-the-old-BASIC-programmers. Lessons learned.

> As I understand it, Northeastern is unique in its CS pedagogy, and there's only 1 other school I know of (WPI) that uses Racket as its teaching language.

Not Racket, but Indiana University uses Scheme. Dan Friedman is a professor there and teaches a great 300-level programming languages class (in Scheme ofc)

In-state tuition to that school (and Purdue for that matter) is one of the few reasons I'd advocate for living in Indiana after growing up there haha.

At University of Waterloo we used scheme