Learning programming is DIFFICULT
Tags: beginners, webdev, javascript
Published: 2020-10-20 13:23:50

---
title: Learning programming is DIFFICULT
published: true
date: 2020-10-20 13:23:00 UTC
cover_image: https://dglsparsons.github.io/img/remote/laptop.jpg
tags: beginner, webdev, javascript
canonical_url: https://dglsparsons.github.io/posts/why-learning-programming-is-SO-HARD/
---

Have you ever wanted to learn how to program, or to learn a new concept? Have you ever come across a technology you wanted to play around with but had no idea how to get started? Does it feel like there is _too_ much information about programming on the internet?

Programming is a difficult topic to break into. It's a complicated field. There's a lot of information to learn. There are a lot of contrasting opinions on the internet. The field moves amazingly fast, with new trends and technologies popping up all the time. To top it all off, guides and tutorials don't build up your knowledge to an adequate level. They leave you [stumbling in the dark](https://dev.to/dglsparsons/the-drug-of-online-tutorials-2od4).

But why is this? What makes all these tutorials fall short? Why can't you follow a guide and learn everything you need to get started?

Most tutorials, guides or courses fall short for at least one of three reasons:

- They promote misinformation, guiding you down an opinionated or flawed path.
- They fail to account for, and teach, the huge amount of knowledge you need beforehand.
- They focus on low-level details, rather than overarching concepts and their rationale.

Here, I will examine each of these three flaws, in turn, arguing how they all undermine successful learning. I'll then argue for a simplified approach to learning. Instead, we should be focussing on concepts and experiences over implementation.

## A sea of (mis)information [#](#a-sea-of-(mis)information)

The internet is an invaluable tool for any type of learning. The amount of information readily available is second to none.

However, not all information is created equally. On the internet, love it or loathe it, anyone can create content. This leads to a divide. How do you know what content is worth looking at? How do you know who's opinions are trustworthy?

Studies have shown that bloggers are trusted. Trusted a scary amount. They are more trusted than [celebrities, social media contacts and journalists](https://moreniche.com/blog/bloggers-are-third-most-trusted-by-consumers/).

> If you’re a blogger, you’re the third most trusted source of information... behind only friends and family.

Should we trust these people?

The problem is the low barrier to entry. It's both a strength and weakness of online material. Anyone can create a blog or video claiming they know everything there is to know about programming. As long as someone is presenting with confidence it is impossible to tell an expert from a beginner.

We live in a society fuelled by views, likes, comments and social media interaction. In this world, it is not the most insightful information that gets the most attention. It is the content with the most-clickbaity title. The author who writes a compelling story, or the person who promises you a quick-win tutorial.

As a result, the most promoted information can often be the least valuable. People are more likely to create content that will get viewed, rather than content that will teach you everything you need to know.

## The HUGE amount of knowledge [#](#the-huge-amount-of-knowledge)

Have you ever heard the interview question: "What happens when you type [google.com](http://google.com/) into your browser's address bar and press enter?"

![Browser search](https://dglsparsons.github.io/img/remote/search.jpg)

If you haven't, take a moment to think. It's a big question. How deep can your knowledge of it go?

It seems a trivial task. Typing an address or search term into a browser is something we all do hundreds of times every day. But the explanation is anything but trivial. People have tried to create [comprehensive guides](https://github.com/alex/what-happens-when) answering this question. Even then, they don't cover everything. It depends on what operating system you're using. It depends on what browser you're using. It depends on what keyboard you are using. It depends on what motherboard your computer has. It depends on what monitor you are using. It depends on how your internet is set up. It depends on where in the world you are... it depends on... well, everything.

There is a crazy amount of detail involved in answering this straightforward question. This highlights how complicated programming can be. An overwhelming amount is going on. If you're just starting out learning, this puzzle can be too much to handle. Without a knowledgeable guide to show you what to learn, it's tricky to know where to start. It's a puzzle you need to break apart, but have no idea how.

## The lack of concept-driven learning [#](#the-lack-of-concept-driven-learning)

Despite the huge amount of complexity in the previous example, it's important to remember one thing.

**Nobody knows everything.**

Most programmers are capable of using the internet as a black-box without dealing with all its complexities. We do not worry about the [TCP/IP model](https://en.wikipedia.org/wiki/Internet_protocol_suite). We do not worry about lost packets, signal-to-noise ratio along wires, or routing connections to servers. We don't worry about keyboard hardware, operating systems, or motherboards. This is because these are concepts. Concepts that we can abstract away.

The problem, though, is that beginners often bump up against all these concepts. It's overwhelming how many there are, and how they are often assumed knowledge. For example, before building and hosting a website there is a level of understanding you need to have.

- What is a website?
- What is a webpage?
- Why do we have HTML / css / javascript?
- What is the DOM?
- What is a browser API?
- What is a webserver?
- How does a browser communicate with a webserver?
- How does DNS work?
- What is a function, module, page, view?
- What is a package manager?
- What is a package?
- What is a dependency?
- What is accessibility?
- What is a build?
- What is deployment?
- What is a version?
- What is a cache?
- How does a browser store data?
- What is a framework? ...

The list goes on. Most tutorials fail to recognise this massive amount of knowledge you need beforehand. Instead, they jump in at the deep end. "Install this npm package", "run this command". Or worse, "copy this code", "follow me".

![Confused](https://dglsparsons.github.io/img/remote/confused.png)

Instead, there is a need to focus on what concepts and abstractions we use and rely on as programmers. Rather than teaching how to build a website, we need to give insight into our terminology and culture. We need to focus on _why_ we do things. What each abstraction is for, what is its purpose. As a beginner, programming is overwhelming because nobody explains the concepts you need. There is no source for this information. Instead, everyone assumes you can pick up concepts as you go along. Or, they assume you understand enough beforehand.

This is one of the key reasons a 'tutorial hell' exists. It's very simple to watch someone build something. But, without understanding the concepts they use as building blocks, it is impossible to replicate.

Even experienced programmers get tripped up by this.

I was recently chatting with a friend who moved jobs. After his first few days, he told me his head felt like mush. He had so much to learn. After a bit of discussion, I realised the problem was that he was learning three things at once:

- He had to learn a whole new technology stack.
- He had to learn the ways of working within the company.
- He had to learn the domain of the companies product.

Even for someone with a wealth of experience, learning those three things all at once is daunting. But he is bringing to the table years and years of experience. Contrast this to a complete beginner, and no wonder it's so difficult!

## How do you avoid these problems? [#](#how-do-you-avoid-these-problems%3F)

I wish I had an easy solution to all these problems. I wish there was an easy way to get trustworthy information. To inform people of the core concepts that power programmers everywhere. To tackle the huge amount of knowledge by teaching you what you need to know without getting weighed down by complexity. The solution is not an easy one. There are, however, two solutions that spring to my mind.

Number 1: Get a mentor. An experienced programmer is a powerful ally to have. They can point you in the right direction with your learning. They can answer your questions. They can teach you concepts that you don't understand. With the current climate of the world, more and more people are available on the internet. It's easy to ask for support and there are huge numbers of people eager to help out.

Number 2: A useful tutorial course. Over time, I've stumbled across a few resources that cement the logic you need to succeed. However, I've always found these few and far between. I'm sure there are lots out there because there are so many courses, blogs and guides are available. I don't know where the trustworthy, concept-first courses are though. Are people interested in a concept-first style tutorial? Have you come across any good resources for this? If so, please share these useful resources!

* * *

_Do people share my same criticisms of tutorials and guides? Do you share the feeling that it's overwhelming at times? Please let me know - and let me know if I can help in any way. If you're more experienced, please share any resources you have that helped you._


</p><p>Thanks for reading. If you enjoyed this article, please share or   <a href="https://twitter.com/intent/follow?screen_name=dglsparsons" target="_blank" rel="noopener">follow me on twitter.</a></p>