The Evolutionary Mistake
Most engineering articles preach the same principles: SRP, KISS, DRY, YAGNI. They present them as universal laws. But what if I told you that applying these principles in the wrong order could kill your startup or cripple your enterprise?
After years of studying both greenfield startups and billion-dollar systems, I discovered a pattern:
Startups need: YAGNI → KISS → SRP → DRY
Enterprises need: SRP → KISS → DRY → YAGNI
The difference isn't about big vs bad engineering—it's about evolutionary stage.
Stage 1: Ape-to-Human Engineering (Startups)
Context: You're Discovering What Works
You're not building a cathedral. You're discovering fire. Your codebase is an evolutionary experiment, not an architectural masterpiece.
# Startup Code: The Primate Prototype
def do_everything_for_first_customers():
# YAGNI: No "premium tier" logic yet
# KISS: One function, no abstractions
# SRP: It has one job: get us our first 10 users
# DRY: Who cares? We'll rewrite it tomorrow
user = create_user_somehow()
take_payment_anyway_we_can()
send_email_using_gmail_smtp()
log_to_a_text_file_because_why_not()
return "We have a customer!"
The Ape-to-Human Priorities:
- YAGNI First - Don't grow a tail if you're learning to walk upright
- KISS Second - Simple tools for immediate survival
- SRP Third - Specialized organs emerge from proven needs
- DRY Last - Efficient body plans form after you know how you move
This order lets you pivot fast. When your startup discovers it's not building a farming tool but a weapon, you haven't over-invested in crop-rotation logic.
The Inflection Point: Discovering Agriculture
The transition happens when:
- You have consistent users/revenue (food surplus)
- Your team grows beyond the founders (tribe expansion)
- Features stabilize (settled civilization)
- Technical debt slows iteration (overhunting your local codebase)
- This is when you stop being nomadic hunters and start building permanent settlements.
Stage 2: Medieval-to-Modern Engineering (Enterprises)
Context: You're Optimizing What Works
Now you're not discovering agriculture—you're industrializing it. Your codebase is a city that must function while you replace the plumbing.
// Enterprise Code: The Civic Infrastructure
@Component
@Transactional
@CircuitBreaker(name = "paymentService", fallbackMethod = "fallback")
@DistributedLock(lockName = "order_#{#orderId}")
@AuditLog(action = "PROCESS_ORDER")
public class OrderProcessingService {
// SRP: Each dependency manages one civic function
private final InventoryService inventory; // Warehouse district
private final PaymentService payment; // Banking sector
private final ShippingService shipping; // Transportation network
private final NotificationService notifications; // Postal service
// The contract: Process order without collapsing the city
public OrderResult process(Order order) {
// Reuse established city services
}
}
The Medieval-to-Modern Priorities:
- SRP First - Cities need specialized districts (residential, commercial, industrial)
- KISS Second - Upgrade sewage simply, without digging up the entire city
- DRY Third - Standardized building codes across neighborhoods
- YAGNI Last - Don't add monorails because they "might be cool."
This order maintains stability while evolving. You can't shut down the stock exchange to try a new trading algorithm.
The Deadly Transposition
Killing Startups with Enterprise Patterns:
# The over-engineered startup grave
from abc import ABC, abstractmethod
from typing import Protocol, Generic, TypeVar
T = TypeVar('T', covariant=True)
class Repository(Generic[T], Protocol):
@abstractmethod
def find(self, id: str) -> T: ...
# Meanwhile, competitors shipped 3 features while you defined interfaces
Crippling Enterprises with Startup Patterns:
// The "move fast and break things" enterprise disaster
public class EverythingService {
// God class handling users, orders, payments, analytics
// Deployed directly to production because "it works on my machine."
// Now 200 services depend on its random output format
}
Recognizing Your Evolutionary Stage
You're Still Ape-to-Human If:
- Your biggest risk is building something nobody wants
- You've rewritten core logic in the last 3 months
- "Technical debt" is a luxury problem
- You can explain the entire system in one whiteboard session
You've Reached Medieval-to-Modern If:
- Your biggest risk is breaking existing functionality
- There are systems nobody fully understands anymore
- Changing a database schema requires a migration plan
- You have more engineers than original features
The Evolutionary Wisdom
Great engineers aren't those who blindly follow principles—they're those who match their methodology to their evolutionary context.
The ape building spears shouldn't worry about metallurgy. The medieval city shouldn't experiment with structural engineering on the cathedral.
Your startup isn't a small enterprise. It's a different species entirely. And it needs to be engineered like one.
Top comments (0)