I’m not going to be able to answer all of your questions, but I can maybe provide some insight. Last year this time I was basically where you are now; I’ve been a technology professional for a fair while and started what I think would be considered a substantial Elixir project.
It took me about three months to really find a good groove with Elixir. To put that into some context, I’m working solo with no mentoring aside from the occasional discussion in the forums here. When I started the project I did have a couple of the training courses under my belt (@pragdave’s excellent course… Elixir for Programmers and and very good courses from The Pragmatic Studio… https://pragmaticstudio.com/) I also had a fairly long period of learning “big idea” stuff and watching things evolve here; while that certainly helped, the goal with that was not to learn about how to develop in Elixir as much as it was to decide if the stack, ecosystem, community, etc. was a reasonable choice to use for a large project given the time commitment. As @dimitarvp points out though, for learning things that’s no substitute to diving into a decently realistic project of your own where you’re solving the problems with much less safety net.
That initial 3 month learning curve included Elixir proper, writing tests, documentation, and Ecto and did include a fair amount of “off-the-beaten-path” work which a more typical project could probably avoid. Notably it did not include Phoenix. I have found the most commonly used frameworks and libraries to be well conceived and well coded. I especially have a sweet spot for Ecto; it didn’t take long to learn at all… but I do a lot of database work so it was very naturally to fit into my preexisting knowledge.
After the initial 3 months I’d say my experience is that I spend much more time up front figuring out how, say, a module should be designed like or getting a good clean set of functions in shape etc than I have taken with other development projects using other languages. On the flip side, I’ve found that when I need to refactor for whatever reason that the refactoring tends to move much more quickly in my Elixir project than in my other previous projects. I can’t say that’s the common experience, especially with those in here with deeper experience both in Elixir and development than me, but that’s how it’s been working out for me thus far.
At the beginning of this month, the my project started with front-end stuff… specifically the Phoenix 1.7 RC’s and LiveView. It’s taken me until just today to get a good looking multi-step form done from beginning to end. Some context: while I have almost 30 years of professional technology experience, none of that can be said to be in web development… I’m an “enterprise” guy… (which probably now has a lot of people wondering why I’m here
) … I did step into a PHP project back in 2007, but even then the actual front end was done in Adobe Flex (I actually liked ActionScript). I also have a fair amount of Qt experience… but not web. In this month I’ve been able to get a fair number of custom components done, an elementary sense of how each of the events proceed and dealing with certain long-running processes (handle_info
kinda stuff), and standing up different web sites for my admin and customer access from the same project. Still a long way to go and I’m not going to say my code is clean right now… but it works as my requirements require. That month did include getting up to speed with basic web technologies (HTML 5 didn’t exist last time I did any web work and CSS has changed a lot, so I’ve been learning Tailwind, too.).
I’d say the two biggest issue areas I’ve run into are related to tooling and Phoenix.
The tooling issues are around Dialyzer and some of the editor tooling. Dialyzer, looking in from the outside, seems like a perfectly sensible thing to want to use… and then you use it… oh dear. Most of the problem I have with Dialyzer is that often times when it tells you something is wrong it tells you in some of the most cryptic ways and then when you do find the issue it’s either minor or with the description of what it should find (the typespec) rather than the code itself. To be fair, I can’t recall a time that it’s actually been wrong, except maybe when it hasn’t found an actual issue. It’s just time and effort to get through a Dialyzer run isn’t always as productive as you’d hope it would be and also there’s a fair number of people that just don’t use it. The editor issue is primarily focused on ElixirLS. Here I’ve only got two real issues: 1) some of the sanity checking it does is done through Dialyzer (see previous discussion above); and 2) for me it can be pretty slow. Not getting code suggestions, docs, etc. nearly as timely as I’d like. Some of this may be certain times where the code needs to be reanalyzed in the background and such and when it does work for me it works well. To be fair to that team, I believe their focus is mostly on VS Code and I use Sublime Text 4; so I may be getting some impedance mis-match there. I don’t know… overall I think the whole area could use a “rust analyzer” kind of moment (if you know what I’m talking about) vs. a more evolutionary approach. All of the tooling stuff is in the annoyance department and not fatal flaws.
My biggest issue with Phoenix right now is not atypical of my issue with a lot of larger frameworks, including those outside of the Elixir world: a lot of magic going on behind the scenes to make it a tool worth using. When black boxes work well, there’s little need to see what’s inside; but when things don’t work finding out why can be more of a challenge than it might be when delegating less heavy lifting to third parties. I’ve made matters worse for myself in that 1) I’m learning phoenix and web dev stuff, 2) I’m using pre-release software. This means for me it’s both more difficult to know why something is going wrong and it’s difficult to know if it’s because I’ve done something wrong (the most likely) or if I’ve hit a bug. Having said that, again, this is annoyance more than serious issue and as I progress I’m beginning to see how I can leverage Phoenix to save me a fair amount of time over the course of the project. Ultimately, I think a professional web developer will fare much better with picking up Phoenix than I have so far.
Insofar as I have listed issues which are less about my state of learning and are real in the ecosystem, I do expect them to be fixed. I deeply appreciate that the core language has, by design, reached a point of substantial stability and that the new/shiny stuff is mostly happening in libraries and such; that alone protects a fair amount of investment. It also means more time to fix the circumstantial issues I’ve discussed.
My expectation, should I need high performance code, is that I’d use Elixir with Rust. Rust seems a natural fit, especially if you’re going to have to go down the NIF path. Seems like it would be hard to not just default to Rust unless there was a compelling reason to not use it.
Ultimately, I have not been disappointed with my choice of Erlang/Elixir based technologies for my project. This community in particular has been especially helpful in getting through a lot of the roadblocks I’ve faced… not because I’ve asked a whole lot of questions, but because most of my questions had already been answered here for me to find.
Hope that helps some.