This issue is a fundamental one that everybody teaching programming or computer science must answer. Is it better to teach CS from the ground up or top down?
The ground up approach is something like SICP, with fundamentals in lambda calculus or Turing machines. Students learn rules such as how a Lisp evaluates an expression and write programs which apply the rules. It's not necessary that this be taught using Lisp, but it seems to be popular, because it greatly reduces distractions when understanding and writing actual programs. In any case, the ground-up approach generally teaches first a system of rules, and only once the rules are understood does it move on to programs.
The top-down approach, on the other hand, starts with programs. Often the students are given a partially written program and are asked to improve it. The curriculum doesn't focus on rules because they all have exceptions. It's much more like engineering and less like mathematics. As the article says, nowadays "a real engineer is given a big software library, with a 300-page manual that’s full of errors. He’s also given a robot, whose exact behavior is extremely hard to characterize...."
What's better? Some schools (such as my alma mater, Brown) have two intro classes, one for each method of teaching. I chose the rules-based bottom-up approach when I was an undergrad, and it was very good, and I was convinced it was the better way to go.
But I'm losing my conviction, partially because MIT is changing it and they must know what they're doing (heh), and partially because I'm coming to the understanding that everybody uses libraries and this is not going to change. The top-down approach doesn't really provide any sense that there should be libraries, that code should be organized, that you can write to an interface and document your code. People can learn these sorts of things later, though.
Unfortunately, when MIT moved from 6.001 in Scheme to 6.01 in Python, they also changed later courses to Python because now students wouldn't have Scheme experience.
This results in:
6.005 ("software engineering") in Java
6.006 (intro to algorithms) in Python
6.034 (intro to AI) in Python
6.035 (compilers) in Java
(6.005 was 6.170 which used Java and 6.035 has always used Java afaik so this list isn't all the new curriculum's fault... but it does give a good overview of MIT's undergrad CS decline)
Frankly, this is unacceptable. I'm not sure I would hire an MIT CS grad that did the new curriculum. It is absolutely absurd that MIT (which purports to have one of the best CS programs in the world) is teaching Java and Python in their undergrad CS curriculum even in places where Java and Python are not the best suited (compilers!? algorithms!? AI!?). For instance, one 6.005 pset is to build a Sudoku solver... in Java. Every MIT undergrad should have the ability to learn a new programming language. 6-3 students (CS majors) should especially be able to do this. MIT is getting watered down.
Students don't learn other programming paradigms and they learn to accept the bloat and poor design decisions of the required languages. Where once students would build a text adventure and a metacircular evaluator in Scheme for 6.001, they now build what amount to Lego Mindstorms kits. Seriously?
The program I was in didn't even try to do things like this. Web course? Use perl. OS course? Use C. Soft Eng? Use Java (people demanded at least one Java course). If you can't learn the appropriate language within the first week of the course, you probably should have a different major.
Naturally some people were very upset about this, but it definitely made for a better program all in all.
This was the same at my university (Santa Clara University, http://www.scu.edu/engineering/cse/): introductory courses used C++ (for "intro to computing" and data structures), assembly (for a computer organization course) and Haskell (for the SICP equivalent -- not sure if it's still a requirement).
Upper level courses would then expect students to pick up Verilog/VHDL, regular C, assembly, lex/yacc, Scheme/Lisp, Java and Perl/Python as needed.
I agree - after freshman year, don't worry about whether the students have prior experience in a language or not. My first experience with Java was in a Database class: The teacher gave us a project, said "use Java". She linked to the Java tutorial, and I learned enough for the project in a day or two. I learned Perl the same way (for a bioinformatics course)
Of course, if they had been languages in a different paradigm, (e.g., Scheme, Prolog) it may have taken me a bit more time to get going. Still, no reason to not use these languages.
Any computer science student should be able to learn a new language quickly to get a project done. It's an important practical skill for their careers anyway.
Frankly, I know I would never hire anyone with your view of CS.
While I understand the fondness many people feel for Scheme, building an entire CS curriculum around it strikes me as particularly problematic. Scheme and Scheme's approach to programming can, I'm sure, be useful as one part of a larger curriculum, but more often it feels as if I'm talking to someone who, say, learned how to take a derivative via limits, and then decided that it would be all right never to learn anything more about calculus in the course of a mathematics degree. By analogy, building a REPL given only a small set of atomic language bits to start with simply is not the totality of either theoretical or applied computer science, and should not be pushed as such.
You don't believe in using the right tool for the job? In learning a variety of paradigms?
Perhaps we have misunderstood each other. I'm not pushing Scheme or the metacircular evaluator as the totality of theoretical or applied computer science. My interest is entirely in the educational value of building a REPL versus, say, a robotic control system. MIT has a lot of robotics opportunities from clubs to IAP (winter term) competitions to UROPs (undergrad research). MIT doesn't have a lot of REPL building opportunities.
In fact, I believe it is possible with the new curriculum to graduate from MIT with a degree in CS and have never built a REPL or a compiler. That seems a little... misguided.
I don't rail against this change because I mourn Scheme or hate Python. I rail against this change because I feel it fundamentally weakens the quality of an MIT CS education.
I rail against the railing because, frankly, so much of it consists of "how dare anyone call themselves a programmer if they didn't build their own Lisp from scratch in 6.001!"
This simply is not a useful approach. And, honestly, as a working programmer there are lots of things that aren't compilers or REPLs that I can think of, all of which would be at least as useful for students to have experience with, and none of which are, so far as I know, part of MIT's or anyone else's curriculum.
But I manage to live with that, rather than demanding that MIT build a curriculum around what I happen to think is important.
(and, honestly? I still feel like Scheme is the derivatives-by-limits approach to programming -- yeah, you can do it that way your whole life, but that doesn't mean you should)
6.001 was required and at least walked you through the construction of a metacircular evaluator. While this isn't building a compiler or interpreter (Scheme cheats), it seems to be more than we have now. :-(
I have been taking Carnegie Mellon graduate CS classes part time, and for the most part I have been able to use any programming language I want for assignments (within the bounds of "The TA knows at least enough of that language to read and understand your code"). I have used this as a fun excuse to learn a new language just to do the projects and assignments for a course. I've done this with Common Lisp, Python, and Clojure so far. Some times the source code isn't even required, just your answers to the questions and an idea of how you arrived at them.
It seems a much more grown up and civilized approach to me. Maybe this is because it is graduate level and not undergrad? I remember CMU undergrad classes requiring C, Scheme, Prolog, and Pascal, but that was over 20 years ago.
Quite frankly I'd rather be working with robots than building text adventure games (been there, done that: when I was 13). And while building a meta-circular evaluator is interesting, I don't see how it can be considered a central tenet of introductory computer science. Also, both Python and Java have implementations that are meta-circular (PyPy, Jikes RVM, and Squawk), so it's not like you're shutting the door on these concepts to beginner students by bootstrapping them with conceptually-limited languages.
silentOpen - The only class in which the language has been changed due to the lack of Scheme in 6.001 is 6.034. As students branch out and take electives, there are plenty of opportunities to learn other programming languages - the UI class this year, 6.813/6.831 (undergrad/grad), had problem sets using Adobe Flex. My current Distributed Systems class (6.824), the Graphics class (6.837 - an undergrad elective), and the Operating Systems class (6.828) all use C++. All have the mentality, "don't know C++? Here are some links, go learn it."
There are constant opportunities within the MIT curriculum to learn other languages, and while I had the pleasure of taking 6.001, frankly - if an undergrad doesn't take advantage of any of those opportunities and leaves college only having used Python and Java, that's their flaw - not the Institute's.
Finally - to play devil's advocate in response to the REPL / compiler argument, of all of the assignments in 6.001, writing the metacircular evaluator gave me the least accurate representation of the power of computer programming as a whole. While it was an interesting exercise, if I had been interested in language design, I could have taken an elective more focused on the topic - as is still an option at the Institute.
I think your claims about the tragic decline of the quality of an MIT CS education are a bit dramatic - few MIT students seriously considering a career in computer science graduate as lopsided as you seem to believe. Your efforts may be better spent railing against why 40% of all undergrads graduate to take jobs in finance and consulting, despite the vast majority of students graduating with engineering degrees. (Source: http://web.mit.edu/career/www/infostats/graduation.html)
ubernostrum - a point of clarification, the "entire CS curriculum" was never built around Scheme. 6.034 was the only class that used Scheme after 6.001. I believe a graduate class existed in the recent past that also focused on Scheme and its interesting properties as a language.
6.828 uses C. C++ and C are still the same paradigm as Python and Java. I'm glad these courses use the right language for their topic but they don't really expand your horizons.
I want to know where Lisp, ML, Prolog, and Smalltalk are. I'm particularly concerned about Lisp and ML (incl. Haskell and ML derivs). Does MIT just not care about FP any more?
If you're a CS student and you haven't seriously worked with functional languages by the time you graduate, something is wrong. There is nothing to prevent this now. Many students will not seek out these languages on their own but it is decidedly in their best interest to acquire experience with them and MIT, to produce 'well-rounded' computer science graduates, should require/encourage it.
Your efforts may be better spent railing against why 40% of all undergrads graduate to take jobs in finance and consulting
I was going to make a snide comment wondering why Scheme was necessary for training future investment bankers and lawyers, but I just had anecdotal experience and didn't want to spread false information. Thanks for the numbers.
(Through chance I was a TA at MIT at the turn of the millennium. Pretty much everyone I taught had plans of working on wall street or going to law school.)
I've never heard this characterized so well. There was a <something> that I had always been trying to put my finger on when I'd read these sorts of articles and the top-down/bottom-up description is right on the mark.
My own feeling is something like this. Before Newton there was Kepler. Now Kepler was no dummy and he used the exacting measurements of Tycho Brahe to arrive at a very accurate model of planetary motion. He found that planets traveled in ellipses not circles, and he knew that they swept out equal areas in equal times (among other things). In short, he had a very firm "top-down" grasp on what planets did.
Then along came Newton, a "bottom-up" thinker if there ever was one (calculus was invented in what was perhaps the most supreme feat of yak shaving ever http://catb.org/jargon/html/Y/yak-shaving.html ). He found that there was an underlying and unifying idea, gravity, that explained why the planets behave as they do.
So to cap off my analogy, I've found that if I've worked in a sufficiently bottom-up way on something then sometimes what seems complex or intricate collapses down into some small and elegant solution that I wouldn't have seen if I were coming from the other direction (or at least it would be much more difficult).
Great analogy. I guess the answer is "people should be able to apply both ways of thinking". So how do you impart both in a curriculum?
I have observed that for great hackers, it doesn't matter what method they are taught -- they'll learn both and apply them appropriately. This was probably true for Newton. It's certainly true for one of my best friends, an excellent hacker, who is as much a bottom-up thinker as anyone could ask for and yet he took the top-down class. He was going to learn how to think about problems in the optimal way no matter how, or what, anyone taught him.
I'm not sure what this means for how the intro course should be taught. Certainly it seems to suggest you won't be ruining anyone with great potential by teaching them the wrong stuff. So maybe MIT has realized that it doesn't matter for the best students, and they've been doing the same thing for 30 years and it's time for a change. What the hell. See how it works, and then maybe change back or learn something new. They're going to have to run this experiment for a long time, though, in order to figure out whether it's actually better. I'm quite interested to watch.
I'm graduating from MIT (hopefully) in under a month with a degree in CS. The new curriculum is an abomination. If you are teaching some of the (supposedly) brightest students in the world, you shouldn't worry about teaching marketable skills or using popular languages. Your students should be able to pick up a new language easily.
Luckily, I took all old-curriculum classes. If I were a student entering college for CS now, I would not choose MIT. I don't know other schools' curricula in depth but some place has got to be more rigorous (Berkeley? Stanford? CMU?).
The arguments for changing the course do not include teaching marketable skills or using popular languages. The main argument is that the practice of computer science has fundamentally changed since the course was originally developed.
The argument is that computer scientists rely more on existing libraries and systems that often require fundamental research for an individual to comprehend. They have changed the course to reflect this using robotics and a library to control the robots. That library happens to be written in Python. They didn't start with "Let's change to using Python" and develop the course around that.
The validity of this argument is debatable. But I don't think your reasons address it at all.
It's not just 6.01/6.001 -- it's the entire undergrad CS curriculum. Moving these classes toward Python because 6.01 found a Python robotics library (from MIT, coincidentally) does not justify moving other things to Python.
Python's a great language, don't get me wrong but you're being misled if you think that popularity and marketability were not factors in selecting Python for the new course 6 curriculum.
As for the argument that "computer science has fundamentally changed", I agree. Unfortunately, what is really meant is that softwareengineering has changed. You can learn computer science concepts just as well with Scheme or Python or Smalltalk or OCaml...
Additionally, while library use may be more prevalent in industry now, that's no pedagogical argument for teaching "library use" (whatever that is).
Library use is relatively easy. Reading docs is hard for a lot of people but learning to read docs can be done with systems or languages instead of libraries.
It all boils down to what will serve the students best and what will let MIT deliver the most value. Students can learn python and library use on their own relatively easily. Fundamentally understanding recursion, abstraction, complexity, scoping, FP, OO, and other more abstract topics is considerably harder working alone. 6.01 claims to still cover these topics. 6.01 claims to integrate them with EE and robots to make the class fun.
From the conversations I've had with 6.001 students and 6.01 students, 6.001 does a much better job with these topics. 6.01 can and will improve, of course. Unfortunately, I don't think teaching about robots in Python will give students as solid a grounding as SICP.
MIT's new course 6 curriculum falls along similar lines as the 8.01/8.02 (intro mechanics and e&m) move to TEAL (a bastardized blend of game show and "hands-on" computer work that feels like high school). See http://tech.mit.edu/search.html?cx=000823599697007823270%3Aq... for how TEAL has been doing.
"Fundamentally understanding recursion, abstraction, complexity, scoping, FP, OO, and other more abstract topics is considerably harder working alone."
Reading SICP on my own time helped me understand these topics better, and helped me understand some things about Java better (like how anonymous inner classes are a half-assed, broken attempt at implementing closures). SICP makes sense of these topics in a way that I doubt is even possible in a class taught in Java. You can probably cover a lot of this material with Python, but still run into more limitations and inconsistencies than with Scheme.
Interestingly enough, I'm also an MIT '09 (hi) - and while yes, I loved the old curriculum and I wish they were still on it, you're making all these claims about the new curriculum that are simply not true. The "entire undergrad CS curriculum" has NOT changed to accommodate the shift to Python. 6.034 was the only one that changed at all.
6.006 does Python, but it's new and 6.046 had no practical edge to it at all. As a student who had a little bit of difficulty with the theoretical steps in 046, I can understand why they added the "test this and prove to yourself that this makes sense" exercises in Python.
As lame as it sounds, look into 6.00 - it's an "intro intro" programming class mostly required for Course 20 (Biological Engineering) students, but it's surprisingly robust as an introductory class - covering a lot of the topics you just listed, and well.
6.034, 6.046 (now 6.006), 6.001 (now 6.01), 6.02 all use Python. There are/will be more most likely. These are all new or refurbished classes to support the new curriculum. That's a pretty major shift.
I've helped a number of people with their 6.00 work and read quite a bit of the course material and I have to respectfully disagree. Students in 6.00 don't learn anywhere near what was taught in 6.001.
Right, but 6.00 is also not aimed at Course 6 students. I brought it up to provide an example of what I would've liked to see 6.01 / the intro 6 class be like, if they were going to Pythonize / simplify 6.001 at all.
How have I been misled regarding popularity and marketability? That is, what information do you have that I do not?
Note that I said, with added emphasis, "the practice of computer science has fundamentally changed." This idea rings true for me, as a systems researcher. I have to do as they describe to do my own research. "Library use is relatively easy" greatly underestimates the difficulty of accomplishing non-trivial tasks with new hardware, even in the presence of published specs and available library.
Also, answering your own rhetorical question even though you don't actually know the answer is not support for your argument.
While Gerry Sussman may not have said it, popularity and marketability were absolutely factors in the decision to adopt Python for the new curriculum. Any sane CS department would take these into account. Unfortunately, it has become increasingly apparent that in many cases MIT in general and course 6 in particular make decisions mostly because of popularity, marketability, buzz, or peer pressure. This is not how you innovate.
"Library use is relatively easy" is not true for all cases; you are correct. 6.01 uses libraries which are well-built and relatively friendly. This is the first 6 class students take, after all. Classes later in the curriculum will have students using libraries of their own selection or writing compilers or operating systems for modern processors (should the student choose to take those courses). Between teaching fundamental concepts and teaching how to use a library, concepts should win out in introductory courses. Whatever skill it takes to use a library or documented system will be learned in time.
I don't absolutely know the answer to whether Caltech would do something similar but I would wager a great deal that they wouldn't. Have you looked at Caltech's required courses? Talked to Caltech students? Looked at MIT's required courses? Talked to MIT students? If you do, you will notice a very clear trend. Although MIT and Caltech are ostensibly peer institutions, the last two decades have seen a marked (relative) decline in the intensity and rigor of MIT's undergraduate programs.
"You're being misled if you think that popularity and marketability were not factors in selecting Python for the new course 6 curriculum." Well, I suppose it's possible that you belive Prof. Sussman and Prof. White are lying. I've known both of them for a very long time and find that utterly implausible, but I suppose you have a right to your opinion, however informed or uninformed.
I didn't do my undergrad at Stanford, but I'm here as a grad student, and I believe they use Java for the intro classes. They do teach Python and C eventually, but no Lisp AFAIK.
I did my undergrad at Georgetown, where nearly every class used C++ (or C, for classes in things like OS and security).
I did my undergrad at Stanford, and after taking two simple intro courses, we had the first real intro to paradigms course (CS107). In that course, three languages were used: C++ (for a data structures project), Java (for an OOP and Concurrency project), and Lisp (for a context-free grammar project). I don't know if the course is still taught this way, but I thought it was great.
There's a new CS107 this year (along with a few other classes; they just redid the undergrad curriculum). One of my friends is a 107 TA and he is actually sitting next to me right now. Apparently 107 no longer includes anything on Lisp. :(
Ah I probably do not know you then. I graduated in '04. Do you know Zico? He graduated in '05 and is a grad student at Stanford now I believe. We were in the same algorithms class.
I don't know him personally, but I know who he is; I think we met once when I was a freshman, and then he gave a lecture for one of my classes last quarter. Andrew Ng speaks highly of him.
If you read my original post, you'll see that it has absolutely nothing to do with teaching marketable skills nor popular languages. The point was that the change in languages was not a goal in itself, but merely an incidental consequence of what the real goals were. (The title of the blog entry was meant to be ironic.) http://danweinreb.org/blog
6.003 (Signals and Systems) and 6.004 ("Computation Structures" -- transistors to microprocessors) were great classes. I don't know what they've done to them since I took them. 6.033 (Systems Engineering) and 6.046 (Intro to Algorithms) were also great classes. 6.046 has become 6.006 and 6.046' now. I've heard mediocre things about 6.006.
6.945 (Large-scale Symbolic Systems) is an excellent class. Afaik, it's still taught in Scheme by Sussman.
All these classes cover quite a bit of material in not-very-much time. They don't get bogged down by whatever language they use (if any) and they straightforwardly teach fundamental concepts in some depth. They have high throughput.
I find this justification downright weird. Yes, a class like 6.001 is an extremely purified and unrealistic view of modern software engineering. But the same could be said of any theoretical subject. The people at the Large Hadron Collider are probably spending a lot more time reading 300-page technical manuals than they are reading Feynman.
A lot of the charm of academia, to me, is that it gives you some breathing room to step back from the mess, and look for unifying principles. There might be a bit of a shock when the student first graduates, but in the long term they're often better off with the kind of knowledge that they couldn't easily pick up through osmosis.
From what I've been reading about this issue, I think many people are missing one important point: 6.001 was an introductory course, the contents of which would be rehashed and expanded in several later courses. That the contents of this course has changed does not mean that MIT students do not learn about these concepts anymore.
Before 6.01 was introduced, MIT didn't have any required undergrad CS courses that required anything besides Scheme and Java! Is that much better? Frankly - I think if you're starting to argue simply based on language, you'll find few supporters.
The strengths of the old curriculum were the concepts you learned through 6.001 and using Scheme, not the Scheme skills themselves. Do I think 6.034 would be significantly different if I had to use Python versus Scheme? Not at all - and frankly using Scheme added nothing to my experience in that class.
It's not the language that is important, it's the programming style(s) the language supports. With Scheme and Java, you get a functional language (and one in which other paradigms can easily be implemented) and an OO-ish language. Pedagogically, I think that's superior to a sorta-functional-and-sorta-OO language and a OO-ish language.
I had a different experience in 6.034 than you did, I suppose. I think Scheme suited the class well and offered a nice way to express searches, minimizations, and decision systems. I'm sure you can do everything you can do in Scheme in Python but you could also do it in Java. Functional languages are particularly well-suited to these tasks. I wouldn't necessarily pick Scheme, though. Why not use the most appropriate tool for the job? If students have to learn a new language, OK. If you really do think Python is the best tool, OK.
I'm in the middle of taking the undergrad PL class at the University of Washington and I've come to the conclusion that classes of this sort can be whatever you make them. We spent the first five weeks learning/using ML, recently switched to Scheme, and will dive into Ruby for a few weeks before the quarter ends. While I'm sure many of my peers will leave the course thinking of functional languages as a quirky set of under-developed relatives to the tried-and-true OO family, I've spent the last 6 weeks breathing functional programming, both in my coursework and in places like this thread. I feel that I'm taking more away from the class and that much of introductory computer science works this way. The burden of learning is on the student to become engaged in the subject matter and make use of the resources the school and professor provides.
At the end of the day, the department won't make the student great. To a degree, a driven and talented student can succeed anywhere, regardless of how many ooh's and aah's a name-dropping of their school will produce.
An intelligent person, particularly one with natural aptitude for programming will end up fine regardless of which language they start with. Also, anybody that truly starts programming in college is a rather sad candidate to begin with.
Also, Python is a much more practical choice than Scheme, and has technical merits which are at least as attractive as Scheme, and arguably more so. Scheme is elegant. But Python is also elegant, yet more practical. From that angle, looks like a net change for the better.
MIT also strikes me as a school oriented more towards producing engineers rather than programmers. And if you're going to school at MIT just to get into a career in programming, that sounds like a terrible waste of money. Robotics or electrical engineering? Probably a good choice. But programming? Come on.
Then there's the whole argument of why anybody needs to go to MIT, or even get a college education in CS. We live in a world with the Internet and scads of free books in libraries and documentation online. Follow that line of thinking and the whole controversy over this tweak in some random school's class content seems silly. It is as if nobody can learn anything outside of a class, so if it is not taught in that particular class at MIT, it will never be learned, and the world will end. Hilarious. :)
Every time this story comes up I'm shocked at the number of CS MIT grads there are on the internets. MIT must be graduating something like 50% of the total internet.
Also the comments on this story are always of the type "Well when I was in school things were taught right. The day I graduated it all started going downhill and now I wouldn't hire someone graduating from that school."
The title is a bit misleading. The gist of TFA is that MIT is switching from Scheme to Python in its INTRODUCTION TO PROGRAMMING course. That would seem to me to be a bit of a no brainer. I find python to be a much more acceptable alternative than BASIC in introducing people new to coder in a way that is more in line with sound computer engineering practices.
I started with C, but from what I've heard, Scheme actually makes plenty of sense as a first language. There's a Marvin Minsky quote, "Anyone could learn Lisp in one day, except that if they already knew Fortran, it would take three days." The "complexity" of Lisp comes from our preconceptions from different languages (Minsky presumably said that when Fortran was more in vogue).
because SICP was a great introduction, personally I think that Scheme (at least at first) is easier to pick up than Python. Our professor taught us basic Scheme in 40 minutes no problem. Python takes longer than that because there is more syntax. Basically all you need in scheme are some () and define, lambda, cons, car, cdr, and cond for the first 4 or 5 weeks.
It it just me who is seeing a cowardly surrender to cultural decay here? From the renowned Sussman, no less.
The glorious MIT of the 1980s and prior appears to be dead. Erased, in fact, without a trace. Consider the following:
These are the latest releases from MIT press. Among them you will find nothing remotely like SICP, but plenty of postmodernist/related pablum.
"You have to do basic science on your libraries to see how they work, trying out different inputs and seeing how the code reacts." Is this not an atrocity, to be fought to the last bullet? Is this not an argument for declaring all existing software obsolete and starting from scratch? Why are we - even luminaries like Sussman - so willing to give up on the future without a fight?
As argued in some of PG's essays, in order for creativity to bear fruit it is not enough for a given individual to possess a creative mind. The culture has to be hospitable to creativity. And there are processes which come close to stamping out creativity without any overt or deliberate suppression involved. Specifically, a transition to a medium where one cannot get reliable, understandable "small parts" having predictable behavior.
Programmers have indeed created a universe where "science doesn't work." Learning where the permanent bugs and workarounds are inside a phonebook-length API teaches you nothing. It is anti-knowledge. Where your mind could have instead held something lastingly useful or truly beautiful, there is now garbage.
There is no longer a "what you see is all there is" Commodore 64 for kids to play with:
No one is working on, or sees the need for a replacement. This is just as well, considering as one would have to start from bare silicon - and avoid the use of design tools built on the decaying crud of the past. Only a raving lunatic would dare contemplate it...
Outside of programming: Linus Pauling developed an interest in chemistry by experimenting incessantly throughout his childhood. Today, he would have been imprisoned:
The new generation will have no Linus Pauling, unless the Third World - where one might still purchase a beaker without a license - supplies us with one. Likewise, we will see very few truly creative programmers. What creativity can there be when your medium is shit mixed with sawdust?
I think this is a technology evolution natural move. This will probably happen every few decades to the most capable new language or platform.
There is a strong religious backing to Scheme being the only way to teach core CS fundamentals at MIT. I think that is an emotional almost fanboy reaction at times probably filled with heavy bias.
Python is a great balance of showing many sides of programming, it can be as eye opening as Lisp. Python is functional and object-oriented. Python is a simplifying tool and culture. All platforms used here should be simplifying.
Python can get you building market ready desktop applications, web applications, building robotics, scientific computing, game development, algorithms and AI and nearly anything out there Python is at the tip of the spear. Python is rapid iterations and prototype friendly.
The frameworks of Python are more capable to wrap nearly anything, that is what software engineering is about now. It is the same evolution software process has taken from the CMM, to CMMI (supporting modular and libraries), to Agile and a more natural iterative process rather than top down design everything from the bottom up approach. You can still do that, it is just not the majority of software engineering today, and it will continue to simplify.
Are Scheme and Lisp programmers who are biased because they had that more hardcore bottom up technique really thinking this degrades the experience or is this more of a bias that is being attacked. Or has software engineering fundamentally changed?
Scheme will not go away. This does not mean that people will stop making compilers or REPL. It simply means the starting place is different. It might even drive some better compilers and multi-platform tools because of the quirkiness of many compiler systems out there will drive good engineeers to simplify that process.
That is what we do, we simplify problems.
I would argue Python makes for more marketable and capable graduates to be successful almost immediately after school, but I don't think it harms the fundamentals much. Good developers and engineers still take time to get better. No one is the best programmer in college, it takes time and experiences after the academics to be highly skilled. Python fits closely with computer science and is very capable of taking the torch.
I do think that there is a benefit to learning from a more difficult and core understanding because it is more downhill from there but Python is hardly the worst case scenario here.
I think that Python is perfect for teaching CS because of the flexibility, libraries, open source but support by Google (they are big on CS and like Python) and many other reasons.
What can you make in Scheme that you can't make in Python, very little.
Would you rather it be Java or C# they are teaching?
Because we know what it is like to work in a medium that can be understood, behaves correctly, isn't peppered with inconsistencies, and does not force you to clutter your brain with pointless trivia. Call that bias if you will.
> the quirkiness of many compiler systems out there will drive good engineeers to simplify that process
There is no evidence that this is happening or will ever happen. Almost everyone shuts up, bends over, and spreads wide to accept whatever level of pointless complexity the system they are forced to work with has. Programming systems are continuously growing more Byzantine and idiotically laden with accidental complexity as feature is piled on top of feature. This is how we got Python, C++, Java, C#, et al.
Teaching has always to do with bringing something really new and perfect to a still quite fresh mind.
So, when teaching, you always need to bring the simple and perfect theory.
Practice is what your students will make out of your 'perfect' theory -- slumming down quite a bit -- but if you start with bringing a 'practical' theory to begin with, your students will never learn to fly high (bringing in some really fresh new ideas).
The ground up approach is something like SICP, with fundamentals in lambda calculus or Turing machines. Students learn rules such as how a Lisp evaluates an expression and write programs which apply the rules. It's not necessary that this be taught using Lisp, but it seems to be popular, because it greatly reduces distractions when understanding and writing actual programs. In any case, the ground-up approach generally teaches first a system of rules, and only once the rules are understood does it move on to programs.
The top-down approach, on the other hand, starts with programs. Often the students are given a partially written program and are asked to improve it. The curriculum doesn't focus on rules because they all have exceptions. It's much more like engineering and less like mathematics. As the article says, nowadays "a real engineer is given a big software library, with a 300-page manual that’s full of errors. He’s also given a robot, whose exact behavior is extremely hard to characterize...."
What's better? Some schools (such as my alma mater, Brown) have two intro classes, one for each method of teaching. I chose the rules-based bottom-up approach when I was an undergrad, and it was very good, and I was convinced it was the better way to go.
But I'm losing my conviction, partially because MIT is changing it and they must know what they're doing (heh), and partially because I'm coming to the understanding that everybody uses libraries and this is not going to change. The top-down approach doesn't really provide any sense that there should be libraries, that code should be organized, that you can write to an interface and document your code. People can learn these sorts of things later, though.