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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 126
  • Облачные технологии14 083
  • QA вакансии3 456
  • Backend вакансии2 115
  • Инженер данных1 809
  • Продакт-менеджер1 261

Разработка

  • Android1 862
  • iOS1 700
  • Fullstack вакансии986
  • AI вакансии950
  • Frontend вакансии744
  • Mobile вакансии44

По стеку

  • Go8 688
  • Java6 537
  • Node.js2 026
  • .NET1 722
  • Kotlin1 611
  • Rust1 458
  • C#710
  • PHP682
  • C++571

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

  • Kubernetes7 772
  • DevOps вакансии6 054
  • Linux-инфраструктура5 493
  • Terraform / IaC4 275
  • CI/CD3 239
  • Мониторинг и Observability1 790
  • SRE568
  • Кибербезопасность458

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

  • Data Scientist1 143
  • Бизнес-аналитик923
  • Аналитик данных857
  • Системный аналитик152

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

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

По регионам

  • Вакансии в США44 276
  • Вакансии в Европе23 819
  • Вакансии в Канаде4 471
  • Работа в России3 904

По формату

  • Удалённые вакансии74 928
  • Релокация в США44 273
  • Гибридная работа12 388
  • Офисная работа7 083

По уровню

  • Senior вакансии42 625
  • Middle вакансии20 854
  • Junior вакансии6 721

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • 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