Overengineering 101: What Is It and How Can Product Managers Avoid It?
Developing and releasing sophisticated products with all the bells and whistles imaginable might seem like a great idea. After all, you want your newly released software to be as good as it gets when it’s finally launched, right?
Not quite. Overengineered products are difficult to use, filled with bugs, and instead of improving your users’ lives, they make them unnecessarily complicated.
But worry not! In this article, we look at different ways for product managers to avoid falling into the overengineering trap.
- An over-engineered product is more complex than it should be and it solves problems that don’t exist. This means complicated UI, redundant features, and unnecessary use of complex technologies.
- Low feature adoption is one of the symptoms of over-engineering. That’s because users either don’t need them or don’t know how to use them. Also, performance issues and frequent bugs are such an indication.
- Developers tend to overcomplicate code when they don’t have enough experience or want to show off their skills.
- However, product managers are also to blame for not setting clear objectives and realistic timelines, and communicating them effectively. Poor prioritization and external pressure are also common causes.
- Overengineering leads to longer development times, higher costs, technical debt, and problems achieving the PMF.
- To avoid falling into the trap, set clear and realistic objectives that are aligned with the product vision.
- User stories make you focus on solving specific user problems rather than the actual features.
- Use opportunity solutions trees to align the problems you try to solve with product goals.
- Pick the right prioritization framework and make data-driven prioritization decisions to manage the roadmap.
- Use mental models like the KISS principle or Occam’s Razor to remember about feature and code simplicity.
- Build your MVP around the most basic features and iterate on them.
- Use data from user interviews, task analyses, and customer feedback to inform what goes into the MVP and future development.
- Want to see how Userpilot can help you prevent overengineering? Book the demo!
What is overengineering?
Overengineering is building a product that is more complex than necessary.
This could be through features that nobody needs, overwhelming UI, overcomplicated architecture, or complex technologies, like AI when simple solutions would do the job.
How to identify an overengineered solution?
There are some tell-tale signs that your product may be over-engineered.
One of the first symptoms would be low feature adoption.
There could be three reasons for that:
- There are too many features that solve problems that your users don’t have.
- The features are too complex and come with a steep learning curve so users don’t know how to use them or don’t have enough motivation to learn.
- Overly complex UI makes it difficult to find the functionality that users need.
Apart from that, look out for performance issues, like excessive downtime, and a large volume of bug reports.
Why do developers overengineer software products?
Lack of experience and excessive reliance on coursebook design patterns could be one of the causes of excessively complex code. Too much confidence in their skills and wanting to show them off could be another.
However, blaming developers for overengineering isn’t fair. Building amazing products is a combined effort of teams from across the organization. It’s often product managers that are responsible for poor practices leading to it.
What are the greatest PM sins?
- Lack of clear goals: if your developers don’t know where the product is heading, they won’t be able to find the best way to get there.
- Poor backlog prioritization: if you don’t know which features are best aligned with customer and business requirements, how should your development team know what needs immediate attention?
- Poor communication: even if you nail your product goals, make sure to communicate them clearly to the development team.
- Vague deadliness: if you give your team too much time, they’ll start gold-plating.
- Unrealistic timescales: if the deadlines are too tight, on the other hand, developers will start looking for unsustainable hacks.
- Not enough buffering: the key stakeholders will try to push their pet features to the top of the backlog, but it’s your job to filter these.
What are the negative consequences of excessive engineering?
You’ve probably got an idea by now that overengineering isn’t exactly optimal for your product. Let’s look at some of the more serious consequences of excessive engineering that can plague your product far into the future.
Longer development cycles
- waiting longer for product usage data necessary to validate the features or improve their performance,
- losing the first-mover advantage and the novelty factor if your competitors beat you to the market,
- and, more time before your product starts bringing revenue.
Increased development and maintenance costs
The longer the development takes, the more it costs. Developer and QA salaries, software licenses, tools, infrastructure, facilities… all that will increase the overall expenditure on the product and cut into your profit margins.
And don’t forget about higher ongoing maintenance costs. The upkeep of complex infrastructure will require more effort and resources.
And while you’re dealing with all that, you may be missing out on opportunities to add true value to your product.
Greater technical debt
Overengineering is like building a house with all the best fittings and furnishings but no solid foundation. Without such a foundation, the house will be shaky and won’t last very long.
Your product may wow users with its fancy features to start with. However, such a system will gradually be less resilient to technical issues, and more challenging to scale or upgrade – until you reach the point when a complete rewrite is necessary.
Not many companies can pull it off without taking a significant hit in user numbers and revenue. In fact, some companies never recover from that at all.
Failure to reach product-market fit
Overengineering often delays the moment companies reach product-market fit.
First, it delays the product launch. This means a lot of product development happens without customer validation. Without this, you can’t really tell whether there’s enough demand for the solution to make it a viable commercial product.
And the longer it takes for you to find your PMF, the higher the risk you run out of cash to finance your development. And even the most optimistic VCs will turn off the tap if they don’t see evidence that your product is heading in the right direction.
This eventually leads to product failure, and in the case of smaller startups – business failure.
Good practices on how to avoid overengineering
So how do you avoid overengineering your product? Let’s look at a few best practices.
Focus on the product vision to avoid the build trap
Product vision outlines the long-term objectives for the product. It is specific enough to guide the work of the product team but not detailed enough to constrain their creativity to come up with innovative solutions.
Keeping your vision in mind while making product decisions will help you prioritize more effectively and help you avoid distractions and external pressures that could send you down the build trap.
Set realistic goals in the software development process
Make sure the goals for your development team are realistic. Otherwise, you may find them compromising on quality.
Whichever tool you use, make sure the goals are clear and you have a reliable way of assessing their success.
Apart from giving your devs enough time to complete their jobs, it will also ensure that their time is spent well and will remove the temptation to overdo it.
Perform a task analysis to understand user behavior
To carry out task analysis, you need an analytics tool that allows you to track feature usage and goals like Userpilot. You can also track user in-app behavior leading up to specific events using session recording functionality available in tools like Hotjar or TrueStory.
Such insights can help you make informed decisions and prioritize your backlog.
Conduct customer interviews to understand user needs
User interviews are an easy way to collect user input and gain an understanding of their needs. The best thing is that you can use them at all stages of the product management process, even before the product launch.
While interviews give you a lot of flexibility to adjust your course and follow up on ideas, make sure to prepare for them thoroughly.
Write user stories to remove unnecessary complexity
User stories help you avoid over-engineering features because they focus on specific user objectives.
Here’s an example of a user story:
As a product manager, I need event-triggered in-app surveys so that I can collect feedback at the moment when the user engages with a feature.
By phrasing your backlog items like this, you tell your developers what you want to achieve and let them find the most efficient way to solve the problem.
Use the opportunity solution tree framework to ensure alignment
The opportunity solution tree (OST) is a discovery tool that can help you stay in line with the product vision and the business needs.
The tree consists of 3 main levels.
At the top, we have the Outcome, which is the product or business goal. Next, we have opportunities to achieve that outcome. These are the pain points, needs, and desires of your users. The level after that is all about solutions.
Mapping out your opportunity-solution space like this makes it easier to see how they drive the higher-level goals.
Prioritize feature development to avoid new feature fallacy
Once you have identified the user problems you want to tackle and the corresponding solutions, you need to prioritize them.
There are some prioritization frameworks that you can use:
- MoSCoW (Must Have, Should Have, Could Have, Won’t Have)
- Kano model (Basic, Excitement, Performance, Indifferent, Dissatisfaction)
- Cost of delay
- Dot voting
Teams use them to divide the features into those that solve genuine user problems (painkillers) and those that are nice to have (vitamins).
All the prioritization decisions you make need to be based on tangible evidence rather than gut feelings.
Follow mental models to create a simple software product
Regardless of the stage of the product development process, using mental models that force you to think about your product in simple terms can also help you avoid overengineering.
Here are a few examples:
- KISS principle (Keep It Simple Stupid)
- Occam’s Razor
- YAGNI (You Aren’t Gonna Need It)
All of these make you question if your users really need a feature to satisfy their needs and solve their problems.
Create and test minimum viable products
There’s a reason why MVPs (minimum viable products) are such a popular concept in product management.
No matter how good our market research and product discovery are, we can’t build a complete product before launching it. Only when we put it in the hands of the users, start tracking their behavior, and collect feedback, we can tell what works and what does not.
So move fast, build your MVP around the features that address the key user needs, do a beta launch, and start collecting data to inform future iterations.
Collect customer feedback and improve the product accordingly
To get the best out of your user surveys, mix up closed-ended questions for quantitative data, and open-ended ones for qualitative insights.
So if your initial question is ‘How Was the Experience of Creating Your First Automation Flow?’, follow it up with ‘What could we do to improve it?’
Overengineering slows down product development and leads to long-term technical issues.
To avoid it, product managers should focus on developing features that are directly aligned with the product vision and solve real-life user problems.
If you want to see how Userpilot can help you collect data and feedback for better prioritization, book the demo!