Last time I checked, Princeton offers one truly practical Computer Science course. One.
Advanced Programming Techniques, taught by Brian Kernighan, which is really a software development class despite what the title may suggest. The course revolves around the six week group design project, where students create full-on applications or websites. Many of these are Princeton-related and have become staples on campus, such as the Integrated Course Engine and other TigerApps.
This is, however, the extent of Princeton’s practical CS curriculum. There are certainly other classes that contain practical elements or information that could be directly applied in the real world, but classes have a tendency to focus heavily on the theoretical end of the spectrum. And there is no equivalent to courses such as Stanford’s CS193p (iOS Programming), despite it certainly being a topic of great interest.
Let us consider two of the introductory CS classes, Intro to CS and Data Structures & Algorithms. Both of these classes use Java extensively, but I came out of these classes lacking fundamental elements of the Java language, the things that would be in any Intro to Java book. I did not know Standard Input or Output, how to access the filesystem, draw to the screen, or even use Eclipse or a simple debugger. Instead, I knew how to do these things using custom libraries that would be useless to me beyond the scope of the class.
Now clearly these classes were about Computer Science, not Java in particular and certainly did teach me much of the relevant theory, but what if I wanted to become more skilled at Java? There’s no course for that. There’s no course for Web Design, or Mobile Apps, or Game Design, or really any other job that I might be looking for.
So why aren’t there classes for that? I would love to tell a prospective employer ‘yeah, I took a class on exactly that thing that you’re going to have me working on,’ but the fact of the matter is I can’t. Princeton believes that once you know the theory, it is easy to learn the practical bits. If you know how to design an algorithm, you can write it in any language.
I think this is a valid assumption, at least to an extent. Any programmer knows that once you learn one language it is easy to pick up another. But not as easy as having someone teach it to you. I would prefer having someone teach me the specifics, but maybe some people feel differently. In this way you can focus your limited class time on learning the more difficult topics, while parsing the ‘simpler’ ones on your own.
The real challenge comes in the sense that any prospective employee has to prove himself. It is not enough to say that you took a class about that, because there are no classes about that. Internships and personal projects become increasingly important. You have to find time outside of your classes and work to improve your coding skills and build up a practical baseline to show employers.
As long as you are willing to put in the extra effort, a theoretical CS education has great potential, as it creates students who can learn new technologies on their own and adapt to new challenges, ultimately becoming stronger Computer Scientists if they can keep up.