FARFETCH — modernizing a live e-commerce app

Android Engineer · August 2021 – April 2025 · FARFETCH on Google Play

Problem

FARFETCH is a luxury fashion marketplace, and its Android app takes orders from customers around the world. By 2021 the codebase carried years of accumulated decisions: MVC in the oldest screens, MVVM in the newer ones, dependencies wired by hand throughout. None of it was wrong when it was written, and all of it made the next change slower than the last.

The continuous integration pipeline took fifteen minutes per run. Fifteen minutes is past the threshold where engineers stop running it and start batching, which is how integration problems get found late and expensively.

Constraint

Nothing could stop. The app was in production taking revenue, on a release train that did not pause for architecture work. Every change had to land incrementally, and both the old and the new patterns had to stay alive in the same codebase for as long as the migration ran — which meant years, not sprints.

Decisions

Result

The pipeline went from 15 minutes to 2.5 on average — back under the threshold where engineers run it per change instead of batching.

Compose and dependency injection both became the default for new work rather than parallel experiments, which is the only durable outcome an incremental migration can have: the new way has to be the easy way, or the old way wins by inertia.

What I'd do differently

I would modularize before migrating, not alongside it. We did both at once, and the same argument I make for the build cache applies to the migration: module boundaries are what make an incremental change cheap. Without them, every screen moved to Compose still dragged the whole dependency graph behind it, and the migration paid a tax it did not need to pay. The pipeline work proved the point — I just proved it in the wrong order.