I’d also like to reference one of Felleisen’s earlier posts, Developing Developers, which also rationalizes what a pedagogical computer science curriculum should look like.
Why does Northeastern use the Racket Student Languages in the intro course as opposed to Python? If the fundamentals are language-independent, then surely there’s no problem using Python? Felleisen addresses this by referencing the trinity. Beginners will have the best experience in an introductory course when:
The course has an emphasis on systematic design – an intentional method of analyzing and dissecting problems that builds on what they know.
A well-scoped language that is simple – readable error messages, low cognitive overhead, and accommodating of student’s growth.
A pedagogic IDE – tooling built specifically for beginners, including a simpler debugger and interactive environment.
A transition to Python likely doesn’t fully satisfy the trinity, since it’s a complex, full-fledged programming language with several quirks and footguns for beginners. Likewise, Racket itself doesn’t pose a suitable alternative, since it’s also a complex, full-fledged programming language: that’s why students start with the Racket student languages instead! With the Racket student languages, they learn the entirety of that language before introducing new features and greater complexity. In particular, new features are integrated into the design recipe, a vehicle for teaching systematic design. Rather than teaching language features independently, problems are posed and these features are introduced as solutions and described from the context of the design recipe. You’d probably want to skim HtDP to see how they do this well.
A language that could be an adequate substitution is Pyret, and it might be used in the new curriculum. One of the Pyret developers/researchers is @shriram, who had Felleisen as an advisor. The DCIC book, however, makes different decisions on the order in which to introduce ideas.
On another note, the curriculum change likely isn’t because of dissatisfaction with the current curriculum. Rather, it’s political. I have a brief set of notes that describes this problem:
Part of Northeastern’s business is real-estate and acquiring satellite campuses.
Northeastern is legally required to send students to those satellite campuses.
The satellite campuses retain their existing professors.
The satellite campus professors are unwilling to learn the Fundies curriculum.
Since the satellite campus professors are unwilling to learn the Fundies curriculum, they don’t teach it to the students who attend the satellite campuses.
So, students who come from satellite campuses have a different experience – we believe this experience to be of lesser value.
We don’t want students to be advantaged/disadvantaged based on the campus they attend during their first year.
So, we either
find a way to teach the Fundies curriculum in the satellite campuses – but this has been attempted before unsuccessfully and is unlikely to work
change the Fundies curriculum to something the satellite campus professors do want to teach
The Khoury administration has decided to go with the latter.
Second part: co-op.
OOD (third course in the sequence, “fundies 3”) is a requirement to go on co-op
Many students fail/withdraw from OOD
Consequently, many students can’t go on co-op and even drop out of CS
Khoury admin believes that is a problem – students are customers
Co-op placements are also low – students aren’t appealing enough to employers
Khoury admin believes that learning “modern”, industry-relevant skills would make students more employable
Thus, Khoury admin believes they should teach those skills
Another implicit consequence is that downstream courses outside of the core curriculum will have to change. A classic programming languages course, taught by Eli Barzilay, will inevitably stop being taught the way it is. That course uses a new language based on Typed Racket for each homework, including one that emulates the lambda calculus! Barzilay has expressed that he will likely stop teaching the course if the curriculum changes, since it would be too time-consuming to teach basic Typed Racket to be productive enough for the rest of the course. Another course at Northeastern, Logic & Computation, also built a teaching language using Racket to teach the fundamentals of formal methods. There’s exciting courses such as Hack Your Own Language that teach how to build DSLs from Racket. It’s a shame some of these will have to change or cease being taught.
I’m fairly involved in the Racket community. I have no qualms about transitioning away from the HtDP curriculum or from the Racket student languages. My concern is that the new curriculum does not adequately substitute for the old one, and instead will breed a new generation of AI-reliant code monkeys – to put it one way. The political pressure to switch curriculums is worrying, but I’m hoping some of the involved professors help steer the new proposed changes in the right direction.
First, I guess we shouldn’t hold our breath waiting for HtDP 3e.
Second, it might be my bias speaking – as a Schemer, I’m more aware of Northeastern’s work because they use and contribute back to my language of choice – but Northeastern seems to me to be one of the top centres for in programming language education and research in the world, and this seems like a total betrayal of that. Its existing curriculum, as Felleisen explains, was already a very well-thought-out balance of preparation for theory and preparation for practical work, widely applauded. That curriculum has produced truly excellent students in the past: just picking something at random of stuff from their department which I’ve seen and personally found useful recently, this paper comes to mind, whose lead author was still an undergrad at the time of its publication – it’s notable as a significant and useful contribution in the otherwise still fairly under-researched area of applications of mutation testing to functional programming languages. If I’m ever recruiting programmers again, it’s likely I’ll consider an undergrad CS degree from Northeastern will be much less of a positive, compared to other universities, after these changes – though let’s wait and see.
Third, the events of the 2000s do also come to mind: not only MIT’s switch from SICP to Python which @minimax noted, but handwringing about JavaSchools (major universities switching from ‘academic’ programming languages to Java for their intro courses). I think MIT dropping 6.001 was mostly lamented by Lisp fans for the sake of dropping a Lisp – what replaced it certainly doesn’t sound from the outside any less rigorous. Perhaps now, the PythonSchool is the new JavaSchool. In any case, it would be instructive to gather some kind of data from the schools which switched from SICP-based (or ML/Haskell/whatever-based) courses to Java-based courses on how the changes affected their graduates’ career prospects. While having ‘Java’ on your CV might have got you past an HR drone faster in 2005, and ‘Python’ might do that today, the actual technical interviewers at the really top, competitive tech companies of the time (like, say, early-2000s Google) can presumably (hopefully!) do a lot better at telling who’s actually a good programmer. That might give useful data on how this kind of change will affect today’s graduates’ career prospects.
Lastly, Northeastern’s researchers have also contributed a huge amount to the Scheme/Racket community, and although that obviously won’t dry up overnight, it’s hard to see this as anything but the Racket/PLT-oriented part of the CS department being sidelined internally; hopefully that doesn’t translate into things like funding and staffing reductions which would rob our entire community of great ideas and great people.
Sadly, it is happening everywhere. In the 2000s, Europe had lots of great CS schools teaching rigorous PLT and formal methods. For example, CTM came from UCLouvain & KTH, two places heavily invested in PLT education and research. Many others existed. By the mid 2000s, this niche was already fading away.
In 2008, I attended a one-to-one viva voce exam for an AI course, and the professor was surprised to see all my code was written in Scheme. He was both excited and sad to go through my submission. He said to the external examiner: “We no longer teach this for political reasons”.
Personally, I think teaching the language du jour instead of timeless ideas is a big mistake. Someone who deeply understands FP & OO can quickly adapt to Python, but not the other way round.
I’m reminded of MIT’s switch from the long-running SICP curriculum to a Python-based one. That was driven by Abelson and Sussman themselves, who had their reasons. This change, as the dialogue makes clear, was not Felleisen’s idea.
I feel very fortunate to have managed to squeeze the HTDP experience out of my school (long story, mostly irrelevant) and to have only learned Python on the job. I see that Python is now the most popular programming language in the world. I like Python well enough, and appreciate its ergonomics, but I also see a lot of Python written by people who clearly are missing some basic concepts. I guess that’s to be expected when you lower the barriers to entry, but it still worries me.
Anyway, Northeastern ain’t MIT… but no matter who your students are, dumbing down your intro curriculum is not a responsible approach to a tightened job market.
Don’t underestimate Northeastern’s CS department! I’ve worked with a bunch of very good engineers out of there.
One of the reasons MIT changed the curriculum is because the old class (6.001, taught in Scheme) was not only a CS-track class, but also stood in as the “intro to programming” course for many other disciplines (physics, mech E, biology, etc etc). There is a very good argument to be made that those people are not going to be creating entire computing systems from first principles, but they are going to be gluing together 15 libraries they didn’t write into a Python program that does the thing they need.
I did not intend to disparage Northeastern or its CS department! I’ve seen it produce both strong research and great engineers. Just… MIT is sort of unusual in lots of ways. I was trying to say that what makes good pedagogy for MIT doesn’t necessarily translate directly anywhere else.
I was the first year of APCS where we were taught Java instead of C++. The summer before college I taught myself python for a job. In college most classes were in Java. In classes where you could choose your language I opted for python. In statistics while examples were in R, I did the assignments in SciPy.
Despite my love of python, I think Java is a really great language for teaching OOP. I think Scheme is a really great language for teaching functional programming. And I think experience is a really good way to learn that composition is better than inheritance ;P
That is all to say colleges need to find the right balance between “marketable” skills and foundational “evergreen” concepts. Seems like some of these recent changes skew a little more towards “marketable”.
They’re moving to Pyret and Python, the same combination that Shriram Krishnamurthi, one of the HtDP co-authors, has been working on for some time now.
Sounds like they’re uncertain whether they want to be a University teaching computer science, or a Polytechnic (Trade School in the US?) teaching programming.
There’s obviously a valuable place in the world for both. But it’s intellectually dishonest to dress either up as the other.
I doubt very much that the average person entering a “Computer Science” program is doing so out of excitement for learning a branch of pure theoretical mathematics that only rarely and grudgingly allows actual computers to be used as vehicles for some of its thought experiments. Doing away with “Computer Science” as its own department, and shifting it to be a branch of the pure mathematics department (possibly even renamed to something like “Mathematical Theory of Computation”) would make a lot of sense.
And then the thing most of the “Computer Science” students are actually wanting, which is something more akin to a “Department of Software Engineering”, could take over the vacated facilities of “Computer Science”. Nobody seems to think it’s beneath the high lordly academic dignity of a university to teach, say, biology with a practical bent for students who intend to become doctors, or chemistry with a practical bent for those who wish to enter the applied sciences, so I don’t know why it should be as sneered-upon as it is up and down this thread for a university to similarly offer a more practical track for those who intend to become programmers. The idea that only some sort of trade-wagie “polytechnic” could ever dirty its hands with such a thing seems deeply outdated.
In Australia the government is keen to get a greater fraction of year 12’s into univeristy. We need tonnes of educated useful adults, but not as many academics. Learning some programming a trade school (TAFE) won’t land you the same job as a university degree. And what is (might be? I dunno) a polytechnic in Australia are our “XXX University of Techology” universities which these days are basically universities but more likely to train nurses and primary teachers than theoretical physicists and “pure” CS.
It seems like we need a lot more “learn practical skills” schooling, but splitting higher education into vocational and academic turns into a prestige problem where the grade 12 students already know they need to have the most presigious certificate in 3-4 years to get a job (or higher degree). So one thing we see is making the undegrad degrees more applied, and dare I say dumbed down for the masses. I kinda think a larger university should just go and stream the students - take the to 5%-10% of IT students and put them in a harder degree (ideally the practical stuff plus extra theory) than the other 90% and give the degree a slightly fancier name (CS vs CS Honours or something). The uni keeps its prestige, the students that want the theory get it, the bulk of students that want a job get a degree from an institution with a good name…
Just musing … but maybe the problem is high schools?
Many years ago where I grew up in NZ, it was expected that a high school graduate not going on to University would leave with trade-valuable (if male) or home-valuable (if female) skills.
Boys would be doing shop classes, technical drawing, etc. Girls would be doing cooking, sewing, etc. The idea was you could leave school the with the skills you’d need to join the workforce (in a junior / apprentice role), or the skills to start and run a family at home. You’d finish school being able to “adult”.
Leaving aside the obviously broken gender role issues, that concept seems to have gone entirely by the wayside. I wonder why … changing job market? Lesser quality of high school education?
Our kids go to a pretty good school, and we’re still having to ensure their “adulting prep” happens through extra-curriculars like Scouts.
Another muse: IMO most programming jobs would be much better suited to apprenticeships than to CS degrees. But most corporate policy is so broken there’s no scope for that sort of tenure or career development.
IMO most programming jobs would be much better suited to apprenticeships than to CS degrees
Agree.
On the university front, at least co-op programs are slowly becoming more common. Some apprentiships are starting to look this way (you enroll with an apprentiship organization rather than an employer, bouncing between TAFE and various hosts that take you for 6 months).
I think high schools could focus on more practical things. On the topic of musing, I often wonder if a much broader curriculum and 8 hour school days would suit everyone well. (I don’t expect them to do 8 hours of academics, but if there are two hours that provide skills and activities much along the lines of scouts… well that would break it up a little).
that concept seems to have gone entirely by the wayside. I wonder why … changing job market? Lesser quality of high school education?
But most corporate policy is so broken there’s no scope for that sort of tenure or career development.
My read was that previously there was a tacit knowledge that someone had to keep the 15-20 year olds occupied and to make the next generations of workers useful. It wasn’t expected that parents pay living expenses of children until they are 25, and it wasn’t expected the school system keep them occupied either. Businesses, corporations, etc would take advantage of the cheap labour. Now the culture isn’t there. (I also couldn’t imagine open-plan offices full of capering teenagers going down too well with some of the grumblier programmers I know either…)
as an alumni of Northeastern (I went through the Computer Engineering, not the Computer Science program; I took a few classes in the CS school but not fundies, the CE program had a different intro path taught with C++):
please recognize this article is by a current undergraduate student in the school newspaper. It really seems like most of the commentary here believes the article to be written by an aggrieved CS professor. I cannot imagine what it would have been like if, as an undergrad, articles written by students in the school newspaper faced the scrutiny of the public internet.
most of the commentary here is confused about the fundamental nature of the Northeastern undergrad experience, which is that it’s structured around a five-year program in which students do three six-month full time co-op positions. Northeastern’s undergrad program is as close to a trade school as universities get. The undergrad program is not treated as a feeder into academia, it’s treated as a feeder into industry.
Roughly 40% of Khoury students enter with AP CS credit, and others have learned on their own or through nontraditional means. Rather than sending everyone to Fundies 1, we’re aiming for a more adaptable intro sequence in which each student takes the courses that make the most sense for them given their starting point.
It seems a big motivator is that the current curriculum is actually too remedial for students entering with existing compsci knowledge.
“Object-Oriented Design” is a good course that teaches a lot, and it’s effectively the gateway to co-op, the course you need to take to be ready. But because it’s so important, it has too much responsibility and material, and it’s too much for many students. It has one of the highest workloads of any course we offer; we hear that consistently in students’ course evaluations. The thinking is not to get rid of material; it’s to spread it out throughout the curriculum so it’s not all in one semester.
The changes are the result of feedback from many students, but the article everyone is commenting on is the opinion of one student.
In talking to Khoury students who come in with experience, they consistently tell me that they like the Fundies 1 design recipe. It offers structure and a way of thinking about problem decomposition that was often lacking in their high school CS courses. But those same students also find Fundies 1 too easy; they get the design recipe quickly and are ready to move on.
It seems the changes are, if anything, geared more towards the precocious and the already-experienced and is not The Great Dumbing Down Of Computer Science education that so many people in this thread seem to assume it is.
Anyway, I’m glad I went to Northeastern, I think I learned a lot and it prepared me very well for my career. I also think that how I felt about the program when I was in my junior year differ substantially from how I feel about the program years later. There was a LOT that I thought was ill-informed and stupid that, over time, I have come to realize was very well planned and thought through. I have a lot of faith in the Northeastern faculty and think they are top-notch educators acting with not just good intentions but also with a high degree of skill.
Since this is la cause célèbre du jour and the links are being posted evangelically, I’ve now read the blog a few times. It’s basically a rant by young Derek Kaplan, a student who likes a language named Racket that the school was using, and doesn’t want the school to switch to the well-known language named Python.
We all have preferences. It’s perfectly reasonable for him to have a preference for Racket, and to be upset that the school is changing away from his preference.
But to pretend that the change in the language being used to teach is somehow “abandoning the fundamentals of computer science” beggars disbelief, and reeks of elitist auto-onanism. That same elitism is peppered throughout the comments here as well, and reflects poorly on our field.
Oh! You misunderstand. They’re switching away from HtDP, an instructional approach, not from Racket, a language. Back to ad-hoc instructional methods. Switching back to teaching a language and hoping something of computer science comes through by osmosis, if you like.
That is quite a significant claim, with scant evidence to support it. As Sagan would say, extraordinary claims require extraordinary evidence. And this story links to a blog by Matthias Felleisen, who is hardly an objective observer – having spent his entire adult life building and investing in Racket! (And I admit to admiring his work!)
I’m not defending the Northeastern decision; I have no horse in this race. But when I read things like “[they are] teaching a language and hoping something of computer science comes through by osmosis”, I’m pretty sure that I am reading hyperbole and not a reasoned argument.
To be clear, I agree with Derek’s statement: “A good computer science curriculum must emphasize fundamental principles that are widely applicable, enabling students to easily adapt to new technologies in the field they are entering. It must teach students how to think about software and how to problem-solve.” But I assume that you would agree that can be done in Python as well as in Racket, yes?
Totally agree with this. And Northeastern isn’t the only college. Some colleges are splitting computer science into multiple degrees with varying levels of math and CS theory.
Personally a degree in math might serve developers better long term than a CS degree. IMHO discrete math, statistics, and calculus are much harder to learn on your own vs. picking up a new language.
As Will Hunting said: “See the sad thing about a guy like you, is in about 50 years you’re gonna start doin’ some thinkin’ on your own and you’re gonna come up with the fact that there are two certainties in life. One, don’t do that. And two, you dropped a hundred and fifty grand on a fuckin’ education you coulda’ got for a dollar fifty in late charges at the Public Library.”
Personally a degree in math might serve developers better long term than a CS degree. IMHO discrete math, statistics, and calculus are much harder to learn on your own vs. picking up a new language.
That might be true, but I’ve seen some REALLY bad code written by people with math degrees. It’s easy to learn a language, it’s harder to learn how to build good, maintainable software. But this isn’t a novel realization, it’s the reason most fields called “_________ engineering” exist.
That’s not surprising. On the other hand, I’ve also seen some REALLY bad code written by people with software engineering degrees. And some of the best code I’ve seen was written by people with philosophy degrees, or worse, no degrees and all!
This sounds like survivorship bias to me. Compare a graduate of subject X working in field X with a non-graduate or graduate of Z - of course the Z person must be above average to even stay competitive in the field X.
Also anecdata, but my experience is heavily leaning the other way - physicists being either terrible coders in consultancies (the norm) or really good (rare). I don’t want to make it a cliche, and I try hard to challenge this, but I’ve simply had this experience for over a decade now.
That might be true, but I’ve seen some REALLY bad code written by people with math degrees.
Yes, it’s very common. I believe it’s an attitude problem. Mathematicians often believe that programming is a pedestrian, mechanical activity that lacks the depth and beauty of true mathematical thought. That it’s a necessary evil, an obstacle they must quickly overcome to do their actual job, which is mathematics. They simply don’t care about programming. If they did, they would write great code.
I remember a kid in my undergrad who was so effortlessly good at multi-variable calculus but really “average” (at best) as it pertained to writing code. In some ways he was too smart and had no issue reasoning about multiple levels of nested spaghetti code.
There’s certainly a craft to programming that is hard to appreciate without time and experience, and for sure a degree that skews heavier into coding will contribute more towards that building that experience. Those who are delighted by code come from all backgrounds and degrees and will develop into great programmers.
I had a pretty crummy CS education, and only found out how poor it was during the last year of my studies. That said, the most important thing I learned at the university was how to learn.
If you teach your students how to learn, they’ll figure out Python pretty easily on their own. On the other hand, even the students who know how to learn will struggle with the foundational principles of CS if they try to learn them on their own.
There was a period where a new professor at MIT wanted to turn 6.001 into a Visual J++ class. The students rebelled, and for good reason, and the students are right here as well.
TIL that “Visual J++” iswas ever a thing, and sadly has nothing to do with J, which might arguably be an OK intro programming language for somebody coming right out of an applied maths course. (Not an argument I’d ever make, but can imagine at MIT ¯\(ツ)/¯ )
Sure, the syntax of the language is fully parenthesized but that doesn’t mean it’s Racket. It’s just a prefix form of algebra.
Christ, seems like a great change. This sort of “we don’t teach Racket” is just dodging the question - students don’t want your “prefix form of algebra” they want something they’ll get paid to use, like Python. And for so many good reasons. It is radically easier to find tutorials, blog posts, libraries, etc, when using Python. It is radically easier to write programs that feel useful in Python, it makes you like to program.
I’m reminded of how absolutely out of touch my programming professors were and they talked very much like this.
University isn’t trade school. For the purposes of academia (research, learning, etc.), it’s better to learn things that will teach you the fundamentals underpinning the field better. (I also think this is true for engineers as well.)
If you just wanted to learn something purely for a job, you could go to a community college instead.
Northeastern is built around the co-op program. Students there start doing 6-month, full time co-ops in their second year, completing three co-ops by the end of their five years at NEU. While it’s not a trade school, the university’s relationship to industry is built on this program and it is the cornerstone of the experience for students; the co-op program is why many students and alumni choose Northeastern. It’s a big part of why I chose Northeastern. Students often want what they are learning to be relevant to their co-op jobs. I would be curious what the rest of the students think and what the outcomes of the alumni are some years after the change.
Like what you’re saying on paper is sensible. Keep the Computer Science field for the people who like theory and let the people who just want to write code take trade classes. But this is not representative of reality.
I went to a four-year college with one of the highest rates of doctorate attainment among schools in the US and a very theoretical computer science program (in my opinion). A significant majority of my peers in computer science are working as software engineers of some form now. My friends and I all agree that the classes we took contributed very little to our ability to do software engineering work.
The problem is that there’s a mismatch between the hiring desiderata for tech companies and the True Computer Science curriculum. I wouldn’t tell a high-achieving student who wants to work in tech to go to a community college. I would tell them to go to a school with good brand name recognition and connections and make the most out of whatever caliber of classes they offer. Learn enough of the theory so you can tell an interviewer how to do QuickSelect in O(n) and then proceed to shelve that knowledge until the next time you feel the need to show off your geek level. And if you aren’t taught to program well, then get your hands dirty with some personal projects/hackathons/what-have-yous.
In my view, this all comes down to the problem of Computer Science and Software Engineering degrees not being separately offered by most colleges.
I responded to this elsewhere but just to parrot that - no, I’m not describing a trade school. There is plenty of room for research and learning with what I’ve said. Learning theory and science is not incompatible with making it fun, interesting, and practical. In fact, I am advocating the opposite - that if you want people to learn theory it is best to make it fun, interesting, and practical.
When I worked through HtDP, I found it exactly that: fun, interesting, and practical. My school’s official intro CS courses were taught in C++ at the time, and they were just awful.
But I ended up as a maths major, and I’m still no good at C++ (no motivation!) … so YMMV.
I don’t think it’s wrong to teach that way, I think it’s wrong to be so dismissive of a student’s desire to learn Python. The whole straw man argument concocted just comes off really badly to me.
Suppose you want to be, I don’t know, let’s say a structural engineer. You already enjoy building physical stuff, and you think it would make a good career. Regardless of how smart or motivated you are, it just would not behoove you to complain about having to learn calculus and statics and all that theory. You wouldn’t complain about having to build little toy models with materials and techniques that don’t exactly correspond to what working professionals do.
You should instead trust that your professors present all the concepts that you will eventually need, in an order that helps you learn it, that it will all “click” eventually. In a mature field like structural engineering, this would be a well-supported belief. In CS, you can maybe be excused for being a little doubtful. So in that sense, I’m sympathetic… but I’ve known way too many intellectually lazy undergrads to just give you carte blanche here.
If you, as an independent learner, want to go learn programming on your own, more power to you and best of luck. There are plenty of resources out there. If, on the other hand, you checked yourself into an institution of higher learning, you should be prepared to adopt a certain attitude of humility. You should also have known what you’re getting into. Heaven knows there were already plenty of Python-first CS curricula out there. This is a loss of academic diversity, if nothing else.
Things have naturally changed since then, but nowhere in my SE/CS education was there any focus on some desire for a specific language, and the only way to really ‘get’ something language-quirk specific was to enroll in summer courses (padding to have something to do) which covered language tooling and quirks.
From the top of my head, indirect language exposure went something like:
OOP - Java, C++.
Realtime systems - Ada, C, MIPS assembly.
Operating Systems - C, X86 assembly.
Compilers - whatever you liked, evaluation were on explaining your algorithmic breakdown and choices, some did it in Bash. The input language was a custom dialect of Simula. My submission was in brainfuck and received a heartwarming WTF?! (he was unaware that it was generated by another compiler that was 666 lines of Ruby).
AI - parts in Prolog, parts in SPARC assembly, parts in LISP.
‘engineering’ projects against external clients? PHP, Scheme, C#.
Software Security? X86 assembly, shell and Lua.
Outside of that, some smaller groups of students that enjoyed the challenge had language poetry readings in various esoteric languages, Shakespeare being a popular choice. Ook much less so. Pretty much the same cliques added ‘meta’ challenges to the courses taken. Database systems? Competition on writing a backend for dealing with the SQL in the course.
I feel like this presents a binary situation that isn’t there. You can learn CS and Python at the same time. You can learn CS through Python. I maintain that you’ll learn CS and theory better if you do so in a way that motivates students by making it more enjoyable and feel more practical. I feel like this shouldn’t be contentious, honestly.
This is a loss of academic diversity, if nothing else.
I think that’s fair, I just don’t think it’s fair to sneer at students for wanting to enjoy learning or gain practical knowledge as part of their education.
To be fair, a physicist could argue that structural engineering is just dumbed-down applied physics. To me, the ultimate problem with these discussions is that CS was never broken into multiple fields except at a few institutions (UIUC, I believe, has a separate Software Engineering department, for example). We wouldn’t have these weird discussions if SE, CS, and maybe even “Computing Technology” or something were completely separate degrees with a certain amount of overlap, as they probably ought to be, as basically every other field is.
They are trying to teach something very specific, which is how to construct certain patterns of thought. If you’re doing it 1:1 their approach works fine in Python. When you’re teaching a class, their approach of targeted teaching languages is actually really brilliant. The students interact with a compiler that is restricted to the structures they are dealing with, so it can provide excellent error messages and feedback. As the course proceeds, the language shifts along with it.
Any given language is only a vehicle for teaching a certain body of knowledge. Similarly in physics we teach Gibbs-Heaviside vector calculus in all its wartiness. Would differential forms or Clifford algebra be prettier? Sure. But the vector calculus is only a means to get to something else, notably electromagnetism.
Your professors might have been out of touch, or they might be looking back from decades you don’t have and they might be trying to do something you aren’t aware of.
Syntax aside, I think there’s something to be said for teaching in a pedagogy-oriented DSL that no LLM will give any help with. I’ve been a TA for classes like this and I shudder to imagine grading beginner $VERY_POPULAR_LANGUAGE nowadays.
It’s strictly true: the course teaches BSL, not Racket. Syntax is a distraction. Students don’t know enough to know whether what they think they want is what they actually want, let alone what they need; that’s why schools exist.
Students don’t know enough to know whether what they think they want is what they actually want
That’s nonsense. Students want to learn a language that:
Maps to practical applications like getting a job
Is motivating, fun, etc.
It’s why I think JS is a good language for beginners. You can have a pretty webpage with cute features in no time. Students aren’t wrong for wanting these things.
This reminds me of a moment in the MIT intro to electronics course (which I watched on YouTube) where the professor is working through how the transistor implementation of a logic gate works, how the valid logic high/low voltages are determined, etc. He says sometimes students complain that in real life they would just plug chips together where this is already figured
out. He says (paraphrasing) “perhaps so, but you are at MIT so that if you want, you can be the one designing the chips”.
Both this article and Felliesen’s piece feel reactionary and not particularly fair to the university. Especially taking a closer glance at the linked announcement of the changes, the points brought up in the article are mainly strawmen that don’t substantiate the “abandoning fundamentals of computer science” headline, and Felliesen’s piece (when read as an argument against these changes) is simply reductionist.
The article focuses on the change to Python, but the core of its actual argument against Python seems to be this:
But we should not teach a language simply because it is currently popular in industry — we must choose a language with real pedagogical merit. Racket was chosen because it has “teaching languages” that can gradually introduce features as students are taught the relevant design principles.
But the new first course isn’t starting with Python, it’s starting with Pyret and Python! Pyret is a language with some Python-like syntax, but designed explicitly to be a good teaching language.
From the Pyret home page:
Pyret is a programming language designed to serve as an outstanding choice for programming education while exploring the confluence of scripting and functional programming.
The why Pyret? page seems to make a more detailed argument.
The announcement says that the first course will bridge to Python towards the end, but to me that sounds like a great middle ground for teaching a language the students will use later.
If the argument is that both full Racket and full Python are bad introductory languages, but that they have corresponding teaching languages that form a bridge back to them, then I see no inherent reason to prefer Racket over Python. But there are many non-inherent reasons to prefer Python, particularly that it is more widely used.
The article’s second point, that students can now use AP credits to skip courses, is well addressed by the announcement page. My reading is that the instructors are taking the potential loss of fubdamentals from the intro sequence seriously and are interested in helping students make the best choices for their situation.
The third argument is that the courses are becoming easier:
It seems a major impetus for this change is a desire to make the core curriculum easier. I know one professor who has been telling students that the college wants to reduce the number of students who withdraw from Fundies 2 and Object-Oriented Design.
But the announcement emphasizes that the change is designed because OOD in particular is too difficult, and instead of decreasing difficulty, they want to shift the difficulty so it’s more even with the earlier courses:
“Object-Oriented Design” is a good course that teaches a lot […]. But because it’s so important, it has too much responsibility and material, and it’s too much for many students. It has one of the highest workloads of any course we offer; we hear that consistently in students’ course evaluations. The thinking is not to get rid of material; it’s to spread it out throughout the curriculum so it’s not all in one semester.
The goal of the intro sequence isn’t just to teach students how to program in a language; it’s also how to think like a programmer and design programs. Those higher-level objectives won’t change. That said, by adopting the same language for the first two courses, we can get to more advanced topics and larger programs faster. This approach also enables us to alleviate the pressure that is currently centered on OOD.
Felliesen’s piece does mention that the first two semesters intentionally “proceed in a slow and steady way”, but the changes are addressing a problem in the third course, and his argument doesn’t feel like it would actually counter this point.
Finally, the conclusion the article makes from these points is that:
while Khoury may pay lip service to the design recipe, it is not committed to maintaining systematic program design as a central aspect of the curriculum.
But the announcement addresses this directly:
The goal of the intro sequence isn’t just to teach students how to program in a language; it’s also how to think like a programmer and design programs. Those higher-level objectives won’t change.
Sounds like fundamental computer science to me.
(Note that I don’t have the full context, and am relying solely on the linked articles. There may be a more substantive objection to the changes, but I haven’t seen it.)
I’m not going to say it … I’m not going to say it … Ivory Tower
No, I read through most of the debate here and I agree with everyone. How can that be? It especially pains me to see reasonable people fighting each other, but that’s a separate matter.
I agree that we need to teach principles and I agree that we need to teach real life skills. Them kids are picking this course, not ancient philosophy. They hope to earn a living by making computers do stuff.
The class distinction between trade schools and “real” schools should be spoke about with care. Trade schools get you to practical skills quicker. They may skip some theory to do so. That’s not a bad thing.
I think it’s actually better to be a trade school first and then have supplemental theory courses. Let them get their hands dirty. Then they all know how to put bread on the table. A certain percentage of them, say 5% will want to know why. Have theory courses for them.
Don’t go too much onto the other side though: Don’t turn this into Angular v91 University. If a future employer wants that,
As a university you shouldn’t kowtow to one company too much.
That employer ain’t gonna be around too long, because their managers are shortsighted and their workforce is unadaptable.
I think NE reacting to many employers giving them the feedback that filling the graduates heads with Racket knowledge is not as effective as teaching them Python is sound. Yes, it seems a bit commercial, but I think it is just commercial enough. If they turned into MS Access University, then I would be on the picket lines (metaphorically) too.
reacting to many employers giving them the feedback that filling the graduates heads with Racket knowledge is not as effective as teaching them Python
Surprisingly, it’s quite the opposite: employers by and large love the flexibility and capability of Northeastern students on coop, compared to others. This isn’t coming from employers.
You think it’s the students? I took part in a session where we spoke with high school seniors and one of them asked me about Racket and if we used it and if I knew any company that used it.
That question makes a lot more sense now that I know NE had that as a central part of the curriculum.
Kids will ask these sensible questions and so will employers. I think it’s likely they have a decent instinct asto what has value.
Most people aren’t in the game for platonic reasons.
I have an older German degree (diploma) that was generally 10 semesters (most people needed 11-14) which is roughly like a MSc, but it’s basically all-or-nothing (i.e. no going away after 4 semesters with a degree). And while I see a lot of benefits in BSc + MSc.. we just had more time for fundamentals. The first 4 semesters (so the same time as a BSc afaik?) there was like:
intro to programming in an FP language (Ocaml, SML, other schools used Haskell or Racket)
more SWE/OOP with Java
systems programming, computer architecture (and M68k assembler)
theoretical CS, formal languages, automata
All the “applied stuff” beyond the mere basics came either later or in dedicated other courses. I think this broad curriculum has been lost
I’m not sure how long a BSc is in the US, but at least in Germany a BSc is 6 semesters, of which 4 semesters are focused on fundamentals.
My curriculum looked like this:
Intro to programming (using racket student languages), intro to digital systems design (processor architecture using DLX), math 1
Software engineering / oop using java, Algorithms/data structures using java, debugging and reverse engineering using x86 assembly, math 2
More functional programming using haskell and prolog, applied software engineering (work in groups to develop a working project), math 3
Theoretical computer science, databases, applied processor design (actually design your own dlx), logic
And 5/6 were almost entirely filled with courses you could freely choose, with the goal being that you start writing your own papers and contribute to the actual science.
I had to take a break for mental health reasons, and once I returned I realized all the courses had been switched over to Java and most of my credits couldn’t be transferred anymore (which is why I dropped out). It was quite eerie to see how quickly they destroyed a really good CS course.
oops, yes - I mixed up 6+4 with 4+6 - but my point was more that they still have to cram all the basics into the first 6, plus anything that supposedly makes you a well-rounded graduate - whereas we had ONLY fundamentals (plus minor subject) in the first 4.
Also yeah that sucks, I can’t imagine that happening at my uni/time - because we literally had the same “Informatics I” course in another language every year or two, depending on the professor, so you needed this exam, and there were no credits, but afaik nothing was ever changed without many years of leeway towards older “I passed this course”.
The problem I have with this topic is that learning seems to be a very personal thing to me, and everyone usually just learns the fundamentals once, after that it’s just more programming languages and a few concepts.
Didactics of learning isn’t a field of its own without reason.
That said, I find it interesting but I can hardly find two people who agree. Personally I don’t think it matters much, and it’s hard to trial. How would you compare several cohorts from different universities/colleges with different curriculums?
But then again my own journey was more like: I hated the first semester for several different reasons, one of them that I had coded for money beforehand and they seem to be doing everything differently. And while I’ve always been a smartass, in this case I took the same intro course (FP) in the third semester again (different prof, different language) and enjoyed it very much.
I’d also like to reference one of Felleisen’s earlier posts, Developing Developers, which also rationalizes what a pedagogical computer science curriculum should look like.
Why does Northeastern use the Racket Student Languages in the intro course as opposed to Python? If the fundamentals are language-independent, then surely there’s no problem using Python? Felleisen addresses this by referencing the trinity. Beginners will have the best experience in an introductory course when:
A transition to Python likely doesn’t fully satisfy the trinity, since it’s a complex, full-fledged programming language with several quirks and footguns for beginners. Likewise, Racket itself doesn’t pose a suitable alternative, since it’s also a complex, full-fledged programming language: that’s why students start with the Racket student languages instead! With the Racket student languages, they learn the entirety of that language before introducing new features and greater complexity. In particular, new features are integrated into the design recipe, a vehicle for teaching systematic design. Rather than teaching language features independently, problems are posed and these features are introduced as solutions and described from the context of the design recipe. You’d probably want to skim HtDP to see how they do this well.
A language that could be an adequate substitution is Pyret, and it might be used in the new curriculum. One of the Pyret developers/researchers is @shriram, who had Felleisen as an advisor. The DCIC book, however, makes different decisions on the order in which to introduce ideas.
On another note, the curriculum change likely isn’t because of dissatisfaction with the current curriculum. Rather, it’s political. I have a brief set of notes that describes this problem:
Second part: co-op.
Another implicit consequence is that downstream courses outside of the core curriculum will have to change. A classic programming languages course, taught by Eli Barzilay, will inevitably stop being taught the way it is. That course uses a new language based on Typed Racket for each homework, including one that emulates the lambda calculus! Barzilay has expressed that he will likely stop teaching the course if the curriculum changes, since it would be too time-consuming to teach basic Typed Racket to be productive enough for the rest of the course. Another course at Northeastern, Logic & Computation, also built a teaching language using Racket to teach the fundamentals of formal methods. There’s exciting courses such as Hack Your Own Language that teach how to build DSLs from Racket. It’s a shame some of these will have to change or cease being taught.
I’m fairly involved in the Racket community. I have no qualms about transitioning away from the HtDP curriculum or from the Racket student languages. My concern is that the new curriculum does not adequately substitute for the old one, and instead will breed a new generation of AI-reliant code monkeys – to put it one way. The political pressure to switch curriculums is worrying, but I’m hoping some of the involved professors help steer the new proposed changes in the right direction.
A couple of remarks on this.
First, I guess we shouldn’t hold our breath waiting for HtDP 3e.
Second, it might be my bias speaking – as a Schemer, I’m more aware of Northeastern’s work because they use and contribute back to my language of choice – but Northeastern seems to me to be one of the top centres for in programming language education and research in the world, and this seems like a total betrayal of that. Its existing curriculum, as Felleisen explains, was already a very well-thought-out balance of preparation for theory and preparation for practical work, widely applauded. That curriculum has produced truly excellent students in the past: just picking something at random of stuff from their department which I’ve seen and personally found useful recently, this paper comes to mind, whose lead author was still an undergrad at the time of its publication – it’s notable as a significant and useful contribution in the otherwise still fairly under-researched area of applications of mutation testing to functional programming languages. If I’m ever recruiting programmers again, it’s likely I’ll consider an undergrad CS degree from Northeastern will be much less of a positive, compared to other universities, after these changes – though let’s wait and see.
Third, the events of the 2000s do also come to mind: not only MIT’s switch from SICP to Python which @minimax noted, but handwringing about JavaSchools (major universities switching from ‘academic’ programming languages to Java for their intro courses). I think MIT dropping 6.001 was mostly lamented by Lisp fans for the sake of dropping a Lisp – what replaced it certainly doesn’t sound from the outside any less rigorous. Perhaps now, the PythonSchool is the new JavaSchool. In any case, it would be instructive to gather some kind of data from the schools which switched from SICP-based (or ML/Haskell/whatever-based) courses to Java-based courses on how the changes affected their graduates’ career prospects. While having ‘Java’ on your CV might have got you past an HR drone faster in 2005, and ‘Python’ might do that today, the actual technical interviewers at the really top, competitive tech companies of the time (like, say, early-2000s Google) can presumably (hopefully!) do a lot better at telling who’s actually a good programmer. That might give useful data on how this kind of change will affect today’s graduates’ career prospects.
Lastly, Northeastern’s researchers have also contributed a huge amount to the Scheme/Racket community, and although that obviously won’t dry up overnight, it’s hard to see this as anything but the Racket/PLT-oriented part of the CS department being sidelined internally; hopefully that doesn’t translate into things like funding and staffing reductions which would rob our entire community of great ideas and great people.
Sadly, it is happening everywhere. In the 2000s, Europe had lots of great CS schools teaching rigorous PLT and formal methods. For example, CTM came from UCLouvain & KTH, two places heavily invested in PLT education and research. Many others existed. By the mid 2000s, this niche was already fading away.
In 2008, I attended a one-to-one viva voce exam for an AI course, and the professor was surprised to see all my code was written in Scheme. He was both excited and sad to go through my submission. He said to the external examiner: “We no longer teach this for political reasons”.
Personally, I think teaching the language du jour instead of timeless ideas is a big mistake. Someone who deeply understands FP & OO can quickly adapt to Python, but not the other way round.
I’m reminded of MIT’s switch from the long-running SICP curriculum to a Python-based one. That was driven by Abelson and Sussman themselves, who had their reasons. This change, as the dialogue makes clear, was not Felleisen’s idea.
I feel very fortunate to have managed to squeeze the HTDP experience out of my school (long story, mostly irrelevant) and to have only learned Python on the job. I see that Python is now the most popular programming language in the world. I like Python well enough, and appreciate its ergonomics, but I also see a lot of Python written by people who clearly are missing some basic concepts. I guess that’s to be expected when you lower the barriers to entry, but it still worries me.
Anyway, Northeastern ain’t MIT… but no matter who your students are, dumbing down your intro curriculum is not a responsible approach to a tightened job market.
Don’t underestimate Northeastern’s CS department! I’ve worked with a bunch of very good engineers out of there.
One of the reasons MIT changed the curriculum is because the old class (6.001, taught in Scheme) was not only a CS-track class, but also stood in as the “intro to programming” course for many other disciplines (physics, mech E, biology, etc etc). There is a very good argument to be made that those people are not going to be creating entire computing systems from first principles, but they are going to be gluing together 15 libraries they didn’t write into a Python program that does the thing they need.
I did not intend to disparage Northeastern or its CS department! I’ve seen it produce both strong research and great engineers. Just… MIT is sort of unusual in lots of ways. I was trying to say that what makes good pedagogy for MIT doesn’t necessarily translate directly anywhere else.
I was the first year of APCS where we were taught Java instead of C++. The summer before college I taught myself python for a job. In college most classes were in Java. In classes where you could choose your language I opted for python. In statistics while examples were in R, I did the assignments in SciPy.
Despite my love of python, I think Java is a really great language for teaching OOP. I think Scheme is a really great language for teaching functional programming. And I think experience is a really good way to learn that composition is better than inheritance ;P
That is all to say colleges need to find the right balance between “marketable” skills and foundational “evergreen” concepts. Seems like some of these recent changes skew a little more towards “marketable”.
…and thank God for small blessings.
They’re moving to Pyret and Python, the same combination that Shriram Krishnamurthi, one of the HtDP co-authors, has been working on for some time now.
Here’s their latest book: https://dcic-world.org/
Idk if Northeastern will be following that route, but it’s probably something that has influenced them.
Sounds like they’re uncertain whether they want to be a University teaching computer science, or a Polytechnic (Trade School in the US?) teaching programming.
There’s obviously a valuable place in the world for both. But it’s intellectually dishonest to dress either up as the other.
I doubt very much that the average person entering a “Computer Science” program is doing so out of excitement for learning a branch of pure theoretical mathematics that only rarely and grudgingly allows actual computers to be used as vehicles for some of its thought experiments. Doing away with “Computer Science” as its own department, and shifting it to be a branch of the pure mathematics department (possibly even renamed to something like “Mathematical Theory of Computation”) would make a lot of sense.
And then the thing most of the “Computer Science” students are actually wanting, which is something more akin to a “Department of Software Engineering”, could take over the vacated facilities of “Computer Science”. Nobody seems to think it’s beneath the high lordly academic dignity of a university to teach, say, biology with a practical bent for students who intend to become doctors, or chemistry with a practical bent for those who wish to enter the applied sciences, so I don’t know why it should be as sneered-upon as it is up and down this thread for a university to similarly offer a more practical track for those who intend to become programmers. The idea that only some sort of trade-wagie “polytechnic” could ever dirty its hands with such a thing seems deeply outdated.
I feel like there’s this general problem.
In Australia the government is keen to get a greater fraction of year 12’s into univeristy. We need tonnes of educated useful adults, but not as many academics. Learning some programming a trade school (TAFE) won’t land you the same job as a university degree. And what is (might be? I dunno) a polytechnic in Australia are our “XXX University of Techology” universities which these days are basically universities but more likely to train nurses and primary teachers than theoretical physicists and “pure” CS.
It seems like we need a lot more “learn practical skills” schooling, but splitting higher education into vocational and academic turns into a prestige problem where the grade 12 students already know they need to have the most presigious certificate in 3-4 years to get a job (or higher degree). So one thing we see is making the undegrad degrees more applied, and dare I say dumbed down for the masses. I kinda think a larger university should just go and stream the students - take the to 5%-10% of IT students and put them in a harder degree (ideally the practical stuff plus extra theory) than the other 90% and give the degree a slightly fancier name (CS vs CS Honours or something). The uni keeps its prestige, the students that want the theory get it, the bulk of students that want a job get a degree from an institution with a good name…
Just musing … but maybe the problem is high schools?
Many years ago where I grew up in NZ, it was expected that a high school graduate not going on to University would leave with trade-valuable (if male) or home-valuable (if female) skills.
Boys would be doing shop classes, technical drawing, etc. Girls would be doing cooking, sewing, etc. The idea was you could leave school the with the skills you’d need to join the workforce (in a junior / apprentice role), or the skills to start and run a family at home. You’d finish school being able to “adult”.
Leaving aside the obviously broken gender role issues, that concept seems to have gone entirely by the wayside. I wonder why … changing job market? Lesser quality of high school education?
Our kids go to a pretty good school, and we’re still having to ensure their “adulting prep” happens through extra-curriculars like Scouts.
Another muse: IMO most programming jobs would be much better suited to apprenticeships than to CS degrees. But most corporate policy is so broken there’s no scope for that sort of tenure or career development.
Agree.
On the university front, at least co-op programs are slowly becoming more common. Some apprentiships are starting to look this way (you enroll with an apprentiship organization rather than an employer, bouncing between TAFE and various hosts that take you for 6 months).
I think high schools could focus on more practical things. On the topic of musing, I often wonder if a much broader curriculum and 8 hour school days would suit everyone well. (I don’t expect them to do 8 hours of academics, but if there are two hours that provide skills and activities much along the lines of scouts… well that would break it up a little).
My read was that previously there was a tacit knowledge that someone had to keep the 15-20 year olds occupied and to make the next generations of workers useful. It wasn’t expected that parents pay living expenses of children until they are 25, and it wasn’t expected the school system keep them occupied either. Businesses, corporations, etc would take advantage of the cheap labour. Now the culture isn’t there. (I also couldn’t imagine open-plan offices full of capering teenagers going down too well with some of the grumblier programmers I know either…)
as an alumni of Northeastern (I went through the Computer Engineering, not the Computer Science program; I took a few classes in the CS school but not fundies, the CE program had a different intro path taught with C++):
please recognize this article is by a current undergraduate student in the school newspaper. It really seems like most of the commentary here believes the article to be written by an aggrieved CS professor. I cannot imagine what it would have been like if, as an undergrad, articles written by students in the school newspaper faced the scrutiny of the public internet.
most of the commentary here is confused about the fundamental nature of the Northeastern undergrad experience, which is that it’s structured around a five-year program in which students do three six-month full time co-op positions. Northeastern’s undergrad program is as close to a trade school as universities get. The undergrad program is not treated as a feeder into academia, it’s treated as a feeder into industry.
If you want to understand this topic, you must read the commentary from the dean of CS here: https://www.khoury.northeastern.edu/qa-what-to-expect-from-khoury-colleges-upcoming-intro-course-changes/
It seems a big motivator is that the current curriculum is actually too remedial for students entering with existing compsci knowledge.
The changes are the result of feedback from many students, but the article everyone is commenting on is the opinion of one student.
It seems the changes are, if anything, geared more towards the precocious and the already-experienced and is not The Great Dumbing Down Of Computer Science education that so many people in this thread seem to assume it is.
Anyway, I’m glad I went to Northeastern, I think I learned a lot and it prepared me very well for my career. I also think that how I felt about the program when I was in my junior year differ substantially from how I feel about the program years later. There was a LOT that I thought was ill-informed and stupid that, over time, I have come to realize was very well planned and thought through. I have a lot of faith in the Northeastern faculty and think they are top-notch educators acting with not just good intentions but also with a high degree of skill.
Since this is la cause célèbre du jour and the links are being posted evangelically, I’ve now read the blog a few times. It’s basically a rant by young Derek Kaplan, a student who likes a language named Racket that the school was using, and doesn’t want the school to switch to the well-known language named Python.
We all have preferences. It’s perfectly reasonable for him to have a preference for Racket, and to be upset that the school is changing away from his preference.
But to pretend that the change in the language being used to teach is somehow “abandoning the fundamentals of computer science” beggars disbelief, and reeks of elitist auto-onanism. That same elitism is peppered throughout the comments here as well, and reflects poorly on our field.
And I am no Python apologist, nor Racket hater.
Oh! You misunderstand. They’re switching away from HtDP, an instructional approach, not from Racket, a language. Back to ad-hoc instructional methods. Switching back to teaching a language and hoping something of computer science comes through by osmosis, if you like.
That is quite a significant claim, with scant evidence to support it. As Sagan would say, extraordinary claims require extraordinary evidence. And this story links to a blog by Matthias Felleisen, who is hardly an objective observer – having spent his entire adult life building and investing in Racket! (And I admit to admiring his work!)
I’m not defending the Northeastern decision; I have no horse in this race. But when I read things like “[they are] teaching a language and hoping something of computer science comes through by osmosis”, I’m pretty sure that I am reading hyperbole and not a reasoned argument.
To be clear, I agree with Derek’s statement: “A good computer science curriculum must emphasize fundamental principles that are widely applicable, enabling students to easily adapt to new technologies in the field they are entering. It must teach students how to think about software and how to problem-solve.” But I assume that you would agree that can be done in Python as well as in Racket, yes?
[Comment removed by author]
Totally agree with this. And Northeastern isn’t the only college. Some colleges are splitting computer science into multiple degrees with varying levels of math and CS theory.
Personally a degree in math might serve developers better long term than a CS degree. IMHO discrete math, statistics, and calculus are much harder to learn on your own vs. picking up a new language.
As Will Hunting said: “See the sad thing about a guy like you, is in about 50 years you’re gonna start doin’ some thinkin’ on your own and you’re gonna come up with the fact that there are two certainties in life. One, don’t do that. And two, you dropped a hundred and fifty grand on a fuckin’ education you coulda’ got for a dollar fifty in late charges at the Public Library.”
That might be true, but I’ve seen some REALLY bad code written by people with math degrees. It’s easy to learn a language, it’s harder to learn how to build good, maintainable software. But this isn’t a novel realization, it’s the reason most fields called “_________ engineering” exist.
That’s not surprising. On the other hand, I’ve also seen some REALLY bad code written by people with software engineering degrees. And some of the best code I’ve seen was written by people with philosophy degrees, or worse, no degrees and all!
This sounds like survivorship bias to me. Compare a graduate of subject X working in field X with a non-graduate or graduate of Z - of course the Z person must be above average to even stay competitive in the field X.
Also anecdata, but my experience is heavily leaning the other way - physicists being either terrible coders in consultancies (the norm) or really good (rare). I don’t want to make it a cliche, and I try hard to challenge this, but I’ve simply had this experience for over a decade now.
This is also true. I’ve worked with a number of people with film/philosophy/music degrees that were really impressive.
Yes, it’s very common. I believe it’s an attitude problem. Mathematicians often believe that programming is a pedestrian, mechanical activity that lacks the depth and beauty of true mathematical thought. That it’s a necessary evil, an obstacle they must quickly overcome to do their actual job, which is mathematics. They simply don’t care about programming. If they did, they would write great code.
I remember a kid in my undergrad who was so effortlessly good at multi-variable calculus but really “average” (at best) as it pertained to writing code. In some ways he was too smart and had no issue reasoning about multiple levels of nested spaghetti code.
There’s certainly a craft to programming that is hard to appreciate without time and experience, and for sure a degree that skews heavier into coding will contribute more towards that building that experience. Those who are delighted by code come from all backgrounds and degrees and will develop into great programmers.
A CS degree should be a degree in math if you’re doing it right. CS is a branch of mathematics after all :P
I had a pretty crummy CS education, and only found out how poor it was during the last year of my studies. That said, the most important thing I learned at the university was how to learn.
If you teach your students how to learn, they’ll figure out Python pretty easily on their own. On the other hand, even the students who know how to learn will struggle with the foundational principles of CS if they try to learn them on their own.
There was a period where a new professor at MIT wanted to turn 6.001 into a Visual J++ class. The students rebelled, and for good reason, and the students are right here as well.
TIL that “Visual J++”
iswas ever a thing, and sadly has nothing to do with J, which might arguably be an OK intro programming language for somebody coming right out of an applied maths course. (Not an argument I’d ever make, but can imagine at MIT ¯\(ツ)/¯ )[Comment removed by author]
Christ, seems like a great change. This sort of “we don’t teach Racket” is just dodging the question - students don’t want your “prefix form of algebra” they want something they’ll get paid to use, like Python. And for so many good reasons. It is radically easier to find tutorials, blog posts, libraries, etc, when using Python. It is radically easier to write programs that feel useful in Python, it makes you like to program.
I’m reminded of how absolutely out of touch my programming professors were and they talked very much like this.
University isn’t trade school. For the purposes of academia (research, learning, etc.), it’s better to learn things that will teach you the fundamentals underpinning the field better. (I also think this is true for engineers as well.)
If you just wanted to learn something purely for a job, you could go to a community college instead.
Northeastern is built around the co-op program. Students there start doing 6-month, full time co-ops in their second year, completing three co-ops by the end of their five years at NEU. While it’s not a trade school, the university’s relationship to industry is built on this program and it is the cornerstone of the experience for students; the co-op program is why many students and alumni choose Northeastern. It’s a big part of why I chose Northeastern. Students often want what they are learning to be relevant to their co-op jobs. I would be curious what the rest of the students think and what the outcomes of the alumni are some years after the change.
None of this tracks with my experience.
Like what you’re saying on paper is sensible. Keep the Computer Science field for the people who like theory and let the people who just want to write code take trade classes. But this is not representative of reality.
I went to a four-year college with one of the highest rates of doctorate attainment among schools in the US and a very theoretical computer science program (in my opinion). A significant majority of my peers in computer science are working as software engineers of some form now. My friends and I all agree that the classes we took contributed very little to our ability to do software engineering work.
The problem is that there’s a mismatch between the hiring desiderata for tech companies and the True Computer Science curriculum. I wouldn’t tell a high-achieving student who wants to work in tech to go to a community college. I would tell them to go to a school with good brand name recognition and connections and make the most out of whatever caliber of classes they offer. Learn enough of the theory so you can tell an interviewer how to do QuickSelect in O(n) and then proceed to shelve that knowledge until the next time you feel the need to show off your geek level. And if you aren’t taught to program well, then get your hands dirty with some personal projects/hackathons/what-have-yous.
In my view, this all comes down to the problem of Computer Science and Software Engineering degrees not being separately offered by most colleges.
I responded to this elsewhere but just to parrot that - no, I’m not describing a trade school. There is plenty of room for research and learning with what I’ve said. Learning theory and science is not incompatible with making it fun, interesting, and practical. In fact, I am advocating the opposite - that if you want people to learn theory it is best to make it fun, interesting, and practical.
When I worked through HtDP, I found it exactly that: fun, interesting, and practical. My school’s official intro CS courses were taught in C++ at the time, and they were just awful.
But I ended up as a maths major, and I’m still no good at C++ (no motivation!) … so YMMV.
I don’t think it’s wrong to teach that way, I think it’s wrong to be so dismissive of a student’s desire to learn Python. The whole straw man argument concocted just comes off really badly to me.
Suppose you want to be, I don’t know, let’s say a structural engineer. You already enjoy building physical stuff, and you think it would make a good career. Regardless of how smart or motivated you are, it just would not behoove you to complain about having to learn calculus and statics and all that theory. You wouldn’t complain about having to build little toy models with materials and techniques that don’t exactly correspond to what working professionals do.
You should instead trust that your professors present all the concepts that you will eventually need, in an order that helps you learn it, that it will all “click” eventually. In a mature field like structural engineering, this would be a well-supported belief. In CS, you can maybe be excused for being a little doubtful. So in that sense, I’m sympathetic… but I’ve known way too many intellectually lazy undergrads to just give you carte blanche here.
If you, as an independent learner, want to go learn programming on your own, more power to you and best of luck. There are plenty of resources out there. If, on the other hand, you checked yourself into an institution of higher learning, you should be prepared to adopt a certain attitude of humility. You should also have known what you’re getting into. Heaven knows there were already plenty of Python-first CS curricula out there. This is a loss of academic diversity, if nothing else.
Things have naturally changed since then, but nowhere in my SE/CS education was there any focus on some desire for a specific language, and the only way to really ‘get’ something language-quirk specific was to enroll in summer courses (padding to have something to do) which covered language tooling and quirks.
From the top of my head, indirect language exposure went something like:
Outside of that, some smaller groups of students that enjoyed the challenge had language poetry readings in various esoteric languages, Shakespeare being a popular choice. Ook much less so. Pretty much the same cliques added ‘meta’ challenges to the courses taken. Database systems? Competition on writing a backend for dealing with the SQL in the course.
I feel like this presents a binary situation that isn’t there. You can learn CS and Python at the same time. You can learn CS through Python. I maintain that you’ll learn CS and theory better if you do so in a way that motivates students by making it more enjoyable and feel more practical. I feel like this shouldn’t be contentious, honestly.
I think that’s fair, I just don’t think it’s fair to sneer at students for wanting to enjoy learning or gain practical knowledge as part of their education.
To be fair, a physicist could argue that structural engineering is just dumbed-down applied physics. To me, the ultimate problem with these discussions is that CS was never broken into multiple fields except at a few institutions (UIUC, I believe, has a separate Software Engineering department, for example). We wouldn’t have these weird discussions if SE, CS, and maybe even “Computing Technology” or something were completely separate degrees with a certain amount of overlap, as they probably ought to be, as basically every other field is.
Not convincingly.
They are trying to teach something very specific, which is how to construct certain patterns of thought. If you’re doing it 1:1 their approach works fine in Python. When you’re teaching a class, their approach of targeted teaching languages is actually really brilliant. The students interact with a compiler that is restricted to the structures they are dealing with, so it can provide excellent error messages and feedback. As the course proceeds, the language shifts along with it.
Any given language is only a vehicle for teaching a certain body of knowledge. Similarly in physics we teach Gibbs-Heaviside vector calculus in all its wartiness. Would differential forms or Clifford algebra be prettier? Sure. But the vector calculus is only a means to get to something else, notably electromagnetism.
Your professors might have been out of touch, or they might be looking back from decades you don’t have and they might be trying to do something you aren’t aware of.
Syntax aside, I think there’s something to be said for teaching in a pedagogy-oriented DSL that no LLM will give any help with. I’ve been a TA for classes like this and I shudder to imagine grading beginner
$VERY_POPULAR_LANGUAGEnowadays.It’s strictly true: the course teaches BSL, not Racket. Syntax is a distraction. Students don’t know enough to know whether what they think they want is what they actually want, let alone what they need; that’s why schools exist.
That’s nonsense. Students want to learn a language that:
It’s why I think JS is a good language for beginners. You can have a pretty webpage with cute features in no time. Students aren’t wrong for wanting these things.
I don’t agree.
You’re describing the purpose of a vocational school, not a university.
No I’m not. There is plenty of room for theory in what I’m saying, but that doesn’t mean it shouldn’t strive to also be motivating.
I’m not sure how much more motivating you want than a fourth-year undergrad passionately arguing for this model in the student newspaper.
I feel like I’ve made my point pretty clearly.
This reminds me of a moment in the MIT intro to electronics course (which I watched on YouTube) where the professor is working through how the transistor implementation of a logic gate works, how the valid logic high/low voltages are determined, etc. He says sometimes students complain that in real life they would just plug chips together where this is already figured out. He says (paraphrasing) “perhaps so, but you are at MIT so that if you want, you can be the one designing the chips”.
Both this article and Felliesen’s piece feel reactionary and not particularly fair to the university. Especially taking a closer glance at the linked announcement of the changes, the points brought up in the article are mainly strawmen that don’t substantiate the “abandoning fundamentals of computer science” headline, and Felliesen’s piece (when read as an argument against these changes) is simply reductionist.
The article focuses on the change to Python, but the core of its actual argument against Python seems to be this:
But the new first course isn’t starting with Python, it’s starting with Pyret and Python! Pyret is a language with some Python-like syntax, but designed explicitly to be a good teaching language.
From the Pyret home page:
The why Pyret? page seems to make a more detailed argument.
The announcement says that the first course will bridge to Python towards the end, but to me that sounds like a great middle ground for teaching a language the students will use later.
If the argument is that both full Racket and full Python are bad introductory languages, but that they have corresponding teaching languages that form a bridge back to them, then I see no inherent reason to prefer Racket over Python. But there are many non-inherent reasons to prefer Python, particularly that it is more widely used.
The article’s second point, that students can now use AP credits to skip courses, is well addressed by the announcement page. My reading is that the instructors are taking the potential loss of fubdamentals from the intro sequence seriously and are interested in helping students make the best choices for their situation.
The third argument is that the courses are becoming easier:
But the announcement emphasizes that the change is designed because OOD in particular is too difficult, and instead of decreasing difficulty, they want to shift the difficulty so it’s more even with the earlier courses:
Felliesen’s piece does mention that the first two semesters intentionally “proceed in a slow and steady way”, but the changes are addressing a problem in the third course, and his argument doesn’t feel like it would actually counter this point.
Finally, the conclusion the article makes from these points is that:
But the announcement addresses this directly:
Sounds like fundamental computer science to me.
(Note that I don’t have the full context, and am relying solely on the linked articles. There may be a more substantive objection to the changes, but I haven’t seen it.)
I’m not going to say it … I’m not going to say it … Ivory Tower
No, I read through most of the debate here and I agree with everyone. How can that be? It especially pains me to see reasonable people fighting each other, but that’s a separate matter.
I think NE reacting to many employers giving them the feedback that filling the graduates heads with Racket knowledge is not as effective as teaching them Python is sound. Yes, it seems a bit commercial, but I think it is just commercial enough. If they turned into MS Access University, then I would be on the picket lines (metaphorically) too.
Surprisingly, it’s quite the opposite: employers by and large love the flexibility and capability of Northeastern students on coop, compared to others. This isn’t coming from employers.
You think it’s the students? I took part in a session where we spoke with high school seniors and one of them asked me about Racket and if we used it and if I knew any company that used it.
That question makes a lot more sense now that I know NE had that as a central part of the curriculum.
Kids will ask these sensible questions and so will employers. I think it’s likely they have a decent instinct asto what has value.
Most people aren’t in the game for platonic reasons.
It’s neither the students nor the employers: it’s the administration. (ETA: priime0’s comment is pretty accurate.)
I have an older German degree (diploma) that was generally 10 semesters (most people needed 11-14) which is roughly like a MSc, but it’s basically all-or-nothing (i.e. no going away after 4 semesters with a degree). And while I see a lot of benefits in BSc + MSc.. we just had more time for fundamentals. The first 4 semesters (so the same time as a BSc afaik?) there was like:
All the “applied stuff” beyond the mere basics came either later or in dedicated other courses. I think this broad curriculum has been lost
I’m not sure how long a BSc is in the US, but at least in Germany a BSc is 6 semesters, of which 4 semesters are focused on fundamentals.
My curriculum looked like this:
And 5/6 were almost entirely filled with courses you could freely choose, with the goal being that you start writing your own papers and contribute to the actual science.
I had to take a break for mental health reasons, and once I returned I realized all the courses had been switched over to Java and most of my credits couldn’t be transferred anymore (which is why I dropped out). It was quite eerie to see how quickly they destroyed a really good CS course.
oops, yes - I mixed up 6+4 with 4+6 - but my point was more that they still have to cram all the basics into the first 6, plus anything that supposedly makes you a well-rounded graduate - whereas we had ONLY fundamentals (plus minor subject) in the first 4.
Also yeah that sucks, I can’t imagine that happening at my uni/time - because we literally had the same “Informatics I” course in another language every year or two, depending on the professor, so you needed this exam, and there were no credits, but afaik nothing was ever changed without many years of leeway towards older “I passed this course”.
The problem I have with this topic is that learning seems to be a very personal thing to me, and everyone usually just learns the fundamentals once, after that it’s just more programming languages and a few concepts.
Didactics of learning isn’t a field of its own without reason.
That said, I find it interesting but I can hardly find two people who agree. Personally I don’t think it matters much, and it’s hard to trial. How would you compare several cohorts from different universities/colleges with different curriculums?
But then again my own journey was more like: I hated the first semester for several different reasons, one of them that I had coded for money beforehand and they seem to be doing everything differently. And while I’ve always been a smartass, in this case I took the same intro course (FP) in the third semester again (different prof, different language) and enjoyed it very much.