Programming itself is the art of abstracting. Functions are by definition abstractions over a set of instructions. The question is which domain is used for the abstractions as you add more and more functions. When there are bad abstractions, it just means the abstraction model used does not map properly to the problem domain.<p>The only real downside is the overhead in learning the abstractions as they can be arbitrary and would require understanding it like a machine with all it parts and what they each do. This is where functional programming offers a universal way to abstract any computation, but that is besides the point.