Searls of Wisdom for January 2025
It's taken me a while to figure out what to write for you that would tie a bow around January 2025. My take on the cultural and political realignment we seem to be experiencing? A deep dive into the video workflows I've been developing as an outgrowth of my Breaking Change podcast? Reflections on the distinct misery of feeling like one's life has regressed in some way, and the counter-productive ways American men react to the sensation of going backwards?
None of those felt quite right.
So I sat on the newsletter and waited for inspiration to strike. Then, out of nowhere, an unextraordinary patch for a developer tool I don't use got merged and—through a convoluted series of coincidences—will likely stand as one of the biggest accomplishments of my life.
I'll explain what I mean by that, but first, here's a picture of my brother and me at brunch in a boat-themed restaurant literally named Boathouse and seated at a table built into an actual fucking boat:
What this patch has to do with me
If you're not a programmer, fear not: I don't intend to get too lost in the technical weeds here. That said, some amount of exposition is necessary to convey why the aforementioned pull request matters.
The first thing to know is that virtually no software is written "from scratch", in much the same sense that a human giving birth doesn't count as making a baby from scratch. The act of creating life assumes a bunch of very understandable dependencies: chromosomes refined over thousands of generations of our species, proteins that developed over millions of years, and mitochondria we've been copy-pasting from our first eukaryotic ancestor over a billion years ago. Computer programs are written at a similarly distant level of abstraction, despite their history dating back less than a century. If I write a Ruby program that prints, "Justin Searls is a sassy bitch," my Mac's terminal wouldn't know what to do with it if it weren't for a mountain of 90s-era graphical user interface code developed for NeXT, countless C routines that haven't changed since Reagan was president, and underlying system calls that adhere to API contracts first established by Bell Labs in 1969.
In software, we call the collection of stuff a program needs to function its "dependencies". Things we consciously and explicitly depend on are referred to as "direct" dependencies, and things we've either forgotten about or which are themselves dependencies of our dependencies are called "transitive" dependencies.
Less importantly, but still relevant: automated code checkers are often called "linters". This term was coined in the late-70s by Stephen Johnson (also at Bell Labs), who wrote a tool lint
that removed the software equivalent of lint from C code—yes, just like a lint trap removes lint from laundry machines.
With all of that out of the way, I can explain the causal chain that ended in me caring about this patch:
- A couple of years ago, I thought of a funny name for a plugin API for the Standard gem: since it would need to aggregate a bunch of linters into one, I could call it a "lint roller". Sadly, the curse of thinking of a good name is the urgency to go build the thing, so I sprang into action and started coding. This resulted in the lint_roller gem
- Fast forward to last week: in RuboCop #13792, @koic added support for plugins written against my
lint_roller
API - His work means that the
rubocop
gem will directly depend onlint_roller
. As a result, something I made will be installed every time RuboCop is installed (which has been downloaded 500M times so far and is used by 38% of survey respondents, so that's a lot of installs!) - Compounding this, last year (and after a bit of back and forth with the present author), DHH added a new gem called rubocop-rails-omakase to promote common-sense linting and formatting defaults for Rails users
- While Rails itself doesn't depend on
rubocop-rails-omakase
, every newly-generated Rails app does, so most new Rails apps now depend onrubocop-rails-omakase
, which depends onrubocop
, and which will soon depend onlint_roller
as a second-order transitive dependency - If you count all the developer workstations, continuous integration machines, and application servers that inappropriately install development dependencies into production, that's going to add up to a lot of computers installing code I wrote
Will every one of those Ruby developers know that they've installed a library I published? Or that it's silently being executed thousands of times a day as RuboCop lints their code? Of course not.
But I'll know.
In fact, over my career of writing esoteric developer tools that mostly masquerade as executable editorials on the industry—Mocktail about bad testing, TLDR about slow feedback loops, and todo_or_die about code comments—this single patch will probably make lint_roller
the most depended-on thing I ever make. When I realized that, I took a moment to reflect and celebrate that accomplishment.
Now, for what I really wanted to talk about with you today: why the knowledge that so many people are depending on something I made matters.
Why this patch means so much to me
My all-time favorite Steve Jobs interview was recorded in 1994 by the Silicon Valley Historical Association. It was posted online briefly in 2013 to promote a documentary, before both were yanked back off the Internet. All I remember is that the minute I heard the following excerpt, I felt unusually seen, because I had been making the exact same analogy since I first learned the history of the Unix family of operating systems in college. Here's approximately what Jobs said:
This is not a field where one paints a painting which will be looked at for centuries… This is a field where one does his work and in ten years it's obsolete…
It's sort of like a sediment of rocks. You're building up a mountain and you get to contribute your little layer of sedimentary rock to make the mountain that much higher. But no one on the surface—unless they have x-ray vision—will see your sediment. But they will stand on it. You can't appreciate it from the top of the mountain, but it will be appreciated by that rare geologist.
Woah.
Another Jobs quote, "we're here to put a dent in the universe," gets way more play, but it never resonated with me like this. The universe is infinite and abstract, but sedimentary rock is tangible and inspectable. The layers of source code and header files and binaries that make your computer go vroom are real. What's more, through the magic of software, that machinery can be copied effortlessly and perpetually to virtually every electronic device on the planet. And while it's true that one day Unix may be supplanted by a brand new operating system that doesn't share a single line of code… I wouldn't hold your breath. People are lazy and it's easier to just slap more mud on top of the mountain. And as the mountain grows taller, it only becomes harder to imagine anyone undertaking the Herculean effort that would be required to throw out the decades of sediment and start over. A total collapse of civilization is far likelier than humanity entering a post-Unix era.
Want to leave behind a durable layer of sediment in the stack of technologies that will be running on computers for decades and decades? Then you don't want to build a chart-topping iPhone app or a popular JavaScript user interface widget. No, you want to bore deeper. Create a useful but unremarkable transitive dependency that will so thoroughly burrow itself into people's software that nobody would dream of trying to extricate it, until it's ultimately forgotten… but still there.
This can be applied more broadly. Whatever discernible sediment you leave behind in life becomes a piece of your legacy.
For instance, I'm probably still lugging around genes from some asshole who raped my 30-times great-grandmother 750 years ago. He may have inadvertently ushered in my literal existence, but nobody remembers him. Still, I'm part of the legacy he left behind.
This contrast between the two paths to immortality—a blood legacy passed by one's genes versus an intellectual legacy passed by the endurance of one's ideas—was a concept that immediately hit home with me during a philosophy survey I took as part of my liberal arts coursework in college. In Plato's Symposium, a character named Diotima dismisses the concept of chasing immortality via the carnal pleasures of images of beauty (considered a mere reflection of truth) as unenlightened while extolling the sort of legacy one could achieve by chasing eternal beauty (truth) itself. Such a counter-cultural pursuit could lead to the cultivation of all-new virtues (ideas) that might stand the test of time.
Yes, that's heady and pretentious, but also I was an idiot sophomore who had seen Vanilla Sky fifteen times and couldn't shut up about how deep it was. Clearly this philosophy class caught me at a receptive stage in life.
Still, whatever the merits of Symposium's argument, it struck me that the book was still being read in classrooms 2000 years later, so Plato's advice clearly worked for Plato.
At 19, that particular lecture put a finger on an impulse I had felt since I began writing online in search of an audience in sixth grade. I wanted to move things forward somehow. I wanted to leave behind a meaningful intellectual legacy.
To be clear, "have kids or have an impact" is not a strict either-or proposition. But I do believe you can only focus on one thing (at least to the degree I focus on things) at a time. And my appetite for the particular work I pursue is so limitless that there has never been enough time in the day to sate it. That's why, for me, the decision over having kids was binary, and the impact on that intellectual pursuit (and any legacy that might result) felt visceral and stark. For me, this definition of legacy best encapsulates why I found myself constitutionally repelled by the idea of spending time raising children.
But why in particular did I choose to spend my time programming computers in search of making an impact, as opposed to any other vocation?
Our current geological age belongs to software
When I think of that line from Hamilton, "how lucky we are to be alive right now," I imagine we're meant to think golly gee, I guess I missed my chance to shape future generations through my individual actions. My perspective is wildly different. Yes, I may have missed the boat on making a name for myself by establishing a post-colonial Jeffersonian democracy. America's Founding Fathers lived during a moment when the layer of sediment being laid by civilization demanded a reformation of state governance. They were generally privileged and motivated, but were otherwise just regular people doing regular people stuff. They exhibited the same mix of attributes we find in notable people today, I'm sure.
So if their particular legacy is defined largely by what moment they lived in, the right question to ask is, "what layer of sediment is civilization laying right now?"
Question: what's even younger today than the first anti-colonial rebellion was at the time of the Constitutional Convention?
Answer: software.
The generations between America's founding and the Nintendo Entertainment System added to the mountain as they found it. Each layered on their own contributions: industrialization, market economics, transportation, chemical engineering, and TV sitcoms. These changes were big and visible and transformed daily life.
These days, people often remark that human progress feels like it's slowed down dramatically. They point to the stagnation of economic productivity (GDP per worker), the lack of flying cars, and the staleness of popular culture. One explanation is that without sufficient distance (as much as a postmodern mindset might wish otherwise), it's impossible to fully recognize decades-long tectonic shifts in real time. Another explanation might be that software—what it does, what it's made of, and what it could potentially do next—is completely invisible unless you go looking for it. But if you were to try to get your arms around the aggregate impact software has had on society (as opposed to simply considering its separate effects on each aspect of life and industry), the progress we've lived through is absolutely mind-blowing.
In geological terms, software represents the largest active volcano our generation will encounter in the evolving topology of human civilization. And it's still spewing hot magma in all directions! As someone intent on leaving behind something that will meaningfully outlast me, of course software was where I wanted to spend my time. You can't make glass by blowing on cold sand, after all—you have to go where the heat is.
Someone's legacy that I carry
Now, believe me, I get it: the fact that this particular patch establishes a weird chain of dependencies that will result in many computers running something I created is not actually that big a deal. It's maybe a notch or two above siring a genetic heir at a sperm bank, or scratching my initials on a bunch of rocks, or whatever. The substantive legacies I hope you and I will leave on this world are the ideas imbued in our creations and perpetuated through our relationships.
One person I've been thinking about while writing this essay is my late friend Jim Weirich. Next week will mark 11 years since he passed, but the impact of his loss still stings.
He was a good man. A better man than me. I once told him I loved how happy he always was, and he corrected me: I was actually appreciating how joyful he was. He took joy in everything I ever saw him do: whether it was when we pair-programmed to fix a bug in rspec-given, or when we exited a theater full of nerds as the only two people who seemed to enjoy Star Trek Into Darkness, or when we shared one final meal wherein he spent over an hour explaining the entire mythology of the Stargate franchise. He was a person who radiated his passions wherever he went. Bystanders couldn't help but feel the heat of his convictions and take notice.
Jim once told me he took a selfish delight whenever he went to an Apple store. See, not too long previously, Apple had begun installing Ruby along with the Mac OS X operating system. And because Ruby shipped with Jim's build tool rake, that meant he could walk up to any Mac on earth, open the terminal, and type:
man rake
And he'd see his name, right there:
rake was written by Jim Weirich jim@weirichhouse.org
That was one tangible piece of sediment he left behind. He said it always made him smile.
But the intangible things he left behind were far more impactful than all the libraries he published. He taught the next generation how to design quality code, write meaningful tests, and architect scalable systems. A generation that would go on to build the software that ran businesses like Airbnb, Shopify, GitHub, Hulu, Zendesk, and Kickstarter—and those are just the ones where I can think of specific individuals who I know were influenced by the wisdom Jim imparted on us.
What legacy will we leave?
For as important a topic as this is to me, it's not something I think about every day. When we talk about focusing on leading indicators as opposed to lagging ones, no measure is more lagging than how you'll have influenced humanity a hundred years from now. But I feel like this is a healthy thing to sit and ponder directionally, and it's something I consider every time I find myself at a major crossroads.
None of us can know how much time we have left to make our impact, but I'm grateful for every day I've had so far and excited for whatever the future has in store. Not only for me, but for you, too.