C is used often here in upper divisions for Algorithms, Compilers, and Operating Systems at the very least. I suspect it's used anywhere that theory is deemed very important, because it forces you to understand the theory.

Personally, I don't like coding in it, though I think it's very important to learn in it - it forces you to learn how to do many things at the level of memory management. Learning how to make linked lists in C taught me a lot, for example, and ensuring that my program had no memory leaks also taught me a lot.

On the other hand, this is 2010 and there are programming languages that do memory management for you. Managing memory when you're doing relatively abstract stuff (in most cases) isn't fun OR elegant - it's just tedious. jdietrich talks about this some in another contemporary thread: http://news.ycombinator.com/item?id=1830120

Therefore, I prefer Python - I don't want to program embedded systems.

--

Right now, I'm of the opinion that I ought to be language agnostic. However, I'm also of the opinion that I should know at least two programming languages very well:

I should know one high level language to Get Stuff Done quickly without worrying about tedious stuff like memory management - in these cases, performance is a secondary concern; modern computers are very powerful, and it's much more cost effective to simply write it quickly. Compilers are much better than I am at optimization, and they can do a lot, so why not leave it to them? For this, I've selected Python; I'm working on getting familiar with its many libraries.

I should also know one low-level language for things where performance is critically important, and it's worthwhile to take the extra time to calculate things like that. For this, I'm currently using C, but I plan on switching to Lisp.