Skip to content

Instantly share code, notes, and snippets.

@oguching
Last active March 26, 2018 21:42
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save oguching/c220c191b0dcfe4848c2f90518263bb4 to your computer and use it in GitHub Desktop.
Save oguching/c220c191b0dcfe4848c2f90518263bb4 to your computer and use it in GitHub Desktop.
Learning to learn

There are too many skills to learn in one lifetime, so deciding where to focus and for how long is an important skill in itself.

Some challenges with learning:

  • New concepts don’t usually click the first time around, or the second, or even the tenth.
  • But for those who stick it out long enough, there will be a breaking point where things suddenly begin to make sense.
  • Learning is a process not a goal.
  • Enjoy the process of investing your energy into something, and enjoy the pain that comes along with it.

Here are some strategies to help you learn better

make a list

create a list of the skills you want to learn and ask these questions

  • what skills interest me?
  • what skills could help me in my daily life?
  • what skills could help me in my job?

Take your time to give honest answers to these questions. Prioritise and score then anyway you like but be able to justify why and item is on the list. Don't overthink it though but be very delibrate about what you want to learn.

old or new

Most likely you have a long list of things you can't possibly completely work on. A good way to narrow the items down is to estimate the maout of effort that will be required and the expected outcome. Ask yourself, do I improve an existing skill or learn something totally new?

one approach to learning technical concepts

  • Learn about the project/concept motivations.
  • Read and understand core concepts
  • Write some code. Start with something really small, follow a tutorial through to the end.
  • when you get stuck
    • first narrow down and figure out what I’m actually stuck on — i.e. define the problem. Then I come up with a hypothesis for what I think could be the root cause or causes of the problem. Even if I have no idea, I just make a guess.
    • step away from the problem and do something else. Let your mind rest then come at with with a fresh mind.
    • Now I try to debug with my hypothesis in mind. I get as far as I can on my hypothesis without looking for answers online  You will remember the problem space better when you tackle it on your own.
    • If my hypothesis leads to an answer, hooray! I’m done. If not, I Google search for documentation, blog posts, or Stack Overflow posts that could help me get closer to the answer.
    • Still no solution? That’s fine. I’m sure I learned something valuable by reading through all that, even if it didn’t directly help me solve the problem at hand. Who knows when this knowledge might come in handy next time?
    • At this point, if I’m truly stuck, I will either post a question on Stack Overflow or ask a co-worker or developer I know.
    • Otherwise, I rinse and repeat until I get closer to the final solution. At some point, the answer always comes.

Getting stuck on a bug feels like stumbling in a dark tunnel looking for a ray of light. You eventually find it, but along the way you discover so much about the tunnel — and it’s knowledge about the “tunnel” that makes you strong as a coder.

Rinse, Repeat

  • you have built an app, gone through all the pain and overcome. Now try another app. Maybe base it off something that already exists but slightly different.
  • Mastery requires repetition, so I keep building more small projects until I feel like I’ve got the core concepts down.

Spaced Repetition is one solution to the problem of forgetting what you learn. When you learn something new it's quickly forgotten unless it is brought back to the forefront of your mind repeatedly. Spaced Repetition aims to remind you of the concept just before you are about to forget it. Research shows that this process helps lodge the concept in your memory for a long time. Anki is a free software to help you with this and it is advised that you only use it once you have learned and understand the concept in question. I kind of already do this. When I'm learning something I create a file on my /knowledge repo and write what I want to remember. I have found that it helps keep it in for longer.

Resources
Memorising using SRS


Kumon method of learning - popular in Japan and emphasises memorizaton,repetition and rote learning to develop mastery over the material. It requires plenty of practice, repetition and intelligently designed rote leaning to gain fluency with the material.

Sometimes the focus is on understanding the concept. The problem with this is that while it is possible to graps the essentials of an important idea, this understanding can quickly slip away without consolidation through practice and repetition. You can believe you understand something when in fact you don't.

In the same way, once you understand why you do something in math or science or in programming, you don't have to keep re-explaining the how to yourself every time you do it. At some point, you just know it fluently from memory. The greater understanding results from the fact that your mind constructed the patterns of meaning.

Chunking was originally conceptualised in the groundbreaking work of Herbert Simon in his analysis of chess - chunks were envisioned as the varying neural counterparts of different chess patterns. Gradually, neuroscientists came to realise that experts such as chess grand masters are experts because they have stored thousands of chunks of knowledge about their area of expertise in their long-term memory. Chess masters, for example can recall tens of thousands of different chess patterns. Whatever the discipline, experts can call up to consciousness one or several of these well-knit-together, chunked neural subroutines to analyze and react to a new learning situation. This level of true understanding, and ability ti use that understanding in new situations, comes only with the kind of rigor and familiarity that repetition, memorisation and practice can foster.

Time after time, professors in mathematics and sciences have told me that building well-ingrained chunks of expertise through practice and repetition was absolutely vital to their success. Understanding does not build fluency; instead fluency builds understanding. In fact, I believe that true understanding of a complex subject comes only from fluency. Fluency allows understanding to become embedded, emerging when needed.


Kinesthetic learning (American English), kinaesthetic learning (British English), or tactile learning is a learning style in which learning takes place by the students carrying out physical activities, rather than listening to a lecture or watching demonstrations. People with a preference for kinesthetic learning are also commonly known as "do-ers


As a developer/programmer/software engineer, the landscape is always changing. That is the nature of the beast. How do you keep up with all the new tools, new languages sometimes new paradigms? Learn the fundamentals. The programming fundamentals consist of algorithms, data structures and programming language knowledge.

If you want to be a great software developer, without doubt you should constantly master trending technologies (like React, Redux, Angular). And in the meantime put the same amount of effort to learn regularly fundamentals like algorithms, data structures, the principles of writing scaling and clean code.

The common categories of algorithms that you should know:

  • sorting algorithms: quicksort, bubble sort, insertion sort, etc
  • search algorithms: binary search, breadth-first search, depth-first search, etc
  • shortest path algorithms: Bellman-Ford algorithm, Dijkstra's algorithm, etc
  • Math algorithms: Fibonacci series, Factorial, Greatest common divisor, least common multiple, etc

Learning algorithms in details is a valuable experience. Studying and mastering them cultivates an intuition to solve difficult issues. Powerful intuition is what defines a great software developer. Of course alongside with experience and discipline. Every beginner should fous on fundamentals, language and then framework.

  • Fundamentals: Everything related to algorithms, data structures, computer science questions, application design principles (SOLID, KISS, DRY, Separation of Concerns), scalability.
  • Language: everything related to programming languages (JavaScript, Swift, Java), the syntax, operators, variables, compilers.
  • Framework: everything related to frameworks (AngularJS, ReactJS, Cocoa Touch) and platforms (Browser, NodeJS)

Challenge yourself to become better and better by focusing on the fundamentals, learning new languages and trying out different frameworks. Constantly learn and practice.


How To Learn More Effectively

  • Start with concepts
    Instead of jumping directly into big projects, try learning the smallest pieces of functionality first. This way, you'll start with a strong base of knowledge and have an easier time coding things. Change the color of a paragraph's text, add two numbers together, store a collection of things in an array or an object, learn about logic with if and else. Try some loops.
  • Practice like real life
    As you learn, make sure to take some time to practice under real conditions. That means using your own text editor and your own browser and coding something without relying on a tutorial. This is a great way to avoid the problem of being able to do something with a tutorial but not being able to apply it on your own. Take a look at a site that you like, look at the source, then try to replicate different components of the site: header, hero section, footer... This is agreat way to reinforce your learning.

Some practical ways to think through a project:

  • first break the project down into smaller pieces
  • write in plain language what you want each piece to do. THis way you can do your thinking without getting bogged down in the details of code
  • Build each piece of the project, starting with concepts you know. If you've been learning concepts first (instead of jumping into projects at the beginning), you should have a reasonable toolset by now.
  • When there's a gap in your knowledge, reduce it to the smallest possible piece of functionality and look it up.
  • As you are learning don't obsess over perfection. Perfection hurts progress.
  • Don't be afraid to experiment with different approaches and idead. These polished tutorials you see online often go through a lot of experimentation before being presented anywhere.
  • After you have tried a project yourself, look up similar projects in order to learn from other people's approach.

Notes from Lara Boyd's TEDx talk

Nothing is more effective as practice in helping you learn. There's no getting around it, you have to do the work. Increased struggle during practice leads to more learning. The brain is shaped by everything you do and everything you don't do. The things you do matter. Everything you experience, even your attitude changes your brain. There's no one size fits all to learning. For some people it may take more practice, for others it will take less. The uniqueness of your brain can affect you both as a learner and as a teacher. Study how and what you learn best.


Be rigorous. Understand how and why your code works. Understand your tools. If you’re working with a framework… learning to use it is just scratching the surface. Go deeper. Learn how it works.

For a great example of how to learn just one concept look at How I learned to stop worrying and learn HTTP

Source:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment