You should write deliberately bad tools
“One can waste years this way, systematically postponing precisely the things one cares about the most.”
Oliver Burkeman, Four Thousand Weeks: Time Management for Mortals
I’ve been recently reading a little bit about time management. Time management philosophy is divided into two camps:
-
How can I get more done in each day? Show me the productivity hacks, calendar-juggling techniques, and methods to slay my to-do list.
-
I’m going to die some day so my time is limited. How can I avoid squandering it on stuff that doesn’t matter?
Number 1 is the rise-and-grind hustle approach that’s you’ve likely heard of already. I’m not going to talk about it here. It’s the second approach that’s plenty more interesting –
I first read Seneca’s “On The Shortness of Life” when I was much younger, and I mostly read it for entertainment. I recently looked at Four Thousand Weeks by Oliver Burkeman, which is an important and very recommended read in it’s own right but I’ll let you in on the core idea: Life is probably about 4000 weeks long if you live until 80, and then there’s no more time after that. Whatever attention you give your financial spending, you should give at least twice as much to your time.
So, consider this interaction that I’ve seen in real life, several times:
Alice: Hey, could somebody fetch me the value for $VENDOR_API_KEY in production?
Bob: Yes, I sure can help you with that!
- Bob navigates to the AWS console, where he is prompted to type in his password.
- Bob types in his master password to unlock his password manager.
- Bob’s password manager fills in his account credentials and he clicks login.
- Bob then has to unlock his phone to accept his 2fa authentication from an app.
- Bob, now signed into AWS, changes his account role to the appropriate one.
- Bob navigates over to the AWS secrets manager, but has forgotten if the key is named $VENDOR_API_KEY or $API_KEY_VENDOR. Or is it $API-KEY-VENDOR?
- Bob swaps over to Slack to copy the right name, then pastes it into the search.
- Bob doesn’t find it. He thinks maybe Alice was mistaken about the excat name, so he does a few more searches and then does find that it’s named just a little differently.
- Bob has the value now, but now needs to send it to Alice.
- Bob fetches Alice’s SSH key off of github, and then encrypts the secret with age after first going through his shell history to figure out how he has done it before.
- Bob pastes the encrypted secret to Alice over Slack. “Here you go, it was no problem at all!”
Bob is some sort of moron, but maybe it’s only apparent when written out like this. Time seems infinite when each day comes after the next, in the same manner that the Earth seems flat when observed a few metres at a time, and this task looks simple when thought of as one step at a time. It’s not really that simple.
Perhaps I was a little bit unfair to Bob and they’re not truly the sort of person to go up the wrong-direction escalator for about three minutes before realizing it, but I really do see stuff like this so often. Typing in your password three times before you can get anything done, juggling things in your clipboard, click-ops’ing your way through tasks – if you have to do something like this manually, you ought to kick yourself the third time.
Programming can be described as a lot of things, and one of those things is that it’s the replacement of human labour for compute. Bob writes features and makes buttons bluer day-in and day-out, but easily forgets that they can make computers do stuff for them. And with only 4000 weeks or so of life, it’s plenty nice to have computers do stuff for me.
So I kindly instructed Bob that it might make sense to write something to do these sorts of menial tasks on his behalf, and showed them this comic put together by XKCD:
You may have seen this table before – the implications of it are actually rather surprising. Firstly, clip all values by 20% assuming that you’ll only stay at a company for roughly four years instead of five, when most stock vest handcuffs come off. Also note that these are absolute lengths of time and not work-hours. Really study it and think about each value here.
-
The most surprising thing in my opinion is that you’re permitted to spend more than six months working on shaving off minutes from a CI pipeline that runs 50 builds a day.
-
The most common “rule” I’ve memorized from this is that tasks of ~5 minutes permit at least ~one work-day to eliminate, when done at least monthly.
-
Not all time is equal. Five minutes of active click-ops is not the same as waiting for a build for five minutes. There is a second dimension that I like to call “agony” that’s also important.
This should be at least a little convincing, but “writing a tool is a project in of itself!”, cries Bob. XKCD is again poignant on this issue:
Bob takes your advice, and says “this would be a good opportunity to learn Rust or Haskell!” Cracking their knuckles, they download rustup, set up cargo, research into what IDE plugins there are – or install GHC and do the same–
No, no NO NO! This isn’t the time to learn a language – especially not one that requires you to be precise with what you mean, or to really enjoy the task. OK, you can make some affordances, but the goal here is to maximize your free time and that likely means avoiding any brilliant languages and picking those that align with writing the shittiest thing that is going to work, profiting as much as you can from open-source code others have written, and moving on with your life. The only difference between a script and a program is that scripts are deliberately bad.
“Oh,” Bob moans. “I’ll need an API key for this service, and they don’t have an SDK in Python so I’ll have to write one to make the API calls-“
No. Get Selenium or Playwright. Automate some clicking. Ask a GPT to rewrite some CURLs into real request code. Move on.
“But,” Bob says, “I need to put this user and password into somewhere. I’ll set up Hashicorp Vault, put in the keys–”
No. Put it in a text file and throw it in /tmp
.
“Okay, sometimes this thing crashes if it’s ran too long. I’ll take a heap dump, measure the memory–”
Come on. Just restart it every hour with a cron. Next.
For myself, I have a collection of embarrasingly bad tools that are unshareable and won’t really work for others. They handle all sorts of things that are otherwise papercuts, and it makes me smile when I run them and they do things for me. It doesn’t matter that they’re bad. It’s almost the point. I save my best work and energy for my actual projects.
Life is only so long. I haven’t thought so far as what I’d really like to do with my limited time in my life, but I know that clicking around in dashboards and consoles isn’t it.