The one place where it screws you over in erlang is the REPL, which I think is why Elixir chose to allow you to mutate the variable binding, (but the underlying values are still immutable). In my main code, I mark any variables that I will mutate binding (almost never) with a ! postfix sigil (idea stolen from Julia/Ruby)
http://blog.plataformatec.com.br/2016/01/comparing-elixir-an...
Source code control systems don't mutate in place. They create new versions.
All modern relational databases (Oracle, Sql Server, Postgres) don't modify records in place. They create new versions.
All cloud based file systems (google docs) create new versions.
When you have this mindset of 'any mutation needs to go into a different version, a new variable', it simplifies a whole lot of reasoning when things don't work as expected. Try it out.