Insight

Why “just add this feature” isn't that simple

Why “just add this feature” isn't that simple

Courtney Smith

Photo of Courtney Smith

Courtney Smith

digital marketing assistant

6 minutes

time to read

May 18, 2026

published

There’s a moment that crops up in almost every app project.

It usually happens mid-conversation, somewhere between a review call and a new idea taking shape. Someone leans in and says, “What if we just add this one feature?” And it’s never a bad idea. In fact, most of the time, it’s a good one. It makes sense on the surface. It feels small, contained and like something that should slot neatly into what already exists.

But here’s the thing, people only really see once they’re inside the process: There’s almost no such thing as “just adding” anything.

Not because teams want to complicate things, or slow things down, or over-engineer a simple idea. But because every app, no matter how clean it looks on the surface, is sitting on top of layers of decisions, logic, and connections that all rely on each other to work.

And the moment you introduce something new, you’re not dropping it into empty space, you’re introducing it into a system that already has rules.

 

It’s never just the feature you can see

Let’s take a simple example. Say you want to add a new option to an existing journey, maybe it’s something like letting users amend a booking, or save a preference, or trigger a new type of notification. On the screen, that might look like a button, maybe a form or a confirmation message. It feels contained.

But underneath that surface, that one change starts to spread outwards.

Because that button needs to know what data it’s working with, it needs to understand how that data is stored, whether it can be changed, what happens when it is changed, and who else relies on it staying the same.

It might need to talk to an API that wasn’t originally designed for that kind of interaction, or handle edge cases that didn’t exist before, or respect business rules that only apply in certain scenarios.

And suddenly, what looked like a single feature becomes a series of decisions. None of them visible to the end user, and all of them critical to making sure the app still works as expected.

 

The system is always bigger than the request

One of the biggest shifts for anyone working closely with development teams is realising that apps aren’t built feature by feature, they’re built as systems.

Which means everything is connected, whether you intended it to be or not. Change how bookings behave, and you might also be affecting pricing logic. Change how users update their details, and you might need to rethink validation, security, or how that data is used elsewhere.

This is where things can start to feel slower than expected. Not because the feature itself is particularly complex, but because the system around it needs to stay stable.

system

There’s a really interesting piece of research from Google that looked at large-scale software systems and how developers experience them over time. What they found is that as systems grow, the effort required to maintain and safely change them increases significantly - not linearly, but exponentially.

In simple terms, the more your product evolves, the more carefully each new change needs to be introduced.

 

Timing changes everything

There’s another layer to this that doesn’t always get talked about upfront: when a feature is introduced matters just as much as what it is. Early in a project, things are flexible. Structures are still being defined, flows are still being shaped, and decisions can be adjusted without too much friction.

Later on, it’s a different story.

By the time you’re in build, or even closer to launch, everything is more tightly connected. Code has been written with certain assumptions, features rely on each other, and testing is underway. So when a new request comes in at that stage, it’s not only about building something new. It’s now about unpicking what’s already there, carefully adjusting it, and then making sure nothing else breaks in the process.

That’s why the cost of change increases over time. This isn’t because teams are dragging their feet, but because the impact of that change gets wider the further along you go. IBM’s Systems Sciences Institute famously found that fixing issues later in the lifecycle can be up to 100 times more expensive than addressing them during the design phase.This stat isn’t a scare tactic, it’s just a reflection of how interconnected things become.

 
Image

Then there’s the experience side of things

Even if the technical side is manageable, there’s another question that matters just as much: What does this do to the experience?

Adding a feature doesn’t just increase functionality, it adds weight. Another decision for the user to make, another moment of interaction, another piece of information to process. And without meaning to, it can start to chip away at what made the product feel simple in the first place.

You see it happen gradually, a feature gets added because it solves a real need. Then another, because it supports a different use case. Then another, because it feels like a logical extension. Individually, they all make sense. Together, they can start to compete.

This is where product thinking becomes just as important as technical delivery. Not every good idea improves the product, some of them just make it busier. And knowing the difference is where the real value sits.

 

The trade-offs don’t disappear, they just move

Sometimes, you absolutely can add the feature quickly. You’re able to find a workaround, fit it into the existing structure without too much disruption and get it live. But that decision doesn’t come for free.

It usually means making a compromise somewhere else. Maybe it’s in how scalable the solution is, maybe it’s in how clean the codebase remains, or maybe it’s in how easy future changes will be. This is what we call technical debt, as it ends up being a series of delayed decisions. And over time, those decisions stack up.

There’s a stat that often surprises people: the majority of software cost doesn’t come from building it, but from maintaining and evolving it after launch. So when a team pauses on a “simple” request, it’s usually not about the effort today, it’s about what that decision means six months from now.

 

So what’s actually happening when teams push back?

From the outside, it can feel like resistance. But from the inside, it’s risk management. It’s a team stepping back and asking:

  • What else does this touch?
  • What assumptions does this break?
  • What does this mean for the user journey?
  • What happens if we need to change this again later?

And sometimes the outcome is still yes. The feature gets built, and it works exactly as intended. But it’s built with context, awareness of everything around it, and a clear understanding of the trade-offs involved. That’s the difference.

 

The real shift: from “adding features” to “shaping products”

The most successful products aren’t the ones with the most features, they’re the ones where every feature earns its place. And that only happens when you move away from thinking in isolated requests, and start thinking in systems, journeys, and long-term evolution.

Because “just adding a feature” isn’t really a thing, what you’re actually doing is reshaping part of a living product. And that’s always worth doing properly.

If you’re weighing up a “simple” feature and want to understand what it really means for your product, it’s worth having that conversation early.

 
contact us

Apply theses insights

Contact us to discuss how we can apply theses insights to your project