There was a post on Slashdot earlier in the year pointing to an article about how Java is a bad language for computer science students. I generally agree with the points the article makes, especially given my CS education at RIT, but there are other considerations that should be taken into account.

At RIT, it is required for lots of majors (some engineering and other computery majors) to take at least Computer Science I through III. Those courses use Java as the introductory language. While Java is not hard to pick up, I don’t think it is as damaging as it is claimed to be. These introductory courses are pretty much meant to weed out the people who clearly can’t grasp computer programming. Sadly, this feels like a bad standard since the weed-out courses at other certain schools at more advanced than what I took as a freshman undergraduate.

Even after the introductory courses, there is still Computer Science IV (also required for many majors) which shifts to C++ and more upper-level courses (e.g. Operating Systems I, Programming Language Concepts, etc.) that these students need to learn. Anytime I have ever taken an upper-level CS course, we were always generally given the choice of using Java, C, or C++ for our projects. There are some exceptions where you are required to program in certain languages for a course or where you have more freedom to choose another language (like Haskell or Python). Generally, I always defaulted to Java. It was the language I knew best since it was the one I used the most. I never bothered to really learn other languages that well since it felt like I was spending more time trying to learn the language rather than do the actual assignment.

By that same token, I wish I had used other languages more often in my projects. I really didn’t understand pointers until I took a 2-credit course called “C for C++ Programmers” and used a book that didn’t feel dry or assume the reader was an idiot programmer (no need to go over beginner crap like for loops). “Analysis of Algorithms” was single-handedly the most useful course I ever took in the undergraduate Computer Science program. Unfortunately, I took it my last quarter at RIT, and it would have been so much more useful and applicable had I taken it earlier. I still can’t believe that course was not required at my university even though it is at other schools.

If I had a chance to do my whole degree over again, I would’ve taken more Software Engineering courses. The computer science curriculum isn’t bad at RIT, and there is much flexibility over what you can take. I just didn’t plan my schedule out very well. Had I read my CS handbook more closely, I wouldn’t have taken so many random upper-level CS topics. The point of Computer Science felt too academic and too theoretical for me, and I wish I had taken more practical things. Theory isn’t bad; in fact, people should learn why things work. Connecting the “why” with the “how” does not come easily for me if I approach from an abstract point of view. I learn much better from doing things hands-on emperically and experimentally.

Before I graudated, my algorithms professor was talking about what the Computer Science Department could do to retain students in the program. I don’t know what the problem is, but it may have to do with the way the entire program is taught. There are certainly many CS courses I could have done without because I didn’t feel like they prepared me at all for the “real world” (i.e. the working world). I think for a university like RIT, it would be more beneficial to do what Joel Spolsky suggests especially with RIT’s reputation and emphasis on the co-op program.

It’s too bad I didn’t land my first co-op until later in my undergraduate career though there were contributing factors to that. An economic recession was occuring at the time and nobody was really hiring, and nobody was really going to hire an idiot second-year student with nothing but a basic programming skill set. I don’t think Java is a bad language to have beginning programmers to use if they want to try programming. I think it is a bad language if you want to have them learn computer science. I guess it’s all about using the right tools for the right problem.

In general, the courses I took outside of the Computer Science program would have been more helpful if they had somehow been more integrated or coupled with my degree. This does not work for all courses (like liberal arts) but applies heavily to mathematics. It is unfortunate that such abstract topics are taught in a such a vacuum without any real, substantial connection to anything. It would have been nice to know why I needed something like statistics or linear algebra for computer science. It would have helped to know why I needed to wait through those boring, introductory courses before getting to the really interesting upper-level courses.

My problem with Java is that it didn’t really help prepare me for the rest of the Computer Science program, yet I still managed to make it through with a somewhat decent GPA. Whenever I look at other great programmers out there, I am immediately humbled by how little I know, and how inadequate my education really is. I haven’t been in the workforce for that long, and there is still a lot I don’t know. I don’t think there is a good catch-all cookie-cutter curriculum for everybody. It depends on what people want to do, and the solution would be to figure out how to nurture that interest. Blaming the issue entirely on the Java language is just a lack of insight on a bigger problem.