• Home
  • Writing
  • Resume
  • Home
  • Writing
  • Resume

Writing

  • Why Some Managers Look Disingenuous

    January 3rd, 2024
  • Do’s and Don’ts For Technical Interviews

    December 27th, 2023
  • The Book That Made Me Want To Be A Leader

    October 30th, 2023
  • How to Fail An Interview As the Interviewer

    October 25th, 2023
  • Should Managers Be Prescriptive?

    October 16th, 2023
  • How To Help Unmotivated Developers

    July 12th, 2023
  • What to do when nothing seems good enough

    July 10th, 2023
  • Why Do We Burn Out?

    July 7th, 2023
  • What I Taught You, I Don’t Know

    June 21st, 2023
  • How To Delegate Effectively Without Feeling You Are Losing Control

    June 12th, 2023
  • Let’s Accept It. Technical Interviews Are Broken

    June 7th, 2023
  • Why Managers Need Empathy to Manage Low Performers

    May 31st, 2023
  • The Slow Decline of Highly Motivated Developers

    May 24th, 2023
  • Why Writing Explicit Code Matters

    May 18th, 2023
  • Why Is It So Difficult to Assess Expertise in an Interview?

    May 15th, 2023
  • The Real Value of a Senior Developer When it Comes to Dealing With Uncertainty

    May 11th, 2023
  • Why You Should Use Feature Flags to Deploy with Confidence

    April 28th, 2023
  • Over-Engineering Is Not (Just) a Technical Problem

    March 20th, 2023
  • The proactivity fallacy

    January 25th, 2023
  • Extending typescript intersection with optional properties

    January 18th, 2023
  • Setting up Google Tag Manager in a Nextjs application with a strict content security policy

    December 27th, 2022
  • How to build a scalable folder structure for a nextjs app

    December 11th, 2022
  • Why I have stopped writing comments

    December 6th, 2022
  • How to efficiently type nextjs page's props

    December 6th, 2022

Over-Engineering Is Not (Just) a Technical Problem

March 20th, 2023

I bet anyone who’s been in this industry for some time has experience with an over-engineered solution, be it seeing it from the outside or, most likely, building it. I know I have.

For years I have thought of this as a purely technical problem: the engineer (me) has got carried away with a solution more technically challenging and fulfilling than what the problem demanded. As a purely technical problem, the responsibility lies on the technical people and it's on them to avoid it.

Lately, I realised that by treating this as a technical-only problem we are ignoring a big cause for it, and thus, allowing it to happen again and again.

In my experience over-engineering tends to happen in two different environments: one is where people without enough experience, without enough failures, make long-term decisions. That is a purely technical problem that the technical team needs to address (and I’m not focusing in this article); the second environment where over-engineering tends to happen, and it’s usually ignored, is where maintainability, refactoring and design are not allowed to occur in a regular basis.

If you are building a new feature or a new system and you feel you need to hurry because a product manager may be pressuring you to create value for customers if you feel you won’t get more time in the near future to change the design to address new requirements if you feel this is your only chance to really do proper design and develop with good practices, chances are that the solution will be over-engineered because you will be trying to solve all possible requirements you can imagine so this solution really scales and in reality you will be solving lots of problems you will never, making the solution unscalable.

If that has ever happened to you, or maybe it’s happening right now, please know that it’s not your fault. It’s not the fault of the product manager either. But I think both are part of the problem. The product manager should understand and support continuous refactoring as requirements change and things are learned and engineers should understand that we are not capable of solving big complex problems in one go and that we are better off building something simple and iterating over it.

Closing thoughts

Over-engineering is something that can’t be fully avoided, we are all humans, we all get carried away sometimes, and we all make mistakes. Nonetheless, I have found that asking myself (and my team) whether we are solving a problem we don’t have yet and whether we are attempting to optimise something too soon without really knowing if it’s needed is a very useful tool to keep our engineering minds from going too far.