Effective Learning and Feedback Loops
Tags: python, beginners, javascript, learning
Published: 2020-06-10 17:52:59

I follow a lot of tech people on Twitter that like to give advice to prospective developers on how to get started.  Most of it looks like this:

"Start by learning HTML, CSS, vanilla JS, and how HTTP works"

"Get into data science by learning Python fundamentals, statistics, and higher-level calculus"

"Start with jQuery before learning React"

I used to think like this too, in fact half of my bookshelf right now consists of old discarded programming language books that I hardly opened.  Like in any skilled profession, there is a lot to learn and not much guidance on where to start.

# What is Effective Learning?

We've all heard the phrase, "it takes 10,000 hours to become an expert at something".  Some people with natural talent will become experts in much less time, however there is no getting around the matter that becoming good at anything takes a **significant** amount of time.  It's why medical school takes 10 years (or less if you live outside of the US).  It's why athletes like Michael Phelps at their peak  would train ~6 hours a day, 5-6 days a week.  It's why Mozart never stopped practicing the piano.

I think the focus of what to learn is missing the point.  It's not what you should start learning, it's what makes you the most excited to continue.  If it takes such a significant amount of time to get really good at something, it doesn't really matter what you start with *as long as it motivates you*.  This means you need to create good feedback loops around your learning.

# The Feedback Loop

One of the reasons Silicon Valley has become so successful is because they've embraced this notion of experimentation.  Facebook's old motto was "move fast and break things".  While this is a problematic motto for other reasons, there is no denying that Facebook has become very successful as a company, and I think this motto gives us a glimpse as to why.  Quick experimentation leads to quick feedback, which leads to more experimentation, and so on.  Examples of companies with quick iteration loops abound in Silicon Valley - Google, Uber, Tesla, Twitter, and Apple are always churning out new products and ideas.

This is also the concept around [Agile programming](https://en.wikipedia.org/wiki/Agile_software_development).  Quick iteration cycles lead to quick feedback, which in turn lead to quick products.

To learn anything well, you need to create short feedback loops between your practice and the result.  This feedback loop motivates you to continue practicing and learning.  If Michael Jordan had spent all of his teenage years shooting free throws without constantly playing with others, he would have given up in frustration long before joining the NBA.

Fundamentally this is a biochemical pathway in your brain that you have to wire.  You perform an activity which causes some result, which creates a neurochemical response in your brain, which makes you look forward to doing that activity again.  For Michael Jordan the response is scoring a basket.  For musicians it's hearing beautiful music.  For programmers it's creating intelligent software.  It's also why social media is so addicting, but I digress.

 ![Feedback Loop](https://dev-to-uploads.s3.amazonaws.com/i/ig9lqurge3d47xycncjo.png)

# Examples of Feedback Loops

Feedback can come in a lot of different ways.  We are social creatures however, so the most effective form of feedback is from others.

## Learning a New Language

A lot of the same concepts in programming also apply to learning a new language.  Rather than starting by learning the gender tenses, verb conjugations, and past/present/future forms of verbs, start with something much simpler that gives you instant feedback.  

The reason that people who fully immerse themselves in a language learn an order of magnitude faster is because their feedback loops are much shorter.  As someone who is bilingual and has successfully (and not so successfully) learned other languages, my advice would be:

1. Learn some of the basic question words (how, where, why, what, when, who).  Questions are some of the easiest ways to start a conversation with strangers and conversations give you instant feedback.  If you can learn how to order at a restaurant, ask where the bathroom is, and ask for directions, then you can basically visit any country on your own.
2. Go to meetups where you can talk to others who are learning without feeling embarrassed.  Talking to other people is one of the best ways to get feedback but you won't do it if you're ashamed to make mistakes.
3. Watch Netflix shows, listen to music in that language, or watch Youtube tutorials in that language.
4. If within your financial means, take a vacation to a country that speaks that language and use the few words you've learned to start conversations.

## Learning to Program

In programming, feedback may come from seeing your program do something cool.  It doesn't have to be feedback from others, it can be from your computer.  Although as social beings feedback from others will always be more motivating.

When you make a simple Hello World application, seeing the output in your terminal is feedback.  When you make a change to a React application and see your website instantly reload, that is feedback.  When you get a job at a company because you learned and mastered the most in demand technologies - that is feedback.

So what is the path of least resistance to getting some of this feedback?  Build things.  It doesn't matter what, don't suffer from [analysis paralysis](https://en.wikipedia.org/wiki/Analysis_paralysis).  If you like following tutorials on building TODO apps, do that.  If you like thinking about the stock market, build an app that helps you track it.  If you like playing chess, build a chess app.  Build whatever motivates you and will give you instant feedback.

Another great way to get quick feedback is to *write tests*.  Tests serve a myriad of purposes (see [Why do we Test?](https://dev.to/g_abud/on-testing-2k0i)), but one of the biggest benefits is that you get near instant feedback in the form of passing or failing tests.  This significantly shortens your feedback loop and leads to quicker development, and therefore quicker learning.

As you become more advanced, you will be able to build more interesting applications and still maintain this quick feedback loop.  But you don't need to start with that, you're not going to make something used by thousands of people on the first try.  If you hold yourself to such high standards you will also struggle, not receive any feedback, and ultimately give up.

# My Advice

Don't code in a black box.  If you write code professionally already, you can institute better practices to form shorter feedback loops.  Write lots of quick, easy to maintain tests.  Open short, frequent pull requests and be sure to institute good code review practices.  If you work on a team, every pull request should be reviewed by at least one other developer.  If you don't code professionally, make pull requests to open source projects.  It's fine if these are corrections to documentation or better comments on code to start - that is still feedback.  

And host all your projects on Github with good READMEs for others.  You'll be surprised how often a project that you think is useless will get interest from others.

## What to Learn

Rather than learning 10 foundational things before ever getting started, my advice is to learn in such a way that minimizes your feedback loop.  In software, here are some ideas of the path of least resistance that minimize your feedback loop.

- Learn React to build a simple application.  It can be anything.  Host it on Github and share it with others with a one-click deploy service like [Netlify](https://www.netlify.com/) or [AWS Amplify](https://aws.amazon.com/amplify/).

- Learn Data Science by learning Pandas and applying it to automating mundane spreadsheet tasks at work.

- Learn Python by building a functioning website using Django and Django plugins for authentication.  Deploy this using [Heroku's free tier](https://www.heroku.com/free) and a [Django config](https://devcenter.heroku.com/articles/deploying-python).

The point is not the languages (you can swap out React for Vue or Python for Rust if that's what interests you), the point is that these are some of the easiest ways to build appealing applications.  React, Django, and Python are also among the most employable skills in web development right now.  Here's the latest [Stackoverflow developer survey](https://insights.stackoverflow.com/survey/2020) if you don't believe me.  Receiving a job offer is a very strong form of feedback.  You could certainly learn the fundamentals first and build an application with pure HTML and CSS, hosted on your own server on Digital Ocean.  You will certainly learn a lot, but the feedback you get from building that (an ugly website that looks like it's from the 90's) will not encourage you to continue learning.  I also haven't yet seen a job posting that only asks for ninja level HTML/CSS skills.

Whether it's from other people, from seeing your computer do something that you told it to, or from making some mundane task at work easier, getting feedback is key.  Once you gain a certain level of proficiency, your feedback loop will be much shorter and your learning will grow exponentially.  The key is to get started!