Practical computer science

I read a blog post the other day that attempted to explain why computer science programs are “stagnating”. The content of the post was pretty unimpressive, but it got me thinking. There’s a quote from the founder of Make School, one of several companies that are bringing the “Learn X in 14 Days” programming books from the ’90s into the real world, that really sums up the attitude of the entire thing:

“Nothing I learned at UCLA helped me build my startup,” Desai says. “I had reached out to various CS and EE professors for help, and while they were enthusiastic about my work, they were unable to help me with the project.”

Basically, the complaint is that computer science programs don’t prepare students for what they expect to do after they graduate. If this is true, then it is a problem. While college isn’t supposed to be strictly job training, and, at least in a democracy, it is vitally important that education be much more than just job training, job training is still an important component. A computer science education should be useful.

I shared some of my thoughts on Reddit but I wanted to clean them up and elaborate a bit here.

There seem to be two groups of people who ask for more “applied” computer science programs. The first is made up of students who feel wronged by the field of computer science. They want more “useful” topics and less abstract theory, more code and less math, more frameworks and fewer broad principles, more “modern” topics and less historical background. The second group is companies that hire computer science graduates. They want employees who can walk in the door and be productive on day one, who already know the tools, languages, and frameworks that they use.

I have limited pity for the first group. Indeed, some schools may be better or worse than others, but as a whole computer science students already have the opportunity to learn about all sorts of applied topics outside of the classroom. Meetups, MOOCs, user groups, blogs, internships, open source, and professional conferences (which often offer free or cheap tickets to students) provide incredible opportunities for students to learn state-of-the-art, applied topics.

The ultimate problem I see is that all that abstract, theoretical knowledge students complain about is actually useful. Very few people will use all of it, but almost everyone will use a surprisingly large, and different subset of it. Removing theory to make room for more application therefore won’t necessarily result in better, more capable programmers.

The second group who tend to call for more “applied” topics, companies, are, I think, rather short-sighted in their demands. Asking that employees, especially entry level employees, come in with preexisting knowledge of specific tools, languages, applications, and frameworks is foolish, and asking that they learn all of these things in school is absurd. There are literally hundreds of tools, and no matter which ones a school might choose to teach, most students would still lack many specific applied skills a given employer might demand.

Students who lack a grounding in computer science theory are more likely to struggle when tasked with implementing more complex systems. Perhaps more importantly though, they are less likely to be able to adapt to changing needs within an organization. If you hire a Rails or Django developer, then that’s what you get. If you later need that person to be a Android developer, you may be out of luck. However, if you hire someone with a solid theoretical grounding, that person may be able to take on all of those roles and more.

Of course I’m not trying to say that everyone who gets a computer science degree will end up an amazing developer (and as a corollary, not everyone who doesn’t study computer science won’t end up an amazing developer). But it is more likely that they will if they have the tools they need to become an amazing developer. It is also important to consider that there is a huge range of industries that employ computer science graduates, and each would ideally like people trained for their niche, but all are well-served by people with broad training.

To wrap up, computer science is not taught perfectly. The ideal balance between theory and practice surely changes from year to year, and maintaining a healthy debate is critical to help schools adapt. But I am always skeptical, and I think you should be as well, when I hear claims like the quote above that fall too far to one side or the other.

Image credit: Paul Keller