Since computers were so small back then, almost all programming languages were procedural languages. And because of both these things, essentially all students of computer programming learned to program in the procedural style. This became so common that most people now equate programming with the process of issuing direct commands to the computer. Many people have never heard of any other kind of programming.
What has not doubled in power every year is the programmer. The personal, intellectual resources of the programmer sitting down today in front of a modern, high-powered computer are comparable to those of the pioneers of 50 years ago. Meanwhile, the programs we write have gotten bigger and more complex. The result has been a shift in the software industry, to a situation where the programmer rather than the computer is the limiting factor. This is demonstrated by all the difficulties experienced in large projects because program bugs are so hard to track down and fix, and the source code is so big it's very hard to make significant changes.
This does not have to be the case as much as it currently is. The typical programmer writing code in an object-oriented language like Java or C++ spends a lot of time writing type declarations and other superfluous code that's not necessary with today's dynamically-typed or type-inferring compilers. A million-line application in Java or C++ can be boiled down to a couple hundred thousand lines in powerful functional languages such as Lisp or OCaml. With less source code to create and hide bugs, fewer bugs crop up, and the ones that do occur are easier to find. Project teams can be smaller, reducing the amount of communication—and miscommunication—overhead drastically.
Testing is made easier by the structure of functional programs. Many object-oriented design patterns are hand-coded implementations of functional programming.
Functional programming helps to make multithreading easier. This is increasingly important with today's multicore processors.
There are programmers using functional programming to deal with the "object-relational impedance mismatch". This is a fancy way of saying that OOP isn't all that great for database programming, and that functional programming works better.
"There is a kind of mania for object-oriented programming at the moment, but some of the smartest programmers I know are some of the least excited about it."Most people understand the idea of an object without too much trouble. We deal with objects all the time in other areas of life, so the conceptual leap to object-oriented programming is manageable. Functions, on the other hand, are more abstract, so they require a little more training before the programmer knows how and why to use them.
Paul Graham, Why Arc Isn't Especially Object-Oriented
But the end result is that functional programming allows consolidation of the source code in ways that are not possible or much more difficult using only OOP. Code-manipulation tools are made to solve problems that functional programming languages don't have. Ultimately, they're less effective.