At the present time, object-oriented programming is the only known programming paradigm that makes writing massive software applications reasonably manageable, maintainable, and scalable. The two other major paradigms, procedural and functional, have been largely unproven in this respect and are not generally trusted for this scale of software engineering.
However, I should point out that there is OOP and then there is OOP. OOP, as represented by languages such as C++ and Java, have historically been seen as somewhat problematic. Issues such as the banana-gorilla-jungle problem, the fragile base class problem, and the diamond problem haunt OOP to this day. Most of the blame is placed on inheritance: it’s evil, they say, it’s a big lie.
There is another way to look at OOP: from the standpoint of Smalltalk, which was the first language to popularize OOP in the 1980s and 1990s. (Simula was the first language to introduce OOP concepts.)
The key difference is in their philosophical approaches. Languages like C++ and Java treat object-oriented programming as the application of Abstract Data Types, whereas languages like Smalltalk and Ruby view object-oriented programming as developing a network of cooperative virtual computers (objects).
To understand the essence of Smalltalk’s philosophy, watch this video clip of Alan Kay’s tribute to Ted Nelson (start at 2:15):
Some more insight comes from Alan Kay’s “The Early History Of Smalltalk” (©1993 ACM):
Smalltalk is a recursion on the notion of computer itself. Instead of dividing “computer stuff” into things each less strong than the whole — like data structures, procedures, and functions which are the usual paraphernalia of programming languages — each Smalltalk object is a recursion on the entire possibilities of the computer. Thus its semantics are a bit like having thousands and thousands of computers all hooked together by a very fast network.
Smalltalk’s contribution is a new design paradigm — which I called object-oriented — for attacking large problems of the professional programmer, and making small ones possible for the novice user. Object-oriented design is a successful attempt to qualitatively improve the efficiency of modeling the ever more complex dynamic systems and user relationships made possible by the silicon explosion.
The big takeaway is this: All the complaints you’ve heard about object-oriented programming and inheritance and scalability issues have come from using C++, Java, C#, etc. The Abstract Data Type philosophy is detrimental to large-scale software development.
Alan Kay famously said:
Actually, I made up the term “object-oriented,” and I can tell you I did not have C++ in mind.
(Jump to 10:00.)
Said Alan Kay: “The Internet was done so well that most people think of it as a natural resource like the Pacific Ocean, rather than something that was man-made. When was the last time a technology with a scale like that was so error-free?”
Alan Kay likened his object-oriented philosphy to how the Internet was built, or how biological organisms consisting of billions of cells are built. Smalltalk is fantastic for truly scalable solutions.