My process of learning
Tags: beginners, learning
Published: 2022-08-31 11:43:25

First of all, I want to start by saying: I personally believe that anyone can learn anything if they put their mind to it. Sure, some things that come easily to some are extremely difficult to others but with the right framework, mindset and hard work, anyone can do it. I understand that some people may fundamentally disagree with me on this topic but my mind is not going to be changed. I have seen it happen too many times. 

With that being said, it is not a surprise to anyone who has done it before: Programming (of any kind) is hard. 

Especially when you are just starting out; things don't happen the way you expect, concepts don't stick or just by the very nature of technology/computers, we have to perform some rather complex tasks to make something happen which makes the implementation of the concept difficult to understand and internalise. (I'm looking at you asynchronous Javascript...)

Over my years in the IT world, I have seen this in a multitude of permutations. From university students copying solutions to a problem from Stack Overflow, to students in Bootcamp courses that insist that they don't want to do the exercises and will just copy the code of the provided example to complete the challenge rather than solving it themselves. 

There is nothing inherently wrong with these attitudes, people should be free to do what they think is best, but I am always saddened when it see it. At some point these people are going to come up against a problem which, rather than being challenging, may seem truly insurmountable. I would contend that this is caused, in most cases, by a lack of the foundational knowledge required to understand the problem and effectively decompose it into its constituent elements. 

All of this is within the person's control. 

## Why do people do this? 

I have found that people always want to take the easier road. I know that I often find myself consulting Google for resources on how to solve a problem and there is nothing wrong with that. The problem comes when you just take this at face value and call it a day.

This is what I would consider a universal constant of the human condition, you can only build your knowledge on top of humanity's existing knowledge. Be it from teachers and books or more recently, the internet, this foundational knowledge provides learners of any topic the ability to apply their own fresh perspective to a topic which may result in some new ideas or innovations. One only has to look at the [proliferation](https://angular.io/) and [permutations](https://reactjs.org/) of [Javascript](https://vuejs.org/) [frameworks](https://svelte.dev/) for an example of this. 
<sub>*(Author's note: I was going to add way more links here to further illustrate this point but I am sure you get the idea...)*</sub>

Its all good for me to wax philosophical about the human condition and so on and sound like a pompous intellectual. The heart of the problem which I am to address is within my last paragraph: you **can only** build your knowledge on top of existing knowledge, at least until a certain point where you reach the current limit of understanding. Few should be more acutely aware of this than developers as we explicitly rely on someone else's knowledge when we do anything with a computer. Using a web browser, running a debugger, importing a package, installing a program, compiling code, all of this in one way or another **explicitly** relies on someone else's knowledge. 

With that said, you might want to contribute. To do that you have to learn. So, how?


## Foundations

Learning is analogous to building a structure, there are common building blocks that need to be in place before you move on to the the part with less strict rules. For example, you need the foundation in place before you can do the framing, install the utilities etc. 

When a new topic is introduced you need to know the basics. For example, lets discuss classes, objects and other OOP concepts. To someone who has been learning the foundational concepts of programming such as variables, functions, control flow, iteration etc, this can seem like a logical extension of the existing topics by introducing the concepts of:

- Logical encapsulation of concept, data and state.
- A safe interface with which to interact with the object that essentially just consists of functions and properties.
- Protection of the object data to provide some guarantee that only operations that we want happen to the data so that when we use it, it is in a valid state for the application. 

If the foundation is complete enough, these logical extensions will provide the framework which will allow the quick consumption of the base topics of the field and build a solid understanding of the reasons to use this design paradigm.

However, it is entirely plausible that someone may hear about these concepts and not be able to join the dots. I know because I was one of those people. The first time it was described to me, in my mind, I was thinking "can't this all be done with functions?" 
<sub>Author's note again: I know functional programming is a thing and there are detractors to OOP. For the purposes of this article, I don't really care</sub>

## My approach to addressing the problem

In my mind there are, at the base level, two possible causes as to why this could have happened:

1. An insufficient conceptual understanding of the topic
2. An insufficient understanding of topics fundamental to understanding the topic being studied 

This could be from a multitude of factors such as a bad teacher or me not putting in the time or effort, but the root of the problem can mostly be boiled down to these two factors. 

The way that I dealt with this, and what I believe to be the only sustainable way I personally am truly able to learn is to put the ego aside and ask myself the questions:

1. Do I actually understand the concept I am learning/working with? 
2. Do I properly understand the topics underpinning it deeply enough to absorb the information and apply it? 

These two simple questions have been my guiding principals in learning complex systems. Being able to ask these questions of myself and honestly answering them has provided me with the appropriate data that I need to make informed decisions about what I need to focus my learning time on.

## My solution

Once I have identified the concepts that I am struggling with, I generally work on them in 3 stages: 

1. Review the reason for a concept's existence so I have a clear understanding of why it exists until I am satisfied that I understand it.
2. Review the implementation details of the concept - What is it? How does it work? What are the moving parts? etc.
3. Implement the concept myself and play with it to find out what it can do and how or even if it can do the thing I want or expect from it.  

Of these three steps, I don't believe that this will be a controversial statement that for me, stage 3 is by far the most important and can help inform what I took from both #1 and #2. 

If we go back to the people I mentioned about 1km up the page who were content to copy their answers from Stack Overflow before they have even tried to solve the problem themselves, this is what will create a weak foundation of knowledge. This set back the clock on learning for me and it will do for you too.

I know I have done this before and it didn't affect me right away; it festered for some time and when I started dealing with more complex and advanced topics, I did not have the appropriate framework or foundation to support what I was trying to learn. This caused me no end of problems including undue stress and confusion when asked about the topic or when I needed to solve a problem and taking far longer to complete a task than my peers.

## Conclusion

My intention in writing this article is not to shame people for not putting in the effort to learn but to really try to break down my learning process, both for myself and for you, dear reader. 

I think it is important to have a simple framework for learning, be it this one I have presented here or one that you develop yourself. You need to **learn how to learn* if you want to be effective at this or any other complex job. 

One last thing to say is that you need to **believe in yourself** and **know that you can do it.** Don't ask questions like these to make yourself feel bad or insecure, use them to identify what you need to work on to ensure that you give yourself an increasingly stable foundation and every chance to succeed. 

Thanks for reading this veritable wall of text. I would love to hear the thoughts on my process as well as your process as well!