OO has been taken to mean classes, inheritance and polymorphism,
as implemented in a variety of programming languages. As we typically build
code, the proper class design is to commingle state and behavior. Inheritance
provides a simple way to vary some but not all aspects of behavior on connected
objects. And polymorphism provides a way to package different behaviors into
look-alike syntax.
Together, these features make for an incredibly flexible system,
with many different ways to design abstractions, express dependencies, and store
state in many objects across the codebase. Other words for flexible are ‘complex’
and ‘complicated’. The notion that having all this flexibility is good and
powerful and smart encourages mixing a variety of abstractions and
implementations, and long and wide dependency trees. As systems and
corresponding codebases grow over time, accumulating ideas and approaches from
many people, they grow more fragile, more tightly-wound. Code also becomes more
dependent on the past history, rather than the latest, and therefore best,
understanding.
We know all that because OO had had a great run in the last
25+ years. Java, in particular, has been one of the most popular programming languages
since it came out in mid-90s, both by the amount of code written and number of
people writing in it. .Net platform is heavily OO and is very popular as well. C++,
while not exactly a strictly OO programming tool, is frequently used for
OO-style development. Lots of complicated projects have been attempted, and
plenty completed, using the OO paradigm. Many people joined the ranks of OO
developers, people with varying amounts of education, imagination and
cleverness.
In the last quarter century OO paradigm has been applied to
many complicated development projects, at times by less-than-stellar developers,
and often by diverse groups working independently and inconsistently. OOP came out somewhat scathed,
bruised by the many broken abstractions, blemished by millions of lines of legacy
code, but by and large OO has delivered on its promise to provide a way to make large and complex systems possible.
So, is OO dead yet? Or, rather, are we ready to move on to
something newer and better?
It’s been many decades since OO first showed up, handily won
over then-popular procedural programming style, and far eclipsed the popularity
of the functional approach. We are now older, wiser, and have more experience.
Is OO still the silver bullet it has once been? And what are our options?
Functional languages are powerful, deeply loved by their
communities, and offer a paradigm that can rival OO tools in solving complex
problems. Yet, the functional approach has not enjoyed nearly as wide an
adoption among broader development community. It also did not have such a testing 25+ years, as software projects grew larger, more complex, and continuously involved larger numbers of less skilled people than ever before.
The functional paradigm is worth exploring again, with the experience we did not have back when OOP originally came along and took over the software industry. But the winning paradigm for the next quarter century is far from certain.