I resisted Compose for longer than I should have.
I had years of muscle memory with XML layouts. ConstraintLayout felt natural. I knew exactly where to look when something didn't render right. Compose, on the other hand, felt like relearning a skill I'd already mastered.
Then I started Fotoshi — a new greenfield app — and decided to go all-in. No XML. No fragments. Full Compose from day one.
That was two years ago. Here's what I actually think now.
What genuinely surprised me
State management clicked fast. I expected it to be the hardest part. It wasn't. Once you internalize "UI is a function of state", everything else follows. remember, mutableStateOf, hoisting state up — it's a consistent mental model, not a collection of workarounds.
Less code, actually. I was skeptical of this claim. But a RecyclerView with a custom adapter and DiffUtil is easily 150+ lines. The equivalent in Compose is a LazyColumn with an item lambda. That's it.
Previews changed how I work. Being able to preview a component in isolation — with different states — without running an emulator is genuinely useful. I catch layout issues earlier now.
What tripped me up
Recomposition is not free. Early on I had a screen that recomposed far more than it should. The fix was understanding remember and derivedStateOf properly — but you won't know you have a problem until you use Layout Inspector or a profiler.
Interop with old Views is messy. Any time I had to use AndroidView (for MapLibre, for instance), the code got ugly fast. It works, but you feel the seams.
Animations have a learning curve. AnimatedVisibility and Crossfade are easy. Complex shared element transitions are... not. I spent more time on one transition than on an entire screen.
Is it worth it?
Yes. For new projects — absolutely. For legacy apps — migrate screen by screen, don't try to do it all at once.
The ecosystem has matured enough. Material 3 components are solid. Navigation Compose is stable. If you're still on XML for a greenfield project in 2025, you're choosing the harder path for no good reason.
Start with one screen. You'll understand why everyone moved.