Kotlin MultiplatformMiddleExperience

В каких mobile-проектах Kotlin Multiplatform является сильным выбором, а где лучше выбрать native или другую cross-platform альтернативу?

KMP оптимален, когда команда знает Kotlin, бизнес-логика составляет >40% кода и нужен нативный UI. Flutter выигрывает при идентичном UI на обеих платформах, React Native — для TypeScript-команд.

Когда KMP — сильный выбор

Kotlin Multiplatform хорошо подходит для проектов, где основная бизнес-логика платформонезависима, а команда уже работает на Kotlin (Android). Типичные сценарии:

  • Kotlin-first Android-команда расширяется на iOS: разработчики знают язык, можно переиспользовать domain/data-слой без переписывания.
  • Финтех, e-commerce, B2B-приложения: сложная бизнес-логика (расчёты, валидация, маппинг данных) выносится в commonMain, UI остаётся нативным.
  • Приложения с богатым offline-режимом: SQLDelight + KMP позволяют использовать одну схему БД и SQL-запросы на Android и iOS одновременно.
  • Постепенная миграция: KMP интегрируется в существующий нативный проект через CocoaPods/SPM (iOS) или AAR (Android) — нет необходимости переписывать всё сразу.

Когда лучше выбрать нативный подход

  • Сложный UI с анимациями и жестами: SwiftUI и Jetpack Compose дают доступ к системным API без обёрток. Compose Multiplatform покрывает часть сценариев, но отстаёт в зрелости.
  • Высокопроизводительная графика/AR/camera: Metal (iOS) и Vulkan/OpenGL (Android) не имеют единого KMP-абстракционного слоя — platform-specific код неизбежен.
  • Команда без Kotlin-экспертизы: если iOS-разработчики пишут только на Swift, KMP создаст барьер знаний и замедлит команду.
  • Маленький MVP за 4–8 недель: нативные инструменты быстрее для прототипирования, если команда однородна по платформе.

Когда стоит рассмотреть Flutter или React Native

  • Flutter: если UI должен быть идентичен на обеих платформах (брендовые дизайн-системы без платформенных виджетов), команда знает Dart. Flutter рисует UI сам через Skia/Impeller — нет зависимости от нативных компонентов.
  • React Native: если фронтенд-команда (TypeScript/React) расширяется в мобайл. Экосистема npm доступна, но bridge-архитектура создаёт риски производительности для сложных анимаций.

Практическая матрица выбора

// Псевдокод критериев
fun choosePlatform(
    teamKnowledge: Set<String>,
    uiComplexity: Level,
    sharedLogicRatio: Float, // 0.0..1.0
    timeToMarket: Weeks
): Recommendation {
    return when {
        "kotlin" in teamKnowledge && sharedLogicRatio > 0.4 -> KMP
        uiComplexity == Level.HIGH && "swift" in teamKnowledge -> Native
        "dart" in teamKnowledge && sharedLogicRatio > 0.7 -> Flutter
        "typescript" in teamKnowledge -> ReactNative
        else -> Native // default: нанять нативных разработчиков
    }
}

Риски найма и долгосрочной поддержки

KMP-разработчики на рынке редки — большинство это Android-разработчики с экспертизой KMP. iOS-специалисты часто воспринимают KMP как угрозу своему стеку, что создаёт культурное сопротивление в команде. Учитывайте это при планировании найма.

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

  • Compose Multiplatform ≠ Kotlin Multiplatform: KMP отвечает за shared-логику, CMP — за shared-UI. Путаница приводит к завышенным ожиданиям по переиспользованию UI-кода.
  • iOS-симулятор vs реальное устройство: код, написанный для iosX64 (симулятор), может вести себя иначе на iosArm64 (устройство) из-за ABI-различий.
  • Kotlin/Native GC vs ARC: до Kotlin 1.9.20 объекты в Kotlin/Native использовали другую модель памяти. Убедитесь, что команда понимает текущую GC-модель (experimental в 1.9, stable в 2.0).
  • Gradle-сложность: мультиплатформенные build-скрипты с несколькими target-ами сложнее отлаживать. Время сборки растёт нелинейно с добавлением targets.
  • Библиотечная экосистема: многие популярные Android-библиотеки (Room, Retrofit, Dagger) не имеют KMP-версий. Альтернативы (SQLDelight, Ktor, Koin) зрелые, но требуют обучения.
  • Отладка на iOS: нет нормальной интеграции Kotlin-отладчика с Xcode. Отлаживать Kotlin/Native код в production-сценариях существенно сложнее, чем Android.

What hurts your answer

  • Сравнивать Kotlin Multiplatform с альтернативами по одному признаку
  • Путать личную привычку с инженерным критерием выбора
  • Не учитывать migration cost и vendor/ecosystem lock-in

What they're listening for

  • Сравнивает Kotlin Multiplatform по нескольким инженерным осям
  • Не путает популярность с пригодностью
  • Понимает migration cost и долгосрочную поддержку

Related topics