Erlang is a programming language designed for writing concurrent programs that run forever. It has a great concurrency model, is network transparent, fault tolerant, and allows replacing running code. Erlang uses processes, immutable variables, recursion, pattern matching, and functional programming. It has built-in support for concurrency through lightweight processes that communicate via message passing. The language philosophy is to "let it crash" and handle errors through recovery in other processes rather than defensive programming.