What I have learned working 1 year full-time using Elixir
Today I celebrate one year of full-time work using Elixir as a programming language. I have build scrumex.com to start with, worked 6 months for a new bank (Solaris) and another 6 now at (Factory Berlin). The following is what I learned.
You can live without Objects
My background is Ruby and I used to learn and think about my programs in terms of Objects that may contain or wrap data. In a functional language such as Elixir/Erlang, I do not have to worry about this. I can simply and more directly think about data as input of a function, manipulation (or the data) and output. Life is easier when the only thing you have to worry about is the consistency of your database and the way functions manipulate your data. In my view, 1/3 of the things I had to worry about are gone (objects).
Your life is more ‘zen’
Given you can live without thinking in terms of Objects, the fact that Elixir has inherited lots of experience and years of development on the BEAM VM from Erlang developers, give you a sense of relaxation when you need to solve hard problems. On one side you only have to think about your data, on the other you are most probably facing a problem that Erlang developers have already a solution for. That is why I would suggest to always have a look at how Erlang devs are solving your ‘current’ problem before writing code. It may help.
Pull requests are more about data than data structure
I was using Ruby in the past and I remember having long discussions on pull requests about all sorts of things: design patterns, name of objects, formatting, etc.
Now this is pretty much simplified. The discussions we have are mostly about the way we are handling data within our set of functions. The formatting is given for granted as it is now part of the language and we use an Atom plugin to automagically format the code while writing it. Modules are just a namespace for functions so we can refactor them whenever needed and we don’t need to stress too much about it. Same goes for functions. If a controller is too fat, we can just copy&paste the code into a Context. We focus on what we expose, how we do it, and what we store in our database (and of course our business logic).
Refactoring is less scary
As already mentioned, refactoring is now easier. If you have a decent test suite, there is no issue moving code around your program or wrapping it into functions. Everything is already isolated and immutable, what do you want to mess up?
The deployment process is still not solid
I have been deploying using Docker, single and multiple nodes, Heroku and Digital Ocean. They are all different ways to get your code to production, but what I noticed is that among developers there isn’t yet a ‘standard’ practice for the deployment process. I personally prefer ‘edeliver’ and a small machine on Digital Ocean, but opinions are different and not everyone is keen on using features such as hot code reloading (it takes extra effort to think of your business logic). So we need to improve on that front, as a community.
Testing is a pleasure
Nothing more to say. Just easy, I love it.
Hiring is hard
One of the hardest part of the current Elixir community, at least in Berlin, is that hiring is quite hard at the moment. But it goes the same when it comes to finding a good company to work with. The market is small and comes with all the limitations of the case. Of course it is getting better by the day but we will need a bit more time. The best way to find developers is investing in people that come from different programming languages and are experienced enough to jump into Elixir and willing to learn it.
The community is amazing, programs don’t take much memory and I do not get why don’t we all just write Erlang programs. You can write them, walk away for 20 years and they will be still up and running. Pure joy.
note: everything in this post is a personal opinion and I did not intend to be scientific or accurate, so please consider that before leaving a comment :)