This is the part of the series on getting better as a programmer. The articles are:
- Getting better at programming
- Writing programs
- Quality assurance & operations
- Debugging & exploration
- Mechanical sympathy
- Data persistence
- Isolation, coordination, & communication
- Human communication & behavior
- Development process & architecture
- Self management
- Domain specific knowledge
All the technical knowledge in the world does you no good if you cannot use it in sustained effort to produce outcomes you want. This brings us to the topic of self management, that is, how to approach directing your attention in the sequence of moments that is your existence.
Before we dive into that, though, it’s important to point out that all your decisions are self management. No one else makes decisions for you. Someone may make a decision about what they want you to do, and may have rewards or punishments to provide to convince you to do so, but in the end it is your decision.1 For a programmer sitting in a cubicle five days a week, a manager may yell at them or otherwise make things physically unpleasant (though there is a line where that becomes creating a hostile workplace and opens the company to lawsuits) or can fire them (and possibly open up the company to a wrongful termination lawsuit if they don’t provide a thorough paper trail), but that is all they can do. You may choose to let someone else make some decisions that you will abide by, but that is a choice you make based on how great the rewards or how severe the punishments are for you.
Giving someone else that power is not a bad thing. By going to a grocery store for food, you have given the store’s manager the power to decide the options of what you eat. By letting a surgeon anesthetize you and operate on you, you have given them the power to decide what happens to your body for that period of time. By having one member of a team research something, summarize it, and provide a recommendation, you have freed up the attention of the rest of the team. Delegating specific decisions to other people is one of the most powerful tools the human race has. What matters is what is delegated, to who, and why.
After that anarchist digression, let’s return to self management. There’s a structure to it. We’ll work through that before getting into specific recommendations for each part.
Let’s start in the middle. In a given moment, there is some set of choices you can make of how to direct your attention. There is a subset of choices that you are aware that you can make. You want to
- make sure that choices that you want your future self to make will be ones you will be aware of, and
- make future choices that you don’t want your future self to make either be unavailable or be ones you are not aware of.
For example, if you have three phone calls that you absolutely must make tomorrow morning, putting them on a sticky note on the computer screen where you know you will sit down to work at 9AM is a great way to make sure those choices are ones you will be aware of.
Conversely, if you don’t want to impulse eat cookies, having no cookies in the house makes that not a choice. Instead you have a choice of going through all the steps to go to the grocery store and buy cookies when the impulse strikes. You may have habits that get you out of your home and on the way, but you have a lot longer to intervene and redirect your behavior.
The choice you make in a given moment is generally part of some larger arc of intention. That arc may be a goal—we’ve all been inundated about achieving goals—but the majority of what we do isn’t about goals at all. There are conditions we are trying to maintain. You want to keep your health. You want not to maintain your relationships. In biology we call this effort that is spent maintaining some state “homeostasis.” You will probably have many instances of homeostasis that you want in your life. It’s important to identify these because, if you’re thinking solely in terms of goals then actions you take to maintain homeostasis make you feel like you are stuck on a treadmill since there is no goal or finish line. Paying attention to the homeostasis is far more rewarding because every time you do the mundane tasks required to maintain it, you succeed.
This, then, is at the center of managing ourselves. We have the choices available to us, the subset of those visible to us, and the goals and homeostases that we have chosen for ourselves, whether consciously or unconsciously. Next let’s work backwards to what influences those.
First, we must have flows of relevant information coming in. The most typical way this shows up for programmers is in worrying about minor issues in the codebase or infrastructure. We do this not because they are the most important problems to solve, but because they are the biggest issues visible to us.
On the other end, too much information coming in is possibly worse than none. You either drown in it and have no attention for other things, or you absorb whatever fraction of it you can, whether it provides an accurate picture or not. In the process, you develop anxiety and decreased capacity to focus, as we have seen from the effects of predatory social media. At least in the absence of information you have peace of mind.
After information, you have affordances. The term is from user experience design, and refers to design choices that provide means for a user to discover or more easily do something. Some affordances are obvious, physical ones like “do I have my computer?” Many are much more abstract, such as where you can apply effort to a system and get a result as opposed to the system’s homeostasis fighting you; whether you have social capital from being reliable, being adaptable, having built trust in the past; or whether you have developed relevant skills.2 These determine what choices you can usefully make visible to yourself.
Information and affordances structure how we think about what
decisions are available to us. On the other side we have the outcomes.
When we curate what we want to do, we do so by making predictions of
outcomes. Our goal may be to deploy a piece of software. Creating a
managed continuous integration pipeline in GitHub may be a task on the
way to that. Running
scp on our workstation might be as
well. If we see alternatives, we choose between them based on the
outcomes we predict. Note: if we see alternatives. It is very
easy to do something the way you have in the past without considering
other options. For some things this is very good. I never think about
possible ways to iterate from left to right over an array. I made that
into a reflex years ago, and I don’t consider alternatives at all. For
others, it leads us into wasted effort. The only good thing to arise
from the emphasis on “impact” that many large software companies have
poisoned themselves with is the skill of pausing, reconsidering what
you’re about to do, and trying to think of a simpler way to get the same
Now onto some detailed recommendations.
Starting in the middle again, What makes a choice visible to us? Some will be triggered by your environment (“oh, there’s that book I want to keep reading” or “I feel hungry”). Some will be triggered by something you put in your environment for that purpose, like a todo list or a sticky note on your monitor. Some will pop up from your memory seemingly at random, based on your flow of consciousness (“wait, I need to feed the fish”). We call all these conditions that make a decision visible “antecedants”4
How do you choose among the visible choices? What you don’t do is collect dozens of possible choices and weigh them via some utility function. Faced with that many immediate choices, you either freeze, or a small number of them cause a much larger emotional reaction and you focus on those. You can condition habits that can help you, though. There is an famous quote from Viktor Frankl: “Between stimulus and response there is a space. In that space is our power to choose our response. In our response lies our growth and our freedom.” This may be as mundane as having a habit of referring back to our todo list at work.
So we can set up our environment to provide us antecedants for choices we want to make. What about antecedants that arise in our stream of consciousness? It turns out that if you can capture them into your environment in a way that your mind trusts will cause them to be noticed in future, they’ll stop showing up in your stream of consciousness. So if you could capture everything in your life into antecedants in your environment that you are confident will get seen and have a chance to trigger behavior in a reasonable time frame, you can have an empty head.
That may seem like a tall order, but it’s actually not that hard. David Allen’s Getting Things Done is still the best place I’ve found to learn how to do it. Many people get hung up on the details of how to track tasks or what kind of calendar to use and lose sight of the basic purpose, though: arrange things so once a week you can review everything in your life in an hour or so. I’ve been doing this pretty consistently since 2003 and it’s served me well.
For people used to thinking about their choices in terms of game theory and utility functions, this can be uncomfortable. It doesn’t really matter though. If you have removed choices you don’t want and set up antecedants for those you do, it probably doesn’t matter exactly what you choose. Either you have enough effort available to do what you hope to get done or you don’t. If you do, what exactly you choose now doesn’t matter as it will all get done. If you don’t, it’s better to address that when curating your choices than when you are in the moment.
When you’re reviewing your life or looking at a todo list to decide what to do next, the most useful tool I have found is just the Eisenhower matrix:
What do you do first? Important things that are due soon. What do you do next? Important things that are due later. Anything that’s not important? Just don’t do it.
Next let’s discuss incoming information. What sources of information will have high value? It’s probably not what’s being mass broadcast at you unless you’re an open source intelligence analyst and your job is specifically to pull patterns out of broadcasts to infer confidential information. So where do you get valuable information?
Some you can probably get by paying someone to send it to you. That’s the promise of trade magazines, journals, and paid newsletters. Most of these are supported by advertisements, though. That brings the price way down, but creates a conflict of interest. If a magazine publishes information that is good for you but bad for advertisers, it loses advertisers and ceases to exist. The survivors have put the advertisers’ interests above your own again and again.
On the other hand, gathering, analyzing, and publishing valuable information is expensive. With no advertisements, subscribers must pay the whole cost, and in general people aren’t going to pay that higher price unless the quality of the information really matters. If the information’s quality isn’t critical, advertiser supported publications will drive out purely subscriber supported ones. What’s left is niches where the information matters. Those niches tend to be small, so you have a much smaller number of subscribers paying hundreds, even thousands, of dollars a month.
That isn’t to say that spending hundreds or thousands of dollars for information means it will be valuable or high quality. Like any other service you might pay for, many of the people doing it for money just aren’t very good at it.
Social media is an extreme case of these problems. Unlike trade magazines which try to appear to produce valuable information to deliver your attention to advertisers, social media tries to use your emotional connection to other people to deliver your attention to advertisers.
The valuable information is showing up in small, semi-closed or fully closed communities that are unreachable by advertising. This can be whatever chat service is burning through investor capital at the moment (Discord at the time of writing) or self funded sites like cooperative Mastodon instances. Most of these will still not be a valuable source of information, but it will only be here that you will find any that are.
The best source of information is people. This gets perverted into the idea of networking, but the basic fact is that people gossip. If you’re in a field where you actually like a lot of the people and where the field’s content is the gossip of those in it, you will receive information by being a good friend. Don’t try to fake it. Don’t force yourself to maintain relationships with people you don’t like. That’s not how humans work. You’ll find a lot of people you can be professional with, a few that you get along with well at work, and a handful that will turn into close friends. The last are the ones you will likely keep in touch with. Over the years that accumulates.
There is a special homeostasis related to getting information from people and communities. When we speak of “information coming in” this isn’t some magic, abstract flow. This is people talking to you, talking to each in ways you can overhear, and things to read that come up in both of those. But this can’t be one way if you want really good information. That means effort providing value to the other person that you want to tell you things, or helping maintain communities and spaces where you may overhear valuable things. Information targeted at you that requires no relationship or effort on your part has a name: marketing. It’s providing value to the people broadcasting it. It is often not valuable to you. On the other hand, that senior engineer who seems to know everything going on in the industry? They have friends who will tell them stuff of interest that comes up, and they reciprocate.
Next, affordances. At the basic level, do you have your tools together? If you’re going to write a letter, do you have paper, envelopes, stamps, and pens all in one place? If you’re doing wood working, do you have your tools organized on your workbench? Is your computer in a space where you can work?5 This seems basic, but it’s surprising how often a little organization goes a long way.
Once we get past the physical level, we arrive at working with other people. If no one will consider any request from you, or the only people who will are people who can’t do anything of use to you, you are missing lots of affordances. So how do you build social capital and how do you know where to expend it?
Building social capital just means being someone with a track record of good judgement, reliability, and being positive to interact with. That does not mean always being right, doing whatever anyone asks, and agreeing to everything with a smile. Saying “I don’t know” when you don’t and working with other people to figre out the right thing to do is better judgement than always having an answer and defending it relentlessly. Turning down a request when you don’t have the capacity to handle it, or renegotiating it with plenty of warning if something changes and you can’t fulfill it, is more reliable than killing yourself to meet any request or deadline no matter how poor the result. Being positive to interact with just means that people come away from dealing with you feeling better than when they arrived.
On the other side, don’t burn social capital. If someone has put their trust in you, don’t betray it. If everyone around you is dead set on using Subversion and you prefer git, think hard before you start pushing git. Is there something more important you could be pushing for instead? I’ve seen people be fired or quit in protest because the codebase they were working in had a style guide and they refused to match it. I’ve seen others threaten to quit because someone wanted to run a formatter on a codebase where every file was in a different style. In both cases there were certainly better uses for that social capital.
And how do you apply that social capital? The best tools I have found are in system dynamics. The key insight is that systems stabilize themselves. If you push against the stabilizing forces, you will exhaust yourself to no effect. Instead, look for leverage points where you affect the structure of the system.
Finally, I want to point out that there are truly dysfunctional environments where your self management does not matter, places where you will be punished no matter how well you manage yourself. These are places where whatever you choose to do will always be the wrong thing according to someone in power, or you will not have done enough no matter how much you do, or you will be isolated from the information you need to possibly make a good decision. In such environments, you will be told that you’re the problem no matter what the reality is. If you find yourself in such an environment, you don’t need to improve your skills at self management. You need to get out of the environment.
This series is still being written. Subscribe to get emailed when each is section is posted:
There is a delightful science fiction story about this.↩︎
When I interviewed to work on Steam at Valve, I told them up front, “I wouldn’t hire me to be a game developer.” I have many deep skills around web services and distributed systems. I am missing many basic skills for game development.↩︎
Sadly, building a performance review system around impact can only operate on visible, easily measurable impact, which leads to neglecting problems until they become huge, existential crises so the impact of fixing them is easily measurable and only doing parts of a project that lead to an easy to measure outcome and abandoning the rest.↩︎
This term comes from applied behavior analysis, where behavior is characterized by an antecedant that triggers it, the behavior itself, and a consequence that determines whether the likelihood of the behavior given that consequence will increase or decrease in future.↩︎
I have heard a tale of an office where the programmers ended up in a space with carbon monoxide coming up from an auto shop.↩︎