I would guess Haskell would be perfect if the goal is to produce academics. But if most of your students are destined for industry, Haskell is in my opinion the absolute worst language.
- You'll probably get a high drop out rate because of the complexity (recursion, pure / first class functions etc).
- You rely that your students already have experience at high school with imperative languages
- The industry by far still don't use functional languages.
But then again Java is an equally bad choice, for the reasons mentioned, but also you jump immediately into OOP, again expecting the student to have former experience.
What is wrong with laying a solid foundation with the introductory class in C or Python, and then moving on to the more advanced OOP or functional worlds?
Industry is far too low a bar to aim at. College should give them the fundamental understanding of programming that they can apply to a variety of situations. Employability flows out of that.
I truly wish this was a more commonly held view point. You would think, speaking with many, that college was nothing more than a corporate worker mill.
This is a dangerously reductionistic viewpoint that castrates the intellectual potential of students.
To a student versed in Lisp macros, a framework like Rails ceases to be magic and starts being something that can be understood and improved on. Meanwhile, industry shies away from the possibility of a quick dive into a metaprogram, because, (OMG), it's hard!
I'm exaggerating, but industry strikes me as profoundly anti-intellectual at times. We need people to counter this sentiment and the damage it imposes on all of us.
But if the way you're doing it causes a high dropout rate, then you're not giving them "the fundamental understanding of programming" very well, are you? (Unless you're going to be snobbish and say that "only the few can learn this" - but that's a pretty ugly snobbery, especially if it's caused by you choosing an inaccessible teaching approach.)
The dropout rate for entry-level programming courses is high, regardless of starting language. Symbolic thinking is rough to pick up in a single semester. I think most people can get it, but the timeframe is tough, especially on non-majors. I don't know enough to comment beyond this, other than suggesting that we can require less of non-major students to ease them in?
> What is wrong with laying a solid foundation with the introductory class in C or Python, and then moving on to the more advanced OOP or functional worlds?
For C at least, you have a hard time with the syntax on first exposure. Unless you want to teach the idea of "Grammar" as a concept as well. "Why doesn't the for statement have a semicolon after it?" is a common question. It's simply an irregular and ad hoc syntax. After working with freshmen learning C as their first language, I am confident it's a terrible starting point. Others might be worse, however.
Given freedom, I would likely pick Scheme as a starting point, with SICP as the text. Regularity of syntax is extremely important - the only thing your mind really should need to worry about is how to reshape itself to the semantic demands of programming.
To your first point, Haskell is less complex than imperative languages. You get to functional by removing things from imperative: mutable state, side effects, et al.
To your second point, case studies indicate that it is actually much easier for people who have no prior experience with programming to learn functional languages than to learn imperative ones. They also show that it is easier for novices to learn functional languages than it is for experienced imperative programmers to learn functional languages.
To your third point, the finance industry uses functional languages quite a bit, and almost every mainstream language has adopted some aspects of functional style (at the very least lambdas and map/filter/fold). Further, the historical trend for the past 50 years has consistently been that mainstream languages adopt new features from functional languages, which means that learning those languages will help prepare you for advancements in whatever language you end up using.
Laying a foundation in C is like teaching how to cut down trees in a first class on woodworking. Yes, the lower-level stuff is important to flesh out a thorough understanding of the subject, but it is absolutely not the correct foundation on which to build pedagogically. Following that notion through to its logical conclusion, rather than starting with C you would start with electrical engineering and only move on to programming after the student had built their own computer from scratch.
> "The industry by far still don't use functional languages."
What industry are you talking about? I note a few programming languages trying to introduce functional programming features into their languages
- The industry by far still don't use functional languages.
Flat-out wrong. The world's most popular language (in terms of lines of code, number of programmers and companies using it) is a functional language: JavaScript.
- You'll probably get a high drop out rate because of the complexity (recursion, pure / first class functions etc).
- You rely that your students already have experience at high school with imperative languages
- The industry by far still don't use functional languages.
But then again Java is an equally bad choice, for the reasons mentioned, but also you jump immediately into OOP, again expecting the student to have former experience.
What is wrong with laying a solid foundation with the introductory class in C or Python, and then moving on to the more advanced OOP or functional worlds?