JavaScript Learnings: From Zero to Hack Reactor in 5 months

Background: When I started this journey, I was completely new to JavaScript, but not new to programming. I had taken the first half of Udacity's Intro to CS (all in python), and completed Programming Foundations in Python and Exploratory Data Analysis with R. [Full disclosure: I work at Udacity and it is awesome.] I also had taken a Treehouse course to build a simple Android app, and picked up a tiny bit of Java in the process.   


Resource list: 

There's a wealth of intro-level material out there for new JS programmers. My first goal was just to pass the Hack Reactor admissions challenge (a very clever coding exercise that requires you to submit your info by manipulating an object and an array). I used the Codeacademy JS track to learn about how to work with objects and arrays, and w3schools to find the methods I needed to apply. I ran my code in jsbin before submitting it in the admissions challenge interface. 

It took me about a week to pass the challenge. After I submitted my info successfully, I felt my first real twinge of achievement. I scheduled my interview for the next month and vowed to study everyday up until that point. I was in for quite the ride. 

I finished the Codecademy track, and proceeded on to Coderbyte to practice coding exercises. This was fun, but, similar to the admissions challenge, didn't feel like I was learning "real" JavaScript. It felt like I was just figuring out how to solve problems by googling and searching Stack Overflow. I needed more structure. At this point, I'd also reached the limits of what I could do in jsbin, and, by the end of the month, decided to upgrade to a real text editor and practice version control. 

Month 2: Doing as Real Programmers Do

Resource list:

This is when I got SERIOUS. Before my interview, I took the first two parts of Code School's excellent JavaScript Road Trip series (well worth the $29/mo fee). I also took Udacity's Github course to understand how to use Github, and figured out how to configure Sublime Text to run my code. Finally. I was doing *real* programmer-y thingies. I even ordered a very thick book to help ground me in the fundamentals (all the different online courses and blogs had made things a little noisy for me).

In addition to my Professional JS book, I read Eloquent Javascript online, which the Hack Reactor admissions team recommended. I found it a little hard to parse at times, but I liked how you could practice coding "inside" the book.

A few days before my interview, I went to a day-long course at Hack Reactor to learn about objects, arrays and functions. This was the first of a two-part series they offered to prospective students. It was expensive ($225), and probably not worth it, learning-wise, since I was already pretty comfortable with the material they presented. I still got a lot of value from it though; I met cool people, and interacted with current Hack Reactor students and instructors, and generally got a good feeling for the place. 

Interview day came, and I was not terribly optimistic about my prospects. My interviewer was perfectly nice and friendly, and I got through the first few problems OK (very basic stuff, working with objects and arrays), but completely froze when I had to write functions. After a painful figuring-out process, my interviewer finally just told me the answers. I could tell he was eager to move on with his day (he wasn't rude or anything, just fiddly and ready to go), and that was that. I got a very friendly rejection two days later, with a request to submit a JS project before scheduling another interview. 

Getting rejected is a bummer, but I was undeterred (and unsurprised). I was ready for more code, and started planning my project. 

Month 3: Let's Do This  

Resource list:

I wrote many, many lines of bad code this month. I was on a tear to prove that I could build something - anything - that worked in JavaScript. I finished the Code School Roadtrip series, and took two Udacity JS courses. I completed the JS Basics project (an online resume) on Udacity, then moved to the Treehouse web course, where I built a TODO app. I submitted my projects at the end of the month, and was promptly cleared to schedule another interview for the following month. 

Of all the learnings I consumed this month, I'd say the Object-Oriented JS course on Udacity (taught by Hack Reactor's Marcus Phillips) AND the JS Ninja book were the most useful -- at this point I didn't need new coding challenges, I needed to understand what the hell I was doing. The Udacity course is free (all Udacity courses have a free path, but you have to read the buttons carefully), and the JS Ninja book was $25 and a VERY good investment. 

Things seemed to be going swimmingly. I was hitting my stride, coding every day, usually for hours at a time, and generally feeling good about my progress. 

At the end of the month, I attended Part 2 of Hack Reactor's JS Fundamentals series, and found it to be pretty helpful and well-taught (h/t to RebootJeff, who led the course). I was still shaky on implementing callbacks and closures, but figured I could work it out in the days before my interview. 

Month 4: This is How You Grow

Leading up to my second-try interview, I felt ready. I'd learned how to write the major collection functions in vanilla JavaScript, studied the underscore collection functions, felt comfortable with objects and arrays, understood control flow and hoisting, and could at least talk intelligently about scopes, closures and callbacks. I even practiced coding in plain text (with no color tags or auto-formatting) so I would be ready for the interview format. 

Everything started great. I sailed through the first few coding exercises with ease. I had a different interviewer than the last time, and he was perfectly nice and helpful. Once we reached more complex functions, I hit a stumbling block. I had no idea what to pass into my callback. I probably could have figured it out if I'd been at home, with the wealth of the Internet at my fingertips, but this was an interview, and I was stuck. I talked through my thought process with my interviewer, and he helped me get unstuck. I stumbled through the rest of the problem, and hoped for the best. 

The best did not happen. Two days later, I got another friendly rejection, saying that I was "very close" to where I needed to be, but not quite there, and please try again after a week or two. This time, I wasn't required to submit a project, so I think I really must have been very close to getting in. Regardless, I was sad and, for the first time, discouraged. Maybe it was time to rethink this whole idea. Maybe I couldn't do this. 

That insidious gremlin, Doubt, crept into my mind, and I thought about giving up. I took a break for a few weeks and mulled my options. I could give up and go back to my non-technical but perfectly fine job, and have a perfectly fine life. OR I could stretch myself and keep trying, and emerge with a highly valuable new skill set and career prospects. I opted for the latter. 

OK, so here's the thing. Whenever you stretch yourself and try to make a big, scary life change, you're going to hit doubts. You'll hear them in your head when you struggle -- they'll tell you that you can't do this, it's too hard, you're not smart enough, you're too old, it's too late. Or maybe it's friends or family members telling you this (in which case, you have shitty friends, and your family sounds terrible). Wherever the doubts come from, you will feel them, and you will feel like giving up. Be ready for that.   


After my break from coding, I found it tough to get back in the game [Important Lesson: Do NOT take more than a few days off when learning to code!]. To help motivate myself, I emailed a few friends for help with callbacks. If I got other people involved, I was far more likely to recommit. Soon after, a friend volunteered to help, and basically taught me how callbacks worked. It took less than 30 minutes. Amazing, right? It's funny how you can read endless blog posts, take classes and do exercises for weeks/months, and still not really understand something until someone just sits down and explains it to you.  

I scheduled my third-try interview for a few weeks out. It had been over a month since my last interview, and I didn't want to drag out the process any further. I'd already missed, like, 3 cohorts since my first-try interview, and I didn't want to be pushed out to next year's cohorts, at the rate I was going. 

I kept coding and focused on writing functions with callbacks. By the time the interview rolled around, I felt ready. I had the same interviewer as before (the second-try interview), and we basically jumped back in at the point where I'd gotten stuck the last time. I didn't get stuck this time. We did a few more exercises, and ended with a problem that required you to manipulate objects. Funny enough, I was rusty on using objects, having been so focused on functions and callbacks in recent weeks. So it took me more time than it should have to work it out. Again, my interviewer was helpful and answered my questions patiently until I got through it. 

I left feeling good about the interview, but still nervous. After all, I'd felt fairly good after the last interview, and didn't get in. I tried not to think about it too much, and enjoyed my weekend (I interviewed on a Friday). On Monday, I got a very friendly acceptance email, and will start in 3 months! 

Moral of the story: DON'T GIVE UP.