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. In this post we’ll talk about another exercise I often end up doing with my trusty paper notebook: reflection.
We’ll talk about two of my favorite reflection exercises in this series, starting with High-Level Reflection. Our next post will talk about Reflecting on Mistakes.
I tend to get sucked into the small details of my work: what is happening with each project and what I think about it. I have neither time nor energy to devote to all of these things. Trying to do so puts me at risk of spreading myself too thin, stressing myself out, and feeling disappointed with my forward progress.
So every three months (and additionally whenever I’m feeling frazzled), I like to do a High-Level Reflection to figure out which things require my attention.
Step 1: Professional Development Goals
I start with my professional development goals: what are the two or three things I’m working on right now?
Mine at the moment are to 1) develop a deeper understanding of natural language processing, 2) build software that centers its clients even more than clients center themselves, and 3) listen better.
These goals constitute the top things I’m doing right now to work on myself—not a particular project. They might come from my last performance review or from my personal vision of where I want my career to go.
Step 2: Things On My Mind
Below my professional development goals, I make a list of all the things I am currently either working on or worried about. If I’m being honest with myself about all the Things On My Mind, this list can end up pretty long—a dozen items at least.
I put this list in a rough order according to how directly each item contributes to my professional goals.
Suppose my list of Things On My Mind includes these things:
Projects: working through a course on deep learning for natural language processing, building a model for some of our text data, pair programming with team member x on revamping our data import, adding commentary to the employee handbook, adding commentary to our language-specific style guides, pruning local branches on an app I don’t work on anymore
Concerns: the on-ramp process for programmers taking over the apps I have worked on, the inclusiveness of our hiring and promotion process, professional development opportunities for my team, how I interact with coworkers one on one, office politics, art ideas for the office, where we get our office coffee from
How would I order these?
I would put those natural language processing projects first: the deep learning course and the text data model both contribute directly to my first goal. Next, I might put pairing with my team member on data import; we have a lot of opportunities there to center our clients more in our import process., as per my second goal After that, I might put my concerns about how I interact with coworkers one on one. Those interactions allow me to practice my listening skills from my third goal.
I’d keep filtering down to items that contribute less and less to my goals. Office politics, for example, are a lower one for me. That’s not because office politics are inherently bad or unimportant; it’s because my goals right now don’t focus on that. Someone who has a goal around getting promoted to director would have that much higher.
Step 3: Identify Gaps
Now that I have my list of projects, I ask myself a question:
Do the things on my mind sufficiently address all of my professional goals?
If not, what projects would I like to do to better address those? I write those in a list next to my list of existing projects. This is my add list. I’ll use it later.
Step 4: Identify Cruft
Now I start at the bottom of the list of Things On My Mind, and for each item until I get near the top I ask myself:
What would happen if I stopped thinking about this?
I used to consider this question unthinkable. After a few rounds of doing this, though, I realized that more often than I’d like to admit, the answer is that not much would change if I stopped thinking about this. In those cases, those items go on my drop list. I’ll work on dropping them to free up bandwidth to focus on the things that do directly address my professional goals.
Sometimes, though, I can’t just stop thinking about something. Those cases generally fall into two categories:
1. I have context that is critical to move this thing forward. Maybe I’m the only one who has maintained this system, for example, even though it has nothing to do with what I’m learning now. In these cases need to prioritize transferring my context to someone else directly responsible for the project. This happened, for example, when I switched from a full-time software engineering role into a more data sciencey role. I wrote documentation, paired with other programmers, and even pushed large structural refactors so other team members could find their way around the code more easily as I rolled off.
2. I have special skills or experience to help move this thing in the right direction. In these cases, I need to prioritize transferring (or at least signaling) my experience in this area to someone up the management chain who works on this. Then they can either use what I have said to take on the concern themselves, or they can at least consult me later if they want to. A common example of this situation for me is inclusion-related concerns: I want to write code, not be an inclusion consultant for my employer. That said, company leadership at most tech companies needs a lot of help in this area. So I’ll talk to the highest-level people I have access to who I believe will actually do something about this. I have recorded a fair amount of what I have to say about inclusion in blog posts, which helps me transfer some of this experience more expediently these days.
Step 5: Review Results with my Manager (or Mentors, or Trusted Peers)
After I do a reflection exercise like this, I spend some time in my one on one talking to my manager. In addition (or alternatively), sometimes I’ll share my conclusions with mentors or colleagues that I trust. I don’t walk them through the whole exercise: that’s boring for them and it feels like overshare to me. Instead, I focus the conversation on two things:
1. Gaps. I might say this to my manager/mentor/peer:
I have noticed that I’m not doing enough to address these goals. These are the ways I have come up with to better address them. Do you agree with these, or do you have other ideas?
(If I am talking to my manager) Are you OK with me adding these items to the Things On My Mind? What do I need to do to start these items? How can you help me with that?
2. Cruft. I might say this to mymanager/mentor/peer:
I have noticed that these things I am doing no longer align with where I am trying to go. Can I take them off my plate? Do I need to transfer context or skills to someone else? Here is my plan for how I might do that.
(If I am talking to my manager) Do you agree with this plan, or do you have other ideas?
Step 6: Track
For me this is a fairly informal one. I’ll keep an eye on those projects/concerns I wanted to add to my list and the ones I wanted to drop. Is the drop list, in fact, getting dropped? Am I, in fact, getting to work on the things in the add list? If so, then I get to be happy about that. If not, then I can follow up with my manager about strategies to move the lists in the right direction.
In the beginning of my career, my limiting resource was programming skill. For that reason, I found the most value in deeply technical notebook exercises like commit tracing. Nowadays, my limiting resources are more often time and mental bandwidth. So now I find a lot of value in reflection exercises, including High-Level Reflection.
I’ll identify my current professional goals (hopefully 2 or 3), then list all the Things On My Mind (probably 12-20). I put the Things On My Mind in a sort of priority order based on how directly they contribute to my professional goals.
I identify gaps where I’m not currently working towards goals, and I write down what I would like to be working on to do that. Then I start at the bottom of my ordered Things On My Mind list and consider what would happen if I stopped thinking about each thing. For items that don’t contribute to my goals and that don’t need me to think about them, I add them to a drop list. Sometimes I have context or skills that mean I need to keep thinking about something even if it does not have much to do with my goals. In these cases I make plans to transfer that context and signal that skillset to other people who are better positioned to work on these things.
When I am finished, I usually talk to my manager, a mentor, or a peer about the plans I have made. They often have helpful suggestions. Sometimes, my manager can even offer support that I didn’t anticipate!
Even if I did not have a supportive person to talk to about my results, I would still find this exercise useful for a couple of reasons.
First, I could still think about things within my purview that I could do to better reach my goals.
Second, I could still come away with a list of things to think less about. This mental house cleaning frees me up to focus my efforts in an effective way. It also feels extremely relieving 🙂