— Software Engineering, Productivity, Opinion — 8 min read
When an engineer starts something new (project, feature, refactoring, etc.), there is almost always a choice to pick some technology or a library to use. And nowadays, tech is a really vibrant domain, where lots of people are offering work of their minds for free in the form of open-source software. Other people commercialize their work and offer it as SaaS. Both are fine, for sure. But there is nothing harder to pick something out of many cool things, right? Moreover, there is always a hype train, pulling specific technology through the industry. And man, the temptation to jump on this train could be big!
In this post, I want to share some thoughts on how to make a good choice and what to watch out for in order to avoid bad technical decisions?
At the very beginning, nothing bad will happen, in the worst case. You might feel a bit of friction, which could be perceived as a "learning curve," and eventually come up with some working prototype (not a product). And this is where the main danger is: in practice, there is a huge difference between a learning curve and a bad technology choice. A bad technology choice will typically have the following properties:
With that said, a bad technology choice will slow down your development and likely penalize your project with the performance or(and) costs as you will get more users.
So the main lesson here is do not mistake the learning curve for bad tech stack. The former will bring you joy, and the later will just become a major headache and could even lead to project death.
The good choice feels natural. Yes, I know how it sounds, but it is almost always like that. You might struggle at first while you understand some new concepts, but rather sooner than later, you should catch the flow. If it does not happen, try something else before jumping to the conclusion. Look for the following properties:
Of course, this is a generalized definition, and it is often impossible to find a solution, checking all boxes, but the more you check, the more productive you will be long term.
At one point, an engineer might be tempted to think that just picking the most popular technology is always a good and safe choice. Unfortunately, this is not that simple. The thing is that we are living in the age of compounding innovation, where you typically have building blocks in the form of foundational technologies, which could be combined into something new or even innovative. So, in practice, such a truly generic foundational blocks are not appearing daily.
For instance, I am thinking of something like MySQL being a foundational block, and ORM, being a thick abstraction on top of it. This abstraction is clearly powerful, but it is not a dogma, and you are free to choose something else if you feel that it does not meet your needs or that it brings too much complexity for your use case.
As an example of tech that is not fully generic, I would probably take serverless functions on your chosen platform. Clearly, the approach is powerful, but it could be that your workloads are simply not suitable for serverless computing.
If you just pick your tech stack based solely on popularity and amount of stars on GitHub, you might easily fall into the trap of a bad choice, which could badly damage your project.
The main advice I can give here - experiment a lot, especially beyond standard TODO list apps. Spend some time building a real prototype (based on your current project) and see how it feels, how productive you are, how readable the code is. Do not jump to conclusions too quickly. If, after a week of experimentation, it still does not feel right, get a second opinion, and eventually drop the approach. This is not the lost time - it is time you spend to build a solid foundation for your project.
Not anymore. Here is the thing. Users' expectations are growing crazy nowadays. Application is expected to be not only functional and useful but beautiful and slick as well. Your app is expected to work across multiple types of devices. Your storage is expected to be fast and durable. Your app is expected to have zero visible downtime. I can keep extending this list for a very long. Note the word "expected" here. Nobody forces you to do all these things; this is just the new minimal quality standard. If you do not follow it, your product adoption will be at risk.
Building the modern app without frameworks and abstractions will likely be a suicide mission in terms of code to be written and bugs to be fixed. But I typically dislike an approach when the dev team is starting to add too many new frameworks at the beginning, just because "we will need it in the future", or "look, here is a new cool thing". Like when you are just starting a new project and your dependencies list does not fit into your screen after a week of work. In my opinion, such an approach only adds noise and facilitates divergence from what matters for the project at the moment.
The way I would rather do it is:
An example of the thinking process for an abstract REST service would be something like:
So, in other words, brutally simple. No middleware, no multi-region DB cluster, no distributed tracing, etc. Such an approach allows you to start fast and evaluate your choices quickly. And later on, you might start adding more stuff to it, but only if you really need it. You can even change some of your core choices relatively quickly because your code will likely be written down to base principles already, which could be applied to any framework - even the latest one on the market with tons of fancy features. And you will do it, inevitably, but it will be in time and with a better understanding of the made a choice.
So it all boils down to finding the right balance: on the one hand, you do not want to bloat your code with tons of frameworks; on the other hand, you do not want to reinvent the wheel over and over again. You do not want to get behind in the current trends in the industry and what new tech has appeared within the last couple of months. My recommendations here would be:
Hope you enjoyed the reading! Want to discuss the content? Feel free to reach out to me on social media!