More about fear
[themediocreprogrammer.git] / chapter06.md
1 # The map is not the territory
2
3 Discuss the ever-changing facets of programming and how keeping current with it all is both a challenge and a myth
4 ## The changing landscape of programming
5
6 The one constant about the field of programming is that it is always in flux. Programming languages come into prominence and the fade away over time. What once was a given is now considered obsolete (or even "harmful", as many essays will point out). 
7
8 When I graduated college we learned Pascal, Modula2 and Ada. When I started my first "professional" programming position Perl was the language of choice (partly because Perl could be easily transformed into the ubiquitous CGI scripts of the era). As of this writing I'm using Python as my main development language, and I foresee that at some point I'll likely have to look into the other languages that are becoming more common.
9
10 Programming requires flexibility. It's difficult to just learn one way of doing things and make that stick for over 20 years. Think back to what the technology was 20 years ago and you'll no doubt notice that things are quite different now.
11
12 ## Learning to learn
13
14 Instead of learning specific methodologies and technologies we programmers are better served by learning how to learn. That sounds simple: once we've cracked how to learn effectively then we'll be set. Unfortunately there isn't currently a foolproof way to learn that works for all people. Different folks learn better when different things are emphasized. Some learn better in a classroom while others learn best with self-directed study (books, video recordings, etc.). If you have the luxury of trying several different methodologies for learning I would encourage you to take them as much as you can. Figuring out what works for you will be key to helping you progress and grow.
15
16 For me I've found that some simple principles work best for me. The first is repetition. I learn better when I continually do something over and over again in small chunks. The second is having a small goal that I can achieve. So for me having some daily practice time on a project where I can see the end goal works best for me. When I was learning Python I enrolled in PyWeek, which is a one week game programming sprint where the theme is announced near the beginning and all programming happens during the week. For that entire week I devoted time to completing a game, and by the end of the week I'd learned more about Pygame (the library that I'd used) and Python than I had in the weeks leading up to PyWeek. Doing a one-week game jam (as they're currently called) is a bit extreme but it gave me a clear goal (a game) and a time-frame to accomplish it (one week). Over the years I've learned more about Python with various projects (both for myself and professionally) that had clear end goals.
17
18 You'll need to experiment to see what works best for you. The underlying principle is that your learning process should be something that you can do for any language or concept in programming. It should also offer the least amount of resistance to your learning. Your ability to learn and be adaptable will be vital to your experience as a programmer so understanding your learning process and what works for you will help in this process.
19
20 At the very least set aside 10 minutes per day as a container (see previous chapter) for reading and learning. There's a lot of information out there and having the habit of small doses of input will help you keep up a bit. But also keep it small. A lot of information can overwhelm you into thinking that you can't possibly learn it all. You're right - you can't learn it all in one sitting. If someone told you to drink one of the Great Lakes in one sitting you'd be hard pressed to complete the task (note: please don't attempt this!). If, however, you took one glass of water and drank it for 10 minutes per day you'd start to make an appreciable dent in the water. (Sure, it might not look like much on the outside, but that's the junction where metaphors and reality break down).
21
22 Each day you have an opportunity to learn more about the realm of computers and computer programming. Taking a little bit each day to learn a little bit more will help you on your journey.
23
24 ## How to choose what to learn
25
26 There are many opportunities to learn, whether it be via books, tutorials, videos, or computer-based training. There's also a myriad of different topics to learn. How do you decide which one is most important to learn? How do you manage what you're learning? How do you keep from getting overwhelmed with the options available?
27
28 This gets back to focusing on one thing at a time and listening to how you best learn. One approach I would take is to think about the things that you're most passionate about right now; what excites you at this moment. If there's something that you're eager to learn start there. If nothing seems obvious then make a list of the things that you're interested in and pick from that list. If there's still nothing on that list that is really exciting you then pick one at random (roll a die or create a random-number generator - that could be a project).
29
30 This isn't about picking the most important thing (though you may have topics to learn that are more important than others in your current situation), it's about figuring out where to put your focus right now.
31
32 Once you have your focus then it's time to figure out how to proceed in learning it. If you have a preferred methodology (videos, tutorials, classes, etc.) then spend a little time (no more than an hour or so) researching what is available. Some topics have resources available for beginners that list off things that the community think might be helpful for programmers just getting started.
33
34 If you can find some resources in a short amount of time that's great! Start your learning process with those resources. Don't worry if they're the right resources or if they'll lead you down the wrong path, just start with the. Eventually you'll come back and determine if what you're looking at is or isn't going to work for you. For now we're more interested in just getting started.
35
36 One trap that I'm guilty of is trying to find the best resource. I'll spend hours looking for the right book, the right videos, the right course; whatever it is I want to find the best version so I can minimize the amount of "back-tracking" and purchasing other material. This seems like a noble pursuit (after all, why wouldn't you want the best materials available?). It's also a trap and can lead you into spending more time thinking about how you'll learn rather than actually learning. And you'll spend most of your time wondering if you really made the right decision. This diminishes your ability to learn the material because you're more focused on the quality of instruction and not the actual instruction.
37
38 After a few days give yourself the opportunity to check in and see how you're learning. Are you feeling engaged or are you not enjoying this as much as you thought you would? If you're not feeling engaged (the material is boring, the instructor doesn't seem to work for you, etc.) then give yourself permission to see if there's something else out there that interests you more. You'll have a little more information from the instruction you've received (even if it's bad instruction you'll understand what bad instruction is like). You'll understand where your gaps are in the topic and will have a better feel for what you're looking for in learning.
39
40 If you're finding that the topic you're looking to learn is no longer interesting to you then give yourself some moments to reflect on why that is. Is it a difficult topic? Do you feel ready for the topic? Are you currently overwhelmed with other projects and are feeling tired when you approach this topic? Sometimes when we arrive to learn we realize that we need to learn something else before we can fully understand the topic. It's OK to find additional resources and focus on those before we tackle this topic.
41
42 Treat this as an iterative process, with regular check-in periods to see how you're doing. Think about how you feel when you're learning. Are you excited and engaged or do you feel tired and withdrawn? Do you try to procrastinate when you think about this topic? When you are focusing on your learning does your mind wander? Note these feelings as they occur to you during your focusing sessions and come back to them when you think about your learning process.
43
44 ## Resistance
45
46 Any time we learn new things we put ourselves into a vulnerable and uncomfortable place. We take the things we are familiar with and push into new territory. We become uncertain of the outcome; will it be successful or will it be a failure? Will it help us or hurt us? Will we choose the wrong thing to learn and will it cost us opportunities in the long run?
47
48 Discomfort and uncertainty are certainly a part of learning, but rather than think of them as something to be avoided we should instead think of them as a beacon. When we're feeling uncertain about what we're doing that means we're pushing into new territory. Instead of wishing for comfort we can instead relish that we're in uncertain territory and feel those brief twinges of fear and doubt.
49
50 We've been conditioned over our human existence to think of the unknown as something to be feared. These emotions have served us well and have kept us from venturing too far out of our comfort zone. When the unknown can house all sorts of dangers it makes sense not to provoke them by showing up on their doorstep. But programming is not the same as venturing into a dark forest or peeking into a damp cave; programming hardly warrants the amount of fear we give it. Instead we need to realize that we're not in any mortal danger and our fears are merely letting us know that we're venturing into the uncharted territory of ignorance where we shall find understanding.
51
52 (talk about learning, feelings, and resistance to new learning. Talk about the discomfort of learning new things)