I’m back in Tennessee, having recently weathered a (gorgeous) mountain snowfall and a (less gorgeous) fever over Christmas. In my client work I’ve been working a lot on Rails test profiling and optimization, something I’m hoping to bring to RubyTapas in upcoming weeks.
I'll Trade Ya!
Hey there! Archived SIGAVDI letters are for newsletter subscribers only. All it costs to join (and unlock this post) is an email address! I'll write to you weekly-ish with a few interesting links, some updates, and some reflections on the intersection of software and life. And I'll respond to your replies! Whattya say?
I have also been adopted by a local anole lizard, who presumably finds the indoor climate more conducive to being cold-blooded. I have named him Schnappi. He likes to jump on my face right as I’m dozing off. I’m assuming this is a gesture of friendship.
I did a work-inspired deep dive into advanced Dockerfile topics recently, so most of what I have for you today are some of the articles that helped me the most:
- Docker anti-patterns from Kostis Kapelonis. A highly opinionated technical article in the best way.
- Best practices for writing Dockerfiles from the official Docker docs. I wish I’d read these earlier.
- Builder pattern vs. Multi-stage builds in Docker – some history behind some of the practices in the preceding article.
- Speeding up Bundler in dockerized environments most applicable to Rails developers, but also useful information for anyone who needs to deal with a time-consuming dependency-fetch in their build cough
And so as not to be completely Docker-focused, here’s something completely different: a history of the The Alameda-Weehawken Burrito Tunnel.
There have been not one but two new RubyTapas freebies since the last newsletter!
- A technique for safely calling superclass methods that may or may not exist (handy for framework metaprogramming)
- Why you shouldn’t use Ruby core classes (String, Array…) as base classes, and what to do instead.
I’ve been having some trouble with the email notifications for new RubyTapas lately, but the episodes have been coming out weekly as usual. Some recent ones have included:
- Tying-off (probably) my series on Ruby one-liners, an episode about null-terminated streams of records.
- The second and third episodes in a new miniseries on developing inside containers!
- Jessitron returns to rant about
npm runand why you should never use the
npxcommand to run NodeJS scripts.
I am not proposing a return to the Stone Age. My intent is not reactionary, nor even conservative, but simply subversive. It seems that the utopian imagination is trapped, like capitalism and industrialism and the human population, in a one-way future consisting only of growth. All I’m trying to do is figure out how to put a pig on the tracks.
— Ursula K. Le Guin
Let’s talk about growth.
“Growth” is such a universally sacrosanct value that it undergird arguments about what other values to focus on. Growth isn’t so much a sacred cow, as the gold that the cow was molded from. Not everyone agrees we should have melted down our earrings to make the cow, but we all agree the gold was valuable.
Most software organizations support a mission of business growth. Certainly all VC-funded startups are predicated on growth-or-bust. Much of our industry’s innovation is preoccupied with scaling of one form or another; which is a subset of growth.
I myself have sometimes championed the view that in business, you have to grow or die. Because something is always eating up your value from behind; whether it’s the depreciation of your assets, the obsolescence of your expertise, the commoditization of your current offering, the shifting of market tastes, or any of a thousand other threats in an ever-evolving world.
Here at my house in East Tennessee, the woods I’m surrounded by is constantly growing. It’s been doing it for a long time, barring some interruption by logging in the ~1930s. But it seems like a rich, healthy, stable sort of growth. The ecosystem here in the foothills is profoundly diverse. A breathtaking array of plants and animals coexist up here, and nothing seems to be blighted at present.
What makes this growth stable and healthy? I’m tempted to say something like: it’s balanced by death. Trees fall; new trees replace them.
But this feels oversimplified to me, like a 90s-era yin-yang t-shirt from a mall head shop. Is it really just about balancing life with death?
In my woods, trees grow to a certain height and then flourish there for decades. Eventually, through a lightning strike, deer scraping bare spots in their bark, or simply the diligent work of bacteria, their skin is penetrated in spots by parasites. From there, wave upon wave of opportunistic creatures—from microbes up to birds and squirrels—make their living from, and find safety in, the tree’s gradual breakdown; each wave paving the way for the next.
Eventually the tree falls in a wind storm. A whole new succession of fungi, algae, moss, lichen, insects, worms, and other creatures inhabit the gradually disintegrating wood, bark, roots, and foliage. Saplings, denied bright sunlight for decades, throw their photosynthesis into overdrive and make their break for the canopy.
At what point did that tree “die”? Was it dead when it contained more dead tree cells than living ones? Was it dead while it still stood but was mostly leafless?
At the moment that the trunk lies moldering and moss-covered on the ground for me to snap a scenic picture, it is in a way as full of life—maybe even more so!—as any of the days it stood tall in the sun. Laced through with hundreds of miles of fungal mycelium, teeming with microscopic creatures, and sheltering more…
No, a balance of life-vs-death seems too simplistic a way to characterize healthy growth. It’s more like: structuring; balanced by waves of de-structuring, disassembly, and repurposing. Which, interestingly, are also forms of growth. And all of these are going on all the time: parts of the forest are structuring, and parts de-structuring, all mixed together.
What else can we draw from the forest about healthy growth?
Neither tails of progress nor of ruin tell us how to think about collaborative survival.
— Anna Lowenhaupt Tsing, “The Mushroom at the End of the World”
The quote above is from a passage about how, in the aftermath of logging in the Pacific Northwest, ignored by both the logging industry and conservation activists, a post-industrial ecosystem emerged. It supported both in-demand mushrooms, and the marginalized people who harvested them.
In debates about growth, the tension is too often between growth and preservation. New construction versus preserving historical neighborhoods. Developing land vs. preserving pristine habitats.
It’s easy to point to growth and development as being very Western ideals. But in his little book Shanzai: Deconstruction in Chinese, author Byung-Chul Han says that preservation, and particularly the value of authenticity, is also a rather Western value.
In Chinese art collecting, perfect fakes were considered as valuable as the original. Successive collectors put their seals and inscriptions onto artworks—not ruining them, but making them even more “real”, “true”, and valuable. In Japan, UNESCO refused to certify a thousand year-old temple as a world heritage site… because by tradition it is torn down and rebuilt from scratch every 20 years.
What would it look like to preserve a tree in my woods? If we could freeze it in place, fully-grown and uncorrupted by rot, for eternity, it would never support the cycles of growth that keeps the forest healthy. Its interstices could never be filled with fungus and grubs. It could never provide the food for a new generation of trees. This would be true death: to be “preserved” from the cycle of structuring and de-structuring.
Nor should we mistake the preservation of a stable cycle to be healthy, either! My woods may appear, on a human timescale, to be quite stable. But it is carpeted in places with spongy, foot-deep matts of fallen leaves, dried branches, pine needles, and other litter. One bad drought and a stray cigarette, and I’m going to be a very nervous homeowner.
The truth is, like a lot of the second-growth forest around here, these woods probably would have burned naturally a long time ago. But a combination of artificial firebreaks (in the form of farmland and roads) and human vigilance has preserved a stability that isn’t actually stable on a longer timescale. That forest floor keeps getting deeper… and deeper.
What was I talking about? Oh yeah, growth. I started off meaning to critique growth, but I kinda got sidetracked into talking about what makes for good growth.
Anyway. Some points and recap to close with:
Growth/death is an inadequate duality.
Richly diverse growth is good. Monocultures are bad. That’s a whole other essay, but the short version is: cancer.
You can’t save a system from bad growth by instituting preservation, or obsessing over authenticity. Preservation is death.
Healthy growth is interdependent and mutually supportive. That’s a whole other essay too, but the short version is that the notion that trees compete with each other for resources is outdated. They communicate and support each other in a myriad ways, even as they all crave space to drink sunlight.
Healthy growth starts where it is, and both builds on and repurposes what came before. No clean slates, but also no bans on knocking down walls.
Good growth can look like death if you have a naïve view of life and don’t carry a magnifying glass.
I hope you are growing healthily this season. Cheers, and stay in touch,
Pssst: if you like SIGAVDI enough to read this far, a) aw, gosh ☺ and b) maybe consider supporting future SIGAVDI’s via my Patreon! Any level of support gets you into my private Discord server ????