I’m at ACM SIGCSE TS 2015. That’s the Associate of Computing Machinery’s Special Interest Group for Computer Science Education’s annual Technical Symposium. You can see why abbreviations are used. I’ve been attending this symposium since 2007 (I think I missed 2008 though).
There is an annual debate – what programming language to teach in. I think it is time we stop having this debate, for several reasons. Of I will give you those reasons and then tell you what languages that I think should be taught.
Reality tells me that the programming language doesn’t matter that much. Instead the critical skills are computational / algorithmic thinking, problem solving skills, and communication / teamwork skills. Programming is a tool we use to express our solutions to problems. A tool we use to express algorithms and to engineer systems.
My own programming career has told me that we need to be flexible as practitioners of computer science. I’ve gone from, in rough chronological order:
So what does this say? It says that you need to be able to move between languages and paradigms. Someone with solid CS fundamentals will be able to move from one language to another and even one programming paradigm to another with minimal effort. That’s not to say you can pick up a language you’ve never seen and be super productive right away. In the order of a few weeks, you should be mostly up and running though.
In conclusion – what should be used as instructional languages? Here are my thoughts. I think that students should come out of a 4 year, BS degree having learned
- 2 OO languages, one of which should be C++
- 1 functional language
- One “scripting” language
In the OO world, learn something that requires you to think about memory. C++ is really the gold standard here. Modern C++ (C++11/C++14) are quite nice and the language has come a long way. The other should be some kind of language that runs in a managed environment, or does reference counting. Something like Java/C#/Objective-C. Personally, I would pick C++ and Java.
Functional: Scheme? Haskell? Erlang? Clojure? It doesn’t matter much to me what this is. What matters is that you learn to think in the functional paradigm. Immutable state, closures, functions as first order items, etc. Personally, if I were teaching, right now I would probably use Erlang or Scheme/Racket for this purpose. Not because it is a markable skill. The language is not the skill, the way of thinking is the skill!
“Scripting language”: I’m probably unfairly bundling things here, but what I’m thinking is runtime interpreted style languages. Python, Ruby, etc.
4 languages – I think that gives a computer scientist a solid foundation for being able to change, adapt, and grow throughout their career. This is essential, because what language will we be programming in in 10 years, I don’t know, but it possibly hasn’t been invented yet.
How should you order these? Doesn’t matter too much. I would still avoid C++ as an introductory language, but having taught that last year, it is manageable, but there are still silly things that should be avoided. If I had it to do over, I would have started with vector before array, as passing arrays to functions in C++ is a mess that introductory students should not have to deal with.
In summary – maybe we should end the language debate and agree that students will learn programming paradigms. Once they get into industry, we can teach them that language we use. If someone is worth hiring, they’re worth investing some startup time on.
Thoughts from a former educator.