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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python8 752
  • Облачные технологии6 631
  • QA вакансии2 183
  • Android1 322
  • Инженер данных860
  • Продакт-менеджер316

Разработка

  • iOS1 238
  • Backend вакансии1 196
  • AI вакансии549
  • Fullstack вакансии500
  • Frontend вакансии426
  • Mobile вакансии28

По стеку

  • Go5 209
  • Java3 131
  • Kotlin1 113
  • Node.js1 008
  • Rust833
  • .NET656
  • PHP322
  • C++270
  • C#207

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

  • Kubernetes3 882
  • Linux-инфраструктура2 817
  • DevOps вакансии2 655
  • Terraform / IaC2 191
  • Мониторинг и Observability1 071
  • CI/CD919
  • SRE308
  • Кибербезопасность38

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

  • Аналитик данных522
  • Data Scientist435
  • Бизнес-аналитик397
  • Системный аналитик67

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

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

По регионам

  • Вакансии в США22 951
  • Вакансии в Европе10 259
  • Работа в России2 963
  • Вакансии в Канаде2 034

По формату

  • Удалённые вакансии39 691
  • Релокация в США22 951
  • Гибридная работа3 633
  • Офисная работа2 761

По уровню

  • Senior вакансии19 599
  • Middle вакансии11 130
  • Junior вакансии3 562

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

Все компании
  • Wise192 вакансии
  • Rakuten189 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis42 вакансии
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

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

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

Какие ошибки делают команды, когда строят приложение на Kotlin Coroutines как web/backend-проект без учёта mobile constraints?

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

Типичные ошибки: игнорирование lifecycle (аналог серверных вечных потоков), отсутствие backpressure, блокировка Main-потока, ignoring cancellation, чрезмерное использование GlobalScope и отсутствие bounded parallelism.

Ошибка 1: игнорирование lifecycle

На сервере запрос живёт от начала до конца. На мобильном экран может уйти в фон, повернуться или уничтожиться. Корутины без привязки к lifecycle продолжают работать.

// НЕПРАВИЛЬНО — GlobalScope как на сервере
class BadActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        GlobalScope.launch { // не отменится при destroy!
            val data = api.fetchData()
            runOnUiThread { updateUI(data) } // Activity может быть уничтожена
        }
    }
}

// ПРАВИЛЬНО
class GoodViewModel : ViewModel() {
    fun loadData() {
        viewModelScope.launch { // отменится в onCleared()
            _state.value = repo.fetchData()
        }
    }
}

Ошибки команд, переносящих web/backend-мышление на мобильные корутины

Backend-разработчики привыкают к другой модели: long-lived процессы без UI, неограниченные потоки, всегда активное соединение. На мобильном эти привычки создают проблемы.

Ошибка 2: блокирующие вызовы без withContext

На сервере thread pool большой — blocking IO не критично. На Android Main thread один, и его блокировка — ANR.

// НЕПРАВИЛЬНО — блокирующий IO в Main-диспетчере
viewModelScope.launch { // Main по умолчанию
    val file = File("/data/large.json").readText() // БЛОКИРУЕТ UI!
    processData(file)
}

// ПРАВИЛЬНО
viewModelScope.launch {
    val file = withContext(Dispatchers.IO) {
        File("/data/large.json").readText()
    }
    processData(file) // обратно на Main
}

Ошибка 3: игнорирование CancellationException

На сервере обычно ловят все исключения. В корутинах CancellationException — механизм structured cancellation, его нельзя глотать.

// НЕПРАВИЛЬНО — поглощение CancellationException
viewModelScope.launch {
    try {
        doWork()
    } catch (e: Exception) { // ловит ВСЕ, включая CancellationException!
        Log.e("Error", "failed", e)
    }
}

// ПРАВИЛЬНО
viewModelScope.launch {
    try {
        doWork()
    } catch (e: CancellationException) {
        throw e // переброс обязателен!
    } catch (e: Exception) {
        Log.e("Error", "failed", e)
    }
}

Ошибка 4: неограниченный параллелизм

Backend запускает столько потоков, сколько нужно. На мобильном чрезмерный параллелизм убивает батарею и память.

// НЕПРАВИЛЬНО — 1000 параллельных запросов
suspend fun loadAll(ids: List<Long>) = coroutineScope {
    ids.map { id -> async { api.getItem(id) } }.awaitAll()
}

// ПРАВИЛЬНО — ограничить до разумного числа
suspend fun loadAll(ids: List<Long>) = coroutineScope {
    val semaphore = Semaphore(10)
    ids.map { id ->
        async {
            semaphore.withPermit { api.getItem(id) }
        }
    }.awaitAll()
}

Ошибка 5: отсутствие backpressure

На сервере producer и consumer часто равноправны. В мобильном UI не успевает обрабатывать быстрые потоки данных.

// НЕПРАВИЛЬНО — каждое событие триггерит тяжёлую операцию
button.setOnClickListener {
    viewModelScope.launch { api.sendData() } // параллельные запросы при быстрых кликах
}

// ПРАВИЛЬНО — debounce через Flow
button.clicks() // kotlinx-coroutines-android
    .debounce(300)
    .onEach { viewModel.sendData() }
    .launchIn(lifecycleScope)

Ошибка 6: длинные polling-циклы без учёта Doze mode

Серверный демон с while(true) { delay(1000) } работает вечно. На Android Doze mode заморозит приложение через 30 минут в фоне. Для background-работы нужен WorkManager.

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

  • Использование runBlocking в продакшн-коде Android — блокирует поток, вызывает ANR на Main или starvation на IO.
  • Создание CoroutineScope вручную без SupervisorJob — ошибка в одной дочерней корутине отменяет весь скоуп.
  • Отсутствие timeout на сетевых запросах: withTimeout(5000) { api.call() } — без этого корутина ждёт вечно при проблемах с сетью.
  • SharedFlow с replay=0 как замена EventBus без учёта: подписчик пропускает события, пришедшие до подписки.
  • Игнорирование Dispatchers.Main.immediate vs Dispatchers.Main: immediate выполняет синхронно если уже на Main, обычный — всегда через dispatch-очередь.
  • Бесконечный Flow без stateIn переподписывается при каждом collect, создавая дублирующие запросы к API.
  • Вызов flow.first() для получения начального значения StateFlow вместо stateFlow.value — лишний overhead.

Что портит ответ

  • Перечислять ошибки без объяснения причин
  • Не отличать beginner mistakes от production failure modes
  • Не предлагать процесс, который предотвращает повторение ошибок

Что слушает интервьюер

  • Знает типичные ошибки при работе с Kotlin Coroutines
  • Понимает причины ошибок
  • Предлагает практики prevention и early detection

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

Проверить себя по теме Kotlin Coroutines →
←Предыдущий вопросКак сравнить Kotlin Coroutines с альтернативами по performance, UX, доступу к platform APIs, найму и долгосрочной поддержке?Следующий вопрос→В чём разница между `StateFlow` и `SharedFlow`?

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

Kotlin Coroutineskotlin coroutinestechnical-communicationtechnology-selectiontrade-off-analysis

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

  • Что такое structured concurrency и почему это важно?
  • В чём разница между билдерами coroutine launch и async?
  • Что такое suspend-функция и где её можно вызывать?
  • Что такое Flow в Kotlin и чем он отличается от suspend fun, возвращающей одно значение?