Overengineering
August 18, 2023 / 7 min
🛠️
As it’s usual for posts in this blog, I get the ideas from the most unexpected places… Today's topic came from this conversation:
I will share some thoughts on why overengineering
Definition
Basically, overengineering is the process of elaborating on a solution when the elaboration was not needed. This is similar (but not the same) to perfectionism or paying too much attention to the details. It starts to become a disguise for procrastination when your obsession is just an unconscious way you found to avoid doing what matters (maybe because you will need to actively seek information and that’s harder than doing more of what you already did).
Sometimes, this occurs when some problem already has a working solution, but you are still trying to make it better, prettier, or smaller even when the effort-result trade-off is not worth it anymore.
Ocamm's razor infinite ways to over-complicate things K.I.S.S.
For example, when you are building a backend application, there are going to be a
lot of scenarios where you think an abstraction would solve the problem. Then you
build it with the goal of making it easier to solve the same problem in the future.
The thing is, most times you’re not going to have the same problem again and you
should’ve gone with a simpler solution. Of course, there are scenarios where an abstraction
is needed and that’s up to you. In my opinion, it becomes a need when the simpler
solution becomes more complex to maintain than creating this new abstraction to deal
with the problem. Don’t overcomplicate things unnecessarily
The problem
Maybe you're thinking something like: “Yeah, that can become an issue, but I have other bigger problems” and that might be true, but the point is that sooner or later, you'll face this. What's tricky about this one is that it is really easy to fall into. What looks like is that you’re making something better, but deep down you know that you are just unnecessarily polishing more of what's already good enough. Sometimes you don't realize that and when you do, a considerable amount of time and effort was lost on something that’s not what you’re trying to accomplish.
Another aspect that can be tricky about this is that overengineering feels like
progress. You think that by doing all this extra work, you are making your project
way better and that's addictive. Think about it. You have the skills to make it better
and the motivation created by this false sensation of huge progress. It's natural
to fall into the temptation of doing just one more thing
That's why one of the top lessons from YC material is to launch fast
At the end of the day, the ones who win are the ones who ship. If you are crafting
eternally, you are never going to put it out. The magic is that there are some things
that you can't see, even if you keep engineering it a lot. You (or your team) are
heavily biased
Just ship it, done is better than perfect!
Of course that the examples I'm going to use here are from the software development world, that's what I’m immersed in every single day…
Examples
I’ll be pretty blunt, I work in a fintech that’s building a bank. We have no clients and have been developing the project for the past year. We never launched, but we’ve been discussing for months about implementing a Kubernetes cluster. Like, there is so much stuff that we should pay more attention to than having this cluster. Lots of simpler solutions would get us to the market faster. One can argue that if we go for simpler solutions, we won’t scale. Thats true, but we don’t even know if we will need to scale in the first place. Maybe we won’t have as many users as we think we will. On the other hand, if we happen to become popular and have a lot of customers, we can always build that Kubernetes cluster later.
Another example is at Mind
Like I already said in this post deployed
publically
As always, thanks to Abdul Haidar for reading drafts of this and helping with the ideas.