8 ms·
Dijkstra on Haskell and Java (2001)
- fishnchips 12y agoMy main problem with teaching CS courses in Java was that it produces folks who have no clue about pointers or memory management in general. This however applies to Python and Haskell as well. I personally had a strange mix of Java, x86 assembly and Ruby in my curriculum.
- mp8 12y agoI was lucky to get a mix of C, Java, and Haskell. Unfortunately (to my detriment) I totally ignored Haskell, and it didn't really click until I picked it up at the end of my degree out of curiosity- it really does help to clarify one's thinking. I think teaching the motivation for learning it before beginning would have been better than just throwing it at freshmen, but I can't truly blame anyone other than myself.
- zak_mc_kracken 12y agoThat's like saying "The problem with teaching people how to drive cars is that at the end, they don't know how to ride motorcycles". There are plenty of other classes at the grad and undergrad level that teach you about lower level concepts such as pointers and memory (system, C, OS, ...). The Java classes teach different concepts.
- fishnchips 12y agoI never got C or C++. The OS course, sure, but it was awfully theoretical and we didn't get to code all that much. Depending on the rest of the curriculum you should probably decide what to use to teach introductory CS.
- noelwelsh 12y agoA classic curriculum in functional programming, which goes back as far as SICP and is continued in modern books such as PLAI, is to build an interpreter for a programming language. This forces issues like memory management to be discussed.
- lern_too_spel 12y agoDijsktra isn't suggesting that the entire computer science curriculum be taught in Haskell. That would be impossible. He's saying only that the introductory course in programming paradigms be taught in Haskell. Haskell and Scheme are well-suited to such a course.
- JSno 12y agoBut to be honest, to implement Dijkstra Alrogithm for shortest path problem. C++/Java are still the easiest languages. By using Haskell or Scala, much harder and counter-intuitive.
- Gyonka 12y agoI agree with him in the sense that these are CS courses, and in in such a way Haskell ties together well with the math that one learns in a CS program. Keeping that in mind it makes sense to only have taught Java in courses specifically designed for developing software.
- mathetic 12y agoI am looking forward to the day the notion that functional languages are not suitable for developing software will die. It is not only that functional languages are more succinct, easier to reason about and are more readable, they also often come with significantly better type systems. Some have type systems sophisticated enough to specify nearly all the legal states and guarantee these are the only states the program can stay in at compile time. One can look at languages with dependent types for that. On the more practical front, Erlang proved itself over three decades to be one of the best choices when it comes to fault-tolerant, highly concurrent systems. Jane Street is using OCaml for all of their trading software, Morgan Stanley has moved to Scala, and so on and so forth.
- Gyonka 12y agoI suppose you are correct, although all the training I received for software engineering was in straight OOP Java. I really dislike java in general. Now I write mostly in python and go, learning a bit of haskell.
- CJefferson 12y agoThat day will come, for many of us, when a large AAA game, web browser, or usable OS is written in a FP language. And I realise that is an unfair target, but there is very little user facing FP software. The only one I can think of I have used is xmonad, which is both hard to use and fairly buggy
- pjmlp 12y agoYou mean like Crash Bandicoot, Abuse, Jak and Daxter? Or maybe Genera. Or maybe Remote Agent software used by Nasa Deep Space 1? Or eventually the train control systems running on software from Siscog?
- jfaucett 12y agoI don't see why they don't just teach C, x86, and Haskell everywhere. If you know the concepts behind these, you can quickly grok any other programming language. Also I never got the whole hype behind OOP. IMHO its self explanatory, nothing you need an entire course on to be effective and understand OOP programs. Memory layout and management, advanced pointer concepts and monads are a slightly different matter. If I had to teach someone OOP I'd say, OOP is like the real world if it were made of puppets and every puppet could pull another puppets strings, pull a string and a dog barks and wags its tail causing a cat to meow, the key is just not tangling up your strings.
- fishnchips 12y agoI love the analogy. I'll use it with my freshman students.
- dkarapetyan 12y agoIn that sense imperative programming is equally hyped. It too is like the real world, first you do this then you do that. Similarly there is nothing fancy about functional programming since algebra and calculus already introduce the ideas of composing smaller things to get bigger things. What I'm getting at is that computation exists on several planes of abstraction and maybe covering C, x86, and Haskell might give you a good overview it will still leave things hidden because there is also Prolog and the branch of computation that Prolog leads to. Most schools settle for teaching their students the theory and some marketable skills by sticking to well-known languages like Java and Python.
- Arwill 12y agoThe problem is, people finish their CS study, and do not have such level of knowledge that they could start working right away. So Haskell might be nice, but is hardly a sought for skill. Sure if students would learn different stuff by themselves, they could learn useful skills too, but most of the students are lazy, and only learn what they have to.
- weeksie 12y agoThis is the worst attitude. University is not supposed to be vocational school.
- deleted 12y ago[deleted]
- deleted 12y ago[deleted]
- MrQuincle 12y agoAlthough I didn't do CS, but electrical engineering, I would have loved to get some more exposure to functional programming. We got Scheme which everybody hated because of the cumbersome bracket counting. And of course we got C, Java, Matlab, and VHDL, besides a bunch of assembly. VHDL or Verilog would maybe also a nice eye opener for CS students. It's again another mindset.
- acallan 12y agoIndeed, my first CS class in 1999 at UT was in Haskell. Wow! What a change it was from high school AP Computer Science in Texas, which was (in those days) C++. Seeing QuickSort in just one line was what hit it home. I remember thinking at the time that this was really incredible, but that Haskell had no future. This was at the time of Hugs 98, although I remember hearing about GHC. I'm glad to be wrong about this.
- SilasX 12y agoHold on: does Haskell allow "the" QuickSort on one line, or just a sort? Because from what I've read, if you want to make Haskell do all the efficient stuff in a QS, you have to tell it a lot more, bloating the program. Edit: this is what I had in mind: http://augustss.blogspot.com/2007/08/quicksort-in-haskell-quicksort-is.html http://augustss.blogspot.com/2007/08/quicksort-in-haskell-qu... Btw, I took AP Compsci with C++ in Austin around that time, so we might know each other.
- acallan 12y agoLike a lot of UT Computer Science, the implementation is a detail left for the reader. The semantics of the language make the one-liner n*log(n)--that's the takeaway.
- SilasX 12y agoBut the one liner was the implementation, and doesn't do a QuickSort...
- acallan 12y agoIn tests and homework, we would implement the one-liner quicksort with paper and pencil, much like a math test. In a pencil implementation of that Haskell, it is n log(n). Each line on the paper represented one level of recursion. Implementing it on silicon requires the trade-offs you mention. But silicon is just an implementation left to the reader... EDIT: I guess where I'm coming from, Haskell was used in the context of the Theory of Computation, not real-world implementation details and the like.
- deleted 12y ago[deleted]
- Osmium 12y agoI've never formally studied CS, but I can definitely see the benefit. I can divide my own (amateur) programming experience into pre-Haskell and post-Haskell. Before I started learning Haskell, I thought I knew how to use a good half a dozen or more programming languages. After I started learning Haskell, I realised I'd really only known how to use one all along, and that they were all fundamentally the same. I wish I'd had the experience sooner (plus, learning Haskell is just plain fun).
- Verdex 12y agoIf you liked the "I'd really only known how to use one" type of experience, then I encourage you to keep learning languages after you are happy with where you are with Haskell. My experience is that languages stop feeling like cohesive entities and start feeling like a collection of features. The nontraditional categories I've encountered are something like: The macro facilities in lisp, scheme, forth (or factor), template haskell, and C++ templates. Array languages like APL, K, or R. Prototype inheritance with smalltalk or Lua. Avoiding side effects with Haskell, Ocaml, or C#'s linq. The "we're serious about type theory" languages like Haskell, coq, agda, and idris.
- navait 12y agoAs much as I love Haskell, one problem with the intro to CS courses is that many of the students are not CS majors, but students from other disciplines that need to learn a little bit of programming. It makes sense here to teach Java and Python, as imperative languages are more useful to real world programming than functional languages. Perhaps it would be better to create a separate intro course for CS majors. On the other hand, most curriculum in CS demand that students learn about languages like prolog and Haskell, so it's not like students will never be exposed to it.
- colordrops 12y agoAt my university, pragmatic programming courses were part of the math department. If students want to learn to program, perhaps they should take programming courses rather than CS courses, instead of compromising the education of full-time CS students. The courses do have to be available though, and not all universities provide them unfortunately.
- saryant 12y agoMy alma mater is having this fight between the CS departments and engineering/physics/etc. The CS department switched the first two courses of the intro sequence from C/Java to Scala, moving C to later in the curriculum. Instead of C/Java/C++ in the first three semesters, it's now Scala/Scala/C++. The department only has 7 professors and is struggling to even offer enough intro classes for their own majors, much less for students in other majors who only need a single CS credit. The engineering department is upset because they want their students to learn C. Physics wants them to know something else, the business department wants them exposed to a tiny bit of Java and so on. When I started in 2008, there were about 30 freshman taking CS1. Now it's >150 last I heard. They really had no choice but to (diplomatically) tell the other departments to go pound sand. They can't compromise their own majors in favor of those from another department. My guess is they aren't the only CS department facing this problem.
- cafebeen 12y agoTo followup with a note from the article: "A very practical reason for preferring functional programming in a freshman course is that most students already have a certain familiarity with imperative programming. Facing them with the novelty of functional programming immediately drives home the message that there is more to programming than they thought." It's no surprise that this attitude can discourage students without programming experience... A parallel intro track seems like a nice solution that has worked in a number of schools.
- megaman821 12y agoI was attending UT during this time period, but luckily it took until my senior year before the Java-fication of nearly every class was complete. My intro class used Dr. Scheme, and I think it worked very well for introducing new concepts. Following classes were mostly C++ with some C and assembly mixed in. When they finally introduced Java it took students a couple days learn it since they all had decent C++ backgrounds from previous classes. I don't think that would work in reverse, a Java background is not going to let you pick up C++ in a couple days. That is what the department did not understand, not knowing Java isn't that much of a determent to getting an entry level Java job. With a solid foundation, a junior programmer can pick up Java quite fast.
- brianchu 12y agoFWIW, UC Berkeley's intro CS course sequence goes through the following languages in order: [Scratch (in an optional gentle-intro CS course)], Python (with an emphasis on using it for functional programming), a tiny bit of Scheme, a tiny bit of SQL (before they used a toy logic programming language), Java, C, MIPS assembly. I think this walks down the ladder of abstraction very nicely.
- tormeh 12y agoI particularly like that they walk the ladder of abstraction downwards, not upwards. I'm not totally convinced, but I have a strong hunch that walking down that ladder is more pedagogical than walking up. At least in math I have a much easier time reading the proof if I know what it's trying to prove beforehand.
- cheepin 12y agoOdd to use Python as your intro to functional programming, since it lacks many functional programming features besides lambdas which the language creator doesn't even like (http://www.artima.com/weblogs/viewpost.jsp?thread=98196 http://www.artima.com/weblogs/viewpost.jsp?thread=98196)
- TazeTSchnitzel 12y agoPython is more object-oriented than anything else. It's not terribly functional. Most tasks that can be accomplished with functional programming in Python aren't.
- sjy 12y agoLambdas (in Python) are just syntax; it's usually better to achieve concise Python code using list comprehensions. The critical feature for functional programming is first-class (and higher-order) functions, which are supported and encouraged in Python. I think Python is better for an introductory functional programming course than C#, Java, C++ et al, which also support "functional programming features" but only in the context of a fairly rigid OO system. What do you think is missing from Python?
- 12y ago
- tormeh 12y agoThere's a link on the page to this essay by Dijkstra: http://www.cs.utexas.edu/~EWD/transcriptions/EWD10xx/EWD1012.html http://www.cs.utexas.edu/~EWD/transcriptions/EWD10xx/EWD1012... It's overall badly (at least foggily) written, but I find this quote really on point: >The moral of the story is clear: real programmers don't reason about their programs, for reasoning isn't macho. They rather get their substitute for intellectual satisfaction from not quite understanding what they are doing in their daring irresponsibility and from the subsequent excitement of chasing the bugs they should not have introduced in the first place. And that, ladies and gentlemen, is why I think people think C/C++ is an acceptable tool for anything besides drivers and kernels, for which they're only acceptable because there's no better alternative. Sure, pointer-pointers is a magnificent idea! I'll totally keep that under control!
- sbov 12y agoYou could actually argue the opposite. People who can use C++ need to reason about their programs because otherwise they're going to shoot their foot off. You can be irresponsible in a language like python and get away with it because you're not going to cause the issues you would in C++. I think that, to some extent, this is true. If you don't know what you're doing I find it's easier to code yourself into a corner in C++ than something like python. (Disclaimer: I haven't used C++ in a decade)
- peterashford 12y agoWhile I wouldn't start with Java (it's not the simplest language about - I'd probably use C or Python) Dijkstra's anti-Java rant is over the top. It's still a huge language and that's NOT because of any corporate advertising campaign. Something that succeeds as well as Java has to have some actual value.
- wyager 12y ago>Something that succeeds as well as Java has to have some actual value Well yes, it has some value. However, just because a lot of people like/believe something doesn't make it good/true. It's not like corporations have some vast conspiracy in place to encourage the use of Java; it's simply that Java, for a number of reasons, is attractive to middle-management types, even though it's not the best language to make good software. That's not necessarily a criticism of Java; from many perspectives, making good software is not the primary goal. Dijkstra's big thing was prioritizing good software over cheap software. This may not be a realistic goal, but it certainly explains why he preferred Haskell to Java. He wrote some really good essays on why you need languages like Haskell to raise the overall quality of software floating about. The more you can shift the burden of guaranteeing correctness away from humans and towards infallible mechanical systems (like Haskell's relatively powerful type system), the more likely you are to end up with good/correct software.
- forkandwait 12y ago> Something that succeeds as well as Java has to have some actual value. Like cigarettes?
- rdc12 12y ago"Something that succeeds as well as Java has to have some actual value" Sounds an awful lot like, the Bandwagon fallacy
- klutometis 12y agoDijkstra's advocating a Sapir–Whorf[1] of programming languages, which I long suspected to be true; but haven't been able to rigorously prove or disprove. [1] http://en.wikipedia.org/wiki/Linguistic_relativity http://en.wikipedia.org/wiki/Linguistic_relativity
- LukeHoersten 12y agoMy favorite quote: "A fundamental reason for the preference is that functional programs are much more readily appreciated as mathematical objects than imperative ones, so that you can teach what rigorous reasoning about programs amounts to. The additional advantage of functional programming with “lazy evaluation” is that it provides an environment that discourages operational reasoning."