How I Went From College Dropout to Google Software Engineer in About a Year

This is an autobiographical post about how I learned to code and got a job at Google, because everyone I know keeps asking me for one. You’re welcome to share it as widely as you like with whoever you think might benefit from it.

Arguably the most important thing was to get help from a psychiatrist for my previously-untreated ADHD. This whole process would have been impossible to navigate while untreated, and ADHD is more common than people think. If you think you might have ADHD (I am not a medical professional, but you can find a questionnaire to screen you here), you should go see a medical professional about it.

If you’re thinking about learning to code, you should. It’s hard to know whether you have the knack for it until you give it a real shot. You don’t have to be a math whiz – I’m sure not. As a result of bouncing between six different high schools, I walked out of high school not knowing any math more complicated than basic algebra. I’ve actually learned a bunch of math the wrong way round at this point – I’ll hear about a math concept and understand it because it’s a concept I’ve navigated while programming. You don’t have to be some ultra-genius, and you don’t necessarily have to have to go to college.

That said, this is not an anti-higher-education post. College didn’t work for me, but it works very well for a lot of people. I wasn’t in a position to benefit from something like college or a bootcamp, but many people are. Particularly if you’re in the middle of an undergraduate degree, it is almost certainly going to be an easier path to finish it than to drop out.

Obviously some subfields and companies are more selective than others, but I dropped out of an English Literature degree a decade ago, never attended a bootcamp, never got any certifications. I hear people saying things like “can I really get hired as a software engineer if my degree is in economics”, and my answer is yes, absolutely. If you have any degree at all, you’re starting from a better place than I was. The opportunity here is like few afforded to us in the modern world. There aren’t many ways to grow up as poor as I did and land a job that pays more than 200k. I know this because I’ve hustled my way through worse jobs for years – fast food, grocery stores, call centers, etc – and at those jobs I’ve worked hard and never made a fifth of that. Tech is one of the least credentialism-infested fields out there, and for those with the knack, this is a gateway to a better life. Take it.

Learning 2 Code

I have a lot of friends who were programmers. They’re constantly saying things like “man, this new hire we just got can’t code their way out of a paper bag, they’ve been here for six months now and I basically have to do all of their work for them.” Somewhere along the line I started thinking, man, I don’t know if I can be a Great Programmer, but I bet I could learn how to code well enough to be favorably compared to that.

In 2020 I spent most of the year working full-time in a testing lab in a hospital. I was a glorified lab tech, mostly in charge of helping route bodily fluid specimens and tests for those specimens between various sections of the lab for tests that doctors had forgotten to order the first time through and needed to order an add-on test in order to cover. I was working third shift, so I had my mornings free. I decided to start learning how to code. A friend of mine who works at Amazon recommended this MIT OCW course, so I took it. I just looked at the syllabus and the readings – I downloaded the listed textbook from Libgen because I couldn’t afford it – and went through the course week by week, watching the lectures, doing the quizzes and problem sets, doing the readings and the finger exercises I found there.

I pestered my programmer friends constantly with stupid questions. I was constantly asking questions like “how come if I divide an int by an int it returns a float?” and “if I assign x to a value, and then to some other value, is there any way to reference the old value?” At one point, exasperated after I asked “can you do X in Python?”, one of my friends told me “you have an interpreter, go try it and see!” I took this advice to heart and it served me very well. Exploring in a repl yourself is a fantastic way to figure things out.

Learning to navigate people’s answers was itself a challenge. There’s a lot of things that people recommend, but everyone learns a little differently, and sometimes people who already understand a concept forget what it’s like to have trouble with it – certainly I remember having a lot of trouble reading documentation, although I look at it now and wonder how I could have, as it looks pretty straightforward now. My advice is not to get too hung up “is this course / tool / practice the best?” Learning to code is like starting to exercise when you’re out of shape – some program may technically be better than another, but by far the most important thing is just that you’re doing it, so whatever keeps you coming back is great.

By the time I finished the course, I knew I wanted to pursue this full-time. Every workday felt like mindless busywork between what I actually wanted to do. I had a little bit of money saved up, so in October I quit my job and started focusing on learning full-time. I knew I needed a side project. I’ve heard a lot of advice about how to choose a side project, but for me I think the most important thing was nice, tight feedback loops – opportunities to try things out and quickly see how well they were working. I spent a lot of time on Discord, so I decided to write a Discord bot.

In retrospect, I think it was a great choice. Discord.py is a fantastic API wrapper in Python, well-documented and with lots of resources available – odds are good if you search something like “python discord bot how to ban user” you’re going to find a StackOverflow link that’s just wrong enough that you’ll learn something fixing it. I started with an online tutorial and went from there. One of my early features was a command which allowed users to report bugs and suggest new features, and I quickly found that every new feature would create a bunch of bugs, and so this was just what I needed: a never-ending font of work that I could tackle in whatever order that I felt most comfortable with.

I frequently prioritized work that would teach me things I wanted to know next – as one example, storage. At one point all my bot’s data was kept in a text file, because I only needed it to select a random link from a prefilled set, so I just had it choose a random line. Later I added a notify-on-watched-word system that stored data in a nested dictionary ({server: {user: word}) and had it save that as a JSON file every fifteen minutes and load from it on startup. I had heard that JSON files weren’t really best practice for storage, so I knew next I wanted to work with an actual database, so I got a SQLite database running and used the Python sqlite library to open a connection to it and read and write from it as necessary. Everything was like this – find a thing I wanted to learn, make a feature that would require me to learn it.

The thing about programming is that there are just enough actual geniuses in the field that you can never quite be safe saying “don’t worry, everyone has imposter syndrome and is flying by the seat of their pants.” But there are definitely a lot of Real, Professional, Employed, Productive, Highly-Paid Software Engineers who have imposter syndrome and are flying by the seat of their pants, just like you. However you feel about how fake and dumb and hacky something you’re doing is, there are Real Programmers dealing with the same sort of thing and feeling the same way about it, for money, at a real company. A lot of this is just “learning the trick” for whatever particular thing you’re looking at, like “how do I handle publishing to GitHub with my security tokens in my code?” “Oh, yeah, just load environmental variables from a .env file and put it in your .gitignore, that’s the trick!” A few hundred tricks later and you’re a software engineer.

When I got bored or frustrated with my main project, I would do smaller, bite-sized programming puzzles. Project Euler was pretty cool even if it was a bit mathier than I was used to. Advent of Code was a lot of fun. When I discovered LeetCode later, it would feel like a natural extension of these sort of bite-sized problems. I began to publish them on my GitHub. After a while my Python was getting pretty smooth. I knew it was time to get serious about finding a place to work.

The Job Hunt

I got a whole lot of “No” before I got any “yes.” I applied to a bunch of Microsoft orgs, wrote up a nice cover letter for SpaceX, applied at a bunch of “software jobs near me” listings on Google Jobs, and got a bunch of form letter rejections, often within minutes.

A friend of mine who works at Blizzard told me to stop wasting my time. He explained to me that while the lack of a college degree was not an enormous hurdle, the combination of “no degree” and “no experience” would ensure that I’d be automatically rejected early on in the hiring funnel, which went automated system -> non-technical recruiter likely just looking for buzzwords -> technical recruiter -> hiring manager. At each level, the number of resumes passed on gets smaller. What I needed to do, he explained, was bypass as many of those steps as I could, and come in the back door.

So I started working on ways to do that. The one thing I did have available to me was a community of programmers, many of whom were friends of mine. I reworked my painfully sparse resume to pitch my lack of education or experience as a plus (“Self-taught. Self-directed. Smart. Focused. Solid.” says my byline – still seems a little smug to me but my friends assured me it hit just right), and to include references from professional SWEs who had helped me learn, seen me work on my side projects, watch me progress from painfully-stupid-questions to slightly-less-stupid questions, and were now invested in my success. When I asked for referrals, a number of them responded: I got two referrals to startups (rejected by one before so much as a phone screen, rejected after my answer to another’s online assessment), one to Amazon (rejected without ever interacting with a human), and one to Google.

This post really simplifies and neatly packages the story into a narrative, but the reality was that every day felt uncertain and frightening. Every day I got up, checked my emails, did some code, applied to some jobs on several platforms, and tried to ignore the feeling in the back of my head saying “You’ve made a horrible mistake – you’ve pissed away your life savings – why did you think you could do this?”

I had the strong intuition that I was doing a lot of things and most of them wouldn’t end up mattering, but I had no idea which ones were important. I did a bunch of stuff that didn’t really end up mattering. I seriously considered enrolling in college. I applied to a bootcamp independent educational institution called Recurse Center, and was rejected after an interview with a guy who seemed very disappointed that I couldn’t elucidate what I liked about list comprehensions. I’m still not sure what answer he was digging for. I added everyone on LinkedIn with the title “Software Engineer” that I could find, and DM’d a bunch of recruiters with posts like “Hey, I notice we have a shared connection in <name>. I’m really interested in the idea of working for <your company> and I wonder if you could talk to me a bit about that process?” None of them responded.

I’d also heard of a company called Triplebyte which ostensibly matched people who did well on their online assessments with companies looking to hire people, and I scored “between the 70th and 99th percentile” which was evidently insufficient to qualify for their hiring service, but I would still have my profile listed and could reach out to startups. I found out later on that they were transitioning into more of a “LinkedIn for startups” role, deprioritizing their assessments and hire-matching. I did reach out to a whole bunch of startups there, and later I ended up moving into the hiring process with two of them.

I started trying to understand the basics of a bunch of paradigms, swapping between them to chase the latest lead I had. I had heard that maybe it was easier to get hired in low-level if you transition into tech because people expect low-level engineers to be older, so I started a nand2tetris Coursera course. When a friend of mine at Amazon found out I could no longer afford my medication, he offered me $500 to learn some basic web dev and make a home page for a startup he was thinking about founding. I spent a week going through HTML/CSS/JS tutorials and made him an extremely dinky set of web pages that was in no way worth $500. Another friend of mine told me his team might be hiring soon, but I’d need to know calculus, so I started spending some time teaching myself math on Khan Academy. I was running out of runway, and getting desperate.

Then I got the phone call. I’d been passed around between a couple of Google recruiters and didn’t really expect it to come to anything, and had poked the latest guy I’d been assigned to one last time. He gave me a call, apologized that he’d missed me, chatted about his product area, probed my technical skills a bit, and said he was going to go ahead and schedule me for an interview loop. Simple as that. Now the only thing between me and a job in tech was the legendarily difficult Google interview loop. I didn’t have to worry any more about credentials or resumes or hireability. I just had to pass the interviews. I had six weeks to prepare.

Interview Prep

I’m going to list a lot of things I did in this section, but there’s no One Quick Trick, other than ludicrous amounts of work. I think I may have worked harder in this six weeks than at any point before or since in my life. I knew that technical interviews at big tech companies are grueling affairs with four or five technical interviews one after the other, focusing almost entirely on data structures and algorithms, and so my best chance was to practice those things non-stop.

My LeetCode history from one of my prep days.

First, I spent a lot of time on LeetCode. I paid for the Premium subscription, and I thought it was well worth it. I tried all sorts of strategies for choosing which problem to do next, including choosing from the featured lists, starting at the easiest and working my way up the ladder, and making an Anki deck of problems to work on hard ones via spaced repetition. I timed myself, trying to finish Easies in 10-15 minutes and Medium/Hards in 30-60 minutes. If I got to the end of the timer, I’d go look up a solution, make sure I understood it, then go to the next problem and try again another day. Sometimes it took multiple tries of this to actually solve a problem within a time limit, especially with dynamic programming problems.

I quickly found that working as hard as I was going was incredibly draining. At the beginning I’d wake up at 7, work out and start prep by 8:30 and by 4 or 5 I’d be ready to go back to sleep. My mental stamina increased over time, but I was definitely running myself ragged. Sometimes I took breaks or had unproductive days, and I felt very guilty about it. I took weekends off, but I usually still worked through at least part of Saturday and Sunday. I stopped hanging out with people on the weekends so I’d have more time. Sometimes at night, I dreamed of debugging algorithms.

Dealing with the anxiety was tough. I would hear someone say something negative like “remember, only a single-digit percentage of Google interview candidates get to the hiring committee” [I still have no idea what the actual numbers are] and I’d think to myself What am I doing? I have no education, no experience, I never went to college, this is just a waste of everyone’s time. Then I’d hear something positive like “I think you’ve got a good shot, judging from what I’ve seen, this is a totally achievable goal” and I’d think to myself Oh, God, I’m not working hard enough. This is doable but I’m going to throw away this shot, and when I don’t get it, it will be my fault. I’ll have let myself down. I just kept telling myself that how I did for the next few weeks could dramatically affect how I lived for the rest of my life, so keep at it.

A friend of mine shared his Tech Interview Pro subscription with me. It was pretty good, actually – I was surprised, after seeing TechLead’s YouTube channel, which had struck me as alternately funny and mind-numbingly boring, but in this paid series he clearly and candidly talked through what the interview process would be like in great detail and I found it pretty helpful. He also had videos of him solving various DS/A problems, but I found those less useful – there’s a great deal of that sort of content for free on YouTube already. I would watch these videos when I was too brain-fatigued from a day of coding to go on, and during meal breaks.

I also did a bunch of practice interviews. Some of them were informal affairs with friends of mine, others were paid interviews from interviewing.io – they had a deal where you could buy a half-dozen professional interviews for a few hundred dollars, but you didn’t have to pay until you got a job, which seemed like a great way to balance my shrinking runway with the money I’d be making if I succeeded. These ended up being incredibly helpful. The first few of them I was incredibly nervous and unused to talking through my thought process out loud, and stumbled through awkwardly. By the time the interviews rolled around, I’d done almost a dozen practice interviews, and it felt natural and normal to be solving an algorithm question in front of another engineer and talking through it as I worked.

In practice interviews with my friends (themselves professional software engineers), the feedback I was getting was pretty reliably that I was good enough to be hireable. In practice interviews with interviewing.io interviewers, I was only about 50-50 at getting a rating of “would advance this candidate to the next stage of hiring.” Were my friends just biased in my favor? Were interviewing.io interviewers incented or selected to be harder than actual interviewers? I had no idea, but I was out of time. On the morning of the interviews, I woke up from a good sleep, went for a brisk walk, had a light breakfast, put on some of my favorite music, and knocked a bunch of LC Easies out to get into stride.

I can’t discuss the Google hiring process because I was under an NDA for it, but I can tell you that I did really, really well.

Handling the Offers

Google was actually not the only company I was talking to – you remember those startups I’d met through Triplebyte I mentioned a thousand words ago? I’d passed both of their (much easier) interviews. One of them had offered me 100k in salary, 0.05% equity, and a 10k signing bonus if I signed before the end of the day. I knew that if Google offered me anything it was going to be much more than that, and so I told them I’d need more time to think about it (a week later, they reached back out and offered a larger signing bonus). Meanwhile, I told my Google recruiter I had offers on the table and I needed them to move quickly if I was going to consider them. My recruiter (who was fantastic the whole way through, incidentally) was able to accelerate my path through the hiring system by doing two steps concurrently that are usually done consecutively.

My recruiter had asked at one point if I had thought about compensation at all. I thought about what to reply. I knew I wanted the highest number I could possibly wrangle, not because I have any particularly opulent ambitions (I’m pretty frugal, have cheap hobbies, and live light), but because I’m earning to give (maxing out Google’s 10k/year charity donation match is going to be a bit tight this year because I’m coming in 2/3 of the way through the year, but I still intend to hit it for GiveWell’s Maximum Impact Fund) and I’d like to retire early. The usual advice given by salary negotiation experts (and I’d read some, like patio11 and Josh Doody) is to never give your number first, but in this case, I figured giving a number might work to my advantage, since I knew I’d done well on the interviews and I had a pretty good handle on what they might offer thanks to levels.fyi.

I figured it was to my advantage to ask high and let them counter lower, so after doing my research and asking around, I asked for a number that was in about the 80th percentile of what a junior engineer at Google might make. My recruiter said he’d get to work on that, and when the offer came through, it was only slightly lower than that. I told him that it was a great offer and I’d love to work for Google, that I was talking to several other companies and I anticipated that they would match this offer, and that if he could throw in a 10k signing bonus, I’d say yes on the spot. He said he’d see what he could do and called me back an hour later saying he couldn’t get the compensation analysts to sign off on the signing bonus but he did get it added to my offer in the form of equity to be vested over four years. I accepted.

Epilogue

I started at Google a couple weeks ago. I won’t say any more about it, as I’m not sure what I can talk about, but I can say it seems like a fantastic place to work, and I’m incredibly grateful for the opportunity. One thing I didn’t anticipate is that my lack of a college degree, which has felt like a millstone around my neck for the last decade, has suddenly made me pretty popular – it seems like everyone who finds out that I’m self-taught thinks it’s very cool. Sometimes I wonder if I could have done this years ago, but I think I probably couldn’t have – the particular combination of a supportive community, a good environment for learning, and a measure of self-discipline isn’t something I’ve had throughout most of my life. It makes me very aware of just how path-dependent life is, and thankful that I’ve stumbled into a place where I can realize my potential, and it underscores my responsibility to those less fortunate than me.

4 thoughts on “How I Went From College Dropout to Google Software Engineer in About a Year”

  1. I’ve been playing around with the Python programming language for about two months. I don’t have any desire to be in the coding/programming field, but its fun to learn.

    Like

  2. You made me tear up at the end. I’ve heard from you before from a friend (I’ll call him friend) when I told him I would like to learn how to code. Now reading all your process and progress, from you, is impressive. Definitely I’m really inspired to dive into coding more than ever. Appreciate the fact that you share this and that my friend had introduce me to you and your story.

    Liked by 1 person

  3. You’re my hero Skew.

    I’m bookmarking this story and whenever I need a boost of motivation, I’m coming back to it.

    I can’t grind anywhere near as hard as you, I can’t emulate your ruggedness and perseverance, but your success story is amazing (and is a stark reminder of how much I’ve squandered).

    You’ve inspired me to seriously commit to gitting gud. I’ll at least try to keep at it; any less would be disrespectful.

    Like

Leave a comment