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

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

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

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

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

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

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

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

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

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

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

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

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

Разработка

  • iOS1 232
  • Backend вакансии1 204
  • AI вакансии543
  • Fullstack вакансии497
  • Frontend вакансии417
  • Mobile вакансии28

По стеку

  • Go5 212
  • Java3 116
  • Kotlin1 090
  • Node.js995
  • Rust845
  • .NET661
  • PHP320
  • C++271
  • C#208

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

  • Kubernetes3 913
  • Linux-инфраструктура2 852
  • DevOps вакансии2 678
  • Terraform / IaC2 167
  • Мониторинг и Observability1 066
  • CI/CD923
  • SRE301
  • Кибербезопасность26

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

  • Аналитик данных533
  • Data Scientist436
  • Бизнес-аналитик400
  • Системный аналитик68

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

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

По регионам

  • Вакансии в США26 186
  • Вакансии в Европе10 369
  • Работа в России3 628
  • Вакансии в Канаде2 306

По формату

  • Удалённые вакансии43 484
  • Релокация в США26 186
  • Гибридная работа5 597
  • Офисная работа4 383

По уровню

  • Senior вакансии22 724
  • Middle вакансии11 726
  • Junior вакансии3 874

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

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

Вакансии из 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