When we use a tool for a long time we get used to it and think in its terms rather than using it to help materialize our thoughts. Mostly this is not a good idea.

We were taught OOP in college and kind of told that even though functional programming sounds cool its only for funky stuff you never use in real life. We were told that dynamic languages were good for scripting and its too slow to use for real life projects. Soon we started believing in these stories. 

Everything was going on fine, until I attended a training from Alexandar Stepanov couple of years ago. He is widely known as the father of generic programming and one of the key person behind C++ STL. Funny part is, in the training he started ridiculing the whole premise of OOP. His point was that computing consists of applying algorithms to data. So algorithms comes first and that is the key part in programming. He suggestes thinking in algorithms and not in terms of objects. If you ever used C++ Standard Template Library (STL) you must've noticed the perculiarity. The whole of STL is not OO. It talks about applying algorithms to containers. STL code looks like sort(v.begin(), v.end()); Not like v.Sort(); as one would expect in a OO system.

I highly recommend reading his interview here where he talks about his thoughts on this.

Object oriented system is frequently taught with examples like Employee, Employer, Car, Animals. I think as these examples suggest they are more suitable in business applications. If you are writing an kernel or maybe writing a Test suite (like I am) they make less sense. You want to be liberated of the burden of always thinking in objects and rather concentrate of the algorithms you need to implement.  

With time I have started coding seriously on functional and dynamic languages. The more I use them, the more they seem natural.