Functional programming is characterized by immutable data and functions without side effects. It uses techniques like first class functions, pattern matching, and higher order functions. In a purely functional style, functions have no side effects and return the same output for the same input. Common data structures like lists are immutable and operations on them return new instances rather than mutating the original. Scala supports both immutable and mutable collections and Scala 2.8 added features like default and named parameters to make functional programming more convenient. Strive for purity when possible for benefits like easier parallelization, concurrency, debugging and testing.