I have been such a huge fan of Ecto in general, because they have conceptually broken down the idea of Schemas, Changesets, and Repos in a way that you can use it in so many additional use cases.
For example, you can use Ecto Schemas and Changesets to validate the shapes of your API requests (down to the valid values, etc) and provide good quality error messages. And changesets are easy to extend too.
Ecto is probably my favorite part of the overall Elixir ecosystem. Phoenix and LiveView have been nice to work with (But still don't quite feel right, especially event handling and bubbling up of events up components, I wish was smoother).
Overall we still really like working with this stack and the community is great too, in the general quality of libraries available.
I pivoted from C# to Elixir after a former manager (and now friend and co-founder) put me onto it as part of a project we were doing for a high volume eCommerce solution. I did another C# job after and then when the opportunity struck, I dove head first into full time Elixir development. I have no regrets. It feels like any problem I have can be solved with a bit of elbow grease and some proper thinking. Phoenix is a bit too opinionated for my liking, but I can't deny just how much more productive it is for me vs C#/.NET. All 'round, my career is the better for working with Erlang/Elixir.
Shortly before, during and after. Market has been kind of bad recently (not just Elixir). My sense is that things are improving again but might not be at the learn-on-the-job level yet.
The dev tools (build, deps, project generation) are not necessarily better than everything else but they are very good.
The paradigm of Erlang that Elixir builds on is outstanding for building reliable, efficient services. It makes trade-offs for that. Trade-offs that mostly don't have downside for your average web app.
Things that begin to get complex in many ecosystems. Low latency "live" functionality and lots of concurrency are trivial and supported from the ground up.
It is a high level dynamic language. Think abstraction-level Python or Ruby. But it has these very different trade-offs.
Docs are good. Ecosystem is not as frantic as JS.
Phoenix LiveView is particularly in service of delivering things quickly. Follows a very 80/20 approach. High abstraction level. Covers most needs. Not shy about making trade-offs to avoid complexity. Much like Erlang originally.
All of that and the fact that the Phoenix CRUD golden path is really wide and low incline. The workflow for implementing arbitrary business rules as an online database that just works is easy to reason about, and things don't get out of hand easily by just adding pages and tables to your app.
For example, you can use Ecto Schemas and Changesets to validate the shapes of your API requests (down to the valid values, etc) and provide good quality error messages. And changesets are easy to extend too.
Ecto is probably my favorite part of the overall Elixir ecosystem. Phoenix and LiveView have been nice to work with (But still don't quite feel right, especially event handling and bubbling up of events up components, I wish was smoother).
Overall we still really like working with this stack and the community is great too, in the general quality of libraries available.