Refactoring My Learning
Tags: learning, studying, refactor, habits
Published: 2020-06-09 22:33:10

This article is a to-do list, of sorts, to myself. I've shared it here just in case someone else finds it useful too.

## The Requirement
I've been developing for nearly two years now. I found myself in a learn-from-scratch-on-the-job situation which has one Major Pro and one Major Con. The Major Pro being all of the real world experience on a daily basis such as website deployment, legacy code, unforeseen UX issues, the list goes on. The Major Con is that there seems to be very little time you can dedicate to learning. So in what little time I do get to study I really want to maximise the return.

Some of the books I've read and online courses I've taken have really stuck with me but a lot no longer seem to have any place in my memory, even though the content was brilliant. This feels like such wasted time and aggravates me to no end! I needed to refactor the way I approached learning. So I spent a few hours digging through resources on the net (listed at the end) and I feel confident in my new approach. It's time to take responsibility for my own learning.


## The Solution
My solution comes in four parts: Coding Books and Online Courses, Projects, Textbooks and Effective Note Taking.


### Coding Books and Online Courses
When I say 'Coding Books' I mean books on HTML, CSS, JS, PHP etc. Books that teach you the language itself and common ways to use it. I'm also referring to online courses such as the ones on Udemy, YouTube, PluralSight, etc. These resources focus on teaching you how to DO something, rather than HOW or WHY something works.

First things first: *I do not need to remember everything!* There are too many languages out there. Each with a different syntax. So unless I suddenly become Dustin Hoffman's Rain Man I simply don't need to hold myself to such standards.

>The key is to **understand** how the language **works**. How the pieces **fit together** to fix a certain problem.

So what steps will I for take coding books and online courses:
1. **Regurgitate**: Repeat the code examples and ensure the code works as intended.
2. **Comprehend**: Make sure I understand every word in the example. This step may require re-reading/watching the resource or even referring to official documentation. This step can give a feeling of real progress that comes from understanding what each piece of a puzzle is doing and how they all fit together.
3. **Deviate**: Play around with the code. Take something away. Add Something. What happens? Is it what I expected?
4. **Innovate**: Use what I've learnt and build something new. It doesn't have to be anything fancy. A small function or feature to ensure I understand what I'm learning.

Making mistakes is a key learning opportunity throughout all of these steps. *Every mistake made is a chance to reduce ignorance.* Embrace the failure, knuckle down and figure out what went wrong.

> #### A Note on Snippets
> A snippet is an extract of code that you know you will need to use over and over in the future. You can take that piece of code, plonk it inside a text file and store it for future reference. This is especially useful to prevent you from repeating the same Google search over and over each time you 'need that bit of code again'.
>
>These books and videos provide lots of brilliant, reusable snippets. Record them. It will reduce the pressure of having to remember everything.
>
> If you want to store your snippets in the cloud, there are some great snippet managers out there. I'm currently trying out [3Cols](https://3cols.com/).


### Projects

Learning resources often have a project built in to be followed step-by-step. These are great for learning how the code works, the author has designed it that way. But what is also important is running riot on a project of my own that solves a *real* problem in my *real* life. I will use the top-down approach for these projects: choose an end result and then work out the details.

1. Decide on a project. Make sure it is something I personally want or need. This way I will gain experience and a useful tool at the same time. Win Win!
2. Upon deciding which language/s I'm going to use, skim over a book or online course on that language and list the major concepts. This could be responsive design, prepared statements, ajax etc.
3. Break down my project into small chunks, each chunk requiring me to utilise a few of those concepts.
4. Have at it! (Get coding.)

This top-down approach is much more 'real life': you know what the end result needs to be and you must determine and execute the steps to bring it to fruition!


### Textbooks

This section is not for how-to-code books. It's for high-level textbooks. I have a few Computer Science textbooks I plan on studying to supplement my developer knowledge. So this is my plan for tackling those concept heavy monsters.

These five steps are to be repeated for each major chapter in the textbook. The first four steps are about getting exposure to the topic. It is **not** about reading into the details at all! This is preparatory work to do before sinking your teeth into the content, which is step five. It builds a foundation on which to construct the rest of your understanding.

1. Flip through each page in the chapter. Ignore any specifics. How long is the chapter? Are there many diagrams?
2. Is there a quiz at the end of the chapter? If there is, read over it. Authors use these quizzes to test you on what they, as the experts, believe is the most important information to remember from the chapter.
3. Read all the bold text. This means headings, sub-headings, key words and key phrases.
4. Read the first and last sentence of each paragraph. Granted, this step assumes the book to be well written. If it is, these sentences should be the introduction and conclusion of each paragraph.
   * By now you should have a good foundation as to what the chapter is about in general. The kinds of words and phrases that are important and the concepts that are most crucial.
5. Now it's time to get truly stuck in; time to pursue **comprehension**. Study the chapter fully. Take notes. Take my time. Ensure I understand. Thanks to the first four steps, my notes contain almost nothing that isn't relevant.


## Effective Note Taking
This section's guidance is very generalised. I will use this method of note taking whether I'm learning a coding language, computer science or any other topic that peeks my interest.

* Use the outline method, which I am using for this section and which looks like this:
>  * A Main Topic.
>    * Sub-Topic.
>      * Details.
>      * Details.
>    * Another Sub-Topic.
>      * Details.
>  * Another Main Topic. etc.

* Record all of the questions I have about the topic. This is extremely important as it highlights knowledge gaps as I learn.
* Add to these notes by doing my own research.
  *  Reference up-to-date sources if my main resource is a bit out of date.
  *  Find answers to **all** of my questions.
  *  Be curious.
*  Create summary sheets of specific topics.
   *  If my topic is development related, I could turn it into a blog post of some sort as my way of summarising my learning. Similar to what I'm doing now.
   *  Focus on concepts, leave the details to the language documentation and my snippet library.
   *  Making my summary sheet visually pleasing will help (right now I like using markdown) but don't get lost down the rabbit hole of trying to obtain visual perfection.
*  Brute-force my long-term memory with flashcards. This is a whole topic on its own but I'll try to summarise it:
   *  Flashcards should be utilised once I fully understand exactly what I'm learning. This is when I will work to embed it deep into long-term memory.
   *  Create my own flashcards (preferred over using someone else's) and ensure they follow the "one card one question" rule.
   *  Focus on concepts. Memorising every syntactical rule of code won't make me a better coder the same way memorising a dictionary won't turn me into William Shakespeare!
   *  [Anki](https://apps.ankiweb.net/) is an amazing piece of free software for creating flashcards and using [Spaced Repetition](https://en.wikipedia.org/wiki/Spaced_repetition) to memorise them.
      *  Anki is available on a huge variety of platforms, including mobile. YouTube is full of useful Anki tips and tutorials.

## Resources Used For This Plan
[Tips On Learning How To Code](https://www.youtube.com/watch?v=0wHyoBPc6zs)  
[How To ABSORB TEXTBOOKS Like A Sponge](https://youtu.be/nqYmmZKY4sA)  
[How to Take Notes | Science-Based Strategies to Earn Perfect Grades](https://youtu.be/QUndnWBR0A0)  
[OWN YOUR LEARNING](https://youtu.be/br0jghA4JEw)  
[4 steps to learn programming faster and better](https://medium.com/swlh/4-steps-to-learn-programming-faster-and-better-quarantine-edition-76565c3a0783)