In 2022, I wrote about how my tech stack has changed. Remix had just gone open-source so I naturally I tried it and I liked it so much that I switched to it as my default React framework. Along with it, I also switched out a few other things that I've been using till that point - Chakra UI, MongoDB, SWR, and Vercel/Netlify.
I didn't change my tech stack in 2023. I was quite happy with the stack that I had chosen. In fact, I'm still happy with it. Almost.
For over 7 years, I'd been a JavaScript developer. I mainly did frontend work but I also built REST APIs and managed cloud infrastructure on AWS. But lately I'm itching to learn and use something new. Something that is not JavaScript.
I did learn some Rust, did some Advent of Code problems the last couple of years. But being a web developer, I don't really want to build web stuff with Rust. Don't get me wrong, Rust is great for backend services but I'd rather use something that's built for backend engineering.
Enter Elixir and Phoenix
If you check the StackOverflow Developer Survey results from last year, Elixir and Phoenix are only being used by about 2% of the 90000 developers who responded.
Compare that to Node.js and Express or even Next.js, the adoption is way higher than Elixir and Phoenix.
So why do I want to learn a language and framework with low adoption? Well, first off, the sample size is really small compared to the total number of developers worldwide.
More importantly, however, I've always heard great things about Elixir and Phoenix. People who use it, love it. After some research, I found that Elixir has some desirable features:
- It's purely a functional programming language. JavaScript is quite flexible and it doesn't enforce a paradigm on us. But I do want to expand my skill set with a language that forces a particular way of thinking about the code I'm writing.
- Its data structures are immutable. In JavaScript, we use libraries like Immutable or Immer to force immutability but in Elixir it's built-in and is the default.
- Elixir is built on top of Erlang and runs on the Erlang VM. Erlang apparently is highly performant but has a terrible syntax, which was why Elixir was created.
- Phoenix is the most popular web framework in Elixir land. It's fast, self-healing, and fault tolerant — all great things to have in a backend service.
- Elixir has great pattern matching. One of my favorite features in Rust is its pattern matching. Elixir has a similar built-in pattern matching feature that's quite powerful. I used it in a couple of toy programs and I think it's great.
- Testing is a first-class citizen. When I started playing with Rust, I jokingly tweeted that I had written more tests in Rust (in a few weeks) than I had in JavaScript (over 6 years). I like that Elixir has testing built into the language.
These are obviously from a beginner's point of view. Experienced Elixir devs could probably tell you more about why they love it.
Does this mean I'm ditching my beloved Remix? The answer is no. I'm going to try building my backend services in Elixir/Phoenix and keep using Remix for frontend. This means I take on a bit of additional complexity in my git repositories since they have to be monorepos now. But I tested out a monorepo setup with Moon and it's quite good. I'll write about the setup soon.
Go, please
My theme for this year is "branching out". For the past few years, I think I've settled into a specific role — the JavaScript/React/Node developer. I'll still keep doing that but I also want to explore outside this bubble. That means, adding more tools, that I have no clue about, to my tool belt. Another tool I'm planning to pick up this year is Golang.
I won't go much into why I chose Golang. It's pretty simple — it's fast, has types, has a good developer experience as far as I can tell. Apparently, it's also quite easy to learn. So I'll be alternating between Elixir and Golang for my projects' backend.
More Backend
As someone who is self-taught and started off as a frontend engineer, I feel like there's a lot more backend and general software engineering stuff that I should learn. So here's some more stuff that I want to learn this year, in no particular order:
- Docker
- Kubernetes
- Terraform
- Ansible
- Data Structures & Algorithms
- Compilers & Interpreters
- System Design
Learning by building
I'm a huge advocate for building side-projects as a method for learning new programming languages and technologies. So I'll do just that. I already have a few ideas lined up that I'm very excited to build. They're all gonna be breakable toys and they'll be stuff that I want to use to improve my life in someway. I'll talk more on the ideas and process in a later post.
All this stuff might seem like I have a lot to learn in 2024. I think so too but with consistency, I think I can get a lot done this year. People usually underestimate how much stuff they can get done in a year so they shoot for less. Even if I don't complete my list, I would have gotten part way there.
Shoot for the moon. Even if you miss, you'll land among the stars.
― Norman Vincent Peale
What are you hoping to learn or get better at in 2024?