For prospective and new software engineers

9 min read Original article ↗
(I originally wrote this in response to one of my alma mater’s FB CS group alumni posts touting the best classes to take for a “successful” career.)

A reminder that you shouldn’t treat anyone’s Buzzfeed-like “Top 10 CS Classes that will make you rich!” as the word of god. And just because you don’t work for FAANMG (Facebook, Amazon, Apple, Netflix, Microsoft, Google) doesn’t mean you are a failure. Your course selection and performance from college and your first job aren’t going to be the primary indicators of your success later on. Your drive to improve yourself through hardship, technical and non-technical, is what will take you to the moon.

It’s almost summer time. Many of you will be starting internships, many will be starting new full time jobs, and many of you will not yet have a job in hand at all. For those of you who do not yet have a job, it’s OK. This does not mean you are inferior to your peers and it does not speak about your abilities as a software developer.

Please do not beat yourself up over this. Finding a job is not as easy everyone else may make it look. What a lot of people don’t mention in addition to the technical skills that companies want, a large amount of soft skills, and especially LUCK of all things play a part as well. Finding the right company is a lot like dating. Many of your dates will go horrifically wrong. Some of them will be OK. Some of them will be great. You may not find the right fit for several months, and perhaps even years. But it isn’t the end of the world. It’s about finding the right fit. Sometimes things look like a right fit and they turn into a nightmare. Sometimes things look terrible but they turn out wonderful. You can be the best version of yourself and still get rejected a hundred times over. Don’t take it too personally.

The truth is you really have no idea what’s good for you and what isn’t until you work somewhere (multiple places, usually) for some amount of time and see for yourself. It has taken me working 5 years full-time across 3 different companies to understand this better, and I am still figuring it out.

Everyone is going to go down a different path in their career, and some classes will be more relevant to some people than others. Some people will do web development. Some people will do embedded systems. Many will do a combination of many different things. High level or low level? These are relative terms – today’s high level might be considered low level tomorrow. Niche spaces can make you a ton of money. Non-niche spaces can make you a ton of money. You can take advantage of startups and large companies, and you can bet they can and will take advantage of you.

Realize that the classes in undergraduate will only cover a sliver of the problems and depth of detail you will face in the future. This is especially true if you work in a space that is the intersection of multiple domains, where you might end up having to constrain and define the problem space yourself.

Don’t just blindly follow the advice of someone who looks like they have “made it”. There are many paths to “success”. Introductory CS classes are important, but that’s the same as saying fundamentals matter. Fundamentals do matter; you may not use all of them all the time, and your skill for each one can vary over time. Different jobs will end up using different subsets of your fundamentals. And some fundamentals are more important to specific domains. Fundamentals are harder to master than they seem. I think I might be approaching basic proficiency now for data structures and algorithms for the sake of passing technical interviews, but also recently orthogonality, testability, and avoiding premature abstractions in heavily trafficked applications.

Look, do your best in a few courses or skills that interest you, and pay attention to ones that others speak fondly of. If you find that missing knowledge in some area is obstructing your progress, then take the time to get better in that area. This is easier said than done and can be very time-consuming. Grades mean something, but they aren’t the ultimate indicator of learning. Something you will realize is that this career (like all others) requires a lifetime of self-learning.  There will no longer be any grades to tell you if you did a good job or not. You will have to find ways to wring honest feedback out of your peers and managers, and sometimes you will have no one to turn to at all.

My GPA at university was not particularly high, but I want to stress to students that my many academic failures are what taught me the most about myself as well as what and how I needed to improve.

Getting the lowest rank on a midterm or final? Been there, done that. A professor told me that he was actually impressed that I managed to get the lowest score on his exam. Flamed out in an interview? Oh yeah, plenty. I’ve failed to code a simple O(N) algorithm that was just supposed to add spaces after numbers once because I was so nervous, right after the introductory CS classes. I’ve made similar mistakes even years out of school over simple list merges. Thank you, nerves of shit.

Don’t be afraid to fail. I was really depressed for a good portion of my life because of this fear. At school, I was approaching academic probation. I was sick all the time. I knew what was wrong with me, but I hesitated and sandbagged on changing the things. Why? I was afraid of what would happen if I failed trying to fix them:

“I know I need to actually do lots of practice problems instead of just skimming the reading material and creating a study card. Hmmm…but what if I fail at that and my grades get even worse? What if I get kicked out of school? What will my parents and my friends think? Oh man, my family poured so much money into my education, I am going to disappoint them so hard, they’re going to disown me.”

“I don’t sleep well because I don’t exercise and I use all my pent up energy to obsess over all the things I didn’t do today (like my proposed set of study habit changes) and all the ways I am fucking up. ” Cue positive feedback loop of bad sleep begetting bad sleep.

I was a rather despicable person since I was aware what was wrong, but did nothing about it for the longest time. So after this one night of crying my eyes out feeling sorry for myself during my 3 AM pity party, I had this epiphany that things probably couldn’t get much worse no matter what I did.

I started working on the things I was afraid to fail at, afraid to get better at. And failed I did. I failed many, many times. But I eventually found some things that worked. My GPA actually crept up towards the end of my college career, but not too high since the damage was already done. ¯\_(ツ)_/¯

I graduated in 2014 and I have worked for small and large sized companies. I can detail what the interviewing experience is like 4+ years out of school. I have never worked at FAANMG etc, and I don’t consider my career a failure because I haven’t worked there. I know people who work at the big five and surprisingly making 350k a year doesn’t always magically bring happiness to your life. Many, if not all of these companies, are wrestling through some serious ethical issues. Some people spend months waiting for a petition to pass so they can add logging of all things to their god forsaken project. Don’t forget about perverse performance incentives. I’m not saying this can’t happen elsewhere, it totally can. My point is that employment at these places is subject to the same problems as anywhere else. It’s not the end of the world if you don’t work there. I’m sick of this cargo cult mentality that working at one of these companies will instantly fix your life’s problems.

I’m still not that great at algorithms interviews, but I think I still do good work today despite my college GPA and work history. (If you’re bored, check out my shameless plug for open source contributions: https://github.com/Netflix/Hystrix/issues/1756).

Something I would stress to other students is to give yourself enough time to retrospect and introspect on why you failed, and if you are having difficulty with that to not be afraid to ask for help.

If you are trying to improve yourself, it is fine to look to others and try to emulate their behavior. But just remember you won’t ever be exactly like them, because you are you. You have your own sets of strengths and weaknesses, and you should play to them. If you don’t know what these are then you had better figure them out soon, before you get rekt too hard. And to be honest, sometimes the world does need to eat you alive. Sometimes things need to get worse for you before they get better, you need to have a real failure that shakes your foundations and gives you a wake up call.

This may sound dramatic, and some of you may never have a moment like this because your disposition allows you to succeed indefinitely. Yes, there are real geniuses among us, and they will outdo us at probably everything. Whatever, this is for the rest of us. I’m really not that smart, so take my two cents as you will.

Again, the point of this post is not to say HEY LOOK AT ME AND MY ACCOMPLISHMENTS, my point is that my accomplishments are my own and yours are yours. Don’t use me or anyone else as some kind of yardstick to measure yourself against. You will live a miserable life if you are always comparing yourself to your peers and asking who works where, who is more popular, who is richer, who is more prestigious. I still grapple with this, it is difficult but I recognize that if I cannot make peace with this I “will die a million deaths before they finally grieve [me]” [1].

[1] Taken from “This is Water”, a commencement speech written by David Foster Wallace. I highly recommend this to live a more fulfilling, less frustrating life.