Friday, December 30, 2005

What languages should students learn?

In an article that is creating a fair amount of discussion, Joel (on Software) Spolsky rants against kids learning Java in school. I think it's a bit of a strawman, as I don't know of any schools that only teach Java to CS majors, but that would be pretty sad. I think in four years you ought to have time to really learn a couple of languages, and get exposed to a few more. I wish I had been able to take MIT's 6.001 [see image for objectives].

I like the approach of starting on both sides, with a high level and a low level language. If you can see how assembler works, you can start to see the reasoning behind things in c works, and then when you see a bunch of c code, you understand why a lot of the memory management and abstractions were added to the other languages. I like the idea of understanding what things are more efficiently accomplished in a high level language versus which things need to be done in a low level language in a hands on fashion.

Now, what about the people that can only deal with the abstractions? I mean for reasons of patience or just lack of interest, some people aren't interested in understading things all the way down. I don't think it's wrong to stop at a particular level of abstraction for those people. Maybe they don't need to know about pointers, but it is going to limit what kind of work they can do effectively.

Maybe the right answer is that you have to understand at least one level of abstraction below where you work. I think that is enough to uncover one level of problem. I have run into Java programmers that know a little c++, but didn't realize all of their variables were pointers to memory, and they do have problems writing code that takes advantage of that fact. The pointers are still in there in the languages that abstract them away- it's just a little harder to screw them up, or make them do exactly what you want.