Over the last 10+ years, my career was dedicated on teaching people how to code. Throughout this career, I’ve directly taught over 1,000 students and indirectly through Coding Dojo have taught thousands of people how to code. It has been a rewarding but also a hard journey. It’s not an easy task to get someone who never programmed and in a matter of months, get them to a level where they can get hired as a full time software engineer. It’s especially hard when training someone who’s not very computer savvy. I’ve had many sleepless nights thinking and pondering what the best way for someone to learn how to code, how to re-wire their brain in the quickest and most effective way so that they can not only understand how a computer thinks but also come up with instructions for the computers to do what they want done, etc.
Over the last 10+ years, I’ve learned a lot, made a lot of mistakes, but also discovered some key learnings that have really helped me to better help more people who are trying to learn how to code for the first time. As these tips would not only help those in coding education, but also directly those who are learning to code for the first time, I wish to share these tips/learnings in this blog post.
Tip #1. Learn how to predict the output of computer programs before learning how to write code
This was probably one of the biggest breakthrough in my teaching career. It was in the summer of 2015 where I had this breakthrough. At that point, I’ve been training folks for over 5 years so it wasn’t that I was completely new at teaching, but I was still struggling on how to get someone’s brain to be re-wired so that in a matter of weeks, they can start thinking like computers instead of like humans. I know this sounds funny but really computers “think” certain way where everything they do is based on a few building blocks. Everything that a computer does needs to be built with these building blocks and getting humans (who’s not used to thinking this way) to all the sudden think this way, is a major transformation. For myself, it took me several months before my brain could “think like a computer” but that was back in early 1990s when I didn’t have a mentor and was self-teaching myself.
Up to 2015, I was able to get majority of my students to have their brain re-wired this way in about 2-5 weeks, which wasn’t bad but it took me enormous amount of time to provide this mentorship and to figure out how to re-wire each person’s brain to think this way. As everyone had slightly different way of thinking about solving a problem, this required a lot of repetitions and personal coaching. What made this even tougher was how just like a spoken language, a lot of these brain re-wiring could happen all the sudden, in what we now call a ‘Aha’ moment where all the sudden, your brain is re-wired and you can now think this way. This made it harder to predict whether someone would get really good at coding as sometimes, someone would have series of these ‘Aha’ moments a few months later than someone who had these ‘Aha’ moments earlier and still end up being equally as competent at the end.
Anyhow, in the middle of 2015, while I was teaching at the Seattle campus, a new thought popped into my mind. Previously, I was having students come up with an algorithm to do simple tasks, such as write a function that returns a sum of the numbers passed, write a function that logs all even numbers from 1 to 255, etc and then gave them increasingly harder algorithm to help them level up. A new thought was to have the students learn how to predict the output of existing computer algorithm before learning how to write their own. It was simple and it made sense so I gave it a try.
The result was astonishing. Progress that I’ve usually seen in students after 2-5 weeks of full time coming, I was seeing how they were able to get there 50-90% faster! Plus, once they did this, they had a better understanding of how a computer worked and they also learned how to debug their own algorithm a lot better! Whereas previously students needed a lot of my help debugging their code, they could now simply pull out a piece of paper and debug their own code. This transformation was so astonishing that I’ve captured the lessons and created an app to duplicate what we did in Seattle. Once we’ve created the algorithm app, we now noticed what we saw in Seattle campus happen in other campuses too.
So, if you’re learning to code for the first time, instead of writing algorithms as your first journey, instead pick a programming language and try to understand how a computer runs these instructions line by line. Learn how to use a T-diagram and first learn how to predict the output of codes before you learn how to write them. You can also try the algorithm app we’ve created. It’s free and can get you started.
Tip #2. Really focus on the fundamentals. Don’t chase fancy colorful features that will be a huge distraction.
All programming languages are really built upon what I consider 5 building blocks of programming. Everything in software is created using these 5 building blocks and if one masters really how to use these 5 building blocks, he/she will be able to create anything he/she can think of, regardless of what programming language one uses. A huge mistake made by a lot of new programmers is where they don’t focus so much on these 5 building blocks but focusing on things that really don’t matter that much. Of course, this is hard for a beginner as the beginner won’t really know what’s important and what’s not when learning something new. After all, that’s why they are called beginners.
Some of the top distractions a new beginner should avoid are:
- focusing on fancy features provided by a programming language or a framework instead of focusing on the basic building blocks. This is very common. Everything in software can be created by 5 building blocks. This also means there are bunch of codes that other developers already created using these fundamental building blocks, which are called libraries, tools, or frameworks. A new programmer shouldn’t focus so much on learning these libraries but should relentless focus on how to replicate what these libraries do by assembling their own instructions using these 5 building blocks. I also think this is the difference between a 10x developer and a mediocre developer. I believe that 10x developer can create whatever they can think of using fundamental building blocks whereas mediocre got too comfortable “leveraging” other people’s code and they aren’t as good as building a new solution using these fundamental building blocks.
When a teacher helps students focus on the fundamentals, the student can grow so much faster than a student who’s not as focused on the fundamentals. Another huge distraction when someone’s new is also too much focus on advanced algorithms including data structures. I have a lot to say on that topic but will save my thoughts for another post.
Tip #3. It’s nearly impossible to predict whether someone’s going to be a great developer or not (when that person has less than 100+ hours of coding experience). Do not sell yourself short (if you’re a new coder).
In my early teaching careers, I’ve tried to come up with a good predictive tool to see who’s going to be an awesome developer or not. In my teaching career however, I’ve observed countless students who were really struggling in the beginning (often being the bottom 10% of my students), who after having some late aha moments, all the sudden, they graduated as top 10% of my class. After seeing so many students like this, I’ve given up on trying to even predict whether someone’s going to be a great developer or not, especially when the person just haven’t spent that much time on coding before.
Now, this is one of those things that after you make the observation, you then come up with a rationale that explains this. My rationale for explaining this phenomenon is that learning to code is a lot like learning a new spoken language. Imagine that you are a teacher and your job is train someone to speak ‘Mandarin’ in 4 months and at the end where they can almost speak like a native, enough to get a job as a translator (either translating Mandarin to English for english speakers or translating English to Mandarin for Mandarin speakers). This is a tall order and you decide to come up with an assessment to better tell who should be admitted to your class.
Imagine that you invited 100 people to interview with you and majority of them have spent less than 100 hours previously actually studying Mandarin. If you were giving them out a test, would the top 20 people who did well on that test, ultimately be the top 20 students (assuming all 100 students actually enrolled in your class)? If you were interviewing a candidate who were struggling, would that person still continue to struggle after your 4 months of training?
Another analogy, which may be better, is to think of a two year old babies. Imagine your baby is two years old and doesn’t speak English really well (compared to other two year olds). Would you then say that your baby just isn’t good enough and can’t speak English better than other kids? Similarly, if you had a baby that learned to speak early, does that mean that the baby is smarter than other kids and will continue to outperform other kids when it comes to speaking English?
Intuitively, we know that this is not the case, as some people just bloom later and there’s nothing wrong with that. For myself too, I came to America when I was 14 and I, being extremely shy, took a lot longer to learn how to speak English than other people. I like to believe I still had a chance and if someone came to judge me when I was 14, saying I would never be able to speak English well (because my English at that time was horrible), I would have felt cheated.
Similarly, when a coding school gives a lot of technical interview challenges for a new coder, a part of me just feels like something is completely broken. That system works for an experienced developer who already had these aha moments, but when you’re evaluating someone who never coded before, building a system to filter out candidates based on their level at the time, to me, feels not only inefficient but also wrong. It feels a lot like getting bunch of two year old babies and filtering them based on who can speak English the best (and assuming two year olds who don’t speak English that well at the time will never really speak English that well later on).
A while back, I wrote a blog post about “Can anyone really learn to code?” That article has thoughts that are related to this topic and you can check that out also if interested.
Tip #4. Given proper environment, it’s possible to learn very very quickly.
This makes sense but when we get into details, people would argue about this point. Learning to become a great developer is not easy and it does require normally years of practice. However, it is possible to learn what one took years to learn in a matter of months. With even a stronger environment, it’s possible for someone to learn what one took years to learn in a matter of 2-3 weeks.
Now, there is still value in the years of experience as knowledge alone is not as powerful as knowledge + wisdom, but when it comes to just ‘knowledge’, I have seen how students learn what I learned in 2-3 years in 2-3 weeks. Because they lack experience, they lack the wisdom I acquired over the years but they are able to obtain ‘knowledge’ enough to create complex application in a whole new language and framework in a matter of 3 weeks.
I have seen this over and over again in Coding Dojo especially as our curriculum got iterated and improved. Now the caveat of this is that unless one continuously practices, what entered into their brain in that 2-3 weeks, unless it’s continuously practiced, will also quickly dissipate and get lost. This is why it’s critical for someone who learned to code to continue to practice so that their knowledge doesn’t just reside in their ‘brain’ but then can be integrated throughout their whole body and become just part of them, but it still remains true that one could really quickly learn a new materials.
I hope some of the learnings/insights are helpful, especially if you’re also in education or if you’re new to coding and you want to learn how to code. A lot of these are my personal opinions though and I am sure there are a lot of people who would disagree with my point of view. Whatever feedback or comment you have, it would be great to learn of your point of view so feel free to send me a message or post a comment below. Happy coding!