I truly believe anyone can learn to code.

At the end of the day programming is a skill, and acquiring a skill is open to anyone.

Sometimes getting good at something appears to be a magical process. But in reality, there are clear steps to follow.

Anders Ericsson, a professor at Florida State University, is a leading researcher of expert performers. He studies the process of acquiring a skill and what it takes to become an expert.

Through his years of research, he concludes that what separates top performers from everyone else is the amount of time spent in something he calls Deliberate Practice.

He believes that “The right sort of practice over a sufficient period of time leads to improvement. Nothing else.”

I believe the Deliberate Practice framework developed by Dr. Ericsson can be used to help people learning to program.

Implementing Deliberate Practice has helped me in my personal life and I believe it can help you learn programming more efficiently.

Below I’ll explain each component of Deliberate Practice and how you can incorporate Deliberate Practice in your coding journey.


The first step of Deliberate Practice is to deconstruct and analyze your desired skill.

Deconstruction requires you to take a bird's eye view of your overall goal and break it down into small manageable components. You're trying to find the most efficient path from where you are to where you want to go.

There are two ways you can go about deconstructing a skill. You can either break down the components yourself or learn from someone who has already acquired the skill.

For someone learning to code, I'd recommend leveraging the knowledge of other developers instead of reinventing the wheel.

Most of the material out there (like freeCodeCamp) was created by people who have put effort into deconstructing the learning process and have iterated on the material.

You can leverage their expertise and effort when you're looking for your own path forward.

Flip through a few different coding websites or read the Table of Contents of various coding books (you can preview books on Amazon for free). Also, read a few blogs or ask a developer friend for their opinion.

After a while, you'll get a sense of the best path forward.

Also, make sure your interests have a vote. It's hard to learn quickly if you're not interested in the material.

The most efficient route to learning to code is at the intersection of what the experts recommend and what you're interested in.

Don't obsess about perfectly deconstructing the path to becoming a programmer. You'll never find the perfectly efficient route.

It's better to do a little research, start somewhere, and readjust as you go.

Stretch goals

The next key component of Deliberate Practice is creating stretch goals.

A stretch goal is a small task that pushes you outside your current abilities and moves you along your deconstructed learning path.

Creating stretch goals isn't so much about having a huge list of tasks you need to complete. The more important part is setting up your learning in a way that pushes the boundaries of your programming skills.

We humans naturally favor the things that are easy and automatic.

However, if we push ourselves outside our comfort zones for long enough, our body will try to normalize the new behavior and make it a habit.

The objective of a stretch goal is to consciously put yourself outside your comfort zone and wait for your body to adapt.

The trick to creating a stretch goal is making the task difficult but still achievable.

If the goal is too difficult, then you'll get lost and won't know how to move forward. If the goal is too easy then you won't develop as quickly as you could (or not at all).

It will take some time to find the sweet spot.

At the start, a stretch goal could simply be a lesson on freeCodeCamp. As time goes on, a stretch goal could be implementing a button on your portfolio website without using Google.

The key thing to remember is that if a task feels easy you're probably not pushing yourself enough.

Focus and attention

Focus is a foundational component of memory and skill acquisition.



A common trait among people who learn programming quickly is they have the ability to intensely focus on whatever task they're performing for long periods of time.

Think about how any world-class performer practices. They're probably not checking their phone every 5 minutes. They're most likely mentally locked into whatever task they're performing.

Having good focus means eliminating all unwanted distractions.

There are two types of distractions, internal and external. Decreasing external distractions means shutting off your phone, going to a quiet room, and/or putting a site blocker on your computer.

Taming internal distractions means not letting internal thoughts consume your time. This can be done by practicing meditation or having a notebook to write down whatever is on your mind.

The key is to build a distraction-free environment and have a plan when a distraction inevitably pops up. You're probably already well aware of all the things that distract you.

(If you want more insights into where your time goes, I'd recommend using something like RescueTime.)

Improving your focus is a process. In the beginning, try to be fully focused for a few minutes. As time goes on, slowly dial up the duration of your focused coding.

When deliberately practicing your programming skill, it’s better to be 100% focused for a shorter amount of time than 70% focused for a longer amount of time.

It's might feel impossible to maintain focus since we live in a world that's constantly trying to grab our attention. Nonetheless, you must find a way.


The only way to get better at something is by actually doing it.

People often confuse acquiring knowledge with acquiring a skill. Knowledge is useful but it isn’t a substitute for actually attempting something.

Knowledge, in many ways, gives you a false sense of progress. You can watch 100 coding tutorials and feel like you're capable of coding your own website. However, once you go out and try to build one for yourself, you could end up falling on your face.

It's like the difference between watching baseball and playing baseball. Watching helps you play but you can't become a good baseball player just by watching your favorite professional baseball team.

Acquiring skills requires you to go out into the world and test your knowledge against reality.

This isn't always easy. Practicing something new will attack your ego and make you feel incompetent. You'll want to quit or go back to something that feels more comfortable.

Unfortunately, it's impossible to learn something new without looking incompetent (at least at first). You might as well get used to it.

As we talked about above, learning doesn't happen inside your comfort zone. Don't be surprised if you start to feel uncomfortable as you code. Discomfort is usually a sign you're headed in the right direction.

Make sure you're constantly testing out your knowledge against the real world. Don't settle for reading tutorials or watching videos. Put your fingers to the keyboard and write some code that you can run.


It's impossible to get better at anything without feedback.

Imagine trying to improve your golf game but you are unable to see where the ball lands. There'd be no way to know if you're getting better.

Feedback is the way reality communicates with you. It allows you to see the gap between what you think you know and what you actually know.

There are two ways to get feedback. You can get it through self-study or someone else can provide it.

Self-study requires you to compare what you attempted with the correct solution someone else posted.

This naturally happens when you go to websites like Stack Overflow or GitHub to find an answer to a problem. The feedback happens when you discover the gap between your answer and the correct answer.

When you go to websites like Stack Overflow, make sure you spend time understanding why a chunk of code works and how it’s different. Copying and pasting without understanding the difference will rob you of important feedback that will help improve and update your skills.

You can also read through someone's code on Github and compare it to your own code (or compare it to your current understanding of how to code).

Ben Franklin used a similar strategy when he was improving his writing skills.

He would read an article from his favorite newspaper a couple of times. Then he would deconstruct the techniques the author used. He would put the article away and try to replicate it in a similar fashion. After he wrote his version, he would compare the results and analyze his execution.

The other way to get feedback is by letting a more experienced developer see and comment on your code.

Having a fresh pair of eyes can help you solve individual problems and also can help you get back on track if you’re heading in the wrong direction.

It might be scary having someone else look at your code (or even having a conversation with an experienced developer). None of us want to look dumb. If you can get over your fear, getting feedback from others can have a big impact.

One of my biggest regrets when I was teaching myself to code was that I didn't get enough feedback. My code was a mess and I was wasting a lot of time on unimportant things.

Getting feedback from a more experienced developer would have saved me a lot of time and struggle. They would’ve instantly seen what I was doing wrong and put me on a straighter path.

Think of feedback from an experienced developer as a compass. They won’t physically get you to your destination, but they will make sure you are going in the right direction.


Feedback is worthless if you don’t actually use it.

Learning to code is like moving through a dark room. You start walking, bump into some furniture, adjust your route, and try again.

Based on the feedback you receive, it’s important to take some time to think about the gap between what you wanted to do and what actually happened. Based on that gap, make adjustments as you move forward.

If you don't make adjustments, you won't improve.

You'll need to adjust specific lines to code to make your program work. You'll also sometimes need to adjust your approach at a macro level.

Our initial instinct when we aren’t making progress is to try harder. This is only effective to a point.

If you are not getting the results you want, try attacking things from different angles. It might take some experimentation to get it right.


Performing a task once isn’t enough.

Our minds don't store information like computers. We tend to forget new information just as quickly as we learn it.

Learning something new requires you to repeat a task multiple times before it sticks.

Repetition is a signal to our brains that a new piece of information or a new behavior is valuable and shouldn't be forgotten.

The repetition stage of acquiring skill is not easy. It’s not supposed to be. You are consciously trying to reprogram your brain and your body will naturally want to do what's familiar.

You will need to consistently apply effort towards learning to become proficient.

The only sure-fire way to fail at learning to code is quitting. If you don't quit and maintain consistency, you will be able to repeat the important coding material and everything will eventually start making sense.

No matter how tough it feels, make sure you develop a consistent study habit. It is nearly impossible to learn coding without one.

For a deep dive into how you can be more consistent, I wrote an article about specifics techniques you can use.


The process of acquiring skill is simple, but it’s not easy. You are your biggest enemy in the process.

Old habits are hard to break. Each new skill is its own battle to be won.

Stay focused, make sure you're pushing yourself, adjust based on the feedback, rinse, and repeat.

If you follow the Deliberate Practice framework, I believe you’ll surprise yourself with the speed that you pick up programming.

Best of luck.

If you want to hear about other insights I've learned along the way, follow my account Zero to Programmer on Twitter. The goal of the account is to help you learn programming more efficiently.