If one of the aims is to prepare the next generation for the challenges that will be faced in the software industry over the next decade or two, we need to recognise that many of the languages and paradigms in widespread use today are already falling short in many areas. Key to this is the idea that concurrency and parallelism are moving from being advanced, esoteric concepts to being things mainstream programmers have to consider more and more every year.
I\'m not saying that we should all be teaching kids Haskell out of the gate, but that we should listen to the leading voices in these areas that seem to be converging on the ideas that we need to be reducing mutable state and embracing functional programming concepts as a way to move forward in the software industry. These concepts are not new but somewhere along the line mainstream programming went down the imperative route and functional programming became a niche.
Many have put good arguments forward that teaching an imperative paradigm first, and leaving the \'hard\' functional programming until the students become more \'advanced\' is the wrong approach. Many have suggested that the reason \'imperative programmers\' find functional programming so hard is because they were not exposed to it early enough. There is quite a bit of evidence to suggest that children pick up functional programming just as easily as imperative if they are introduced at the same time. I know that I have found that learning functional programming involves a significant amount of effort \'unlearning\' much of what I previously considered to be gospel. It turns out that imperative programming is only one of multiple ways of looking at the world. I wish I was exposed to functional programming earlier, much earlier.
I think that OOP and imperative style is worth teaching but not to preclude the introduction of functional programming paradigms. Personally I am of the view that OOP is both powerful and useful where appropriate but all too often it is abused as if it were the solution to everything.
Python, Ruby or Scheme (esp. Racket) might be good candidates for teaching/learning some functional aspects of programming in a relatively easy going environment. There\'s also a promising project called Kojo (http://www.kogics.net/sf:kojo
) developed and used by a teacher in an Indian orphanage for girls to teach programming and maths etc.
Some further reading for those interested:
\"The Free Lunch Is Over\" by Herb Sutter : http://www.gotw.ca/publications/concurrency-ddj.htm
Simon Peyton Jones\' talk from 2008: \"Taming Effects with Functional Programming\" : http://www.infoq.com/presentations/Tami ... yton-Jones
CMU switching to FP for freshmen : http://existentialtype.wordpress.com/20 ... -freshmen/
\"Where are the Software Engineers of Tomorrow?\" : http://www.crosstalkonline.org/storage/ ... -Dewar.pdf