I don't think that every problem should be approached as a mathematical one, far from that, and I don't see this in the FP community: what I see, in fact, is much more pragmatism, something that you actually find a lot less in the OOP one, because a single function is a much simpler and smaller concept than an object. But I think that for many problems in software development, a mathematical approach is generally a very good one, even if it just gives some insights.
That's a different point. Coding is in general a team effort, and the team should proceed as much as possible a whole. But the OOP background (or any background, really) should be a strength, and not an arbitrary boundary.
The confusion around OOP is not a matter of metaphors: it's really about the fact that, as a paradigm (a set of tools, approaches and patterns for solving problems), OOP has a lot of interpretations that are often incompatible. I'm familiar with the original Alan Kay definition, that's what I tried to use in the Objective-C era, and funnily that was my true gateway towards FP. But I've known maybe 2 people in my life that have maybe heard about Alan Kay and what he talked about when he coined the expression "object-oriented programming". We've probably had different experiences with the OOP community: fair enough.
I still don't see the resemblance. Lifting a function over a functor is the solution, not the problem: the problem is constructing an instance from multiple instances that are only available in a functor context. The applicative is then an abstraction that can be used to represent this lifting operation. Lifting a function over a functor is a design pattern, in this context, but not the applicative definition itself and, most importantly, the laws behind it.
You cited the strategy pattern: a thing that makes you achieve something similar in FP is just currying a function, that you then prepare appropriately. The difference is that currying is a technique at a much lower lever than the strategy pattern, that can be used to solve a variety of problems, often solved in OOP context with different patterns. It's not that every possible solution to every possible problem is a design pattern: the shared language of the problem named design patterns in the OOP community is needed to overcome limitations of some (wildly popular) languages in their abstraction power.
I'd rather talk abstractions than design patterns. "Applicative functor" is not a design pattern in the same way as a "Monoid" is not a design pattern.
I'm not sure about what you mean here. The problem is not the motivation or intelligence of developers: the problem is that OOP is the de facto default way of thinking for many, many developers. FP is not a something that you start from: is something you arrive to when you realize that most if your software problems are about transforming data, and the most natural building block for representing this transformation is a function. On the contrary, OOP is something that you start from when approaching a problem in software development, and then try to mold objects to somehow express your computation, often defaulting to design patterns because you realize that you have almost no other fixed point of reference.
Most of the things you cited here can be analyzed in depth, and depend on the context. For example, it's clear that if you have junior developers and you must ship soon you're probably not going to produce state-of-the-art code, FP or not.
Or also, I never realized that a mutable version of some code was more readable, but when I say "mutability" I'm not referring to "local" mutability, that is, using local variables to implement an algorithm. I do that all the time. I'm talking about global, out-of-scope, at-a-distance effectful computation, like passing huge mutable reference around: that's what I'm referring to when I say that mutability is almost always a bad idea.
Ditto. I definitely use local mutable variables in Swift (not that often actually, I still find it frequently preferable to use constants even in local contexts), and I like and use the inout capabilities of Swift in full force.
Of course you can't remove every accident, but depending on your approach, you can be careful and try to avoid them, or you can be reckless and code in an actively harmful way.
If I'm an expert, seasoned climber and I decide to attempt an extreme hard climb, and I then slip and fall, that's a human error. But if I don't know anything about climbing and I still attempt same climb, with no experience and no equipment, and then I slip and fall, I'm just an idiot.
From what you write it seems like you've had unfruitful conversations with FP people that assumed that only a strict pure functional approach is the only true way. I don't intend to support any of those assumptions. I simply wrote the following:
FP comes (for many, not everyone, I reckon) after the realization that we need a more principled approach to programming (I wrote more, not only exclusively), and sits at the end of a path, not at the beginning, and I simply think that, when trying to teach FP to someone, this concept should be at the front of every discussion.