Carving marble
I haven’t written about Buttondown in a while because I haven’t worked on anything on Buttondown worth writing about. This is for a couple reasons:
- It was summer for a while, and summers are not best spent with idle hours funneled into a computer screen.
- Buttondown is growing, and of the hour or so I allot to it a day, more and more time is spent doing operational things — responding to emails, improving documentation, fiddling with Heroku — rather than doing the thing that I really enjoy, which is sitting in an IDE building things and pretending that there are zero users or external concerns.
But in October I have gotten back into the swing of things. My definition of getting back into the swing of things is simple: I pop a backlog item off of GitHub Issues and start cracking:
Buttondown is currently sitting at 192 issues. This might seem like a comically large number — it is! It is such a small tool, and yet there are so many things wrong with it; or, rather, there are so many ways it can be improved.
Issue creation is one of my favorite activities, though. It is so aspirational, like the equivalent of telling someone you’re going to run a marathon. Committing a bug or a feature or a to-do is a little lie I tell myself; this thing will get done, I whisper to the keyboard. It’s only a matter of time now that it’s in the database.
There are lots of sensible approaches to backlog prioritization:
- Focus on the highest-leverage tasks first; the ones that are high-impact but low-effort.
- Always have an end user in mind; never build something just to build it
- Bugs come before everything else
I follow none of these rules. There are two questions I ask myself:
- Is there something that a paid user wants or needs ASAP?
- What seems like it would be neat?
My definition of neat, too, is amorphous. Sometimes neat means quickly solvable so I can get a nice little endorphin rush. Sometimes neat means saving twenty bucks. Sometimes neat means playing around with data classes. As long as it’s neat, it’s what I work on.
None of these things are good praxis; this is not investing advice, to borrow a phrase from Matt Levine. And there are times that this is terrible: for instance, I have a memory leak that forces me to restart a box every ~six hours and it is incredibly frustrating but I have not spent any time diagnosing it because it is insufficiently neat.
But the system works! Buttondown is stable (okay, pretend I didn’t just talk about a memory leak). Buttondown is profitable (we are now in four-digit MRR, which is a pittance but a lovely pittance). Buttondown works (almost all of the time), and it is still a joy to work on (almost all of the time.). This is the largest codebase I have ever built, and it is silly and filled with terrible decisions but it seems to be working out okay.
After I finish writing this email, I’m going to track down a neat bug where our data enrichment API explodes when I try to hit it from continuous integration and then work on a neat Zapier integration.
Construction is a quiet joy. Things like CRMs and issue trackers and customer support playbooks are important, but with projects like these they are only important to the extent that they facilitate joy.
This has been a long couple weeks (sorry for not writing the past few Sundays.) My todo list has grown to resemble an abandoned lawn, sprawling and unkempt — I have had too many calls and emails to return, too many things. But the backlog items, all 192 of them, never stress me.
It may make me a merry Sisyphus, but there is no greater balm than spending three hours at a coffeeshop, a steady stream of cortados in hand, and slowly pecking away at ways to make something better. It feels just enough like carving marble.
Have a good Sunday.
Make some soup.