Most of the time, complexity is an unnecessary evil. Attempt to avoid it at all cost and, even if you think this is the only way to proceed, sleep over it and try it simpler on next morning.
I’ve been working as a developer for 11 years already, I’ve committed a lot of mistakes, I’ve created a lot of complex systems.
I do prefer simpler things now. Simpler systems are:
- Easier to maintain:
Unless you live in a bubble, documentation is not as mainstream as it should. I still scratch my head reading my own code just a couple of weeks after writing it. - They perform better:
The less instructions a CPU needs to compute, the faster it will complete the job. Do you really need to implement a whole observer pattern for just one subscriber?, maybe you can just call that callback directly, and scale later if needed. - Much easier to delegate:
We’ve been juniors as well. Tutorials, pet projects and Open Source Software are fine to exercise new knowledge, ask them to practice on those, not on production. You will be in a hurry someday, and being able to delegate is easier when your system is easy to follow.
A recruiter recently sent me a job offer highlighting his client wants candidates with “experience building complex systems”. It won’t be a surprise that those candidates will be more keen to architect crazy complex stuff.
While the following repository is a joke, it’s a reflect of something that is happening:
Of course, in order to achieve specific business goals or tricky performance issues, you will end up adding complexity to your project. In those cases, flag it and discuss with your team to see if there is an easier way to achieve it.
Conclusion
Avoid using coding patterns or third-party solutions and dependencies looking for a problem you don’t have.
Simplify your systems! That is a complex enough but much more rewarding challenge. Remember that a boring Model-View-Controller monolith can still make you millionaire.