Functional programming uses mathematical concepts like pure functions, immutability, monoids and monads to reduce side effects and make code more predictable. It encourages describing what a program should do rather than how to do it. While not a perfect solution, functional programming techniques help manage complexity and minimize state manipulation, thus creating more reliable software.