skip to content

Given a new mobile app screen with a handful of simple, mostly-static fields versus a complex form with many interdependent, frequently changing fields, how would you decide between MVP and MVVM for each, and what's the actual cost you're trading off?

level: seniorimportance: should knowfreq 60%

answer

  1. MVP cost scales with #fields; MVVM cost flat per field
  2. MVP=linear debugger steps; MVVM=graph tracing
  3. platform toolkit alignment (SwiftUI/Compose/WPF favor MVVM)
  4. Android MVP->MVVM shift tied to tooling (LiveData 2017)
  5. pick per-screen complexity, not blanket dogma

basics

~20 s

For simple screens, MVP's explicit code is easy to follow and not much extra work. For complex screens with lots of changing state, MVVM's automatic updates save a ton of repetitive code, but you trade that for a debugging chain that's harder to trace step by step.

solid answer

~50 s

The decision hinges on state complexity and update frequency, not team preference alone. MVP's cost scales roughly linearly with the number of distinct pieces of displayed state - each needs an interface method and a call site - so for a screen with 3-4 fields that rarely change, that boilerplate is trivial and the explicit call sequence is easy to read and step through in a debugger. MVVM's cost is roughly flat regardless of field count, so for a form with 20+ interdependent fields, MVVM eliminates a large, error-prone amount of manual sequencing. The real trade-off isn't 'better/worse,' it's 'linear explicit boilerplate you can step through' versus 'flat declarative wiring you have to trace through an observable chain.' Teams also weigh platform defaults: if the platform's blessed toolkit already ships strong binding support, fighting that to do MVP is usually not worth it.

go deeper

for a junior

Can say that simple screens are easier with fewer moving parts and complex screens benefit from automatic updates, in plain terms.

for a middle

Names the boilerplate-vs-binding-framework trade-off concretely and can point to which pattern a given platform's toolkit favors.

for a senior

Articulates the linear-debugging vs graph-tracing distinction and can recommend a pattern for a given screen based on its actual state-interdependency profile.

for a principal

Sets org-level architecture guidance that accounts for toolkit evolution over time, revisiting a platform default when new binding infrastructure ships, rather than treating a pattern choice as permanent.

## The two variables Choosing between MVP and MVVM is fundamentally a bet about two variables: 1. how much displayed state a screen has, and 2. how often that state changes in response to other state. These two variables determine which pattern's cost curve is lower for a given screen, and the mistake many teams make is picking one pattern as a blanket standard for an entire app regardless of how individual screens differ on these axes. ## How MVP's cost scales Mechanically, MVP's cost is proportional to the number of distinct View-interface methods needed, because every piece of state the View must display requires: - a method on the **View interface**, - an implementation of that method in the **concrete View**, - and an explicit **call site in the Presenter**, correctly sequenced relative to every other call. For a login screen with a username field, a password field, and a submit button — a handful of states total — that's a handful of methods, trivially reviewable, and a debugger can step through the Presenter method line by line and see exactly what happens and in what order. This explicitness is a genuine asset: when something's wrong, you set a breakpoint on the suspect call and you're done. ## How MVVM's cost scales MVVM's cost, by contrast, is roughly flat per additional field: adding a new bound property to a ViewModel is typically one new observable declaration plus one binding expression in the View's markup, with no growth in imperative call-sequencing code, because the binding engine handles propagation regardless of how many properties exist. For a checkout form with quantity fields, per-item subtotals, a running total, a discount code field that revalidates other fields, and conditional visibility on a dozen elements, hand-writing MVP-style explicit calls for every interdependency becomes both verbose and a common source of ordering bugs. MVVM collapses that to declaring computed/derived observables that the binding layer keeps current automatically, and every bound View element just reflects whatever the observable currently holds. ## The real trade-off is debuggability shape The real trade-off, then, is not raw code volume alone but debuggability shape. | Pattern | What tracing a bug looks like | |---|---| | MVP debugging | linear and imperative — you can literally step through the Presenter's method top to bottom | | MVVM debugging | a dependency graph — understanding why a value changed means tracing backward through however many transformation operators sit between the root mutation and the bound UI element, which is a fundamentally different mental model, especially for engineers unfamiliar with reactive composition | Teams sometimes underestimate this cost until a production bug in a long observable chain takes hours to trace versus minutes for an equivalent MVP call-sequencing bug. ## Platform and toolkit alignment A second, often-decisive factor is platform/toolkit alignment rather than pure architecture merit. Modern declarative UI toolkits — SwiftUI, Jetpack Compose, WPF/XAML — are built with first-class binding and expect a reactive state-holder as the natural shape of screen code; forcing MVP's explicit-interface-and-imperative-call style onto them means fighting the platform's grain. Conversely, on a toolkit with no meaningful binding support, hand-rolling an observable layer just to do MVVM adds framework-building overhead MVP wouldn't need. In practice, most real teams choose per-platform default rather than per-screen, because consistency across a codebase has its own value, but the underlying reasoning for that platform default is exactly the state-complexity/toolkit-alignment trade-off described above, not fashion. ## A concrete illustration A concrete illustration: Google's own Android guidance shifted from MVP, recommended circa 2015-2017 when Architecture Components didn't exist and Fragments/Activities needed a mockable interface for JVM unit tests, to MVVM from 2017 onward once ViewModel plus LiveData shipped as first-class, lifecycle-aware, testable primitives — a platform-level tooling change, not a change in what 'good architecture' means, and it illustrates that this decision should be revisited when the underlying toolkit's capabilities change, not treated as permanent doctrine.

  • Why might a team standardize on one pattern per platform rather than deciding per-screen?
    Consistency reduces onboarding cost and code-review friction - engineers don't have to relearn a different architectural shape for every screen they touch. It also lets a team invest once in shared infrastructure, such as a base Presenter class or reusable ViewModel testing utilities, rather than maintaining two parallel sets of conventions.
  • What's a concrete sign a screen originally built with MVP should be migrated to MVVM?
    The Presenter's View interface has grown to dozens of methods with complex conditional call sequences to keep several interdependent fields consistent, and bugs keep arising from a call being forgotten or ordered wrong. That's the state-interdependency signal that a declarative binding approach would eliminate the sequencing burden entirely.
  • Is it possible to use MVVM without any reactive/observable framework at all?
    Yes, in a minimal form: manual polling or a simple callback-list implementation can substitute for a full reactive library, and the essential MVVM property - the ViewModel exposing state without holding a View reference - doesn't strictly require a specific framework. In practice, though, most teams adopt a binding framework because hand-rolled observability tends to reinvent the same lifecycle and leak-prevention problems those frameworks already solved.

It's like choosing between writing out step-by-step driving directions (MVP) versus giving someone a GPS that recalculates automatically as conditions change (MVVM): directions are easy to double check line by line for a short trip, but for a route with constant rerouting you'd rather trust the GPS - even though when the GPS gives a wrong turn, figuring out why is a lot less obvious than checking a single wrong line in written directions.

saying these in an interview costs you the question

  • insists one pattern is universally superior regardless of screen complexity
  • can't name a concrete cost of MVVM such as debugging observable chains
  • can't name a concrete cost of MVP such as per-field boilerplate
  • ignores platform/toolkit fit as a factor
  • treats the choice as purely stylistic with no technical basis

context