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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 222
  • Облачные технологии14 153
  • QA вакансии3 463
  • Backend вакансии2 114
  • Инженер данных1 798
  • Продакт-менеджер1 248

Разработка

  • Android1 858
  • iOS1 698
  • Fullstack вакансии997
  • AI вакансии955
  • Frontend вакансии755
  • Mobile вакансии44

По стеку

  • Go8 725
  • Java6 580
  • Node.js2 032
  • .NET1 731
  • Kotlin1 619
  • Rust1 471
  • C#717
  • PHP689
  • C++580

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

  • Kubernetes7 778
  • DevOps вакансии6 080
  • Linux-инфраструктура5 500
  • Terraform / IaC4 278
  • CI/CD3 272
  • Мониторинг и Observability1 790
  • SRE567
  • Кибербезопасность454

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

  • Data Scientist1 138
  • Бизнес-аналитик921
  • Аналитик данных857
  • Системный аналитик154

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

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

По регионам

  • Вакансии в США44 166
  • Вакансии в Европе24 014
  • Вакансии в Канаде4 535
  • Работа в России3 868

По формату

  • Удалённые вакансии75 003
  • Релокация в США44 160
  • Гибридная работа12 465
  • Офисная работа7 099

По уровню

  • Senior вакансии42 643
  • Middle вакансии20 963
  • Junior вакансии6 714

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis38 вакансий
  • Spotify37 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

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

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

Расскажите о случае, когда особенности Kotlin повлияли на архитектурное решение, производительность или сопровождение проекта.

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

Особенности Kotlin (data class, sealed class, extension functions, корутины) регулярно влияют на архитектуру: sealed class делает конечные автоматы exhaustive, extension functions разделяют ответственность без наследования.

Кейс 1: sealed class для конечных автоматов

В проекте на Ktor требовалось моделировать состояния платёжной транзакции. Java Enum не позволял нести данные. Kotlin sealed class решил задачу элегантно:

sealed class PaymentState {
    object Pending : PaymentState()
    data class Processing(val processorId: String) : PaymentState()
    data class Success(val transactionId: String, val amount: Long) : PaymentState()
    data class Failed(val code: String, val message: String) : PaymentState()
    data class Refunded(val refundId: String) : PaymentState()
}

fun handleState(state: PaymentState): String = when (state) {
    is PaymentState.Pending -> "Ожидание"
    is PaymentState.Processing -> "Обработка через ${state.processorId}"
    is PaymentState.Success -> "Успех: ${state.transactionId}"
    is PaymentState.Failed -> "Ошибка: ${state.message}"
    is PaymentState.Refunded -> "Возврат: ${state.refundId}"
    // Компилятор требует обработки всех случаев — exhaustive when
}

Архитектурный эффект: добавление нового состояния компилятор отмечает как ошибку во всех when-блоках без else — полная безопасность при рефакторинге.

Как особенности Kotlin влияют на архитектуру

Kotlin — не просто «Java с синтаксическим сахаром». Ряд языковых особенностей напрямую определяет архитектурные решения в production-проектах.

Кейс 2: extension functions вместо наследования

Нужно было добавить метод toDomain() к сгенерированным Protobuf-классам без изменения их кода:

// Protobuf-класс из другого модуля (изменить нельзя)
// class UserProto { val id: String; val email: String }

// Extension function в domain-модуле
fun UserProto.toDomain(): User = User(
    id = UserId(this.id),
    email = Email(this.email)
)

// Extension на коллекции
fun List<UserProto>.toDomain(): List<User> = map { it.toDomain() }

Это позволило держать маппинг в domain-слое без загрязнения Protobuf-классов или создания отдельных Mapper-классов.

Кейс 3: корутины и архитектура репозитория

Kotlin Coroutines изменили интерфейс репозитория: вместо RxJava Observable или callback — suspend functions и Flow:

interface UserRepository {
    suspend fun getUser(id: UserId): User          // одноразовый запрос
    fun observeUser(id: UserId): Flow<User>        // поток изменений
    suspend fun updateUser(user: User): Unit
}

class UserRepositoryImpl(
    private val api: UserApi,
    private val dao: UserDao
) : UserRepository {

    override suspend fun getUser(id: UserId): User =
        withContext(Dispatchers.IO) {
            dao.getUser(id.value) ?: api.fetchUser(id.value).also {
                dao.insert(it)
            }
        }

    override fun observeUser(id: UserId): Flow<User> =
        dao.observeUser(id.value) // Room возвращает Flow
            .map { it.toDomain() }
            .flowOn(Dispatchers.IO)
}

Кейс 4: data class и иммутабельность

Иммутабельные data class упростили concurrent доступ к состоянию — не нужны locks для чтения:

@Immutable
data class AppConfig(
    val apiUrl: String,
    val timeoutMs: Long,
    val retries: Int
)

// Обновление через copy() — потокобезопасно для чтения
val newConfig = config.copy(timeoutMs = 10_000L)
_config.value = newConfig // атомарное обновление StateFlow

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

  • data class copy() — поверхностное копирование; вложенные List/Map всё равно изменяемы.
  • sealed class из разных модулей требует rebuild всех зависимых при добавлении subclass.
  • Extension functions не имеют доступа к private-членам — иногда нужен refactoring для тестируемости.
  • companion object инициализируется при первом обращении к классу — lazy инициализация с побочными эффектами может удивить.
  • Flow без flowOn(Dispatchers.IO) выполняется на вызывающем диспетчере — блокирует Main поток.
  • when без else для не-sealed типов компилируется без ошибки — exhaustive проверка только для sealed.
  • operator fun invoke() на object может сбить с толку — выглядит как функция, является объектом.

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

  • Выдумывать опыт или говорить слишком общими фразами
  • Не объяснять свою личную роль в работе с Kotlin
  • Не показывать результат, метрики или извлечённые уроки

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

  • Может подготовить честный пример использования Kotlin
  • Показывает свою роль, решения и результат
  • Умеет рефлексировать над trade-offs и уроками

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

Проверить себя по теме Kotlin →
←Предыдущий вопросВ чём разница между `class`, `object` и `companion object` в Kotlin?Следующий вопрос→Что такое Kotlin Multiplatform (KMP) и Compose Multiplatform?

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

Kotlinexperience-storytellingtechnical-communicationtechnology-selectiontrade-off-analysis

Вакансии с этим навыком

Kotlin вакансии
  • Tech Lead Manager, Software Engineering
  • Senior Staff Software Engineer, Mobile (Android and iOS) - Hyderabad, India
  • Senior Backend Engineer (Java/Kotlin)
  • Junior Android Developer
  • Sr iOS Developer (AI-assisted), remote

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

  • Что такое structured concurrency в Kotlin?
  • Для каких задач Kotlin является сильным выбором, а где лучше честно выбрать другой язык?
  • В чём разница между val и var в Kotlin?
  • В чём разница между List и MutableList в Kotlin?