Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 440новых вакансий за сутки·54 706вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 625
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 397 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python8 748
  • Облачные технологии6 616
  • QA вакансии2 169
  • Android1 320
  • Инженер данных872
  • Продакт-менеджер302

Разработка

  • iOS1 232
  • Backend вакансии1 204
  • AI вакансии543
  • Fullstack вакансии497
  • Frontend вакансии417
  • Mobile вакансии28

По стеку

  • Go5 212
  • Java3 116
  • Kotlin1 090
  • Node.js995
  • Rust845
  • .NET661
  • PHP320
  • C++271
  • C#208

DevOps и инфраструктура

  • Kubernetes3 913
  • Linux-инфраструктура2 852
  • DevOps вакансии2 678
  • Terraform / IaC2 167
  • Мониторинг и Observability1 066
  • CI/CD923
  • SRE301
  • Кибербезопасность26

Аналитика и данные

  • Аналитик данных533
  • Data Scientist436
  • Бизнес-аналитик400
  • Системный аналитик68

Другие направления

  • Проджект-менеджер90
  • UI/UX дизайн70
  • Ручное тестирование14

По регионам

  • Вакансии в США25 784
  • Вакансии в Европе10 258
  • Работа в России3 652
  • Вакансии в Канаде2 266

По формату

  • Удалённые вакансии42 770
  • Релокация в США25 784
  • Гибридная работа5 627
  • Офисная работа4 383

По уровню

  • Senior вакансии22 724
  • Middle вакансии11 726
  • Junior вакансии3 874

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab135 вакансий
  • Celonis45 вакансий
  • Spotify37 вакансий
  • Infobip28 вакансий
  • Adyen26 вакансий
  • Monzo19 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме Jetpack ComposeВсе вопросы
Jetpack ComposeSeniorТеория

Каковы лучшие практики производительности в Jetpack Compose (стабильность, пропускаемость)?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Compose пропускает recomposition только для стабильных параметров. Ключевые практики: @Immutable/ImmutableList для типов, derivedStateOf для derived state, key() в LazyColumn, передача лямбды вместо значения в offset/padding для defer-чтения state в layout-фазу.

Практика: стабильность параметров

// ПЛОХО: List<Item> нестабилен → composable не пропускается
@Composable
fun ItemList(items: List<Item>) { /* ... */ }

// ХОРОШО: kotlinx.collections.immutable дает стабильный тип
import kotlinx.collections.immutable.ImmutableList

@Composable
fun ItemList(items: ImmutableList<Item>) { /* ... */ }

// Или обернуть в @Immutable data class
@Immutable
data class ItemListUiState(val items: List<Item>)

@Composable
fun ItemList(state: ItemListUiState) { /* ... */ }

Как Compose решает, пересобирать ли composable

Compose Runtime перед каждым recomposition проверяет, изменились ли параметры composable. Если все параметры стабильны и их значения не изменились с прошлого вызова — composable пропускается (skipped). Это называется skippability. Нестабильный тип вынуждает Compose пересобирать функцию при каждом изменении родительского state, даже если данные для этого composable не изменились.

Тип считается стабильным, если компилятор Compose может доказать, что все его публичные поля неизменны или помечены @Stable/@Immutable. Типы из внешних библиотек (включая List, Map из стандартной библиотеки Kotlin) по умолчанию нестабильны, потому что компилятор не видит их исходники.

derivedStateOf: читать state без лишних recomposition

Если вычисление зависит от state, который меняется часто, но результат — редко, используйте derivedStateOf. Иначе каждое изменение исходного state вызовет recomposition потребителя.

@Composable
fun ScrollToTopButton(listState: LazyListState) {
    // showButton меняется только когда пересекает порог 0/1
    // без derivedStateOf — recomposition на каждый scroll
    val showButton by remember {
        derivedStateOf { listState.firstVisibleItemIndex > 0 }
    }
    AnimatedVisibility(visible = showButton) {
        FloatingActionButton(onClick = { /* scroll to top */ }) {
            Icon(Icons.Default.KeyboardArrowUp, contentDescription = null)
        }
    }
}

key() в LazyColumn: правильная идентификация элементов

LazyColumn {
    // Без key Compose использует позицию → при вставке/удалении
    // переиспользует неправильные composable
    items(messages, key = { it.id }) { message ->
        MessageItem(message)
    }
}

Отложенное чтение state: передавать лямбду вместо значения

Если state передается в modifier (например, для анимации позиции), чтение внутри layout/draw lambda пропускает composition фазу полностью.

// ПЛОХО: читаем state в composition → recomposition при каждом изменении
@Composable
fun BadOffset(scrollState: ScrollState) {
    Box(Modifier.offset(y = scrollState.value.dp)) { /* ... */ }
}

// ХОРОШО: читаем в layout lambda → только layout фаза
@Composable
fun GoodOffset(scrollState: ScrollState) {
    Box(Modifier.offset { IntOffset(0, scrollState.value) }) { /* ... */ }
}

Профилирование: Compose Layout Inspector и Recomposition Counts

В Android Studio Layout Inspector включите Recomposition Counts — он показывает, сколько раз каждый composable был пересобран и сколько раз пропущен. Это главный инструмент до любой оптимизации. Также полезен Trace.beginSection / Trace.endSection для custom tracing в Systrace/Perfetto.

Подводные камни

  • Оборачивать всё в remember вслепую — remember кеширует объект между recomposition, но не делает тип стабильным. Если внутри remember { mutableListOf() }, список всё равно нестабилен.
  • Нестабильный ViewModel state — если UiState содержит List без @Immutable, весь экран не пропускается. Один нестабильный тип в data class «заражает» весь граф.
  • Лямбды-захватчики нестабильного state — onClick = { viewModel.doSomething(item) } создает новую лямбду на каждый recomposition. Используйте remember { { viewModel.doSomething(item) } } или передавайте стабильную ссылку.
  • Игнорировать фазу draw — тяжелые drawBehind / Canvas операции могут быть bottleneck независимо от recomposition; их нужно профилировать отдельно в Perfetto.
  • Слишком крупные composable — один большой composable пересобирается целиком. Декомпозиция на маленькие функции с точечными state reads снижает область invalidation.
  • Чтение state в composition вместо layout/draw — особенно критично для scroll-driven анимаций: чтение scrollState.value прямо в теле composable вызывает recomposition на каждый пиксель прокрутки.
  • Отсутствие baseline profile — без скомпилированного кода первый запуск экрана медленный из-за интерпретации байткода. Baseline Profiles решают это для production.
  • Неверная работа с Flow в composition — collectAsState() без lifecycleOwner.repeatOnLifecycle может держать подписки активными в background; это утечка ресурсов, а не проблема recomposition, но обнаруживается в тех же трейсах.

Частые вопросы на собеседовании

  • Что такое State в Jetpack Compose и как работает state hoisting?
  • Что такое recomposition и что её вызывает в Jetpack Compose?
  • В чём разница между remember и rememberSaveable?
  • Что такое Jetpack Compose и чем он отличается от традиционной системы View в Android?

Типичные ошибки

  • Объяснять «производительность Compose» только как синтаксис и не описывать поведение runtime/compiler.
  • Игнорировать важный риск: Автоматическое оборачивание всего в remember не решает проблему и может сохранить устаревшие данные.
  • Давать пример без edge case: отмены, null, recomposition, platform boundary или ошибки.

Что проверяет интервьюер

  • Формулирует суть темы «производительность Compose» своими словами и связывает ее с кодом.
  • Называет механизм: Сильный ответ различает recomposition, layout и drawing, а оптимизацию начинает с measurement, tracing и устранения лишних invalidations.
  • Видит production-последствие: Автоматическое оборачивание всего в remember не решает проблему и может сохранить устаревшие данные.

Как вы знаете этот вопрос?

Проверить себя по теме Jetpack Compose →

Источники

  • https://developer.android.com/develop/ui/compose/performance/bestpractices
  • https://developer.android.com/develop/ui/compose/performance/stability
←Предыдущий вопросВ чём разница между `remember` и `rememberSaveable`?Следующий вопрос→Что такое Jetpack Compose и чем он отличается от традиционной системы View в Android?

Связанные темы

Jetpack Composecompose-performance-reasoningui-state