Why Learning Programming is Hard and Tips for Learning it Better
Tags: programming, productivity, advice, learningtocode
Published: 2019-11-23 16:16:13

Have you ever encountered any difficulties when you first started programming? Some people are going to say learning programming is not hard. I can think of a few reasons why they say programming is easy. Maybe they are geniuses, who have a strong analytical background. Perhaps they just forgot the hardships they had when they started. The last reason I can think of is, they simply haven’t reached that point (or pointers in C) yet.

A lot of people are going to have difficulties when they started programming, or even after they have learned it for a while, so don’t be discouraged if you just started and find it difficult.

Maybe you know someone who can program a complex system easily. Most likely it looks easy because they spent a lot of time mastering it. They might also have encountered similar problems in the past. You can after all say, programming is about making a complex problem into smaller problems that can be solved easily by itself.

## Programming learning curve

I believe the learning curve of programming is not linear. Once you reach a certain level, you will hit a wall. You will feel like you are unable to get better, not knowing how to improve. This will keep happening until you learn (or unlearn in some cases) a skill/knowledge. If you are familiar with games that have ranking/rating systems, you sometimes will feel like getting stuck in certain ranks despite you keep playing it. The only way to get past that is to figure out what you are missing and work on that to reach the next level. Once you’ve worked on that, you will feel like you are making a lot of progress, until you hit the next walls.

![Programming learning curve](https://i.imgur.com/2lMHq7e.png)

## Phases of learning programming

This is just an example of learning phases based on my own experience and observations. This might differ from how you learn. I try to identify problems that are frequently blocking people’s learning progresses and try to come up with a solution.

### First phase

This phase is where people get familiar with programming languages syntaxes and concepts: variables, if/else, for loop, functions. Once they learn this, there’s a first wall they have to overcome. How do you combine these concepts to create a running program?

For those who have a mentor guiding them, they should be able to get passed through this quickly. For those who don’t have one, I suggest following tutorials on how to create an app and learn from the patterns on how to build one.

People who can’t pass this probably won’t stay for long and usually gives up on programming.

### Second phase

Those who make it to this phase should be able to create an application by now. The next wall to overcome is the difficulty to create a larger-scale application. Things get harder to maintain, changing one part of the app is causing bugs on another. This is another wall programmers have to overcome before they can advance. The solution to this is to learn how to write clean code, having knowledge about design patterns and principles. I recommend reading these or lookup for a summary:

- [Clean Code by Robert C. Martin](https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship-ebook/dp/B001GSTOAM)
- [Head First Design Patterns](https://www.amazon.com/Head-First-Design-Patterns-Brain-Friendly/dp/0596007124)
- [Design pattern for humans](https://github.com/kamranahmedse/design-patterns-for-humans)

### Third phase

This phase happens when people start to work as a team. This is skippable because some people work alone and have never worked as a team. I suggest trying to work in a team at least once. It’s going to teach you some skills that you will never learn otherwise. You don’t have to be working in a company, you can just try and work on a project with a small number of people.

There might be another obstacle here for people to overcome, or probably not depending on the individuals. Some people might find it hard to work with other people. Some problems that might occur are communication problems, unable to read others’ code, etc.

I can’t really give any good advice, but here’s my thought. For communication, try and sit down with your teammates and keep evaluating how you work as a team. What works for a team doesn’t guarantee it’s going to work in another. For reading code, try to simulate the code on a piece of paper. Reading the test specs might help to explain what the code is trying to achieve, so you should start from there.

### Fourth phase

Programmers at this phase should now know a few design patterns or principles, and how to write a clean code. Often times, I see programmers fall into the trap of trying to apply a design pattern they’ve learned to every problem. Sometimes using a design pattern is just adding complexity to the code. Your app is probably not needing that much flexibility yet (check out [YAGNI](https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it) principle).

So I’ve come to the conclusion that the biggest wall for this phase is not being able to understand trade-offs. These programmers tend to try and adhere to all of the principles/patterns they’ve learned. I personally think they are just a guide to help, and it’s all about trade-offs. Implementing a principle will be good in one situation, but it might be bad in another. That’s the difficulty of trying to level up in this phase, knowing when to pick a solution over another.

One way to sharpen your skills in making these kinds of decisions is, try to learn about anti-patterns before going on with patterns. Anti-patterns will give you a general idea of what not to do. Just keep yourself reminded that at the end of the day, you shouldn’t be adhering to all anti-patterns all the time. Remember, it’s about trade-offs. It might actually be good in certain situations!

There are probably a lot more phases after this, but I haven’t observed a lot to write about it. If you have any stories, please share it in the comments!

## Make learning programming easier

So why do I think learning programming is hard? Most of the time it’s because people don’t know what to learn. What to learn largely depends on your goal and how experienced you are. I don’t believe just trying to code for 10,000 hours is gonna help. Instead, try to learn efficiently. Here are a few tips to make you learn more efficiently:

### Have a goal in mind

Don’t just learn randomly. Build a roadmap for learning. For example, if you want to be a web developer, first find out what people usually learn to achieve that. You can check out the roadmap for being a web developer in this article: [The 2019 Web Developer](https://www.freecodecamp.org/news/2019-web-developer-roadmap/).

If you have other roadmaps of learning, please share it in the comments.

### Read other people’s code

Do you remember when I said programming is about making a complex problem into smaller problems? Doing so requires experience, and by keep writing codes, you will have little difficulty solving the same problem the next time you encounter it. There’s a way to speed it up though. By reading other people’s code, you save the time needed to think up the solutions for yourself. Just remember to try to solve a problem by yourself from time to time in order to keep your problem-solving skills sharp.

### Find a mentor

Most of the time people don’t improve because they don’t know what to learn. Having a mentor will help to identify what to learn next. Mentors can also help to provide the moral support you need in case you are giving up.

Recently I found [Coding Coach](https://codingcoach.io/), a platform where you can find a mentor for free. It’s a cool community! If you are an experienced developer, I suggest you apply as a mentor too. You might learn a thing or two becoming one.

## Wrapping up

Personally, I think programming is hard. The reason being, programming is not just about writing a bunch of codes to solve a problem. Being a good programmer requires other skills such as collaborating, maintaining, ensuring codes don’t break, writing codes that other people understand and so on.

If you are currently trying to improve by trying to code repeatedly, please take a step back. Try to learn more efficiently instead. If you have any other learning tips, please share it in the comments.