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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python11 079
  • Облачные технологии4 127
  • QA вакансии1 598
  • Android1 395
  • Инженер данных767
  • Продакт-менеджер295

Разработка

  • Backend вакансии1 342
  • iOS1 307
  • AI вакансии660
  • Fullstack вакансии524
  • Frontend вакансии465
  • Mobile вакансии28

По стеку

  • Go6 622
  • Java3 670
  • Kotlin1 199
  • Node.js1 190
  • Rust1 181
  • .NET780
  • PHP329
  • C#211
  • C++206

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

  • DevOps вакансии3 024
  • Kubernetes2 336
  • Linux-инфраструктура1 899
  • Terraform / IaC1 428
  • CI/CD848
  • Мониторинг и Observability650
  • SRE220
  • Кибербезопасность35

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

  • Аналитик данных464
  • Data Scientist434
  • Бизнес-аналитик337
  • Системный аналитик48

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

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

По регионам

  • Вакансии в США23 332
  • Вакансии в Европе9 074
  • Работа в России2 931
  • Вакансии в Канаде2 054

По формату

  • Удалённые вакансии40 752
  • Релокация в США23 332
  • Гибридная работа3 446
  • Офисная работа2 568

По уровню

  • Senior вакансии19 645
  • Middle вакансии11 602
  • Junior вакансии3 620

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

Все компании
  • Wise196 вакансий
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify38 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 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 и как он работает?