You’re one week into your programming course, and it feels like you’ve already hit a skill ceiling. You’ve checked every line, you’ve been staring at the screen for an hour, and yes you’ve checked the damned semicolons. As if to mock you, the computer’s gone ahead and put a warning on the same line as the error, so you can’t even click both of them at the same time.
You give up trying to fix this yourself, and ask for help. Your friend looks at your code for two seconds and points her finger at a particular spot.
“There needs to be a closing bracket right here. Right now this else is inside the if.”
Of course. You just learnt about if-else statements. You’re supposed to know this stuff. You feel like an idiot. If I can’t even get the brackets right, maybe I’m not cut out to be a developer.
Frustrated, you reach over to close your laptop.
It’s easy to blame yourself when you make very basic mistakes, but this is something every programmer goes through.
Like any other craft, programming has skill levels. However, programming is unique in how unforgiving it can be when you mess up.
Say you’re learning to paint. Learning to use the brush is a lower level skill than composition. But, once you get to a reasonable level of skill with the brush, you can start working on composition. Even if you mess up your brush technique a bit, it doesn’t stop you from practicing higher level skills.
This is not how programming works, especially at the lower levels. You miss a bracket, you’re out. It doesn’t matter if you understood the logic, or you have a brilliant solution to the problem. Your program just stops dead in its tracks.
This is the beginner programmer’s curse: to become better, you need to practice writing code; but if you write imperfect code it may not even work.
So, what do we do? Well, getting good at any programming concept involves 3 different skills. You need to develop all three, and often what’s holding you back is that you haven’t paid enough attention to one of them.
We’re going to break down those 3 skills that you need to build to break through that skill ceiling you’re hitting.
Skill #1: Knowledge
This is the obvious one. You need to know and understand the concept you’re learning.
What’s an if statement? What’s a function? What’s a loop?
You’re smart, and you got this. Trouble is, programming is a skill, not a repository of knowledge.
Maybe you know what a butterfly stroke is. Maybe you’ve even watched the butterfly stroke event in the Olympics. But if that’s all you’ve got, I don’t think you should sign up for life guard duty at the local pool just yet.
You need to go beyond just knowing and understanding. There are two more skills you need to develop:
Skill #2: Problem Solving
It’s one thing to know what an if statement is. Knowing when it needs to be used is a whole other skill.
If you’re having trouble figuring out what to do next, you have a problem with application.
Application is about knowing which tool in your belt you want to reach for to fix this specific problem.
The only way to get better at this is practice. Specifically, you want to try many different problems that test the same concept. Try to find a resource that categorizes practice problems by concept (variables, conditionals, etc) for your language.
Don’t stop after you solve the first and easiest problem. The point isn’t to prove that you know what an if statement is. The point is learning to recognize the type of problem that an if statement solves. By doing multiple problems that use the same concept in different contexts, you learn to see the shape of problem that this concept can help you solve.
When you move on to trying problems for a new concept, your brain will instantly spot all the bits that can be solved using lower level concepts. When picking apart the problem like this, you will much more easily spot the parts of the problem that require the new concept.
To get better at application, practice with multiple problems that target the same topic.
Skill #3: Muscle Memory
Programming is a craft. It involves creativity and logic, yes, but it also involves using your eyes and fingers to perform tasks. It’s not enough to know what needs to be done, you need to be able to actually do it effectively.
You see this in other crafts as well. You might know the notes of the song you want to play on the guitar. Maybe you’re even a trained musician in a different instrument, and your brain is coming up with improvised melodies. But until your fingers know how to listen to your brain, you will not be a guitarist.
This ever happen to you? You come up with an idea: I need to check if the password string’s length is too short, and then pull up the error message if it is.
You’re pumped to write the code, but you stop short: How do I get the string out of that text box, again? Wait, is there a round bracket after the “if”?
These tiny questions are easily solvable, but together they hold you back from solving the bigger problem. It becomes frustrating for you to progress to more complex problems, because your brain keeps having to deal with these smaller issues.
If you’re having trouble actually writing the code, you have a problem with execution.
How do musicians train execution? They do drills. As a programmer, you want to do something similar.
Take problems you’ve already solved, and do them again. This time, there is no logic puzzle. You already know what the solution is. You’re simply training your eyes and fingers, and building muscle memory.
Doing drills trains you to very quickly spit out the code for a given idea. Want to compare a string’s length? if, open bracket close bracket, open curly close curly, move cursor back inside bracket. Boom. Now you can think about what the conditional should be, instead of how to write one.
Doing drills also trains your eyes to spot errors more quickly. You get more accustomed to what correct code looks like. So when you miss a semicolon, or a code block is wrongly indented, it jumps out at you immediately.
Drills make you faster at both coding and debugging.
As you do this for each new concept, more and more skills move to this subconscious level. Soon, your brain will be planning larger blocks of logic while your fingers spit out the relevant code.
Initially, simple concepts enter your muscle memory: brackets, semicolons, variable declarations. Soon, things like function definitions, class definitions. Then larger tasks, like adding a new screen to your app and wiring up the relevant code.
You can hold larger and larger problems in your head because your brain does not need to be distracted by the actual execution.
To get better at execution, practice the same problems repeatedly over time.