What’s the best language to learn the fundamentals of Computer Science?
Joel Spolsky is against Java – he posted this a while back. Then I was reading an article linked on Digg by veteran programmer named Doug Ross and he says pretty much the same thing. I will too.
At Lake State, the first programming language that we were introduced to was Borland Delphi (Pascal with RAD features). For a frame of reference, this was 1997. Delphi taught us the bare basics; variables, functions, conditionals and loops. I don’t know if it was possible to fail CS105: Intro to Computer Programming and I still doubt that it was a weed-out class. However, the next course, CS121: Principles Of Programming, was the first of two weed-out classes. This course used C++ instead of what Joel and Doug prefer, C, but not a whole lot is different in an “intro” type of course. Now we were being bombarded with pointers, simple data structures, recursion and a smidgen of OOP. This class was also the breaking point for many; they’d usually change their majors to Math or Business at some point during the semester. I found it hard since I had done hardly any programming prior to switching my major to Computer Science, but I hung in there somehow. The following class, CS201: Data Structures And Algorithms, was the final weed-out class. If you could survive that course and the subsequent math courses, you were pretty much on your way to earning your CS degree.
Now, did I benefit from learning the ugly nitty gritties of Computer Science using a “hard” language like C++ instead of an “easy” one like Java? You bet. Pointers in C and C++ force you to think about what that code that you’re writing is actually doing to the computer. Sure Assembly would really give you insight into what’s going on, but then I find you’re fighting with the language more than learning the basics. Java, on the other hand, is suited for building a cross-platform application quickly and glosses over the fundamentals. I think that learning the basics with C/C++ gives programmers a solid foundation. I don’t particularily like C/C++ for day-to-day use. Up to this point in my career, I’ve never worked on a project that offered me the time and resources I’d need to make a C++ project slick. 99% of time they are rush jobs that are customized for clients and I remember hating the overhead associated with C++ when I didn’t have a choice in the matter. When given a choice nowadays, I’ll opt for languages other than C or C++, if possible. But having that C++ experience is like a badge of honor that you can take into the battles that are real-world software projects, be it with languages like C#, Visual Basic, Java, Python, Perl, Ruby, PHP or whatever.