I won’t let a friend start development in Elixir.<p>Let me get it out: I love BEAM. OTP is awesome and one of the best systems in its kind. I was completely enamored with Elixir years ago as a modern Erlang which excited me to the bone.<p>It’s no longer the case. When you get into non-trivial things there are many sharp edges and paper cuts. Some from the top of my head:<p>- it’s impossible to disable warnings - test runs are often highly verbose because libraries ignore them and (as discussed somewhere in forums) warnings are deemed useful so they can’t be disable<p>- the only way to catch some, important ones, in CI is to use "warnings-as-errors" …<p>- so one cannot use deprecation flags because it’s also a warning<p>- when having non trivial ecosystem one cannot selectively deprecate and get errors, this has to be a human process (remember to replace…)<p>- when doing umbrella tests on non compiled code seed influences order of compilation<p>- this order of compilation influences outcome and can lead to buggy code<p>- dependency compilation is not parallelized - takes a lot of time and uses 10% of CPU<p>- compilation process can break and Elixir isn’t aware that it was interrupted - this means that it doesn’t try to compile properly app/dependency but instead tries to release crippled one<p>- documentation is hard to use - searching shows random versions and there isn’t even a link to „open newest”<p>- searching in docs often not finds the keywords you can actually see<p>- a lot of knowledge is implicit (try checking if you can dynamically add children to a Supervisor)<p>- sidebar with new ExDocs break for some reason so there is no navigation<p>- there is no way to browse navigation outside this broken ExDocs which outputs only HTML and LSP<p>- LSP is afterthought, there are few but neither works well<p>- Dialyzer/dialyxyr typespecs are useless most of the time<p>- Squiggly arrow works weird (i.e. ~0.3 might catch 0.99) - my colleague recently mentioned Renovate not picking it up<p>I could go on and on. I’m doing plenty of research so I’m working with various languages including „niche” ones like Prolog, OCaml, Clojure, Cuelang. Recently I’ve been developing tooling in Go and many core systems are developed in Rust in Elixir, and I work on the latter often.<p>In principle Elixir is awesome, but has the worst developer experience of all. Sometimes it takes 4h to prepare and push release. Tooling I’m working on can do the same in 5 minutes - I’m parallelizing processes in containers, making idempotent output artifacts and heuristic failure detection to retry on flakiness. When switching between Go and OCaml you can sense how tooling cares for me and my time. Often I bounce off forums where people’s need are shrugged off as non-essential, treating those who came as uneducated juniors (because who in sane mind would like to have a parallel dependencies compilation or disable compilation time warning).<p>There is nothing better than BEAM, but (for me) Elixir got much worse over the years.