Have you noticed that in spite of all our oft repeated Best Practices, those bugs don't seem to stop coming back no matter how many tests we write, that pile of technical debt still seems to keep growing no matter how much we refactor, and we keep missing those deadlines no matter how we organise our scrum board?
Perhaps it's time to stop listening to those who shout the loudest and start applying actual reason to the problem for a change. The programming paradigms that served us so well through the 80s and 90s are no longer adequate for developing software in the modern world. Building systems the way we're used to building them always seems to end in the inevitable death march towards exponential complexity.
But once you start asking the right question—"what's causing all this complexity?"—the answers turn out to be obvious. Debugging is only hard when you can't reason about your code. Concurrency is only hard when you can't predict the state of your code. Reusability is only hard when your components aren't naturally composable.
These problems are what the modern generation of functional programming languages—Erlang, Clojure, Haskell—have been designed from the ground up to overcome. This is what the really smart people in our field have been up to lately, and it's really time you put down those Post-Its and come let me show you why it's a really, really big deal.