Learning To Be A Developer And Getting My First Offer (A Personal Story)
Tags: career, beginners
Published: 2019-11-07 07:53:45

I recently got a notification that I have passed the interviewing process at a certain FAANG company (that shall, for now, remain nameless) for a Software Engineering position and will be soon receiving an offer. I am still a bit in shock, as it was my very first interview outside of Academia and my first white board technical interview experience.

As a way to process how I have come to this point, and as a way to perhaps give fellow coders that are looking to break into the industry, a tiny bit of insight, I wanted to write out how I've ended up here and how I've studied. I'm not trying to sell you anything and have no affiliation with any of the websites or services that I may list. I'm just telling you what I've done and experienced.

I don't claim to be an expert at this, and honestly at first there was a part of me that thought that they mistook me for someone else (BEGONE IMPOSTER SYNDROME!)

WARNING: I might have gotten creative with my analogies. Expect references to Tolkien.

<h2>A Bit About Me</h2>

As my previous posts mentioned, I do not come from the traditional Computer Science or Engineering background. My time as a PhD Astrophysics student was spent largely coding, but in a very, very different regime. For example, my primary advisor still codes in Fortran 77 and has very little understanding of OOP, but that is good enough for what we typically are doing (and he's very successful in what he does). Most of the time is spent in developing and implementing algorithms to be able to do the necessary calculations (e.g. a numerical integration of some orbits around a black hole or doing statistical analysis on telescope data), or refactoring said algorithms to be run across a computer cluster.

I'm proud of what I've done, and I've personally have learned a lot about high-performance computing. However, up until about 1 year ago, I had only cursory understanding of different programming regimes. Sure, I could implement a 4-th Order Runge-Kutta Integrator or a Markov Chain Monte Carlo, but I had only cursory understanding of what a Hash Table was. I was simultaneously over-qualified and woefully under-qualified for most Software Engineering positions.

I was always interested in computers though, and I started to realize that maybe I didn't want to be a research scientist for the rest of my life, and that I should really start to let myself explore. No harm in looking after all, so I decided to learn a bit about how the other 99% of coders actually do things.

<h2> Early Exploration </h2>

As I really didn't have any idea where to start, I decided to start looking into Quantitative Analysis and Data Science. Both I knew were good-paying careers, and they are traditionally thought to be one of the most common industry starting points with people with a PhD in Physics or Astrophysics.

For these, I used a combination of <a href="https://www.datacamp.com"> Data Camp</a> and <a href="https://www.kaggle.com"> Kaggle </a>. Between the two, I would lean more towards recommending Kaggle for Data Science. 

I spent a quite a few months exploring both topics, and while interesting, I couldn't help but be easily distracted by other topics. As my PhD research was starting to be going towards scientific software development, refactoring my scripts into something that anyone could use, I became interested in learning more about Software Engineering and Development. 

So, without much an idea as to how to start, I started where I first learned Python back in 2013: <a href="https://www.codecademy.com"> Codecademy </a>.

While I spent a significant time exploring, I would recommend anyone looking for a change to do the same. Find something that fills you with excitement. We must permit ourselves to explore if we are to find new opportunities.

<h2> Learning Computer Science - Algorithms & Data Structures </h2>

At Codecademy, after looking through their catalog a bit, I decided to purchase a premium subscription and take their Computer Science "Career Path."

While it started off with the very basics (e.g. Python syntax), it did ramp up quite nicely. The path goes through all of the basics for algorithms and data structures, teaching you in the interactive lesson format that Codecademy is famous for.

I finally knew what a Hash Table was and I developed an adoration of Graph search algorithms. I would rate this a 9.5/10 experience, with only some minor complaints about the occasional bug that I found in the Codecademy environment.

In order to supplement this education a bit, I built a GitHub repository where I tried to implement all the major data structures and algorithms. I also started to make some very basic projects.

One project that I did that I found especially helpful in learning both the usefulness of Hash Tables and the power of Depth First Search was a command line app that recommends paths to get between two points in the Maryland-DC-Virginia subway system (<a href="https://github.com/cjtaylor1990/wmata_pathfinder"> WMATA Pathfinder</a>). It's was a fun challenge.

After learning the fundamentals, I started going through some of the Easy <a href="https://leetcode.com/"> LeetCode </a> questions, and I learned that I really enjoy doing these types of Technical Interview coding questions. Puzzles have always been fun for me. However, it must be noted that I did NOT go overboard on LeetCode. Take studying seriously, but don't stress yourself out over it, because burn out is a risk, and one that one should always try to avoid.

<h2> Web Development </h2>

As I thought that the Computer Science Career Path was quite good on Codecademy, I picked up their Web Development path shortly after completing the first path.

It had been years since I touched any HTML or CSS, so this process was a bit slower than the previous one. I also did not know anything about JavaScript, and was initially completely baffled by asynchronous programming. However, Codecademy was very good at explaining things, and the interactive lessons forced me to immediately apply what I'm learning.

I am currently nearing the end of this Path right now, and I'm happy to say that it was a good introduction to Full Stack Development. Their React lessons were especially nice, as well as their backend lessons.

The biggest piece of advice that I could give someone who wanted to learn Web Dev, would be to make sure you do projects outside of online tutorials. Online tutorials have a tendency to hold your hand, and while this is important in the initial exposure to the topic, I feel like I learned more about using React and API integration creating my own Weather App from scratch as compared to doing a step-by-step tutorial, even if the tutorial will likely have me building something much more complicated (e.g. Spotify playlist builder).

<h2> Hacktoberfest 2019 - Learning To Collaborate </h2>

After all of this (along with an especially busy year in my PhD studies), I was gaining some confidence in myself, though I realized I didn't have really much experience with development collaboration. While you have collaborators, for better or worse, so much of science is incredibly isolated. As such, I decided to give myself a push.

I had always been interested in the concept of participating in a hackathon, but I wasn't entirely sure about the process, as I'm shy and I am still very green. When I stumbled upon Hacktoberfest, as it was an online hackathon, I no longer had excuses. I signed up, and I got to work making pull requests.

Much of my experience with Hacktoberfest can be found in a <a href="https://dev.to/cjtaylor1990/my-hacktoberfest-experience-as-a-rookie-3mp7"> previous post </a>, but I wanted to still mention it, because I think it is important. Collaborations teach you a lot of things, and the sooner you can get involved in one, the better.

<h2> Building My Resume </h2>

Along with everything I've talked about, I have also been working with my campus' career center (which I would highly suggest all students take advantage of if one's available), and I had turned my massive CV that spanned a decade's of scientific research into a slim, compact resume.

This was incredibly difficult, and I would be lying if I said I didn't have many, many revisions. It is important however for you to get your resume as polished as possible.

For PhDs who are looking to change paths, a great resource for this would be <a href="https://www.amazon.com/What-Are-You-Going-That/dp/022620040X/ref=sr_1_1?crid=EP50RMHQFTD1&keywords=what+are+you+going+to+do+with+that&qid=1573106963&sprefix=what+are+you+going+to+do%2Caps%2C137&sr=8-1"> "So What Are You Going to Do with That?"</a> by Basalla and Debelius. It goes through much of the application process, and it also talks about changing your mindset when you write your resume.

The biggest piece of advice for those that are looking to change fields would be to stop thinking of yourself AS whatever you do, but instead think of yourself as a person who just so happens to do what you currently do. For academics, this can be a HUGE challenge, but it is worth the time required for the necessary self-reflection. Make sure you make those skills prominent in your resume, as those are what a potential employer will look for.

To draw upon an analogy from theater, you are a person with skills, and those skills are like the stage, the props, the actors, and the backdrop in a theatre. Those same people and items can be used to perform a multitude of plays and operas, but it is ultimately you, the playwright of your life, to decide what story they will tell.

For myself, I realized I was not an Astrophysicist, but a person with a passion for coding who chose to do Astrophysics. By making my resume about my skills, I was making a statement that I am more than whatever my past choices have been. I'm adaptable.

<h2> Applying - I Was Brave And Sleep Deprived </h2>

I had been polishing my resume for weeks, and my career counselor suggested I put out a few applications, just to get used to the process. I was nervous, but finally after a long (but successful) night of debugging the code for my PhD project, I decided that I was feeling brave enough to venture forth into the land of Indeed and LinkedIn Jobs.

After a bit of a random walk, I happened upon a listing for one particular company that I had always regarded with great respect, but one that I considered myself woefully unprepared to actually seriously apply for. If I was more conscious and had a full night's rest, I might have hesitated, but I decided to pull the trigger and apply. This was at the end of September 2019. I still remember that my hands were especially sweaty and the day after, I thought I was crazy. The tired version of myself clearly had gotten a bit too sure of itself! I was expecting my application to go into the trash immediately (and once again, another example of imposter syndrome). 

I didn't think about it for a while. I continued to hone my skills a bit, do some more LeetCode, and have some fun with Hacktoberfest.

<h2> An Unexpected Journey </h2>

Very much like Gandalf showing up at the door of the hobbit, Bilbo, and tricking him into throwing a party, a couple of weeks go by and I suddenly received an email about taking an initial interview and coding assessment. I was a bit perplexed...were they positive they were emailing the right person? I decided to be brave and said yes, deciding that I would rather take the risk and go down in flames than not having tried at all.

I spent some more time on LeetCode, doing a couple of Medium questions and still failing miserably at the Hard questions. I tried my hardest to prepare, but obviously I had other obligations that kept me from optimizing my study times. I just wanted to try my best though, and that's what I aimed for.

I went through the initial assessment and interview, thought I did okay, but didn't find the optimal solutions. I had some more confidence in myself, but I wasn't expecting to advance further.

Like Bilbo however, I wasn't prepared for what was going to happen. The next thing I know, I am contacted, being invited to (figuratively) take on the dreaded On-Site Coding Interview Dragon.

I was in a bit of a daze at first...I pinched myself...I was excited...I was terrified.

<h2> (Coding) Riddles In The Dark </h2>

I had a short time to prepare, and I felt terribly, and I mean, TERRIBLY unprepared. I knew that I had to brush up on so much, and I had to really bolster my Data Structures and Algorithms. It was a bit overwhelming, and I was stressing out so much in the time leading up to the on-site, and I could only hope that I wouldn't get Smaug as an interviewer. It was certainly Out of the Frying Pan and Into the Fire.

LeetCode wasn't enough as I never was really satisfied with their explanations (if there was an explanation). I needed to really understand the these type of coding questions on a fundamental level, as that is really the only way that I knew that I would be likely to be able to apply the problem solving techniques in an interview setting.

Suddenly, in the dark depths of studying, I find my One Ring To Rule Them All: <a href="https://www.algoexpert.io"> AlgoExpert </a>. I found this platform absolutely fantastic, and I would recommend it to anyone who is trying to master Algorithms and Data Structures.

Unfortunately, AlgoExpert is not a free service, and thus may be out of reach for some people. For those who need to do this type of studying on a tight budget, there does seem to be plenty of options out there. I would suggest trying the videos put out by <a href="https://www.youtube.com/watch?v=bum_19loj9A&t=7s"> CS Dojo </a> or <a href="https://www.youtube.com/watch?v=RBSGKlAvoiM"> freeCodeCamp </a>. That being said, if you have the money, AlgoExpert is well worth the investment.

If I were to go back and give myself some advice about this pre-interview build up, I would tell myself NOT TO BE SO STRESSED OUT! I should never have let my imposter syndrome affect me like it did, making it often hard to sleep or concentrate.

Sometime stress can be the fire needed to ignite greatness in you. Just be careful as to not get burned. Take care of yourself. If you've gotten this far in the process, then you're doing something right!

<h2> The Interview </h2>

Unfortunately, I am unable to tell you details of the interview itself (I can confirm though that it did not involve slaying a dragon). It was difficult, and to tell you otherwise would be lying. That being said, for all of the cultural dread that surrounds talk of technical interviews, it wasn't AS bad as I was expecting.

The interviewers were more than happy to give me hints and clarifications, and completely understood that I was nervous. I realized that they weren't there to torture me for hours, but instead just to talk to me and to see how my thoughts came together.

Talk to your interviewers and remember to ask questions. They won't bite.

<h2> Epilogue </h2>

After the interview, I felt I did okay, but not great. I thought it was all going to be a stressful learning experience, and that would be it. I still really wanted to try to work for the company, but I thought I had fallen just short. I went back to the hotel and ate two whole pints of Ben & Jerry's ice cream, letting myself just relax and try not to agonize over how things went.

I returned back to my normal life, my regular PhD research project and my late-night forays into the land of Software Development. That is, until I get the call from the recruiter, asking if I would like to continue into the offer process.

I don't remember a whole lot about the next few minutes, only that they told me I would know more in the next few days. I then proceeded to power-walk through the Astronomy Department multiple times just to eliminate some adrenaline. I've not been that excited in a very, very long time.

I went home to celebrate, eating another pint of Ben and Jerry's (I swear I don't have a problem) and calling my family and close friends with details.

Even if it would have turned out differently, I would have still been proud of myself, because I tried my best, and I know I still have a long road ahead of me in transitioning from an Astrophysicist to a Software Engineer.

It's important to remember that every experience you have in your professional life can be useful if you allow it to be. Successes boost your confidence and act as the building blocks to the path forward. Failures are equally as important, as they teach you to be humble and be aware of the areas that you can improve upon. Always do your best, and even if you fail, you can always come back stronger.

I will say that I'm writing this without having the offer letter officially in front of me, and it's entirely possible that the company and I can't come to an agreement on terms. If so, that's fine. I still learned something, and I feel much better about myself and my future in this new career path that I've chosen to walk down.

In writing all of this, I am not in any way trying to brag. I just want my fellow rookies, and especially those that come from a non-traditional background, to know that you can succeed. Don't let your self-doubt hold you back. Don't let your stress overwhelm you. Take care of yourself and don't be afraid to go after your dreams and passions.

You are the author to your own story. Now write it.