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

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

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

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

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

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

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

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

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

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

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

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

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

Разработка

  • iOS1 361
  • Backend вакансии1 335
  • AI вакансии645
  • Fullstack вакансии521
  • Frontend вакансии460
  • Mobile вакансии28

По стеку

  • Go6 500
  • Java3 643
  • Node.js1 203
  • Kotlin1 161
  • Rust1 155
  • .NET787
  • PHP334
  • C++285
  • C#211

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

  • Kubernetes3 913
  • DevOps вакансии3 059
  • Linux-инфраструктура2 852
  • Terraform / IaC2 167
  • Мониторинг и Observability1 066
  • CI/CD929
  • 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 602

По уровню

  • Senior вакансии22 956
  • Middle вакансии11 692
  • Junior вакансии3 903

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

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

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

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

Что такое структура source set: commonMain, androidMain, iosMain?

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

Source sets — это логические наборы исходников с зависимостями. commonMain компилируется для всех платформ, androidMain/iosMain — только для своей. Иерархия настраивается в kotlin {} блоке build.gradle.kts.

Стандартная иерархия source sets

kotlin {
    androidTarget()
    iosX64()
    iosArm64()
    iosSimulatorArm64()

    //  Иерархия формируется автоматически при использовании
    //  стандартных имён. Вручную её можно расширить:
    sourceSets {
        // Базовый — компилируется для ВСЕХ платформ:
        val commonMain by getting {
            dependencies {
                implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1")
                implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3")
            }
        }

        // Только для Android:
        val androidMain by getting {
            dependencies {
                implementation("io.ktor:ktor-client-okhttp:2.3.12")
            }
        }

        // Промежуточный для ВСЕХ iOS-таргетов:
        val iosMain by creating {
            dependsOn(commonMain)
            dependencies {
                implementation("io.ktor:ktor-client-darwin:2.3.12")
            }
        }

        // Конкретные iOS-таргеты наследуют iosMain:
        val iosX64Main by getting { dependsOn(iosMain) }
        val iosArm64Main by getting { dependsOn(iosMain) }
        val iosSimulatorArm64Main by getting { dependsOn(iosMain) }
    }
}

Что такое source set

Source set — это именованный набор директорий с кодом (kotlin/) и ресурсами (resources/), плюс список зависимостей. Каждый source set компилируется для определённого набора таргетов. Ключевое свойство: source set может зависеть от другого (директива dependsOn), формируя иерархию.

Структура директорий на диске

shared/
  src/
    commonMain/
      kotlin/
        com/example/shared/
          models/User.kt          // доступно везде
          repos/UserRepository.kt
      resources/
    androidMain/
      kotlin/
        com/example/shared/
          actual/PlatformUtils.android.kt  // actual-реализация
    iosMain/
      kotlin/
        com/example/shared/
          actual/PlatformUtils.ios.kt      // actual-реализация
    commonTest/
      kotlin/
        com/example/shared/
          UserRepositoryTest.kt  // тесты запустятся на всех платформах
    androidUnitTest/
      kotlin/
    iosTest/
      kotlin/

expect/actual в контексте source sets

// commonMain: объявляем ожидание
expect class PlatformLogger {
    fun log(message: String)
}

// androidMain: даём реализацию
actual class PlatformLogger {
    actual fun log(message: String) {
        android.util.Log.d("App", message)
    }
}

// iosMain: даём реализацию
actual class PlatformLogger {
    actual fun log(message: String) {
        println(message)  // NSLog через println в Kotlin/Native
    }
}

Kotlin 1.9.20+ Hierarchy Template

Начиная с Kotlin 1.9.20, при использовании стандартных имён таргетов (iosX64, iosArm64, iosSimulatorArm64) промежуточный iosMain создаётся автоматически. Явный dependsOn больше не нужен:

kotlin {
    androidTarget()
    iosX64()
    iosArm64()
    iosSimulatorArm64()

    // iosMain создаётся автоматически — код пишем сюда:
    sourceSets {
        iosMain.dependencies {
            implementation("io.ktor:ktor-client-darwin:2.3.12")
        }
    }
}

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

  • Написать actual-реализацию в iosX64Main вместо iosMain — при добавлении iosArm64 компиляция упадёт с ошибкой «expect has no actual»;
  • Добавить Android-зависимость в commonMain — iOS-таргет не скомпилируется; зависимость обязана идти в androidMain;
  • Забыть про commonTest и писать тесты только в jvmTest — логика в commonMain остаётся непротестированной на iOS;
  • Создавать слишком много промежуточных source sets (например, mobileMain) без реальной необходимости — усложняет граф зависимостей;
  • Дублировать код в iosX64Main и iosArm64Main вместо iosMain — нарушает принцип единственного источника истины;
  • Использовать by creating вместо by getting для уже существующего source set — Gradle создаёт новый пустой, игнорируя существующий.

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

  • Объяснять «source sets commonMain/androidMain/iosMain» только как синтаксис и не описывать поведение runtime/compiler.
  • Игнорировать важный риск: Путаница source sets часто проявляется как unresolved reference или скрытая platform dependency в common коде.
  • Давать пример без edge case: отмены, null, recomposition, platform boundary или ошибки.

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

  • Формулирует суть темы «source sets commonMain/androidMain/iosMain» своими словами и связывает ее с кодом.
  • Называет механизм: commonMain компилируется во все targets, androidMain видит Android API, iosMain видит Apple/Native API.
  • Видит production-последствие: Путаница source sets часто проявляется как unresolved reference или скрытая platform dependency в common коде.

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

Проверить себя по теме Kotlin Multiplatform →

Источники

  • https://kotlinlang.org/docs/multiplatform/multiplatform-discover-project.html
Следующий вопрос→Какой код можно разделять между платформами, а какой должен оставаться платформо-зависимым?

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

Kotlin Multiplatformplatform-boundariessource-sets-reasoning

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

  • Какой код можно разделять между платформами, а какой должен оставаться платформо-зависимым?
  • Как структурировать KMP-проект (shared module, платформо-зависимые модули)?
  • Что такое Kotlin Multiplatform (KMP) и какие платформы он поддерживает?
  • Что такое механизм expect/actual в KMP и как он работает?