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.
We have talked about a few journaling exercises so far, like goal setting, accountability calendars, and tracing commits. Then in the last post, we talked about another exercise I often end up doing with my trusty paper notebook: High-Level Reflection. This post talks about another type of reflection: reflecting on mistakes.
Reflecting on Mistakes
I’m glad that we’re finally getting to talk about this.
Throughout my career, the most effective learning mechanism I have found is a good old-fashioned screwup. Something about the anxiety of a screwup cements lessons into my mind better than anything else.
Psychology research supports this observation, and we’ll keep talking in the future about how to capitalize on this to improve information retention.
Before we do, though, let’s address one more thing: senior developers from privileged groups talk about this a lot already. “It’s OK to make mistakes!” “You should make mistakes!”
I cannot recommend making mistakes like that.
Maybe some mistakes have more benefits than drawbacks for the senior guy who is already reputed to be technically competent.
For a junior person, or for an engineer from an underrepresented group whose authority and ability are constantly questioned and downplayed throughout their career, screwups are costlier because they feed other peoples’ confirmation bias. “Oh, yeah, she’s hit or miss. Really botched that database refresh last quarter.”
So I’m not going to tell you to go forth and make mistakes. That said, I don’t have to. People don’t make mistakes on purpose, usually. We’re human, so it just happens.
Instead of recommending that you make mistakes, I’ll take it as a given that you will make mistakes. Let’s talk about what you can do to absorb the absolute most that you can from each mistake.
The reflection activity I am about to describe works best when my mistakes have an interpersonal component. In my career, I have found that the larger the mistake, the more likely it is to transcend the purely technical and possess some kind of interpersonal component.
Step 1: Write down the story.
I open a fresh page in my journal and I record the date and the time. Then I write down the story, in my words, of what happened leading up to, and through, the mistake. I write down who else was involved, and I write down my reactions.
This can be hard, and it can take some time. Sometimes I give myself a full night of rest after the mistake and before I write about it. I do this so that I have had an opportunity to begin processing what happened—but I try not to let it go too long because I want to recall most of the details.
As I explain what happened, I try to be honest with myself about why I reacted the way I did. This can be hard, especially if jealousy, ego, or personal insecurities are involved. I will write, for example, “I think I felt upset because I am jealous of <Person> for getting to do <project assignment>, even though I know that I got my chance at a plum project with <other project assignment>.” This accomplishes two things:
1. It saves me energy in the long run. I sometimes shy away from addressing emotions that I think I’m not supposed to be feeling. Then I feel subconsciously obligated to cover for myself with other rationales for my mental state or behavior. That activity might be subconscious, but it takes energy. It also imposes further stress, because now I have to convince myself of this rationale that maybe isn’t exactly the truth.
Admitting my unsavory moments takes focused practice, and it doesn’t feel good. When I’m hesitating to do it, I remind myself that the notebook isn’t going to write me off as a human being for admitting this stuff.
2. It helps me develop my compassion skills. I think most characteristics, including the ones we think of as innate, have a skill component that we can improve. Writing about my least commendable emotions and behaviors helps me empathize later with other people who I think are struggling with those same emotions or behaviors.
Step 2: Write down the things I could have done differently.
I use a little bit of notation for this. After I write down the whole story, I go back and put an ‘X’ in the left margin on each line where something ‘bad’ happened, as well as on each line where I see a place that I made a mistake.
For each X, I ask myself a question: If I got to do this situation over, what could I have done differently here to reach a better outcome? Sometimes I can brainstorm answers on my own. Sometimes I can Google answers. Sometimes I’ll crack open a book or ask a mentor or colleague. Below the story, in the left margin, I put a black dot. Then next to the dot, I’ll write down everything I have considered or learned about how to do this better in the future.
By the end of the exercise, I should have roughly the same number of X’s and black dots (though sometimes a black dot solution will address two X’s, and sometimes I’ll have multiple black dot solutions for one X). Then I draw a little arc from each X to its black dot solution.
Usually, I don’t go back and read these over later (though maybe I should, and maybe you’d choose to go back and read them in your workflow). Instead, the next time I find myself in a situation like this, I’ll hopefully remember the reflection exercise and consider testing out some of the solutions I considered in it.
I think there’s a reason that this works. In the moment, my brain’s processing speed is not always fast enough to make the right decision. But when I journal later, I have the opportunity to slow things down and think critically about my options. When I articulate my options and write them down by hand, I make it more likely that those options will get saved in my memory. Later, when I’m in the moment again, I don’t have to process, consider, and react: I have already done the processing and considering, and I have cached the options to use on the fly.
Step 3: Apologize, if needed.
If I made mistakes that hurt someone else, I think it’s important for me to apologize and take responsibility for the harm I caused. I try to do this as soon after the incident as I can.
The reason that this step is #3 instead of #1 is circumstantial and depends on the mistake.
Here’s why: In order to apologize properly, I need to be able to do four things:
1. Say I’m sorry.
2. Thank people for their feedback (if anyone gave me feedback about this mistake).
3. Name and acknowledge any harm that I caused (without trying to explain my intentions or otherwise justify my behavior).
4. State what I will do differently in the future.
I might not be able to answer #4 until after I have performed the journaling exercise, and it’s a critical part of the apology that I’d prefer to include. This is a judgment call: if I I don’t have specifics for #4, but I have a general idea of what I want to do differently, I’ll often prioritize the expedience of the apology and include the general solution before I carve out specifics. Each case of when and how to apologize can be a deeply personal decision. Timeliness and completeness are two variables to consider, though.
Step 4: Label the story with relevant lessons or terms.
Back in my journal, once I have arcs drawn between X’s and black dots, I’ll try to label each arc with a term I can use to categorize it. Examples might be “patience,” “making unfounded assumptions,” “getting defensive,” or “comparing myself to other people.”
As I continue doing reflection exercises over time, sometimes I’ll look back at previous exercises and see which terms are coming up the most often. These represent things that I am struggling to improve. I can choose to set explicit career goals around these things, get extra help addressing them, or otherwise prioritize them so I don’t continue making the same mistakes. Sometimes I find that I keep using these terms, but recent reflections apply these terms to a more advanced class of situations than the older reflections did. This tells me that, even though I am still working on this thing, I am getting better at it. Gold star for me!
Conclusion
Mistakes suck, but they can be a valuable learning experience. I find that reflection exercises help me extract the most learning that I can out of each mistake I make.
First, I write down the story of the mistake. I include names and dates, and I try to be honest about my emotions, motivations, and behaviors throughout the story. When I finish, I go back and put an ‘X’ in the margin next to any line where something went wrong or where I made a mistake. For each of these, I ask myself: If I got to do this situation over, what could I have done differently here to reach a better outcome? Sometimes I can brainstorm answers myself, or sometimes I get help from outside resources. I write down my answers to these questions below the story, and I put a black dot in the margin next to each solution I consider. Then I draw connections in the margin between the X’s and their relevant dots.
Finally, I label each connection with a category term so I can look back later and identify mistakes I might be making over and over. In those cases, I can prioritize addressing the mistakes so that I improve at my self-identified weaknesses throughout my career.
If you liked this post and you might try a reflection exercise, you might also like:
Leading a Software Rewrite at your Company
Thank you for this. It is practical, compassionate, and provides light.