+As you progress with learning you'll start to see that a lot of what we call programming is interconnected. Languages borrow heavily from each other and ideas that seem new and innovative have their roots in concepts dating back to the genesis of computing. Rather than dissuade us it should encourage us. We can open the doors of programming by learning simple, transferable concepts. The question is, which ones?
+
+The simplest answer is "all of them", but that's hardly satisfactory or possible. A less cheeky answer would be "enough of them to start seeing the patterns emerge" but that sounds more like a truism than something we can use to start making our longer term goals for learning.
+
+Rather than give specific advice on which concepts will serve you best in your pursuit of becoming a better programmer I'm going to suggest a technique that might help you map out what could help you.
+
+Programming languages will mention the concepts they borrow from. Whenever you're learning and you see mention of one of these other concepts make a note of it and keep focusing on what you're learning now. When you've completed your learning for the day take a look at that list and do some searching to see what else shows up. If there are other things that show up then write them down on your list. These concepts might not make sense at the moment but having that list available and referring to it might help you make connections about programming that you might otherwise not notice.
+
+When I was learning JavaScript I noticed that someone mentioned that JavaScript borrowed from languages like Scheme. Scheme is a functional language that was based on Lisp and was created as a teaching language for functional programming and recursion. So I took a brief detour into learning Scheme (partly because it was more interesting to me than JavaScript. Call it "creative procrastination", if you're being charitable.). What I learned while learning Scheme piqued my interest into other functional languages and functional programming. This in turn helped me understand some of the functional programming paradigms that were becoming popular in Python (list comprehensions, lambdas, etc.). By taking a brief detour in my learning of JavaScript I learned more about a whole family of languages and now I feel like I understand JavaScript and Python with more clarity than when I started.
+
+I'm not suggesting that everyone take the "creative procrastination" steps like I have (I'm still in the process of learning JavaScript as of this writing), but it does help to make notes of the concepts you encounter and dig further.
+
+This is one way to map out learning goals (see what shows up and be curious about how they fit together), but you may need a different approach. Perhaps you're under pressure to learn something to remain marketable or acquire some skill for your job that needs to be learned quickly. How do you map out those goals?
+
+The approach I'm outlining is designed to help you learn how to learn. The best way to learn something quickly is to understand how other concepts fit together with what you're learning. This is great when you have experience with a lot of different languages and concepts, but for those who don't have much experience yet it will feel like you're trying to shove an elephant through a small funnel. This is where practicing learning every day will help you. It will help you break apart larger learning goals into smaller chunks and will help you recognize the fear and discomfort for what they truly are: acknowledgment that you're expanding your skills into new territory.
+
+Longer-term goals are just goals that have been broken down into shorter-term goals. Focus on the short-term goals and allow yourself to course-correct as needed (and follow a few connections as you desire.)
+
+## Failure and learning
+
+One thing that we are afraid of while learning is failure. We worry that we won't learn the topic quickly or completely. We pick up material that starts off simply but later on becomes very complex, and we struggle to keep up. We try examples and find ourselves needing help in order to complete them. We fail to grasp the material and wonder if we'll ever learn what we're trying to learn.
+
+Failure is a part of learning. If you knew the material you wouldn't be learning.
+
+One of the reasons for practicing learning using containers is because we give ourselves those brief moments of failure and repetition. Repetition is how you get better at whatever you're learning. Failure allows you to course-correct your learning so you can determine how best to approach this the next time you make an attempt.
+
+We often feel that failure is something to be avoided, but while we're learning it is unavoidable. Our learning process requires us to fail in order to get better at what we're learning. That's the whole point of learning: reworking your brain so that it can finally understand the concepts you're trying to learn.
+
+Part of learning is having the right mindset for learning. Instead of feeling like you're constantly failing and struggling to keep up you may want to approach it with a different perspective. Instead of "I can't do this. It's too hard." approach it with a more curious "This is all new to me. This is why I'm practicing learning this." Giving yourself a more positive mindset will help keep you from giving up when you struggle with the material.
+
+## Dead ends and changing topography
+
+Sometimes we'll find ourselves learning something that's a dead end. We look at our progress and see no real improvement. We don't find the topic as engaging or as exciting as we'd imagined. We realize that what we're learning is an evolutionary dead-end in the realm of programming. What then?