Merge branch 'release/20200524.04'
[themediocreprogrammer.git] / chapter06.md
index 1a4ca36a33dc693cef1e77b14c2e1134e76c82e7..3a07e0d00f10f9400ed9443d77882b047445c80a 100644 (file)
@@ -56,68 +56,67 @@ This is why the "focus container" is so important: it gives us small doses of di
 
 ## Mapping out longer-term goals
 
-### FIXME
 
-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?
+As you progress through the learning process 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 dissuading us it should encourage us to 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.
+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 review the list of other concepts 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 not otherwise 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.
+When I was learning JavaScript I noticed that someone mentioned that JavaScript borrowed from languages like Scheme. Scheme is a functional language 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?
+This is one way to map out learning goals (notice the other connections that show up as you are learning 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.
+The pressure to learn quickly can make any task seem insurmountable, especially if you don't know how best to proceed. You may be tempted to rush through this process and hope you retain the knowledge you've learned. This approach doesn't lead to understanding, it leads to stress and burnout. 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.)
+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 and follow a few connections as needed.
 
 ## 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.
+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 typing example code into our editors and find ourselves needing help to get them to work. 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.
+One of the reasons for practicing learning using containers is because we give ourselves those brief moments of failure and repetition. Repetition is how we get better at whatever we are learning. Failure allows us to course-correct our learning so we can determine how best to approach this the next time we 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.
+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 our brains so that they can finally understand the concepts we are 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.
+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 thinking "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?
 
-Part of our learning process is understanding that our expectations of how something will turn out can be completely different from how things actually do turn out. We envision all sorts of rewards and platitudes that never come. Does that mean we're at a dead end? I don't think so. What it might be is a case of what we expected we'd be doing with our newfound knowledge isn't panning out. We might find our expectations for how quickly we'd learn the topic aren't being met. We may also expect that our career will be bolstered by learning this topic, yet the job market hasn't recognized our new-found skills with job offers or more money.
+Part of our learning process is understanding that our expectations of how something will turn out can be completely different from how things actually do turn out. We envision all sorts of rewards and platitudes that never come. Does that mean we're at a dead end? I don't think so. It might be that what we expected we'd be doing with our newfound knowledge isn't panning out. We might find our expectations for how quickly we'd learn the topic aren't being met. We may also expect that our career will be bolstered by learning this topic, yet the job market hasn't recognized our new-found skills with job offers or more money.
 
-Our engagement is related to our expectations. Programming demands a certain amount of fun and reward, and if we're not finding the experience fun or rewarding then we're unlikely to want to continue learning that topic. Our minds begin wanting something else to engage us and we crave anything other than to continue with this learning process. After all, shouldn't we be enjoying this? If there's no engagement and enjoyment then the learning becomes drudgery. We become distracted more easily while trying to learn and our minds drift away rather than focus on our learning experience.
+Our engagement is related to our expectations. Programming demands a certain amount of fun and reward, and if we're not finding the experience fun or rewarding then we're unlikely to want to continue learning that topic. Our minds begin wanting something else to engage us, and we start craving anything other than to continue with this learning process. After all, shouldn't we be enjoying this? If there's no engagement and enjoyment then the learning becomes drudgery. We become distracted more easily while trying to learn and our minds drift away rather than focusing on our learning experience.
 
-There is also the problem of learning things that are evolutionary dead ends. The world of computing is littered with the remains of technologies and methodologies that are either no longer relevant or are considered "out-of-fashion". What once was cutting edge is now considered moribund, and the community around that technology or methodology scoots on to new technologies and methodologies and leaves their previous work as a technological ghost town. When we mention that we're learning these things we get curious looks from developers: "Why would you learn that? We've moved on to this other thing." It's as if we've heard about a party and arrive in time to see the clean-up crew picking up the litter and breaking down the tables and chairs. We feel like we've missed out on the good parts and wonder if it's even worth trying to keep up and find the next thing.
+There is also the problem of learning things that are evolutionary dead ends. The world of computing is littered with the remains of technologies and methodologies that are either no longer relevant or are considered "out-of-fashion." What once was cutting edge is now considered moribund, and the community around that technology or methodology scoots on to new technologies and methodologies and leaves their previous work as a technological ghost town. When we mention that we're learning these things we get curious looks from developers: "Why would you learn that? We've moved on to this other thing." It's as if we've heard about a party and arrived in time to see the clean-up crew picking up the litter and breaking down the tables and chairs. We feel like we've missed out on the good parts and wonder if it's even worth trying to keep up and find the next thing.
 
-All of these can pose their own problems for learning but it's up to us to take a more critical look at why we started this whole process of learning. What did we bring into this?
+All of these can pose their own problems for learning, but it's up to us to take a more critical look at why we started this whole process of learning. What did we bring into this?
 
 In each of these cases we brought our expectations of how the learning would progress. We brought the expectation that it would always be fun, engaging, and relevant. Sometimes our learning expectations do pan out, but when they don't we get discouraged and disappointed.
 
 Rather than being upset at how our expectations of learning this technology or methodology aren't being met we can take a more mindful approach. We can see ourselves in our moments of learning and notice if we're trying to bring more than our focused attention into the learning container. We can realize that learning is about changing ourselves and change is not always fun, engaging, or pleasant. We can put aside our expectations and concentrate on the learning itself. 
 
-That doesn't mean we shouldn't acknowledge our feelings. We should certainly feel the feelings of boredom, anxiety, disillusionment, and so on, but we should also be mindful of where those feelings originate. Are we truly bored or is this our mind trying to tell us to stop so we can do something more fun? Are we not engaged with this material because we don't find it relevant or are we giving in to our distractions? Is this really a dead-end in our learning or are we just feeling stuck? Notice when the feeling comes up and be curious about what prompted the feeling. Note when you get the feeling and where you feel it most in your body. Stay with the feeling for a few seconds and keep noticing it. Then,  continue your work. While you work keep noticing all of the feelings you're having and repeat the process of staying and noticing your feelings. When you're done you can reflect more on those feelings and make an honest determination of what those feelings are indicating. Through this process you can clarify what is causing those feelings and if they are just resistance to learning new material or a desire to run to distractions or something more familiar.
+That doesn't mean we shouldn't acknowledge our feelings. We should certainly acknowledge the feelings of boredom, anxiety, disillusionment, and so on, but we should also be mindful of where those feelings originate. Are we truly bored or is this our mind trying to tell us to stop so we can do something more fun? Are we not engaged with this material because we don't find it relevant or are we giving in to our distractions? Is this really a dead-end in our learning or are we just feeling stuck? Notice when the feeling comes up and be curious about what prompted the feeling. Note when you get the feeling and where you feel it most in your body. Stay with the feeling for a few seconds and keep noticing it. Then,  continue your work. While you work keep noticing all of the feelings you're having and repeat the process of staying and noticing your feelings. When you're finished you can reflect more on those feelings and make an honest determination of what those feelings are indicating. Through this process you can clarify what is causing those feelings and notice if they are just resistance to learning new material or a desire to run to distractions or something more familiar.
 
-If, however, you realize that you're really not enjoying learning this topic; if you feel you're spending more time convincing yourself to learn rather than actually learning, then you'll need to have an honest discussion with yourself about why you're learning this topic at all. Is this topic still relevant to you or has the topic become irrelevant? Are you learning this out of an obligation to yourself or others, and is that obligation still present? Are you trying to learn whatever it is because you're worried you'll be left behind, personally or professionally? Think about what brought you to start learning this topic and determine if the situation has changed. If someone came up to you and asked you if you would like to use this topic in the next few days would you consider it?
+If, however, you realize that you're really not enjoying learning this topic, if you feel you're spending more time convincing yourself to learn rather than actually learning, then you'll need to have an honest discussion with yourself about why you're learning this topic at all. Is this topic still relevant to you or has the topic become irrelevant? Are you learning this out of an obligation to yourself or others, and is that obligation still present? Are you trying to learn whatever it is because you're worried you'll be left behind, personally or professionally? Think about what brought you to start learning this topic and determine if the situation has changed. If someone came up to you and asked you if you would like to use this topic in the next few days would you consider it?
 
-You'll need to reconsider your true motivations for learning this topic and see if they still match what you want to do with your programming profession. You will also need to be honest with yourself about why you're learning this topic and why it is important to you. There are plenty of things to learn that are great career paths but if you have no interest in the topic, or are just learning it "to get hired" you're going to have a more difficult time learning the topic than if you had a genuine interest in it. You'll also need to determine if this is just resistance to learning. Your challenge will be to sort out your true feelings about this topic and tease out whether you've genuinely lost interest or are just struggling.
+You'll need to reconsider your true motivations for learning this topic and see if they still match what you want to do with your programming profession. You will also need to be honest with yourself about why you're learning this topic and why it is important to you. There are plenty of things to learn that are great career paths, but if you have no interest in the topic, or are just learning it "to get hired" you're going to have a more difficult time learning the topic than if you had a genuine interest in it. You'll also need to determine if this is just resistance to learning. Your challenge will be to sort out your true feelings about this topic and tease out whether you've genuinely lost interest or are just struggling.
 
-There have been many things in my career that I have tried to learn, but there have been many more that I haven't learned. Part of the reason I haven't learned them is because the computing landscape changed as I was learning them. At school I learned the Pascal language. I got reasonably good at it but over time those skills faded. Right now there's very little need for proficient Pascal programmers so continuing to develop my Pascal skills would be purely for my own enjoyment. I find other computing topics more enjoyable so my Pascal skills lay dormant. Should Pascal arise from its moribund state I can revisit the decision to reinvigorate my Pascal knowledge, but for now I'm content that I've made the right call. Later in my career the Java language came to prominence. I spent many sessions learning Java until I realized that I didn't enjoy the language. It felt too cumbersome to me and the directions it took weren't ones that I cared to pursue. So after some reflection I stopped learning Java. Was this all wasted time? Hardly. During my sessions I learned more about Object Oriented Programming and how objects fit together. I learned more about recursion while trying to solve a problem for one of my projects. These skills transcend Java, so when I started learning Python I was able to transfer my knowledge on how objects worked from Java to Python. I used that knowledge to understand what Python was doing and how it was different from Java. Should the need arise I can revisit my decision to learn Java and see if it interests me again.
+There have been many things in my career that I have tried to learn, but there have been many more that I haven't learned. Part of the reason I haven't learned them is because the computing landscape changed as I was learning them. At school I learned the Pascal language. I got reasonably good at it but over time my Pascal skills have faded. Right now there's very little need for proficient Pascal programmers so continuing to develop my Pascal skills would be purely for my own enjoyment. I find other computing topics more enjoyable so my Pascal skills lie dormant. Should Pascal arise from its moribund state I can revisit the decision to reinvigorate my Pascal knowledge, but for now I'm content that I've made the right call. At one point in my career the Java language came to prominence. I spent many sessions learning Java until I realized I didn't enjoy the language. It felt too cumbersome to me and the directions it took weren't ones that I cared to pursue. So after some reflection I stopped learning Java. Was this all wasted time? Hardly. During my sessions I learned more about Object Oriented Programming and how objects fit together. I learned more about recursion while trying to solve a problem for one of my projects. These skills transcend Java, so when I started learning Python I was able to transfer my knowledge on how objects worked from Java to Python. I used that knowledge to understand what Python was doing and how it was different from Java. Should the need arise I can revisit my decision to stop learning Java and see if it interests me again.
 
-It's OK to give up on learning something. It's up to you to determine what you want to learn and for how long. We are complex beings and our interests morph and change. We also exist in a complex industry of changing technologies and whims. What was interesting and necessary at the beginning of the year might become uninteresting or unnecessary at the end of the year. We shouldn't feel beholden to learning something just because others are learning it or because the job market requires it. Give yourself permission to listen to your own desires. If they match up with what a fickle industry wants then great! Go learn with abandon. But if they don't match up and you find yourself spending weeks trying to stir up enough motivation to learn the topic then you're doing yourself and your craft a disservice. Let this topic sit dormant for a bit and give yourself something else to learn. 
+It's OK to give up on learning something. It's up to you to determine what you want to learn and for how long. We are complex beings and our interests morph and change. We also exist in a complex industry of changing whims and technologies. What was interesting and necessary at the beginning of the year might become uninteresting or unnecessary at the end of the year. We shouldn't feel beholden to learning something just because others are learning it or because the job market seems to require it. Give yourself permission to listen to your own desires. If they match up with what a fickle industry wants then great! Go learn with abandon. But if they don't match up and you find yourself spending weeks trying to stir up enough motivation to learn the topic then you're doing yourself and your craft a disservice. Let this topic sit dormant for a bit and give yourself something else to learn. There is little point in making yourself miserable to please others.
 
 If you feel the urge to revisit this topic at a later point then let yourself come back to it. You should also allow yourself to come back to this topic without the baggage and expectations of your previous attempts. Saying "I already tried this once, so we'll see if this works this time" sets your mind to expect that you will give up again. Give yourself permission to approach this topic as though you're experiencing this topic fresh, with no expectations of how it will turn out. Be gentle with yourself and experience this topic again from your current perspective. 
 
 ## Approach with curiosity
 
-As beginners we engaged the computer with curiosity and enthusiasm. We didn't know what to expect and had no idea how long it would take. We just learned as much as we could and took everything at face-value. As we continued to learn we traded our curiosity for certainty, and our enthusiasm for expectations. The excitement we got from learning became the drudgery of feeling that we must always be learning, but we can re-capture that beginner's spirit by looking at each opportunity to learn as a new experience. We can let go of our expectations of how our learning will progress and instead approach each learning session with curiosity for what we will learn during the session. We can re-kindle the spark that we had when we were beginners with infinite possibilities. That spark will sustain us through the periods of uncertainty.
+As beginners we engaged the computer with curiosity and enthusiasm. We didn't know what to expect and had no idea how long it would take. We just learned as much as we could and took everything at face-value. As we continued to learn we traded our curiosity for certainty, and our enthusiasm for expectations. The excitement we got from learning became the drudgery of feeling that we must always be learning. We can re-capture that beginner's spirit by looking at each opportunity to learn as a new experience. We can let go of our expectations of how our learning will progress and instead approach each learning session with curiosity for what we will learn during the session. We can re-kindle the spark that we had when we were beginners with infinite possibilities. That spark will sustain us through the periods of uncertainty.
 
-We can learn to love learning again. With each focus container we can approach our learning fresh, with no preconceived notions of how it will end, and be curious for what we'll find when we dig deeper into what we're learning. Each session of learning brings us one step closer on our journey to close up the gaps. There so much to explore in our field. I hope you always find something new and exciting to help you on your journey.
+We can learn to love learning again. With each focus container we can approach our learning fresh, with no preconceived notions of how it will end, and be curious for what we'll find when we dig deeper into what we're learning. Each learning session brings us one step closer on our journey to close up the gaps. There so much to explore in our field. I hope you always find something new and exciting to help you on your journey.