Software is a complex and ever evolving domain. As software developers, this means that, in order to stay on top of changes in the field, we need to be learning all the time. Certainly we owe it to our employers and clients to ensure that we’re keeping our skills sharp and up to date, but it’s also safe to assume that most of us enjoy this process of learning—it’s probably part of what attracted us to the field in the first place.
But our time is limited. We owe it to ourselves to ensure that the time we devote to developing new skills is spent as effectively and efficiently as possible. And yet most of us spend very little time or thought on how we might become more effective learners. From an early age we come to view learning as an essentially output-driven process: I wasn’t able to perform some task, I spent some time learning about it, and now I can. The middle stage—the actual learning—remains fuzzily defined at best.
The most effective learners do things differently. They treat learning as a skill to be developed in and of itself. Rather than focussing solely on output, they give equal weight to the process of study itself. Over time, they develop a set of mental problem solving tools and approaches that they can apply to help break down even the most complex of topics. In other words, they make use of metacognitive practices—thinking about thinking itself—to turbocharge their learning.
The good news is that this approach isn’t a superpower that some people are just lucky to be born with. In fact, it’s a skill, and just like any other skill it can be honed over time. Here at 8th Light, all new employees go through a period of apprenticeship during which they are not expected to deliver on client work. Instead, guided and mentored by a more senior colleague, they focus solely on growing their skills as a software crafter and a consultant. Naturally, this provides apprentices with a fantastic space and opportunity to sharpen their own approach to learning—but even if you’re not in a position to devote yourself to the process in the same way, there are steps you can take to move in the right direction. That’s not to say, however, that it’s easy.
Reinforcement Loop Learning
The problem is that many of us over-rely on an approach to learning I’ll refer to as a reinforcement loop. We come at a topic with some preconceived idea of the approach we want to take to learning it, and then we repeat this approach over and over in the belief—sometimes justified, sometimes not—that through this process we’ll be able to develop our abilities.
We rely so heavily on reinforcement loop learning not only because it’s a habit developed over many years—many of your lessons at school were likely characterised by this approach—but also because the act of continuous “doing” which underpins the process is frankly addictive. For example, the most compelling video games are almost always optimised around reinforcement loop learning. When you start a new level and are presented with some task to complete, you likely fail the task on your first attempt and go back to the start. With each successive attempt you get a little further, providing you with a sense of progression and mastery. Eventually you succeed, get rewarded with the endorphin rush of some points, and begin a new loop on the next level.
Given that this process is compelling enough that we’ll happily engage with it for fun, perhaps it’s unsurprising that we also try to apply it to other, more meaningful tasks. Reinforcement loops provide us with a sense of gradual but continuous improvement. We might struggle to articulate exactly how the process is helping us to progress, but again we have some output—the fact that we can now use the skill in question more confidently than we were previously able to—which provides us with evidence that we are.
Tradeoffs of Reinforcement Loop Learning
This sense of progress isn’t entirely misplaced. We can get better at writing software, learning a language, or just about anything else simply by repeating these loops ad infinitum. This is particularly true when the loop is defined around a simple, well-defined point of focus.
The problems with this approach arise when we try to apply it to more complex domains or tasks. Let’s take a moment to consider the process of learning a musical instrument. Reinforcement loops can be a highly effective tool for improving in this area when applied correctly. Learning scales would be a clear example. Scales are simple, repeatable, clearly defined sequences of notes. If I repeatedly play them over a period of time I may still struggle with the theoretical understanding of why the individual notes appear where they do, but I'll undoubtedly get better at playing them.
I’d also struggle if I tried to apply the same approach to learning not just scales, but the entirety of a complex piece of music. I might try to apply a reinforcement loop by simply playing the piece from beginning to end over and over. As with my scales, over time my performance would likely improve, but this improvement would come with certain costs.
If my goal is just to play from the first bar to the last, I'm almost certainly going to introduce workarounds into my performance. There will be particular phrases I find difficult, and so I'll find ways to make them easier. There will be bars where my technique is imperfect, but where my playing sounds just good enough for me to ignore any slip ups. These cut corners are not only going to be detrimental to my performance of the piece in question, but if I continue to replicate them over time, they will ultimately become habits that negatively impact my performance of all pieces.
Of course, this isn’t how a serious musician approaches learning a new piece. Instead of relying on reinforcement loops, they look to break the piece down into its constituent parts, then spend time analysing the techniques required for each and comparing different approaches they might take. Perhaps they listen to and evaluate other’s performances or study the cultural and historical context in which the piece was written in order to enhance their understanding. In short, they intentionally select from a range of activities and cognitive approaches in order to tackle each of these smaller problems as effectively and efficiently as possible.
There is absolutely nothing special or unique about learning to play a musical instrument. Whatever our area of interest, adopting an approach similar to that of the musician can speed up our learning while helping to avoid these pitfalls, while an over-reliance on reinforcement loop learning when applied to any other domain of comparative complexity can, and likely will, lead to the adoption of bad habits that filter through our practice.
What I’m ultimately proposing is a focus on metacognition—thinking about, and thereby gaining increased mastery over, the process of thinking itself. Through increased use of metacognitive techniques, we can develop a toolkit of tasks and approaches that allow us to gain clarity and plot a clear course through even the most complex topics.
This is an easy claim for me to make, but given that reinforcement loop learning is a habit of a lifetime for many of us, how can we start on the path towards adopting this approach? My suggestion is to begin with a simple list of things you are currently focussed on getting better at. So someone interested in learning to write software might include activities such as debugging, refactoring, naming, and so on.
Your list can be a mental one, but I recommend having some physical artifact—perhaps a Post-it Note for each item—somewhere in the vicinity of where you plan to do your learning. The benefit of this is that the list can act as a visual cue—whenever you find yourself engaged in one of the activities on your list (for example, when you find a bug), stop what you are doing. This can be extremely difficult at first. Again, what we’re talking about here is acting to break a long-term habit that probably tells you to jump right into trying to solve the problem. Nevertheless, try to persevere with consciously stopping and clearing your mind of whatever your instincts are telling you should be the first thing you do.
Once you’ve quietened your mind in this way, for each activity on your list you should have a checklist or rubric of activities you want to work through. For example, if you were focussed on improving your approach to debugging, your rubric might read something like this:
- Identify the line number on which the bug occurs
- Identify the exact structure which is causing the problem
- Apply an approach to fixing the bug
- Compare other possible solutions to eliminate the bug
- Analyse why this bug occurred and make changes so that is does not occur again
- Evaluate my approach to writing code and how it could be modified to ensure I don't make bugs like this in future
You’ll notice that the items on this run from simple, easily completed tasks through to broader, more complex thinking points. This is intentional and something we’ll come back to shortly. Your intention should be that, any time you encounter an activity in your list, you work through each element on the associated rubric before allowing yourself to continue with whatever you were doing beforehand.
By making a conscious habit of breaking out of our normal flow, we facilitate metacognitive processes. We give ourselves the room to think about the approach we take to our learning, and to start applying a range of appropriate cognitive tools to tackling the problem in front of us. Just like the musician with an effective practice regimen, this allows us to avoid the adoption of unconscious bad habits, while boosting the effectiveness and efficiency of our learning. Better still, over time it helps us develop and build familiarity with a toolset that we can apply to any problem solving activity.
Making a Rubric
The question which perhaps remains unanswered is how we can go about designing our rubrics in the first place. How exactly can we know which strategies and actions are appropriate for our situation? My preferred tool for facilitating this process is Bloom’s taxonomy.
Bloom’s taxonomy is a tool for modelling the increasing complexity of cognitive tasks, as well as illustrating the level of familiarity a learner should have with a topic before attempting them. The process of learning a subject is shown as a pyramid of six levels, each level representing a different broadly defined cognitive process. In order to move up through each level of the pyramid for any given topic, a learner must have gained mastery over the processes represented in the preceding levels. If, for example, you have just reached a point where you understand why adding two and three gives you five, you’re not yet ready to analyse and compare different written methods for addition—you first need to pass through the step of applying your newfound knowledge.
In providing a common language around tracking learner’s progress through a given topic, Bloom’s is used by educators around the world to form the basis of many curriculums. It can also act as a framework for us, as learners, to assess our own level of knowledge and set appropriate goals for ourselves.
If you return to our debugging rubric above, you’ll likely now notice that each element begins with a verb drawn from Bloom’s Taxonomy. This is how I suggest you go about building out your own rubrics for whichever area you are interesting in. If you’re just starting out on your learning journey with your topic of interest, remembering that the expectation is that you progress sequentially up through each level of the pyramid, your rubric will likely comprise largely from elements drawn from the lower half of the diagram. As you progress, these elements might be replaced with more complex cognitive processes from the upper half.
The real power here is that you are now actively thinking about your progression through a subject, as well as the tasks you should be focussed on in order to further improve. As individual items on your rubric become easier to perform, you have a measurable standard by which you can demonstrate progress. You are taking ownership of the process, and the process itself demonstrates progress—not just the outcome.
Ultimately, my suggestions here outline just one way in which you might start to adopt metacognitive techniques into your approach to learning. So many of us are over-reliant on reinforcement loop style learning which, at best, serves us poorly in making the most of our learning time. More often it introduces bad habits, which can then percolate throughout our practice.
If instead we can focus on being more aware of and exercising greater control over your thinking tools and processes, we can avoid these bad habits and, with practice, gain clarity on the next steps required to conquer even the most complex topics. Metacognitive approaches are, ultimately, the single most powerful tool in our learning toolkits.