I’m a firm believer in choosing boring technologies when building products. I find that each time I use newer technologies, it is usually because I’m more enamored with the technology than the actual product idea itself. In this sense, I’ve grown to dislike newer technologies - or talking about them - as I find that it distracts me from my aim of making useful things.
Of course, the difficulty lies in determining what is boring and what is not. I have come up with a simple rule of thumb, that seems to work:
Choose something that would solve your problem five years ago.
I think it is important to also add a qualifying clause as well.
And would do so in about the same manner then, as today.
This allows us to easily filter out technologies that have the same name, but had significant breaking changes to the point that they could and should be considered different.
Let me demonstrate some technologies that pass this rule of thumb.
Obviously, Postgres passes the test!
I’m fairly certain that our use of Postgres would be completely the same today as it would be five years ago. Ours is a pretty standard CRUD app, after all.
Ecto 3.0 came out just about five years ago, so passes the test just fine.
The only aspect of this stack that does not pass this test is the migration from EEX to HEEX templates over the past five years within Phoenix, but EEX is still supported for Phoenix applications, so I don’t count that as breaking the rule.
Mithril.js 2.0 came out in 2019, so on the surface it seems like it would not pass the test. However, the changes between 1.0 and 2.0 are minor enough that our mild use of the library would likely be unaffected, so it passes the test for us. The breaking change was mainly cleaning up unused APIs, if I recall correctly.
Vue has been around for a long time, but unfortunately has had so many breaking changes that I don’t consider it a boring technology.
There are many examples of libraries, like Buefy that worked fine in the Vue2 of five years ago but are now effectively on life support and won’t be migrated to Vue3.
So using Vue now and using Vue five years ago to solve our problems would be fundamentally different, so it does not pass the test.
We like it well enough, but perhaps should have chosen something more boring. Unfortunately, the most important thing it provides to us - navigation-over-AJAX - does not seem to have any stable equivalent that would have passed our test. The closest is Turbolinks which has not been maintained for the past two years and was redeveloped to turn into Turbo. Our usage of it is light enough that we could rip it out if we needed to, at least.
SQLite is certainly boring technology, but I consider using SQLite3 within a Phoenix application to be too cutting edge. This is because the Ecto adapter and the SQLite database driver that one would use five years ago and the ones used now are completely different with different behaviors. I know this because I helped build both the modern Ecto 3.0 adapter and the exqlite driver!
When I started building HanziHero, I wanted to use SQLite3, but decided that the lack of others building SQLite-powered web applications in Phoenix to be an indication that it was not the Boring path. Given that our application is actually quite write-heavy, this was a good choice.
Our choice to use boring technology allows us to focus on helping our users learn Chinese characters. That singular purpose continues to be our north star in terms of the features we develop and the technologies we use.
If you are looking to temper your enthusiasm for technology and focus on the product itself, I recommend trying out this rule of thumb.
Choose something that would solve your problem five years ago, and would do so in about the same manner then as today.
It has worked well for us!