I think hype in any direction can easily become misguided.
From various things I have heard from Casey, it doesn’t seem to me like he is against OOP in all cases, for example he has mentioned that it can be useful for api/responsibility boundaries, I think he is mostly against it when it is used in a dogmatic way, without reflecting on the real tradeoffs and considering the alternatives.
too much expressive power
I think one of the main problems with OOP is that it allows you to do anything, for example if you want you can implement an emulator and then run your actual code in that, that is an incredibly useful ability, but if everyone implements their own emulator for every problem, that can easily lead to slow code. So basically it requires restraint, so that you don’t end up using it too much, but only in cases where it really is a good fit.
Basically don’t use an interface if tagged unions and switch statements are all you need, so that you end up with a simpler program that is more likely to be performant by default (just by not adding unnecessary abstraction).
not enough expressive power
If your problem is much more complicated, then it may be useful here and there to have some more abstractions, but even then it makes sense to limit that in some way, so that you can retain sub-parts of the solution that can be implemented in more simple ways. And if you do add abstractions you should be careful about how you add them, so that you don’t end up slicing your problem in a way that makes it more difficult.
multi-paradigm thinking
I like the sort of thinking of multi-paradigm languages like what is described in the book “Concepts, Techniques, and Models of Computer Programming”, that basically any programming language can be seen as constructed from a small set of kernel/core language features, which result in a computation model that has different tradeoffs. It does a good job at describing how certain features (concurrency, state) make some things easier, while at the same time making other things harder.
Through reading, thinking and experimenting with those concepts from the book, it helped me with getting new perspectives for thinking about problems/solutions (even if you don’t end up using a multi-paradigm language).
It also has this diagram that categorizes languages based on features The principal programming paradigms.
I think discussions around programming languages and paradigms would be more useful, if we actually broke it down to more fundamental features and concrete problems.
For example whether something has:
- mutable state or not and what kind of state it has
(OOP is just one form of mutable state, ports (erlang style) is a different flavor)
- concurrency
- asyncrony
- determinism or non-determinism
- eager or lazy evaluation of some program part
- …
and whether the problem you are trying to solve actually benefits from the presence or absence of certain features.
All those combinations of features have different tradeoffs and some part of a program may be better written with one set, while another requires other features; and then those different program parts can still interact and share data, one embeds/uses the other etc.