Immanence vs. Transcendence: Building for Now vs. The Future
There is a disease that afflicts Senior Architects. I call it "Cathedral Thinking."
When asked to build a simple e-commerce backend, they don't look at the current requirements (sell 100 items). They look at the Transcendental Future.
- "What if we need to scale to 100 million users?"
- "What if we switch cloud providers next year?"
- "What if we need to support blockchain?"
They design a system so abstract, so generic, and so "future-proof" that it becomes impossible to use today. They are building a Cathedral for a future god that may never arrive.
In philosophy, this is the tension between Transcendence and Immanence.
Understanding this distinction is the key to stopping over-engineering and embracing the most important principle in software: YAGNI (You Ain't Gonna Need It).
1. The Definitions: Above vs. Within
- Transcendence (The Ideal): This is the realm of "forms" and "perfect states" that exist outside of our messy reality. In software, this is the "Perfect Architecture" that handles all edge cases, supports all plugins, and never has technical debt. It is pure, abstract, and theoretically beautiful.
- Immanence (The Real): This is the realm of "here and now." It is the code running on the server right this second. It is messy. It has hard-coded variables. It handles the specific customer requests we have today, not the ones we might have in 5 years.
The Mistake:
Engineers are trained to love Transcendence. We love "Abstractions." We hate hard-coding. We want to solve the General Case, not the Specific Case.
But businesses live in Immanence. Revenue comes from solving the specific problem of a specific user today.
2. The Cost of the Future (The Speculative Tax)
When you build for Transcendence (The Future), you are paying a tax on a reality that hasn't happened yet.
Let's say you need a notification system.
- The Immanent Solution: Write a 50-line script that calls the Twilio API. Cost: 2 hours.
- The Transcendent Solution: Build a "Notification Microservice" with a generic "Provider Interface" so we can swap Twilio for SendGrid later, utilizing a Kafka queue for scalability we don't have yet. Cost: 2 weeks.
You just paid a 2,000% Tax for a "What If."
If you never switch providers (and you usually don't), that effort was waste. Even worse, that complex abstraction is now a burden. You have to maintain the interface, the queue, and the service forever.
Paradox: The more you optimize for a hypothetical future, the heavier you make the present.
3. The "Rule of Three": A Defense Against Premature Abstraction
How do you know when to stop hacking and start abstracting? We use the Rule of Three.
Engineers are taught the DRY Principle ("Don't Repeat Yourself"). This often leads to "Premature Abstraction"—creating a complex generic function the first time you write a line of code.
The Rule of Three argues that Duplication is better than Guessing.
The Protocol:
- The First Time: Write the code to solve the specific problem (e.g., "Send Welcome Email"). Do not make it generic.
- The Second Time: You need to do something similar (e.g., "Send Password Reset"). Copy and paste the code. Yes, duplicate it. Tweak the specific parts you need.
- The Third Time: You need to do it again (e.g., "Send Receipt"). Now you have enough data to see the pattern. Now you refactor the three instances into a single shared abstraction.
The Philosophy:
Why wait? Because if you abstract on the second time, you are guessing the pattern. You are predicting the future.
As the legendary engineer Sandi Metz famously said:
"Duplication is far cheaper than the wrong abstraction."
- Duplication is cheap to fix. You just delete the code and rewrite it.
- Wrong Abstraction is expensive. It creates dependencies. Other code relies on it. Tearing it out requires a surgical operation.
Immanence requires the humility to say: "I don't know the pattern yet, so I will live with the duplication until the reality reveals itself."
4. The Philosophical Pivot: Loving the "Hack"
We often feel guilty about "Hacks." We think a hard-coded value is a sin.
Through the lens of Immanence, a hack is often virtuous. It is a direct engagement with reality.
- Bad Hack: A sloppy mess that breaks when you look at it.
- Good Hack (Immanent Code): A solution that solves the exact problem at hand without adding unnecessary layers of "maybe later."
Spinoza, the philosopher of Immanence, argued that God is not outside the world; God is the world (Nature).
In software: The Architecture is not the diagram on the whiteboard; the Architecture is the code running in production.
Stop worshipping the diagram. Worship the running code.
Summary
The next time your team proposes a "Generic, Multi-Tenant, Cloud-Agnostic Platform," ask them:
"Are we building this for the customers we have, or the customers we imagine we might have?"
- Transcendence is an ego trip. It is building for a perfect future.
- Immanence is humility. It is building for the messy present.
Build for now. The future can take care of itself—but only if you survive today.
No spam, no sharing to third party. Only you and me.
Member discussion