Lots of languages are incorporating functional features, from dynamic languages like Python to even Java's support for closures. To really get your head around these features, it pays to play with a real functional language for a bit.
What happens when you want to program for more than ten CPU cores?
I recently took a course on concurrent programming, and the from what I learned, some problems are easier to deal with in erlang or something similar. But then again some aren't. And a lot of the time, they run an order of magnitude slower (though as my prof would say, correctness is sometimes more valuable than speed).
And granted my Erlang program for matrix multiplication was very concise. My MPI implementation ran WAY faster.
It seems to me, there are two schools of thought, and you can live in one, the other, or both. Certainly there are things to be learned in either.
I think all one can take away from articles like this is that it's good to keep learning.
Try to convince someone of the value of immutability without mentioning concurrency.
Imperative and functional programming relate in the same way that arithmetic and algebra relate. It is hard to do deep reasoning in maths without algebra and it is impossible to evaluate the value of most algebraic expressions without arithmetic.
There is a reason that functional programming is at the forefront of concurrency research. In the long run, imperative only approaches will be unable to compete, and functional only approaches will remain on paper.
OO programmers who understand functional programming have a big advantage over OO programmers who don't. Learning FP gives one the mental tools to do better encapsulation.