Hack Reactor's Teaching Style
Without a doubt, one of the most impactful things at Hack Reactor has been the teachings from our lectures. Especially at the beginning. This was due largely to our main instructor Marcus. Honestly, his attitude towards teaching and care for the students is one of the main things that sold me on Hack Reactor in the first place. In this post, I'd like to walk you through some of the things I think set Hack Reactor apart in terms of teaching style, culture, expectations of students, etc.
Expectations
From the the start of Hack Reactor it was clear that they expected a lot from us. To get into the program there were two technical interviews and a chat client assignment. After being accepted there was about 50+ hours of pre-work to do before the program. This is honestly starting to be the norm for a lot of intensive coding programs. What's different about Hack Reactor is that when you arrive your first day you realize many of the students are already part way through a CS degree, flew through the prework and that the first two weeks you take a deep dive into data structures and algorithms. If you aren't extremely solid on the fundamentals when you start, you will quickly be buried by the work thrown on to you. They expect a ton out of the students and that is one of the things I like most about being here.
Pair programming
Pair programming is one of the best ways for a beginner to learn how to program and learn how to vocalize code. It's basically when two people sit at a computer with two screens and two keyboards that are attached to the same computer. They work through the code as a team, with one person being the "navigator" and the other person the "driver". The navigator is the person that decides what to do. If the either of the people are like "Ooo I know what to do", rather than take the keyboard and do it, they suggest to navigate so that they can speak the code to someone else and the other person (driver) can practice doing it. The driver is the person that has the keyboard and codes. Each person takes turns swapping between driving and navigating.
My experiences with pairing have been largely positive. It really helps to practice working on problems with someone. Getting stuck isn't as frustrating when you have someone else to work on a problem with you. Generally when you pair, both people have a notion of who knows more about what to do. When this is the case, the 'better' pair is able to practice navigating more and explaining their reasoning. I've frequently had situations where I thought I knew something very well but when it came down to explain it, I realized my understanding was foggier than I initially thought. This can also be one of the challenges of pairing is that when someone has a weaker intuition of what to do, it can lead to both of you constantly jumping into rabbit holes and diving into tangents that don't solve the problem. This is why I've tried to embrace a more inductive way problem solving and debugging. I'll explain what I mean. A deductive way of debugging is where you might run into a bug and then frantically trial/error every possible solution you have in your mind. For small problems this might be enough; however, with bigger problems you can end up spending an hour or two spinning your tires and still not have any idea what the problem is. The inductive way to solving is to go back to the point where you know exactly how the code works and you know it's functioning. You then step through the code one line/block at a time with a debugger and find the point where things aren't behaving as they should. Next, make a hypothesis on what you think is the root cause and a potential fix. Test out the fix and see what happened. Wash, rinse repeat.
The other side of pairing is also helpful but it has drawbacks all the same. When you are the 'weaker' pair it feels better because you fly through the problem easier and you're able to get an explanation from your pair about how they're approaching the problem. The downside is that you don't hit the same roadblocks that you would've alone and that effectively means that you also skip a lot of the learnings that you should've had. For this reason and many others, we're always encouraged to pair with people who have similar abilities to us.
Mentality
Coding can be extremely frustrating. When you're in an environment such as this it's easy to feel discouraged or feel like an idiot because your peers are constantly one step ahead of you. One of the things that's been drilled into our heads is that good software engineering doesn't mean that you know everything. Rather that you are comfortable understanding that you don't know everything and you can move forward quickly. You are also comfortable with just interacting with the interfaces of libraries/frameworks and not having to understand the inner-workings of everything.
Autonomy
When we all started at Hack Reactor, their mandate was to make sure that no student 'grinded' on a problem for more than 5 minutes. Grinding is where you are stuck on a problem and are burning a lot of mental energy to figure it out. Hack Reactor offers tons of resources to make sure that we can get 'unstuck' immediately. However, as we progress as developers their goal is for us to become autonomous. Autonomy in coding is where you are able to unstick yourself through whatever effective means necessary. This might mean talking to a senior engineer, but it likely means debugging, stack overflow or reading the documentation.
Lowest delta
Lowest delta is the idea that rather than code 50+ lines and check in your code, you should do it much more iteratively. This is better both for debugging and for keeping track of working versions of your code. Aiming for the lowest delta means doing the smallest amount of code necessary for a noticeable improvement in the program. Doing as little as possible to improve the app, testing it to make sure it works, then checking it in.
Toy problems
We do basic algorithm questions every morning as a warm-up that helps us get prepared for interviews ahead and gets us more used to the time complexity of alternative solutions. Some questions are building a function to bind a object and a function together. Others are building sorting algorithms, anagram generators, data structures, etc.
















