This document provides an introduction to functional programming concepts and the Scala programming language. It begins with a brief history of object-oriented programming and why it became popular. It then discusses why functional programming has gained popularity in recent years due to its ability to handle parallel, reactive and distributed systems through immutable data and avoidance of mutable state. The document introduces functional programming concepts like immutable data, first-class functions and purity. It provides an example of functional-style programming in Scala. Finally, it outlines topics that will be covered about practical functional programming in Scala, including collections, functions, pattern matching and lazy evaluation.