My tech stack, 2023 edition
As knowledge grows, tastes evolve and become more refined. For the past couple of years, I have settled on a few flavours which pair well with my approach and experience in software engineering. While one can be productive in any language or stack, I primarily optimise for fun and productivity, and as I mainly work solo or on smaller teams, popularity or ease of use is not a metric I pay particular attention to.
With that in mind, if I were to start a new project in 2023, these are the technological choices I would make:
Programming
-
For long-running servers, Elixir. I have grown very fond of the language, the community, and the BEAM, the platform it runs on. It's functional, immutable, and dramatically reduces the complexity of managing state in a complex application. The actor model, mailboxes, and native clustering facilities make it top-of-the-class when you need to scale horizontally and vertically. Supervision trees and the let-it-crash philosophy eliminate downtime and time spent writing error-checking logic. This will be my primary language for the next decade.
-
Web applications: Phoenix + LiveView. Elixir's native web framework is very well documented, with a vibrant community. I maintain that LiveView, its server-side library for interactive web apps, is the successor of the MVC architecture that has been the golden standard for the past 15 years. LiveView made frontend development fun again, and it's just getting started.
-
For short native applications, Go. It is no-nonsense, offers a quick feedback cycle and cross-compilation, and is my preferred choice for anything below 10k lines that must be shipped ASAP. It is obtuse, unergonomic for anything larger than that, and afraid of functional constructs. map/reduce are a better abstraction than for loops.
-
For larger native applications and high performance, Rust. Great ecosystem and a more functional feeling than other languages in this space. Pairs really well with Elixir. That said, I am not entirely sold on its strictness and approach to memory management. 99% of the projects I write would operate perfectly with a GC.
-
One-off scripts: no clear winner. I know Python very well, but it does not spark joy anymore, which is a big deal. It's slow, has a crap approach to packaging and feels brittle. I have been exploring Lisp (and Lisp-likes) to fill this niche, but right now, the ideal Lisp dialect only exists in my head.
Not pictured:
-
Javascript/Typescript — Not anymore, thanks.
-
React/Next.js/Vue and other SPA libraries — conceptually interesting but increasingly a bad idea. Actively avoided.
-
C — not terrible, but there's no point in using it when Rust and Go exist.
Infrastructure
-
On the server, CentOS Stream or RHEL. Commercial backing, sane defaults, prefer pragmatism over dogma. Has a sensible philosophy to maintainership and packaging by patching iff upstream is broken. The Debian/Ubuntu approach of applying liberal patches on top of upstream-tested and approved software is madness to me. rpm, like jazz, is not dead yet but smells funny, and I wish it was laid to rest for something more elegant.
-
Deployment and containerisation: podman on systemd. There's no real reason to use Docker anymore when podman is fully compatible and lightweight. Containers are the best invention since sliced bread, and to me, the purpose of a modern server is to run containers and nothing else.
-
Automation: Terraform and Ansible. While I tolerate the former, I wish I could throw Ansible into the flaming sun. This space is ripe for disruption.
The minimal unit of computation on a server is the container. I would reach for an immutable server OS that does just that, but they're apparently all based on cloud-init and ignition, which have never felt very good in my hands and only start to make sense for large infrastructures.
Kubernetes is alright, I guess. But is it a good idea to buy a Formula 1 car if you only need to commute to work? It's developed by the largest cloud players in the world and optimised for their scale, not yours. Their salespeople will happily recommend trying their managed k8s product if it's too complicated. It has reached its peak popularity, and more agile and opinionated products will soon eat its lunch.
Development
-
My daily editor is Emacs. I like vim, but the only choice for a meta-programmable editor is a meta-programmable language like Lisp. Not very flashy, but learning Emacs is an excellent investment of time and effort. It's been around for 40 years, so I expect it to still be around when I retire. neovim is interesting, but Lua won't turn it into Emacs in a million years; the hype and rapid churn remind me of the JS world, where everyone is rewriting the world in Lua, breaking things, and there's a constant feeling that we're 80% there, the rest is a bit buggy which was not present in Bram's vim.
-
For work and gaming, Fedora Silverblue. An immutable distro based on rpm-ostree, all GUI applications are Flatpaks, and everything else is installed into an Arch Linux toolbox container. I love it to bits. I will go into my setup in a later post.