When working with large-scale systems, developers can’t be bothered with low-level details, such as memory management and inter-process communication. These details should just work, leaving developers able to focus on high-level aspects of the overall system. Traditional languages don’t allow such higher level work. Consequently, they don’t scale as well and aren’t as cost effective.
Elixir is a language intended to be easy to learn. Since Elixir is built on Erlang, it gains all the benefits of Erlang. This also means they can be used interchangeably. Elixir can call into Erlang code with no overhead since it compiles to the same byte code. This gives developers access to all the existing Erlang code.
Erlang was designed to handle the large scale of the telecom system before the Internet existed. To do so, Erlang promotes concurrency, fault-tolerance, reliability, hot code swapping, and scalability. Because of Erlang’s early roots, it has become a mature, battle-tested language for large-scale systems.
The philosophy that drives Elixir/Erlang is “let it crash.” Human errors are inevitable. Eventually programs will crash. In order to have a truly reliable system, the system must be able to recover from these inevitable crises. Erlang handles this by breaking up the system into many processes. When a process dies abnormally, it is simply restarted and the system carries on as if nothing had happened. Consequently, Elixir/Erlang developers spend little time writing error handling code and more time writing valuable business logic.
There are other concurrent languages, such as Scala and Go. These languages often copy what Erlang has already achieved. However, Erlang has had longer to mature and is built from the ground up to be scalable.