Please look to the first footnote for an explanation of why I’m writing this1.
There are a lot of resources out there that teach you about a career in tech, most of them filled with a variety of useful life, technical, and career advice. I’m not going to try to replicate that or pretend to have enough experience to do so (though I’ll link resources that go more in-depth). Instead, I’m going to focus on the bare-bones fundamentals for a very specific (but traditional) goal, in the hopes of letting you cut through the non-essentials and not waste time worrying about things that aren’t huge.
That specific goal is, as a college student, set yourself up for a successful software engineering career at a medium-to-large company2.
Your highest priority should be to get an internship at a good company.
This is true if you optimize for learning/growth, because the best people with the best technology will be there. This is true if you optimize for prestige, because they will be prestigious (at the very least to those who understand tech, if not your parents). This is true if you optimize for money, because tech currently has a massive talent war, and the best companies want the best people badly.
There are some counter-intuitive patterns that stem from this priority.
For instance, classes and GPA don’t matter very much. This is very counter-intuitive to many people who have academics as a priority beaten into them since age 5, but it’s simply not that big of a deal. Therefore, learning the material quickly and well should be a much higher priority than optimizing for grades, and getting straight A+s is generally overkill.
Another one is that the companies your parents (or in general, laypeople) find impressive are not quite the companies you should be aiming for. They’re quite correlated, of course, but Facebook and Google are not the hardest to get, nor the ones you learn the most from. For an interesting opinion on a list of this, see this Quora answer.
Worrying about your major is not that important, especially if you have a related technical major to computer science (math, electrical engineering, etc.) or demonstrate outside involvement (which you should do anyways!). I’ll elaborate more on this later.
There’s also not much marginal benefit to a master’s degree in computer science. See this Quora post for a discussion. A PhD is also completely orthogonal to a successful software engineering career (though it may be very rewarding for other reasons!).
With that said, there are really just two steps to getting an internship/job:
The best case scenario is getting referred. Don’t feel like you’re imposing by asking friends who work at the places you want to work for referrals; they’ll generally be happy to do it. A longer discussion of “networking” is out of the scope of this piece, but there are some good articles3.
If you go to a school that gets recruited, go to the career/startup fairs; if you don’t, go to hackathons, which nowadays function similarly4 and are generally free (including transportation!).
At this point, the most important thing is having a decent resume with side projects and reasonable courses. People often do personal projects, competitive programming, open-source projects, hackathons (both participation and organization), startups, and research.
For internships and recent graduate interviews, the vast majority of your focus should be on algorithm questions.
As with all learning, the focus should be on the thought processes/problem solving skills themselves, not the specific questions being asked, and never memorize solutions.
Completely grokking the above is probably unnecessary and overkill, especially if you have a solid math background. Doing all of this methodically will almost guarantee interview success at a typical engineering interview.
At this point, you should be set for most engineering internships, which, if you convert to full-time, means that you’ll be in a lucky and privileged position in one of the luckiest and most privileged industries/places on Earth. So, the question is: what next? This is something nobody can tell you, but here are some useful articles about software engineering careers specifically:
And here are some resources on learning, improving, and become world-class at your profession:
A general theme I’ve learned is that success is usually quite simple (i.e. not convoluted), even if it is never easy (i.e. achieved without much effort). This is probably because of the effectiveness of extreme focus on the small number of important things. I hope this post lets you achieve your goals efficiently, so that you can think about more important things than the typical markers of success.
Why am I doing this? Well, usually I try to approach the world assuming I basically don’t know much. It’s always a little sad for me to see people paving the road to hell with good intentions by giving well-meaning but incorrect advice. After all, I’m just some kid.
However, sometimes people ask me for advice– people that I care about, who I want to succeed at all costs– and I would hate for them to waste the amount of time I’ve spent “learning the system” that I’ve already explored. So at the risk of being one of those pavers, I give them the most succinct and accurate advice I can.
But to artificially filter the people you help seems undemocratic. After all, there are friends who, for some perfectly valid reason, simply don’t ask for it (for example, out of timidity or misplaced courtesy); furthermore, there are unconscious biases and other factors (for example, geography, socioeconomic class, gender, race, attractiveness) that I’m certain filter the people I interact with but whose influences I want to remove. This is my way to reduce bias and broaden the types of people I help. ↩
Why this goal? There are many reasons people end up choosing this goal, but quite honestly I believe the real reason that most people first consider it is that society (i.e. other people) thinks it is valuable and prestigious. There’s nothing inherently wrong with this; it’s certainly a good baseline, and many people grow to love it.
However, I hope that, from this fairly traditional starting point, you explore your interests and values to figure out if tech and engineering is right for you. If nothing else, there are exciting traditional roles within tech (product management and design) as well as different lifestyles (startups, quantitative finance, scientific research) that require many of the same skills but cater to different values. Finally, detaching yourself from the standards of society and independently finding what you care about will likely lead to more life satisfaction. ↩
The main trick with networking is to not “network”; instead, treat others with respect, friendship, and curiosity. Avoid at all costs portraying the archetype of a “networker”. Typical guides include the classic How to win friends and influence people by Carnegie and Never eat alone by Keith Ferrazzi. ↩
Hackathons are (pretty amazing) 24 to 36 hour events where teams build a project from scratch and show it off, and are a celebration of builder/hacker culture. Recently, they’ve gotten a lot more corporation-focused, which means that companies actively try to recruit from them. I have mixed feelings about this, but it’s a reality that may benefit you. ↩