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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python5 973
  • Облачные технологии4 523
  • QA вакансии1 689
  • Android1 143
  • Инженер данных788
  • Продакт-менеджер308

Разработка

  • iOS1 093
  • Backend вакансии1 020
  • Fullstack вакансии448
  • AI вакансии378
  • Frontend вакансии369
  • Mobile вакансии27

По стеку

  • Go3 345
  • Java2 037
  • Kotlin908
  • Node.js746
  • Rust492
  • .NET481
  • PHP278
  • C++213
  • C#199

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

  • Kubernetes2 562
  • Linux-инфраструктура2 030
  • DevOps вакансии1 855
  • Terraform / IaC1 548
  • CI/CD876
  • Мониторинг и Observability709
  • SRE229
  • Кибербезопасность40

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

  • Аналитик данных479
  • Data Scientist443
  • Бизнес-аналитик342
  • Системный аналитик50

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

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

По регионам

  • Вакансии в США24 039
  • Вакансии в Европе9 373
  • Работа в России2 968
  • Вакансии в Канаде2 114

По формату

  • Удалённые вакансии41 595
  • Релокация в США24 039
  • Гибридная работа5 209
  • Офисная работа3 834

По уровню

  • Senior вакансии22 591
  • Middle вакансии12 174
  • Junior вакансии4 013

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

Все компании
  • Rakuten189 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Wise81 вакансия
  • Infobip28 вакансий
  • Darktrace17 вакансий
  • Spotify17 вакансий
  • Celonis14 вакансий
  • UiPath13 вакансий
  • Adyen9 вакансий

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

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

Как структурировать KMP-проект (shared module, платформо-зависимые модули)?

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

KMP-проект состоит из shared-модуля (commonMain/androidMain/iosMain source sets), Android Gradle-модуля и Xcode-проекта для iOS; shared компилируется в AAR для Android и XCFramework для iOS.

Типовая структура директорий

my-kmp-project/
├── androidApp/                    # Android-приложение (модуль Gradle)
│   ├── src/main/
│   └── build.gradle.kts
├── iosApp/                        # Xcode-проект
│   ├── iosApp.xcodeproj/
│   └── iosApp/
│       └── ContentView.swift
├── shared/                        # Общий KMP-модуль
│   ├── src/
│   │   ├── commonMain/kotlin/     # Общая бизнес-логика
│   │   ├── commonTest/kotlin/     # Общие тесты
│   │   ├── androidMain/kotlin/    # Android-реализации expect
│   │   ├── androidTest/kotlin/
│   │   ├── iosMain/kotlin/        # iOS-реализации expect
│   │   └── iosTest/kotlin/
│   └── build.gradle.kts
├── build.gradle.kts               # Корневой build файл
└── settings.gradle.kts

Структура KMP-проекта

Стандартный KMP-проект состоит из трёх слоёв: общий shared-модуль с кросс-платформенной логикой, платформо-зависимые модули (androidApp, iosApp) и, при необходимости, дополнительные feature-модули. Генератор на kmp.jetbrains.com создаёт правильный скелет автоматически.

Конфигурация shared/build.gradle.kts

plugins {
    alias(libs.plugins.kotlinMultiplatform)
    alias(libs.plugins.androidLibrary)
    alias(libs.plugins.kotlinxSerialization)
}

kotlin {
    androidTarget {
        compilations.all {
            kotlinOptions.jvmTarget = "11"
        }
    }
    iosArm64()
    iosSimulatorArm64()
    iosX64()  // для Intel Mac

    sourceSets {
        commonMain.dependencies {
            implementation(libs.kotlinx.coroutines.core)
            implementation(libs.kotlinx.serialization.json)
            implementation(libs.ktor.client.core)
        }
        commonTest.dependencies {
            implementation(libs.kotlin.test)
        }
        androidMain.dependencies {
            implementation(libs.ktor.client.okhttp)
        }
        iosMain.dependencies {
            implementation(libs.ktor.client.darwin)
        }
    }
}

android {
    namespace = "com.example.shared"
    compileSdk = 34
    defaultConfig { minSdk = 24 }
}

Внутренняя организация commonMain

Внутри commonMain рекомендуется layer-архитектура по пакетам:

commonMain/kotlin/com/example/
├── data/
│   ├── remote/          # Ktor-клиенты, DTO
│   ├── local/           # SQLDelight queries
│   └── repository/      # Реализации репозиториев
├── domain/
│   ├── model/           # Domain-модели
│   ├── repository/      # Интерфейсы репозиториев
│   └── usecase/         # Use cases / interactors
├── presentation/        # ViewModels (если используется KMP ViewModel)
└── Platform.kt          # expect-декларации

Несколько feature-модулей

Для больших проектов shared делится на feature-модули:

// settings.gradle.kts
include(":androidApp")
include(":shared:core")
include(":shared:feature-auth")
include(":shared:feature-feed")

// shared/feature-auth/build.gradle.kts
kotlin {
    androidTarget()
    iosArm64(); iosSimulatorArm64()

    sourceSets {
        commonMain.dependencies {
            api(project(":shared:core"))
        }
    }
}

Подключение shared к androidApp

// androidApp/build.gradle.kts
dependencies {
    implementation(project(":shared"))
}

Подключение shared к Xcode

Запускается задача Gradle, которая создаёт XCFramework, затем он подключается в Xcode как Framework Search Path или через SPM:

# Сборка debug-фреймворка для симулятора
./gradlew :shared:assembleSharedDebugXCFramework

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

  • iosMain не создаётся автоматически при нескольких iOS-таргетах — нужно явно создать промежуточный source set и настроить dependsOn(commonMain) для iosArm64Main, iosSimulatorArm64Main и iosX64Main.
  • androidTarget() против android() — в Kotlin 1.9+ используется androidTarget(); старый android() депрекирован и вызовет предупреждения при сборке.
  • Неправильный namespace в android-блоке — если namespace не совпадает с applicationId в манифесте, R-классы не будут найдены.
  • Зависимости должны поддерживать нужные таргеты — Android-only библиотека, добавленная в commonMain, вызовет ошибку линковки на iOS; всегда проверяйте поддерживаемые таргеты.
  • iosApp не является Gradle-модулем — Xcode-проект управляется отдельно; изменения в shared требуют пересборки фреймворка и обновления в Xcode.
  • Конфликты версий зависимостей между модулями — при разбивке на feature-модули один модуль может подтянуть несовместимую версию транзитивной зависимости; используйте platform BOM или явно выравнивайте версии.
  • Gradle Configuration Cache не поддерживается некоторыми KMP-плагинами — включение org.gradle.configuration-cache=true может ломать сборку; проверяйте совместимость.

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

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

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

  • Объяснять «структура KMP-проекта» только как синтаксис и не описывать поведение runtime/compiler.
  • Игнорировать важный риск: Плохая структура приводит к циклическим зависимостям, platform leakage и невозможности тестировать common logic.
  • Давать пример без edge case: отмены, null, recomposition, platform boundary или ошибки.

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

  • Формулирует суть темы «структура KMP-проекта» своими словами и связывает ее с кодом.
  • Называет механизм: Gradle targets, sourceSets и dependencies определяют, какой код и библиотеки доступны конкретной компиляции.
  • Видит production-последствие: Плохая структура приводит к циклическим зависимостям, platform leakage и невозможности тестировать common logic.

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

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

Источники

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

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

Kotlin Multiplatformplatform-boundariesproject-structure-reasoning