
I was recently asked this question on LinkedIn. My short answer: yes. But the more interesting question is why, and why AI might make them more relevant, not less.
Reframing the Question
Some say SOLID principles are outdated. They’re not. SOLID principles are guidelines for designing modular systems. They address forces that exist in software regardless of who (or what) produces the code. AI changes the author. It doesn’t change the physics of software complexity.
If anything, AI amplifies the need for modular design. We can now generate code at unprecedented speed. That’s a double-edged sword. You can build a well-structured system faster than ever. But poor design decisions will accumulate technical debt at a pace we’ve never seen before.
SOLID Through the Lens of Coupling
To understand why SOLID remains relevant, it helps to look at what these principles actually address. I’ll use the balanced coupling model as a lens.
The short version: modularity emerges when two dimensions of coupling, integration strength (how much knowledge components share) and distance (how far apart they are), balance each other. When they don’t, you get complexity. Either tight coupling (high strength, high distance) or low cohesion (low strength, low distance).
Let’s see how SOLID principles map to this model.
Single Responsibility Principle (SRP)
A class should have only one reason to change.
In balanced coupling terms: don’t co-locate functionalities that don’t change together. If two behaviors have different change vectors, putting them in the same place creates low cohesion: low integration strength combined with low distance. SRP is about avoiding the mess of shoehorning unrelated functionalities into the same container.
Open/Closed Principle (OCP)
Software entities should be open for extension but closed for modification.
This one is the trickiest: if an extension is a reasonable change to expect, the component’s interfaces should make it easy to implement without modifying internals.
When you can’t extend without fiddling with things irrelevant to the functionality you’re adding, you’re forced to share knowledge of implementation details that shouldn’t be shared. That’s intrusive coupling, the strongest and most fragile form.
OCP is about designing interfaces that anticipate reasonable change vectors.
Liskov Substitution Principle (LSP)
Objects of a superclass should be replaceable with objects of its subclasses without breaking the application.
If swapping a subclass breaks things, there’s implicit knowledge about the superclass that isn’t explicit in its contract. Consumers depend on assumptions that aren’t documented or enforced.
LSP violations are a symptom of implicit knowledge flow. Implicit knowledge flow is complexity.
Interface Segregation Principle (ISP)
Clients should not be forced to depend on methods they do not use.
This principle targets knowledge flow. Don’t expose clients to functionality they don’t need. Every method in an interface is a piece of knowledge the consumer must be aware of. The more a piece of knowledge is shared, the harder it becomes to change.
Dependency Inversion Principle (DIP)
High-level modules should not depend on low-level modules; both should depend on abstractions.
Low-level modules support the application. High-level modules are the reason the application is being developed. If high-level modules depend directly on low-level ones, implementation knowledge flows upward. DIP inverts this: both depend on abstractions, shielding the high-level modules from details they don’t need. The result is reduced knowledge flow and more comprehensible code.
The Reasoning Stands
All five principles address the same underlying concern: managing the flow of knowledge between components to preserve modularity. That concern doesn’t disappear because AI writes your code. If anything, it becomes more acute when code is generated faster than humans can review it.
Now, whether SOLID is the most effective formulation of these guidelines today is a different question. OOP itself is viewed more pragmatically than it was twenty years ago. Many teams work in paradigms where classes aren’t central and inheritance is treated with suspicion.
But that’s a topic for another post.
P.S.
Sharing is caring ;)