I’ve seen (and participated in) a number of discussions recently about the selection of a first programming language. I don’t think the choice is a trivial matter, and don’t necessarily think there’s a single right answer, depending on the overall goals of a curriculum. Here are some choice strategies I’ve seen discussed recently:
- Commercially-popular language
- students see a connection to the job market,
- prospective employers may like it,
- students may have had prior exposure (especially non-traditional students), and
- a wealth of related materials (books, web pages, etc.) is available.
Cons (especially if the curriculum doesn’t provide multi-language experience):
- risks biasing the student’s perception of programming,
- risks putting the student into the “knowledge half-life” problem, and
- risks the nasty choice, as language trends change, between churn in the curriculum or becoming less “relevant”.
- Academically-popular research language
- professors and grad students may like it, and
- some of these languages explore ideas that may be important by the time the students graduate.
- similar to the “cons” list above(no pun intended!).
- Teaching-oriented language (remember Pascal?)
- resources (e.g. books such as Structure and Interpretation of Computer Programs – 2nd Edition (MIT Electrical Engineering and Computer Science) or How to Design Programs: An Introduction to Programming and Computing, and mature implementations),
- intended for teaching concepts (i.e. language/notation features), and
- often has good infrastructure (i.e. debuggers, class browsers, visualization, etc.).
- can risk separation of “theory” and “practice”,
- teaching-oriented aspects may shield students from the “pain” of production programming, and
- prospective employers may strongly prefer “practical” language experience.
Following the line of thinking from the previous post, I believe that a language can serve as a bride from one style of thinking and problem solving to another, if it is properly designed for that purpose. Going further, the book Concepts, Techniques, and Models of Computer Programming makes use of a multi-paradigm approach in which a kernel language is extended in various ways to expose the student/reader to a variety of styles of programming. I’m currently focusing my spare time on Scala, but I’m intrigued by Van Roy and Haridi’s use of Oz to explore the style “spokes” out from a simple “hub” of basic computation concepts.
Maybe I can get back to Mozart/Oz after I’ve mastered Scala. Of course, I’d have to make friends with emacs…