Dec 15, 2021 — By Igor Krasnik
Engineers tend to over-engineer.
In fact everyone else does too, especially in the beginning of their careers.
It's a known fact that the most difficult thing to create is a simple thing. It's difficult to translate your thought in few words that a group will understand, It's difficult to write a catchy song, it's difficult to create a design for a real-world process.
A simple thing
How to define a simple thing?
Simple means it easy to create, duplicate, change and understand. Without knowing the outside context.
Basically a simple thing just does what it should do and doesn't do anything else. It also look very similar to other examples from the group.
To fulfil these requirements you should follow strong conventions and stay consistent, add little-to-no dependencies, unify data-flow, use known terms, provide the smallest option set needed.
Once you use an uncommon term, name, change the dataflow in the middle — you add complexity. Once you use an extra variable, function, abstraction — you force other people to spend their cognitive power to understand your idea. Once you add an unnecessary dependency you make it difficult to change in the future. Once you add an unnecessary optimisation (or worse, caching) you create legacy to support.
Suddenly, to create a simple thing you need to follow a strong complex opinionated process that will limit you. You need to observe the whole system from outside, instead of keeping yourself in a small piece of puzzle.
It's very hard to create and define this process. But it's very simple to deviate from the rules and add complexity.
The roots of complexity
Tech universities and computer science in general defines technology as an end goal of a process, where the technology involved. It kind of makes sense — the core technology problems are extremely complex. These problems include scalability, data consistency and isolation, network partitioning, fault tolerance etc.
To approach core problems, scientists and engineers come up with abstractions, data structures, programming paradigms, patterns etc. When you learn it you start to extrapolate — it looks like any issue now should be solved with this difficult toolset. But it should not!
Every problem that has multiple practical applications is already solved, you don't have to approach it as it's a new complex problem. If something works, you don't have to invent something new (if invention is not your goal). You need to understand how it already works and apply it. Or simplify (remove extra functions) to better suit your needs.
If you're building a product — your end goal is a product, technology is just a powerful tool. If your goal is framework, your goal is still product — the simple interface that solves some common tech problem.
Inventors create simple solutions for difficult problems. Focus on the value you create first and don't make simple things difficult.
UNIX won't be loved globally without a stupid simple yet crazy powerful pipe interface — the interface that scales from searching local files to multi-server parallel computing.
Did you like this article?
👉 Subscribe for more updates on Technology, Creativity and Shipping things.