Введение: вопрос, который задают и в проектах, и на собеседованиях

«Compose или XML?» — этот выбор встаёт перед каждым: начинаете новый проект — что закладывать? Идёте на собеседование — вас спросят, что вы выберете и почему. Правильный ответ не «Compose, потому что модно», а разбор по критериям.

Сразу важная поправка, которую часто не замечают: противопоставление «Compose против XML» технически неверно. XML — это формат разметки, а Compose — фреймворк. Реальное противопоставление — Compose против View-системы (той самой, что читает XML-разметку через setContentView). Но на собеседовании вопрос сформулируют именно так, поэтому разберём его в привычных терминах.

Что важно понять: разница не в файлах, а в модели работы с UI. Отсюда и пляшут все критерии сравнения.

Разные модели: императив против декларатива

XML-разметка описывает структуру экрана, но жизнь UI на этом не заканчивается. После setContentView начинается императивное управление: найти виджет через findViewById, обновить через setText, добавить элемент в контейнер. При каждом изменении данных вы вручную синхронизируете дерево виджетов.

activity_main.xml
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center">

    <TextView
        android:id="@+id/text_counter"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Счёт: 0" />

    <Button
        android:id="@+id/button_increment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="+1" />
</LinearLayout>
MainActivity.kt
val counter = findViewById<TextView>(R.id.text_counter)
buttonIncrement.setOnClickListener {
    counter.text = "Счёт: ${++count}"
}

В Compose вы описываете экран как функцию от состояния: поменялось состояние — Compose сам пересобирает описание и применяет изменения. Никаких findViewById и ручной синхронизации.

CounterScreen.kt
@Composable
fun CounterScreen() {
    var count by remember { mutableStateOf(0) }

    Column(
        modifier = Modifier.fillMaxSize(),
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Text(text = "Счёт: $count", style = MaterialTheme.typography.headlineMedium)
        Button(onClick = { count++ }) {
            Text("+1")
        }
    }
}

Коротко о сути

XML-подход: разметка декларативная, обновление императивное — вы вручную двигаете виджеты. Compose: вся модель декларативная — UI всегда является функцией от состояния. Именно поэтому Compose-код проще поддерживать при росте экрана.

Официальная документация называет Compose декларативным UI-тулкитом и описывает, как работает эта модель — «Мыслить в композиции».

Сравнение по критериям: без фанатизма

Теперь по-честному, по пунктам, которые важны в реальном проекте.

Скорость разработки. Compose выигрывает на динамичных экранах: состояние, списки, анимации. Предпросмотр (@Preview) показывает экран без запуска приложения, а Live Edit обновляет изменения мгновенно. XML быстрее для статичных простых форм — но таких экранов в современных приложениях всё меньше.

Производительность. Компилятор Compose пропускает рекомпозицию неизменных частей, LazyColumn рендерит только видимые элементы. View-система десятилетиями оптимизировалась, но её развитие остановилось. В честном сравнении на сложных экранах Compose как минимум не проигрывает, а инструменты профилирования позволяют находить узкие места.

Кастомизация и дизайн-системы. Material 3 из коробки — это про Compose. Темы, компоненты, адаптивность под разные форм-факторы — вся новая функциональность идёт только туда. XML-версия Material Components заморожена.

Экосистема. Вот где View ещё держится: библиотеки вроде карт или сложных графиков легче встраиваются как View. Но Compose умеет встраивать View-компоненты через интероп (AndroidView), так что это не блокер, а нюанс.

Команда. Если команда годами писала на View, переход пугает. На практике кривая входа короткая: Compose — это обычный Kotlin, новый синтаксис вроде Modifier и remember осваивается за пару недель практики. Плюс @Preview и Live Edit сокращают цикл «написал — увидел», что особенно ценится новичками. Сложнее всего переучиваться не писать императивно — но именно этот переход и прокачивает уровень.

Честный ответ на собеседовании: Compose выигрывает по скорости разработки, состоянию и направлению развития, а View остаётся для интеграции с legacy-компонентами. Фанатичное «Compose во всём лучше» — тоже ошибка: инженер взвешивает, а не лозунги кричит.

Миграция: можно ли совмещать

Ключевой факт, который снимает половину страхов: Compose и View официально совместимы. Compose-функция AndroidView позволяет встроить любой View-компонент, а ComposeView — вставить Compose в существующий XML-экран. Миграция идёт экран за экраном, без «дня X», когда всё переписывается разом.

Реальные сценарии:

  • Новый модуль в старом приложении — пишется на Compose, остальное живёт как жило.
  • Новые экраны — на Compose, старые переписываются по мере необходимости.
  • Полный переход — когда Compose закрывает все потребности проекта, View-слои выпиливаются.

Почему мигрировать вообще нужно: Google объявила Android подходом «Compose-first». Классический View-тулкит переведён в режим сопровождения — только критические исправления, никаких новых возможностей. То же с View-версиями библиотек: RecyclerView, ViewPager2, Fragment, Material Components — режим сопровождения. Новые инструменты Android Studio делаются только для Compose. Официальное заявление — на странице «Android is Compose-first».

Способа миграции

AndroidView — встроить View в Compose, ComposeView — встроить Compose в XML-экран. Поэтому переезд не блокирует разработку: старые экраны работают, новые пишутся на Compose.

Что выбрать в 2026 году и как ответить на собеседовании

Практический вывод такой.

Новый проект. Закладывайте Compose. Не потому что «так все делают», а потому что развитие идёт туда: новые API, Material 3, инструменты, документация. Начинать новый проект на XML в 2026 году — значит взять технологию, у которой нет будущего, и платить за это долгие годы.

Существующий проект. Оценивайте по экранам: новое — на Compose, критичные View-экраны — как есть, интероп решает стыки. Полная миграция — вопрос приоритетов, а не технологий.

Собеседование. Здесь проверяют умение рассуждать. Отвечайте структурой: разница в парадигме (императив против декларатива), критерии выбора (скорость разработки, состояние, экосистема), направление индустрии (Compose-first, View в режиме сопровождения), план миграции (интероп, поэтапность).

  • «XML — это старое, Compose — новое, всё». Нет аргументов — нет баллов. Нужны критерии и понимание, почему.
  • «Compose нельзя использовать с View». Можно, через AndroidView и ComposeView.
  • «Compose медленный». Без конкретики это миф; узкие места находятся профилировщиком.
  • «Мигрировать надо за один раз». Нет, миграция поэтапная, экран за экраном.

Уверенный ответ выглядит так: «Я бы выбрал Compose для нового функционала: быстрее разработка, лучше работа с состоянием, туда идёт развитие экосистемы. Для legacy-экранов оставил бы View с интеропом, миграцию вёл бы поэтапно». Это ответ инженера, а не фаната.

И последний практический совет: принимайте решение не абстрактно, а от задачи. Список с фильтрами, чат, лента — экраны, где Compose даёт максимальный выигрыш. Простая статичная форма с двумя полями и кнопкой в legacy-проекте — повод оставить View, а не героически переписывать. Умение не трогать работающее — тоже часть middle-уровня.

Кто это пишет: про автора

Меня зовут Рустем Бикбулатов. Я senior Android-разработчик, провожу технические собеседования и менторю в Яндекс Практикуме. За моей спиной более ста учеников и разборов.

Я помогаю Android-разработчикам с опытом один-два года перейти на уровень middle за четыре-восемь недель: закрываю пробелы в Kotlin, корутинах и архитектуре, тренирую ответы на собеседованиях — Яндекс, Авито и другие сильные компании. Умение аргументированно выбирать технологии — часть middle-уровня, и вопросы «Compose или XML» это проверяют лучше всего.

Хотите план роста под ваш уровень?

Бесплатная диагностика: разберу ваши пробелы — Kotlin, корутины, архитектура, Compose — и составлю план роста за 30–40 минут. Без обязательств: если менторство вам не подойдёт, честно скажу.

Итоги

Вопрос «Compose или XML» — это на самом деле вопрос «как вы принимаете технические решения». Правильный ответ всегда взвешенный, по критериям, а не по моде.

  • Разница: XML-разметка + императивное обновление против полностью декларативной модели Compose.
  • Выбор: новый проект — Compose; legacy — поэтапная миграция через интероп (AndroidView, ComposeView).
  • Направление: View-тулкит в режиме сопровождения, Compose-first — вся новая функциональность идёт в Compose.

Главное

Формула ответа на собеседовании: парадигма, критерии, направление, план. «Compose — декларативный UI, быстрее в разработке и работе с состоянием; View остаётся для интеропа с legacy; миграция поэтапная» — этого достаточно, чтобы ответ звучал как ответ инженера.

Если чувствуете, что знаете отдельные темы, но на собеседовании не можете собрать ответ в структуру — это тренируется, и быстрее всего в формате мок-собеседования. Напишите в Telegram, разберём вашу ситуацию и составим план подготовки.