Preface
I recently found myself in the position of having to learn a new web framework as part of an interview process. I had 7 days to go from never having used the web framework, to being able to demonstrate working knowledge during a live coding interview.
The employer knew that I had never used this particular framework, and so I wasn’t necessarily being tested on my proficiencies in the language. Rather, they wanted to see how quickly, when left to my own devices, could I learn a new technology. This exercise highlighted perhaps the most important skill in the software industry—learning.
For a software engineer, learning new languages and technologies is in the job description. You never know what project you might end up working on, and what technology you might end up making use of. It’s also vitally important to stay up-to-date with the latest and greatest so that you can stay competitive, maintain best security practices, improve quality of life, and so on. All of this means that one of the most, if not the most, important skill to a software engineer is learning.
Learning is a skill. For me, I’m always learning how to learn—it’s a lifelong process. And part of the reason I love software engineering is that it’s a field of continuous learning. It keeps me on my toes. Every day, not only do I get to learn new things, but on a higher level, I get to practice learning. So, when I set out to learn the new web framework as part of this interview process, I decided that I wasn’t just learning a new language, but more importantly, I was sharpening my ability to learn.
Learning How To Learn
What’s the best way to get better at learning? Practice.
And not just mindless practice, but practicing using the right mindset and techniques.
“Practice does not make perfect. Only perfect practice makes perfect.”
Vince Lombardi
So what does perfect practice look like? What is the right mindset, and what are the right techniques for learning how to learn? If I may, I turn your attention to the image of Bloom’s Taxonomy Pyramid.
Figure credits to: Anderson, L. W. and Krathwohl, D. R., et al (Eds..) (2001) A Taxonomy for Learning, Teaching, and Assessing: A Revision of Bloom’s Taxonomy of Educational Objectives. Allyn & Bacon. Boston, MA (Pearson Education Group)
At the bottom of the pyramid are lower-level thinking skills, and going up the pyramid are the higher and higher-level thinking skills.
Much of early education is focused on teaching children the low-level, foundational thinking skills: remembering and understanding. This starts with memorizing words, numbers, and facts, and then spending a great deal of time learning to actually understand what they’ve memorized. Only then can children begin to understand concepts, and begin applying knowledge to new situations.
I don’t remember what it was like, but it must have been very hard to do these things for the first time—and what a tremendous feeling it must be for teachers and educators to see children first begin to make these connections. In the process of moving from the low levels of memorizing and understanding, to the high levels of applying, analyzing, and evaluating, not only are children learning important concepts such as the alphabet, grammar, numbers, and math, but they are also learning a much more important skill—they are learning how to learn. And each time that they move up the pyramid, from memorization, to application, to abstraction, the learning accelerates. It’s almost as if there’s a learning curve to learning.
Learning how to learn is hard. And even after becoming a skilled learner, it’s still difficult to learn something that is completely new to you. The first steps into new territory are always the most difficult.
Consider learning a first musical instrument, or a first organized sport.
In the beginning you have to memorize where your hands go on the piano keys, or what the rules and regulations of basketball are. But with learning to take apart ideas, compare concepts, and apply knowledge to other areas, the second instrument, or the second sport comes much easier—it’s the same notes, major, and minor chords or it’s the same idea of out-of-bounds, attacking, defending, and scoring.
Learning your first programming language is much like learning your first musical instrument, or organized sport. Everything is distinctly foreign to you, and you have no familiar concepts to base comparisons off of. But as you learn a second, and a third language, you start to see connections—the similarities and differences. The learning curve becomes much less steep, and the learning accelerates.
Taking apart concepts, exploring relationships, using knowledge from one area and applying it to another—this is high-level thinking. And this is how to become a skilled learner. If perfect practice makes perfect, then the avenue to perfect practice is through high-level thinking.
A Rising Tide Lifts All Boats
If you’re spending time to learn something new, but you’re not also focusing on high-level thinking, then you’re not getting the most bang for your buck.
As an exaggerated example, consider that I learn a new language entirely through memorization. At the end of a line I must add a colon or else the program won’t run—brackets go here, and certain keywords go there. Suppose I go so far as to master this language through simple trial and error and memorization. If I then went on to learn another programming language, I would have to go through the entire process of memorization again. The learning process remains just as esoteric as before because I haven’t been focusing on understanding deeply, finding concepts, taking apart information, comparing, and contrasting elements. Against my best judgement, I haven’t used my high-level thinking skills, and now I can’t fully realize the benefits of learning. Now, again, this is an exaggerated example, but if you’re not careful it can be easy to fall into lazy, inefficient, or imperfect learning practices.
Continuing on for too long with a lack of understanding or with bad programming practices can lead to habitual copy-and-paste programming, or turn you into a cargo cult programmer (both of these terms are pejorative in nature, and stem from similar, frowned-upon programming techniques).
Bad practices aside, there are great benefits to learning a new language if you focus on high-level thinking. One of my favorite side effects is the, “A rising tide lifts all boats,” phenomenon, meaning that learning something new can actually improve your network of existing knowledge. In the context of programming languages, learning a new language can make you better at the other programming languages you already know.
You might have run into this situation, where learning another language has unanticipated benefits. You may start recognizing concepts that didn’t matter or make sense before. You might bring to light something that you had accepted as esoteric, or had been put out of mind for lack of understanding. You might learn the difference between a functional language and an object-oriented language, or static versus dynamic typing. You might gain a new appreciation of something that exists in one language but not another, like certain data structures, or a package manager.
Making these connections is important to the learning process as a whole, and can enhance your knowledge in unforeseen ways. If scientific papers and human psychology interest you, consider looking at the role transfer of learning plays in the learning process, and the benefits it encompasses.
Same, Same, But Different
As you learn more languages, frameworks, and technologies, you’re able to see things you couldn’t see before.
The DIK(I)W Pyramid, illustration by David Somerville
I believe this diagram does a very good job of visualizing the benefits of high-level thinking, and the significance of making connections between pockets of knowledge.
Each new technology that you learn can be thought of as a dot. Connecting these dots creates this web of knowledge from whence insight and wisdom can be drawn. A new dot might allow a new path to be drawn between two different areas of knowledge—a new bridge between two pieces of information. As more and more knowledge is added, the gaps in knowledge fade away, and the big picture reveals itself, becoming unobscured.
Very senior engineers seem to almost have a knack for knowing which technologies to use, and how to design the system architecture. They’re able to foresee issues that might occur months, or years down the line. Sometimes they can tell which technologies are just a fad, and which will be here to stay. Their brains exist on the far right side of this diagram. This is the wisdom that comes from years of high-level thinking and continuous learning. They become masters of the concepts.
For good measure, it’s worth noting that there can be both positive and negative consequences to a senior developer’s wisdom.
“In the beginner’s mind there are many possibilities, in the expert’s mind there are few.”
Shunryo Suzuki
While an expert can bring wisdom, an intuitive grasp of challenges, and a better understanding of the big picture, their perspective can also be narrowed by experience. They can fall into the rut of solving every problem the same way, and fail to see all of the other possibilities. Even an expert can have misplaced insight and wisdom. But a beginner who is still solidifying concepts has the greatly sought after ability to bring new perspectives to problems (albeit sometimes lousy perspectives!).
The Secrets of the Universe
I had to learn the Lisp programming language for a couple projects during university classes. I hated it. I thought that it was the most abstruse way of communicating with the computer that anyone had ever thought of. But looking back, it made me think differently about functional programming, and even though I hated it, I’ve learned to appreciate it as a learning experience.
Every piece of knowledge has some importance to the big picture, and if you’re not paying attention, you might miss something very important.
“Some people can read War and Peace and come away thinking it’s a simple adventure story. Others can read the ingredients on a chewing gum wrapper and unlock the secrets of the universe.”
Lex Luthor
I hope to never be the one reading War and Peace and thinking it’s a simple adventure story. If I’m going to read a 1,225 page book, or if I’m going to learn a web framework, then I’m going to pursue deep understanding, take apart and explore the concepts, and, to the best of my ability, make it worthwhile. Being in the mindset of higher-level learning requires extra focus and energy, and can take some practice, but if your job requires you to constantly learn new things, or if you just enjoy living the life of a continuous learner, then it’s one of the most beneficial changes that you can make.
Loved the article? Hated it? Didn’t even read it?
We’d love to hear from you.
So many great and important points in this. Learning to learn is such a fundamental thing yet it’s not explicitly called out nearly enough in US education. Critical thinking is what students need to achieve and, furthermore, *know* that that’s what they’re trying to achieve – not just passing classes.
I appreciate some of the insights on your article. Personally the article came across pretty high-level, and I would like to see a set of practical guidelines for learning efficiently. For me, tools including flash cards and mind mapping, in addition to applying new knowledge continually as I learn, can help me to learn more rapidly. I’d like to hear what low-level techniques you use to learn more effectively and make the material stick.