A few years ago, I graduated from Carnegie Mellon. Boasting some of the top technology programs in the world, CMU graduates are specifically recruited by Google, Apple, Amazon, Microsoft... the who's who of the tech industry.
I work for GitHub. Around half of the company either dropped out of college or just didn't go.
Virtually none of the technical skills I studied at CMU are used in my job. Everyone at GitHub is self-taught. I'm pretty sure no one at GitHub even realized I went to CMU until a few months after I was hired.
Why is there such a disparity in the startup world? Is this something we can change? Can we better prepare university students for life as a startup worker? Can we teach startup culture?
This deserves some context. I absolutely adore Carnegie Mellon, had a great time there, and it was certainly a formative four years for my character, work ethic, and broader academic enrichment. This is not about "should I go to school", either; that discussion depends entirely on the person and situation. This is about one specific question: how do we, as a culture and industry, produce first-class startup workers from our university system?
In the few short years since I've graduated, I've been completely convinced that I require a startup culture. I'd crumble in a big business corporate hierarchy. There are thousands just like me; I'm nothing special. There's a substantial community of entrepreneurs that love building things, that loathe bureaucracy, that crave the risks and seek the rewards.
It's not for everybody. It's not even for the majority. Most of our industry will be more than happy — and thrive — by taking their courses during school, joining a stable and profitable company, picking up their paycheck and rising through the ranks. That's great, and all things considered I think the university system is starting to figure out how to evolve their curriculum to accommodate those professions.
If you're interested in working at a startup, I think you're much more ill-prepared.
The problem with technology that we've battled for decades is how to teach it. It's just too damn fast. You can't teach the same Java course you taught in 2001; APIs have changed, frameworks have evolved, entire methodologies have died, risen, and then been replaced again. But you can teach Java itself more broadly. And that's been the saving grace for many programs: if you teach the foundations of a language, the student can then build upon them, learn the incremental changes, and take those language-specific foundations and apply them to a different language.
The startup world takes this to the extreme. The concept of a startup is, at its very core, creating entirely new solutions to new and existing problems. (If you're not, you're probably doing it wrong.) This typically means completely reinventing existing technology. Or reinventing new approaches to busted-ass processes. Or combining a multitude of different moving parts in a package that's never been done before. It takes a little bit of crazy that is, quite frankly, difficult to learn in a classroom.
So, don't learn it in a classroom.
It's not all dreary in my school experiences. By far, my favorite class in my major that I took wasn't a class at all: it was an independent study with Jeff Baxendale, one of my friends and classmates in the program. We paired up with one of our favorite professors who acted as our advisor for the semester. No classes, no tests. Our instruction consisted mostly of "go build something cool", and we met every week or two and talked about the process, what worked, what didn't, potential business implications, that sort of thing. What we built — a killer distributed comment tracker, and a self-referential inline annotation app — was never shipped to the general public (your loss). But we gained a new perspective on managing a tiny team, working fantastically diverse hours and workloads, and building something we cared about. That, in many ways, was worth the weight of all my other classes put together.
I wish there were more emphasis on this. There was certainly more of this in my program at CMU than others (we had two semester-long projects in groups of 5-6 for real-world nonprofits, for example), but I think there's more to be done. The reason I pick on CMU is not because there's a problem with CMU; it's because, as a "top tier" school, if it's not leading the way, how can we expect the rest of the university system to fare much better?
At the expense of being a complete shill for GitHub, I think what would be great is a GitHub class. A semester-long, no-rules class designed specifically to contribute to open source on GitHub (or any other site). See who can get the project with the most watchers or forks. Or who had the project with the biggest impact. Whose code is now in use at the largest organization. Or don't even make it a competition; let everyone work the whole semester and take breaks to just talk about everyone else's experiences. I'd have a blast sitting down and hearing what sort of impact my peers were making in their free time. Or have endless discussions about different NoSQL solutions (at the very least, that will prepare them for posting to Hacker News). With no real expectations, everyone picks projects they're interested in and can gain a deeper experience through that.
You can also stretch the envelope in different fashions, too. Take an uptime class, where everyone gets a VPS at the beginning of the semester and has to keep their box up. Grade based on uptime. Have the professor DDOS them. Simulate a power outage at 3am. Simulate a huge traffic influx. Offline specific components. The point is things start to feel less like a class and more like an actual project, with real consequences.
This is, of course, why internships and co-ops are so great. Once you graduate and join your first job, no matter how prepared you are you're going to have that oh shit moment your first day when you realize you're finally deep into it. Those work programs help mitigate the oh shit moments. But I think we can mitigate that in academia, too.
Don't get me wrong; I'm not advocating doing away with abstract studies. Teaching fundamentals and the theory of programming is what college is for; it creates the foundation for learning future languages and patterns. And I'm not advocating replacing entire CS curriculums with startup-oriented classes, either... again, the majority of students might not be as interested in such a curriculum.
That said, I think there are students that would eat it up. And fostering that is good for all of us. Better students create better startups create better industries.