This post is part of a blog series called Leveling Up: A Guide for Programmers. The series covers skills you can use to learn faster, more easily, and more strategically as a programmer.
Two posts ago we talked about removing reliance on motivation to make progress on your project. That post introduces about a framework for discipline-oriented practice to help you build habits, so you can rely less on feeling like practicing. Roughly, we said this:
2. Start your practice sessions with a warm-up activity. This allows you to get started without thinking too much about what it is you want to accomplish that day. Maybe it’s the same activity every day—say, running through a few refactoring shortcuts in your IDE of choice. Or maybe it’s a little problem set based on what you learned in your last session. Maybe it’s reading a short article and taking some notes. Don’t worry—we’ll talk at length about warm-up activities in a future post.
5. End your session by planning your warm-up activity for your next session. Maybe you run through the same warm-up activity before every session, in which case you don’t need to do this. But if you like to start your sessions based on a dedicated problem set from your last session, take time to choose those problems now. I like to leave a failing test in whatever I’m working on so that I can quickly find my place the next time I sit down to practice. Getting a well-encapsulated test to pass serves as my warm-up activity.
This is the aforementioned future post that goes into detail on warm-up activities! This post is also, in part, a testament to my deep and enduring love for coffee.
What is a warm-up activity?
A warm-up activity helps you start your deliberate practice routine for the day.
What makes a good warm-up activity?
- It’s formulaic: I like my warmup to have a predefined series of steps so I can do it as I drink my coffee (that is, without the aid of coffee). As I become more mentally engaged, it is OK for my warmup to start requiring more thought.
- It includes either writing or typing: In the 1940s and 1950s, Minnesotan educator Edgar Dale drew up this cone to represent the amount of information people retain from doing various activities:
I cut this image off because it, like most images of this cone, includes numbers that supposedly represent the percentage of information you retain by doing each of these things. It turns out that there is no conclusive evidence for the numbers, so I’m not looking to amplify them. That said, anecdotally I have found my relative retention rates to go pretty much in the order that the cone suggests.
As you can see, we have a few passive ways to learn that involve various combinations of hearing and seeing. Then we have the more active ones: discussion groups, doing, and teaching. I want to get the most out of my practice time, so I lean toward activities in the bottom of the cone. But remember—I like my warmup to feel formulaic. Neither discussion nor teaching are formulaic: they take some ingenuity and responsiveness that I don’t necessarily have when I start my warmup. So instead, I default to doing. And I default to the most formulaic version of doing that there is: writing or typing something, so I can get the thing I am learning into my fingers and into my brain.
I think the reason we get higher learning bandwidth from activities like doing and teaching is that they force us to slow down. We can only process the material as fast as we can write, perform, or teach it. The rest of the things in the cone don’t slow us down so much, so we can read/listen/discuss too fast and miss things in the process. I absorb information slowly, and during a warmup (again, without the aid of coffee) I absorb information even more slowly than usual. Writing or typing places a bottleneck on the flow of information so I am only processing as fast as I can absorb.
What doesn’t matter for a warm-up activity?
How long it takes. I have had effective warm-up activities that took 5 minutes and effective warm-up activities that took an hour. I think people think of ‘warm up’ and compare that to a workout warmup*, and then they think it’s supposed to take 5-15 minutes, and then they artificially limit the kinds of warmups they can do and/or get discouraged if their warmup takes some time or no time at all. Please, don’t worry about how long your warmup takes. If you’re getting something out of it, do your thing!
*Warmup, as a word, works the same way login does: two words for the verb (She needed to warm up, she needed to log in), one word for the noun (she performed a warmup, she performed a login). Unlike login, warmup has a hyphenated version (warm-up). I use warm-up and warmup interchangeably. Another factoid: workout warmups can also take longer than 5-15 minutes. If I’m going for a one or two rep max on an olympic lift, my warmup is 25-35 minutes long.
Example Warm-Up Activities
A code kata is an exercise in programming which helps programmers hone their skills through practice and repetition.
The term was probably first coined by Dave Thomas, co-author of the book The Pragmatic Programmer, in a bow to the Japanese concept of kata in the martial arts. As of October 2011, Dave Thomas has published 21 different katas.
I wouldn’t use the word ‘coined’ since the term had already been ‘coined’ for thousands of years by Japanese people and Dave just used the existing term in a separate but comparable context. The point, though, is to perform repeatable exercises like a test-and-implementation or a refactor.
I know that this tactic is very popular, so I am including it. It also meets both of my warmup activity conditions: it’s formulaic, since the steps are already clearly described, and it involves typing, as developers follow the steps, reset the code, and repeat.
I tend not to use this warmup activity myself because it requires a critical resource: a kata. Dave Thomas has written several kata, the examples from which happen to be in ruby (though one could do them in any language). Others have written a smattering of kata for other contexts (here’s an example for Anrdoid-robolectric). I cannot depend on the presence of kata for my field of choice and it would be a lot of warmup preparation overhead to write my own, which is one reason I don’t end up warming up with this much. The second reason is that kata tend to skew “Hello World”-y (though they certainly don’t have to), and if I am focused on learning a specific thing I quickly move past the “Hello World” level. The third reason is that, in the real world of programming, I have found very little utility in being able to type the code of a feature or a refactor from memory. So beyond developing my muscle memory for IDE key bindings, I found kata to do little for my general programming chops. You can disagree and love kata. I’m including kata in this list specifically because I know they work for a lot of people, so I want you to know they are available to you.
2. Fixing a Failing Test
This is generally my warmup activity in professional contexts because it gets me started quickly on the code I need to write that day.
It’s formulaic: I have a test that specifies exactly what I need to do next. So I do that thing.
It includes typing: I am typing the code that will make this test pass.
A failing test offers me a quick re-contextualization tool when I step back into a project after a night of rest or some other activity. If I’m already familiar enough with my topic of interest that I can write and execute on tests, I love the failing test as a quick warmup. It does require a little preparation in the form of writing the failing test at the end of the previous programming session.
3. Reading/Watching Videos and Taking Notes
I have a very specific way that I like to do this, which I’ll share in the next post.
It’s formulaic: I open the book/video series/blog I am consuming, and I start going through it wherever I last left off.
It includes writing: As I finish each section, I write down some notes about my takeaways from that section.
I like the flexibility of this warmup activity: I can do it for 10 minutes or an hour, depending on what I’m reading and what I want to do. I also take advantage of the fact that this warmup activity requires very little preparation: if I know what I’m gonna read at the start of my next study session, my preparation is done!
4. Commit Tracing
This is a high-bandwidth technique that folks have told me sounds ‘intense’ and ‘extreme.’ That’s OK! You don’t have to like it or use it! I’ll describe it in a future post. For right now, don’t worry about it.
Warmup activities help me get started on my independent study time so my routine stays on track. I like my warmups to be formulaic so I can follow the steps before I’m fully awake or in the zone. I also like my warmups to include some writing or typing so I can slow down my information intake to my absorption speed and get more out of the material. Sometimes my warmup takes 2 minutes, and sometimes it takes an hour. That’s okay!
There are several options for warmup activities. Some examples: performing kata, fixing a failing test, consuming written or video content and taking notes, or commit tracing (which we’ll go over in a future post). In the meantime, if you like, you can try out some of these warmup activities and see if any of them help you get started each day—especially on practice days when you don’t feel like practicing.
If you liked this post, you might also like:
When and How I Use Robolectric (Android): I’m linking this because one of the kata examples above discussed this, so I want to make sure wanderers Googling that term find something of value here 🙂
Streamlining your Automated Test Strategy with Risk Maps
Leveling Up Skill #3: Tracking our Progress with Accountability Calendars