Elixir as a competitive advantage
Choosing a stack is most often more of a tribal endeavor than a something done on merit. Developers often mistakenly think that their favorite language is somehow measurably better than others. They feel that using it will make for clean code or better productivity. I think there is fairly little support for any of that. What I think matters are the capabilities of the language and its runtime, the culture of its ecosystem and community and the history of proven performance. My intent with this post is to underline what I see as pure business advantages with working with Elixir. By necessity I will also touch on a wide selection of other languages to set the baseline.
Java & .Net - The corporate baseline
In the enterprise there is a strong tendency to Java & C#. Why? Because no one ever got fired for choosing them. They are stable workhorse languages with mostly identical featuresets, the same level of abstraction, solid performance and all the ecosystem that you'd ever want. They both provide a mid-to-high level of abstraction for the common case, are strict at the core but aspire to be more dynamic and place some correctness constraints on your developer with types. Applications can be written to be very strict and quite formal. Culturally they are well suited to a risk-averse business.
Choosing Java or .Net is not a competitive advantage. You are not innovating with this choice, you also aren't chosing something that guarantees reliability or safety. These languages aren't inherently more safe, secure or reliable. It is a risk-averse and uninteresting choice and it assumes you can compete elsewhere. It gives you no advantage, it poses no large drawbacks. It is the default for this class of business.
Ruby & Node - The agile baseline
In the startup world the stacks vary a bit more but Ruby was the darling and Node.js is the currently dominant life-form. Also worth mentioning are Python and PHP. Which are all roughly equivalent. High level of abstraction, highly dynamic, minimal restraint. To a venture-backed, forward-leaning or experimental and fast business, these are all desirable traits and a good culture fit.
Choosing these are not a competitive advantage. Maybe some mobility versus the corporate baseline because there is no strictness at the language level. These languages are all largely equivalent. You have no real advantage, you have no special drawbacks. You are using the default for your type of business.
No advantage in the default
By choosing the default for either type of business you are making a very small choice between dynamic or a bit stricter and between compiled and interpreted. These are technical concerns that mostly do not affect business outcomes but are popular for developers to rant about. Your choice of language among these options is not giving you any distinguishable advantage. Because they are basically the same.
Specialist languages
It is worth mentioning that some languages own certain domains and dominate them in a way that just means choosing them makes sense. Primarily this is Python for data and machine learning. The alternatives here are all significantly less common languages. Swift or Obj-C are for iOS. Kotlin for Android. Then you have projects where you need C/C++/Rust level speeds which steers you to those languages. Or maybe you are trying to embed a language in your system, then I hear Lua is good.
But most development projects today are general-purpose. They are distributed systems with some amount of Web APIs or Web UIs. They often have some semi-real-time going on via WebSockets. They require integration with other parties via APIs. And what do you want?
- Fast response times
- Uptime
- Scalability
- Maintainable architecture
- Decent efficiency from the hardware
So what is Elixir's specialty? Distributed systems with high reliability and soft real-time response times. This maps incredibly tightly to what most systems need these days.
Unopinionated, generic
The baseline languages offer no particular opinions about what a good system design should look like. They are generic languages, mostly OOP, with every paradigm they can fit thrown in for good measure. There is no direction to be found. Your developers can build as well or poorly as their skills and patience allows.
In this I think Elixir distinguishes itself. It builds on the needs of some of the really early distributed systems, which were telecom switches, that were developed at Ericsson. They built Erlang, which Elixir builds on top of. It implements the Actor model. The Actor model + the Functional Programming paradigm are combined not just because they sound cool but because they give certain guarantees and they constrain the way you build code in a way that makes it significantly easier to build distributed systems without screwing it up too bad.
They developed an approach called supervision trees that is used to provide a core level of resiliency for the simplest casest and a toolset to create the serious level of resiliency needed for a piece of telecom infrastructure. The idea being that if your system can drop a call, which any system can, it should not cause failures for other callers and it should not bring the entire node down with it.
It is a design built to achieve nines.
Recruitment
Staying with baseline languages you get the default pool of candidates. It is a vast pool with a very wide level of experience, quality and skill. The average is .. quite average. There are many people invested and excited about each of these languages and there are people that absolutely do not care and trudge on through. The whole range is there.
Most people come to Elixir from other languages because it is still comparatively niche. Very few people start their career in Elixir today. So the pool is smaller and the average developer did not learn this in a boot camp a few months ago. So the average Elixir developer has previous experience and it seems like the general reasons people are attracted to the language is that it allows building things in a more reliable fashion. These are concerns that I firmly believe are more common with experienced developers because they generally mean you have been burned before. For some numbers that indicate this experience difference you can see that Elixir is the 5th highest paid language worldwide. This is a decent marker for experience.
When you bring on an Elixir developer, the chance that you are bringing on valuable experience is high, even if you interview poorly the statistics are in your favor. I see developers that actively strive to transition into Elixir on a daily basis. This increases the chance of getting highly motivated developers, self-driven who are invested in their Elixir skills. It hits 8th most Loved languages.
Unique Selling Points
Elixir can do all the normal things you expect from high abstraction level dynamic language. Culturally it has become the spiritual successor to Ruby. Startups are flocking to it. So it can do all the uninteresting work-horse stuff that you need in the line of business. The competitive advantage is in what it brings beyond the baseline.
Elixir runs on the BEAM virtual machine. It provides uncommon guarantees and capabilities since it is built to provide soft real-time, which means a very low latency, strong concurrency and distribution without all the traps and errors common in concurrent code. It even provides the possibility to update the system without stopping it if your use-case is so critical that application restarts are unacceptable. You might not need these starting out. But retrofitting any of these capabilities is in the range of very costly to impossible.
You get the power to do clustered applications basically for free. You get strong multi-core performance without any further concern. Legend tells of the numerous Ruby instances that were scaled down into a few lonely nodes as the code transitioned to Elixir. You might even save money on your cloud bills.
Elixir and the Phoenix web framework come with strong developer ergonomics, providing a less mysterious approach that is reminiscent of the productivity monster that is Ruby on Rails (or Django, or Laravel).
Phoenix LiveView is probably the most interesting project at this moment where UI work can be done without touching Javascript which allows an incredibly tight, simplified and pragmatic approach to UI/UX development for many, many use-cases. For many applications this can quite simply remove a few programmers from payroll. For others it can simplify things significantly.
Web systems aside there is an entirely unique IoT and connected smart devices story with the Nerves project which solves not just tooling for building IoT devices. It also implements an incredible solution for maintaining your fleet of devices with updates and maintenance via NervesHub.
And when you need native performance there are a number of ways in which you can achieve this. Just like in all other languages there are escape hatches to getting closer to the metal and pressing the computer for all its worth.
Proven performance & historical record
Do you dare using something new and .. unproven?
You probably should. But you don't have to. Elixir is not unproven.
Elixir is a recent language, certainly but it has been around for years and is stable. More importantly, Elixir is built on top of Erlang and the BEAM virtual machine. These were established in 1986. They were open sourced in 1998. Since then they've been used with great but quiet success in many places. The reputation of Erlang is that it is battle-hardened and proven to be reliable. It has always had poor marketing and good results. Java achieved its dominant position through an incredible marketing push with a budget that I doubt any language has seen since. Erlang has earned its stripes almost entirely unknown to the wider business world. A potentially apocryphal quote says that some companies actually claim to use Java so as to not give away their secret advantage of building on Erlang. So what has Erlang done?
You may have heard of WhatsApp. That company ran a messaging system for 900 million users with only 50 engineers using Erlang. They used the hot code updates to never bring the system down for looong stretches of time.
Maybe you've heard of Klarna. Also Erlang. And you know, Snoop Dogg invested in them so I'm pretty sure they're legit.
There are a number of successful companies that built on Erlang. Why do I recommend Elixir? Mostly because it has better developer ergonomics, a stronger present-day mindshare and has a thriving ecosystem. GitHub CTO Jason Warner tweeted that: "Erlang is literally the best language / runtime for much of what we do in 2020 but people are put off by syntax. This is a shame."
Erlang is very much alive and kicking, anything improved in Erlang also improves Elixir. And vice versa. At this point I bet the talent pool for Elixir is larger than for Erlang though the skills translate very well.
So if you want to make a technical choice that can actually make a noticeable impact on the stability and reliability of your product, on how fast your system can go, the hardware costs of running it and what kind of team you are able to assemble I would always advice you to take a long hard look at Elixir or Erlang. It is one of few tech stack choices that I think actually moves the needle in business value.