April 24, 2021 ☼ Philosophy ☼ Architecture
I originally published this article on my substack.
Antifragility has been an incredibly important idea to me over the past year. It has deeply influenced how I think about things ranging from my career, to my finances, to my relationships with loved ones, myself, and my spirituality.
To me, the value behind the principle of antifragility is summed up in Taleb’s words, “I want to live happily in a world I don’t understand.”
I want to learn to live peacefully in a world full of volatility and chaos. But I cannot control the world. I can only “control” me. Antifragility is not ordering the system around myself to keep me safe. Antifragility is learning to embrace change.
Modern industrial society feels based on the idea that humanity lives in competition with the natural world. Humanity seeks to subjugate nature through its understanding of empirical principles gathered through scientific discovery. The principles often sit on top of consumerist values: what we have is never enough, and we always need to find ways to produce more and/or better things for consumption. Nature itself is one of those consumables.
As our quality of living has improved (?) and gained momentum over the past couple centuries, we sometimes begin to operate under the illusion that we are winning. It takes a dramatic event—an earthquake, unexpected weather, disease, perpetually larger ships creating new patterns and clogging a canal—to remind us that we not, in fact, running the show. All the world’s a stage, but there is no human director.
The idea that humans are in control is a coping mechanism for existential angst at scale. We live in a world of unknowns, but one thing we know for sure is that we all die. The fear of death and anxiety around the unknown is an extremely powerful motivator—perhaps the fundamental motivator—and is deeply reinforced into our very being via evolution. Seeking to play the meta-game through our abilities of pattern recognition is what has led us to not just survive, but thrive. The evolutionary gift of anxiety may be a great gift for survival, but evolution did not design us to find peace in a world of volatility.
People who still maintain deeper rooted connections to the earth—farmers, mariners, serious outdoors folk, or those in developing countries who don’t have the luxury of the illusion that humans are in charge, etc.—all understand that attempting to tame nature is a ultimately a fools errand. If your purpose is some variation of rule over nature, you will die unfulfilled.
This doesn’t mean that humans should just keel over and give up. It means is that we need to replace fragile philosophies seeking to dominate nature with antifragile philosophies that create systems in harmony with the world.
Those who work in software often find themselves somewhere on an analogous spectrum when it comes to technical debt and “legacy” systems. There is an eternal tug-of-war between the ideal that we at least control this world of our own creation, and the recognition that software is never purely technical. Software is part of the real-world human systems that create, maintain, and operate it.
There is certainly more to life than our occupation, but our occupation is part of our life. Learning to love—to work in alignment with (harmony), instead of against (dissonance)—the systems we work with a form of radical acceptance that will improve of our lives, and our software.
I think many are familiar with the pop-sensation around Marie Kondo and her techniques for tidying. What I wasn’t familiar with—and still only have a terribly basic understanding of—are the deeper principles from traditional Japanese philosophies in which her tidying practices are rooted.
One of these key philosophies is wabi-sabi. Wabi-sabi is a philosophy stemming from Zen Buddhism that celebrates the transient nature of reality—it is focused on finding beauty in change over time.
“Wabi-sabi nurtures all that is authentic by acknowledging three simple realities: nothing lasts, nothing is finished, and nothing is perfect.” — Wikipedia
One of the most observable practices based on wabi-sabi is kintsugi—which means “golden joinery.” Kintsugi is the practice of taking broken pottery and putting it back together with beautiful golden lacquer. The result is a new iteration of the object that not only respects the original object and the service it provided, but celebrates the cracks and age by highlighting the faults and enables it to serve further. The “new” item is perhaps even more beautiful than before, and the lengthened history of service increases the connection between the object and the user.
This celebration is a critical principle that often gets missed when we watch Marie Kondo on Netflix. Mostly Westerners see a technique for achieving a sort of minimalism of only living with things that bring us joy—but just as critical is the practice of taking the time to thank the objects being removed for the service they provided. The value is the connection between humans and their environment underneath, not the practices on the observable portion of the iceberg.
Similar ideas can be found in western philosophy. There is a latin saying common in stoicism: memento mori. It means “remember that you die.”
Many stoics will carry around physical trinkets, get tattoos, or adopt practices such as visiting cemeteries to serve as a reminder to meditate on life and death. This meditation is a chance to ponder our mortality, and to refocus energy on the things that really matter in our short, unpredictable lives.
While not specifically referencing the stoic formulation of the philosophy, I think we see the same underlying principles present when we display urns, photos of lost loved ones, genealogy, etc.
The recognition of death is at the same time a recognition of life—as two sides of the same coin one cannot exist without the other. Memento mori is a reminder to live, fully (whatever that means to you), and in harmony with the world around us.
The principles behind agile, Extreme Programming, Continuous Delivery, and DevOps all embrace change. But they are more than that: just as life and death are two parts of a whole, antifragility is just as much about non-change as much as it is change. Antifragility is embracing the whole. Don’t purposely drop a bowl for an excuse to do kintsugi. Don’t wait for loved ones to leave to appreciate them.
Antifragile things love change, but if a thing breaks under the status quo how can it hope to survive change? A working-philosophy of software that struggles to approach “technical debt”—both on how to accept it and how to pay it off—can only lead to personal stress and anxiety, and poor business outcomes. Agile, XP, and CD all seek to help us live happily in a world of actual software systems. They are philosophies for iteration that encourage us to ponder the transience of our software, and to identify the most important thing to try to change next, while accepting the rest—for now.
The very first value of Extreme Programming is humanity. As we shift our views around the systems we work with, we must recognize that code is an artifact produced by human systems. Software Architecture is a sociotechnical system, not a purely technical one. Trash-talking the systems they wrote can damage the social system. It is also a blinding act of ego—I can’t tell you how many times I thought I understood and was going to redesign an amazing new solution… and in the process rediscovered the wisdom of the original authors. Amazing how many times technical debt means “code I don’t understand.”
We need to learn acceptance, but also we want to continuously improve. We need to develop the wisdom to know what to change, and when. We need to learn to work in harmony with the sociotechnical system, rather than in dissonance.
I don’t need to big-bang “refactor” the status quo. In fact, Martin Fowler would like to remind you:
“Every refactoring is a change that is so small that it’s not worth doing.” — Martin Fowler
In other words, any change you are making that you cannot commit and move on from at a moment’s notice is not a refactor. Small, iterative changes to a working system are more likely to bring about the changes to the system that we desire in a sustainable way.
“Legacy” is often used to describe software systems as a pejorative, but the classic joke is also that “legacy code means the code that makes money.” What legacy almost always seems to mean is: the way things actually are, but not the way I want them to be. This dissonance between what I want and what is, is the source of unhappiness.
There are myriad of reasons why we have an emotional response to “tech debt” and “legacy code.” The dissonance between us and perceived tech debt can certainly cause friction. This misalignment causes actual pain, and we do need strategies to tackle it. I want to tackle these strategies more in depth in the future.
For now I will generalize and say that we often don’t understand legacy systems—and that fear from the lack of understanding is the software development version of existential angst. All systems will fail. We should think about systems memento mori often—not in manner resigned to a fated, cynical view that all computers are trash—but in a way that allows us to be realistic about what we can expect from complex systems generated by humans.
Finding harmony in the give-and-take of our expectations and the reality of the systems we live with/in will start us on the path of internal peace.