This morning my parents forwarded me an article in the Wall Street Journal, entitled “Why I’m Not Looking to Hire Computer-Science Majors,” by Daniel Gelernter (CEO of a startup called Dittach). It was an interesting read, but one that I ultimately disagreed with, enough to write about it here on my blog. Unfortunately, the article is behind a paywall, so you can’t read it without a subscription1. Here is a brief summary of the main points Mr. Gelernter made:
Most of my disagreement stems from his opinion on computer science education, but I think I have to comment on each of these points, starting with his second one.
I think I have to agree that people with the “longtime love of coding” are much better candidates for software development jobs. Being the humble author of this article, I would probably put myself under that category: I started programming (in C#) the summer before high school, and got experience in programming with at least three other programming languages (Java, Python, and PHP) before starting college. I genuinely couldn’t (and still can’t) get enough of coding.
As I go through college, I’m starting to learn to distinguish who else is infected by this “coding love”, and who is here because they thought they could get a good job with a degree in CS. You can tell by their behavior. The former group spends time working on little side projects. If they’re like me, they’ll readily gush to you about how cool the last thing they made was. They take time in their school schedules to learn new programming languages. They read and discuss news sites like Hacker News that keep them up-to-date with new technologies and cool ideas. The latter group knows our CS curriculum’s programming language (currently Java) but probably hasn’t taken the time to learn any others. They might not be very familiar with major software development tools (such as version control systems). They may not even have a firm grasp on the basics of what happens when you navigate to a website in your web browser. More important than a lack of knowledge is a lack of drive to learn more!
This isn’t just seeing people at different stages in their education. This is a difference in attitude! There are plenty of passionate coders at my school who don’t have much experience or knowledge yet. While they may not know everything I just mentioned, they spend time learning from their classmates that do. Our campus is lucky enough to have an extremely active organization called Hacker Society that exists to bring people with these passions together, so we can learn from one another.
If our school needs a “Hacker Society” of students to teach each other all of this stuff, where does our curriculum come in? Why don’t we just form our own group, teach each other, and save bundles of money? Despite the skimpy coverage of iOS and Android development in our curriculum, we do learn very valuable things. We don’t talk very much about computer science theory at Hacker Society, but it still underlies what we do, and we need our classes to teach it. Without getting into the depths of computer science, let me explain what I mean.
The computer science curriculum gives us a lens for looking at problems. By studying it, we understand the tradeoffs of the world we work in. We understand that we can write programs that run quickly, but need lots of space, or we can write ones that need little space, but run slower. You can’t get something for nothing, and understanding these tradeoffs is frequently the heart of solving a programming problem, especially when the tradeoffs have real meaning in a software project.
The computer science curriculum teaches us how to use the things we need the most. Sure, as Mr. Gelernter pointed out, understanding how to design an operating system probably isn’t a skill I’ll directly apply. But the vast majority of code a developer writes runs on an operating system, and if they don’t understand the basics of how it works and what it does, they’re writing code on a rotten foundation. You expect that an engineer building a bridge understands the properties of the ground they’re building on, and the materials they’re using. For programmers, the operating system is that ground and material.
In computer science, we learn a disciplined mental model that makes the “passionate coder” a better developer. It’s about the transferable skills, not the particular technologies. Imagine I went to college, say, eight years ago. In 2007, the first generation iPhone was released. That marked the beginning of what I think of fondly as “Apple’s war against Flash.” Tons of websites had these “flashy” (pun definitely intended) plugins that ran on Adobe’s Flash Player. They featured lots of pretty transitions and animations. But the iPhone didn’t have Flash, and Apple threw its weight behind HTML5 and apps. Fast-forward to today, and Flash is on its way out.
If I went to college then, and it was the way Mr. Gelernter would have it, I would have learned the ins and outs of Adobe Flash, so I could make killer Flash websites that made companies look professional and sleek. And today, I would be out of a job, because Flash is vulnerable, not mobile friendly, and the industry moved on. I would be stuck having to relearn everything I learned in college, but in HTML5 or native app development. And you know what? Give it another eight years and we’ll probably be doing something new. At least with a computer science degree (as it is now), I’ll always have the core mental model, and I’ll just need to learn new tools and paradigms as they appear.
For a startup that needs skilled developers to help bring a vision into reality, it totally makes sense that you want a developer who already knows the practical toolset you want to use. We try to learn those toolsets and other cool things at our school’s Hacker Society, but not everyone has the benefit of such an organization. A big tech company probably can look beyond the toolsets their candidates know, and try to hire the ones who learned to solve problems exceptionally in school. Maybe that’s why they can so easily steal developers from startups. Sure, lots of money and stock options are probably the main reason, but I know I’d feel better if I knew a company wanted me for my computer science and problem solving skills rather than because I know their toolset!
So, do we need to stop expecting software developers to get a computer science degree? If you ask me, no! College computer science education is not too far from where it needs to be, even if it isn’t perfect. Instead of figuring out some new way to train software developers, we should focus on more excellent student organizations like Hacker Society. We focus on bringing out the passion in our members and helping them learn the practical tools they may need to know. The combination of a student organization like this and a theoretical education is potent, and it has already produced several alumni that are headed to bright careers. We’d love to see this sort of organization becoming more common in the world of EECS education!
If you’re interested in hearing more about this organization, the website may be of interest, as well as our ACM/IEEE chapter (which is part of Hacker Society). We host an annual conference called Link-State, which you may be interested in attending, speaking at, or sponsoring. (And that’s the end of that plug.)
I definitely don’t mean to say that being self taught makes you a bad candidate for a job. Self teaching got me very far before I came to college. Good candidates come from everywhere, and you don’t have to be ruling people out either way. That being said, I do think that a computer science program in combination with the genuine hacker spirit is the most effective way to produce the best developers.