KMP vs Flutter: 4 сценария, когда нужно сделать ставку на Kotlin Multiplatform, а не Flutter

Привет, это Максим Павлов— управляющий партнёр KTS. Мы создаём IT-продукты для бизнеса.

Кроссплатформенные инструменты помогают бизнесу не писать код два раза под iOS и Android, а переиспользовать его на обеих платформах. В статье — о том, чем Kotlin Multiplatform отличается от Flutter и в каких случаях он переигрывает и уничтожает Flutter.

KMP vs Flutter: 4 сценария, когда нужно сделать ставку на Kotlin Multiplatform, а не Flutter

При переходе от нативной разработки к кроссплатформенной многие выбирают Flutter, мы выбрали KMP. Я поспрашивал у нашего руководителя мобильной разработки Максима Мялкина, почему мы выбрали его, а не попсовый Flutter — делюсь результатами.

Максим Мялкин 
Руководитель мобильной разработки KTS

Kotlin Multiplatform (KMP) — раньше был известен еще как Kotlin Multiplatform Mobile‎ (KMM).

Кратко про KMP

KMP — это технология, которая помогает разработчикам переиспользовать общий код на языке Kotlin в обеих версиях мобильного приложения: для iOS и Android. KMP разработали в компании Jetbrains, которая сделала язык Kotlin — основной язык разработки приложений под Android.

Приложение на Kotlin Multiplatform состоит из трех частей:

  • общего кода, который описывает логику сразу для двух платформ,
  • кода интерфейс под iOS,
  • кода интерфейс под Android.

Простой пример, как выглядят эти части в реальности: представьте, вам нужно разработать приложение с регистрацией.

У вас будет интерфейс (отдельно под Android, отдельно под iOS), причем довольно простой: два поля ввода, кнопка «далее» и место для ввода кода из SMS.

При этом, за таким простым интерфейсом будет скрываться и своя логика: таймер, который отсчитывает время отправки кода, правила, по которым его нужно отправлять — это будет общий код, одинаковый и для iOS, и для Android.

Кратко про Flutter

Flutter — это более популярный кроссплатформенный фреймворк.

Главная особенность Flutter заключается в использовании одной кодовой базы на языке Dart вместо нескольких для Android и iOS платформ.

То есть, тогда как KMP фокусируется на бизнес-логике и позволяет использовать нативные инструменты каждой платформы для создания пользовательского интерфейса, Flutter предоставляет собственную систему виджетов для создания UI, которая позволяет создавать единый пользовательский интерфейс для всех платформ.

4 сценария, когда вам подойдет KMP

Выбор Flutter может быть предпочтительным, если вам нужно разработать приложение в короткие сроки и вы готовы мириться с ограничениями по дизайну. Согласно данным Surf, разработка на Flutter экономит до 40% времени по сравнению с нативной, тогда как у KMP этот показатель у нас в KTS варьируется между 20-25%.

Однако есть ситуации, когда стоит сделать выбор в пользу KMP.

#1. Вы не хотите долго искать разработчиков

Для работы на Flutter требуется знание языка программирования Dart. Разработчиков на Flutter тяжело найти на рынке — по данным того же hh.ru, сейчас их всего 1877 человек в России. Вы, конечно, можете нанять обычных Android- и iOS-разработчиков, но тогда надо будет потратить время на их переучивание. Без этого они и строчки не напишут.

Для работы на KMP не нужны «специальные» разработчики. KMP требует знание языка Kotlin, а значит вам подойдёт любой Android-разработчик: их, в настоящее время, по данным hh.ru, на рынке более 29 тысяч человек.

Если говорить про iOS-разработчиков, то iOS-интерфейс для KMP-приложений они могут сделать, не изучая KMP. Если вы хотите, чтобы помимо интерфейса, они смогли разработать еще и логику, то нужно закладывать от одного до четырех месяцев на их погружение в KMP с нуля. Но вы можете этого не делать и оставить реализацию логики Android-разработчику.

#2. Вам в приложении нужно использование блютуса, приём звонков и другие нативные фичи

Поскольку Flutter работает с языком Dart, то для настройки интеграции с нативными фичами — звонками или блютусом — придётся разрабатывать бриджи. Это механизмы, которые обеспечивают связь между нативным кодом, который сможет работать с этими фичами, и кроссплатформенным кодом на Dart.

В KMP же эта функция реализована нативно, следовательно SDK от производителя оборудования легко подключить. В итоге вы можете быстрее настроить интеграцию.

Как это реализуется на практике, можно посмотреть в нашем разборе мобильного приложения для управляющей компании застройщика Мангазея. Там мы написали приложение на KMP и без труда подключили в приложение модуль, который поставляет производитель домофонов.

#3. Вам важна нативность интерфейса

Flutter обеспечивает высокую скорость разработки, но в нём больше ограничений, которые накладываются на реализацию интерфейса. В KMP меньше ограничений, но создание интерфейсов занимает больше времени.

Да, конечно, во Flutter можно постараться и создать нативно выглядящий интерфейс под каждую платформу, а в KMP — использовать compose multiplatform, который позволяет делать единый интерфейс для обеих платформ. Но это скорее исключения из общепринятых подходов.

Вывод: если вам важен максимально нативный интерфейс для пользователей платформы или вы стремитесь сделать премиальный продукт, то выбирайте KMP.

#4. Вам важен плавный переход с нативного приложения

Как я и сказал выше, вам не придётся обучать всех разработчиков новому языку. Можно обучить iOS-разработчиков Kotlin или не обучать и оставить им только интерфейс и платформо-специфичные функции, такие как блютус.

Также KMP — подходящий вариант, так как вам не нужно будет переписывать всё приложение с нуля, как того потребует Flutter.

На KMP можно переписывать код по частям, начиная с модулей, которые планируется развивать и чаще дорабатывать, и в которых есть общая логика.

Пример: у вас уже есть два нативных приложения. Вы можете встроить новые экраны, которые написаны на KMP, в старые приложения без необходимости переписывать весь апп. Следовательно, вам не нужно инвестировать много времени в переезд на KMP.

Кто и почему использует КМР

Сейчас KMP используют Avito, Google, Netflix и Тинькофф. Число компаний, которые его используют, растет с каждым годом.

Мы в KTS выбрали КМР по 3 критериям:

  • нет ограничений на реализацию интерфейсов — они нативны
  • простота подбора команды: используем тех же Android-разработчиков, что уже работают в штате над другими проектами, а iOS-специалистов быстро доучиваем
  • экономия денег клиентов: большая часть наших проектов связана с бизнес-приложениями, в которых логика занимает основную часть разработки

Если совсем коротко

Flutter — это решение для быстрого запуска небольшого продукта в том случае, если вы готовы мириться с ограничениями готовых компонентов.

Однако если у вас:

  • премиальный продукт и вы хотите повысить комфорт пользователя,
  • есть планы нанять разработчиков в штат
  • в команде есть готовые разработчики на Android и iOS,
  • уже есть нативное приложение,
  • вам нужно использование блютуса, приём звонков и другие нативные фичи,

то лучше использовать KMP, позволяющий создать максимально привычный интерфейс.

Кроме того, некоторые проекты, которые основываются на картах, либо имеют движок карт, имеют свои ограничения и требуют нативных элементов каждой платформы, поэтому при работе с ними Flutter использовать не получится.

4545
92 комментария

За 20 лет в ИТ могу сказать что трудозатраты на разработку UI всегда недооценивают и в общем объеме проекта они и съедают огромное количество человеко-часов и в основой части проекта и в последующем развитии и исправлении дефектов. А то что называют весомым словосочетанием "бизнес-логика" обычно делается относительно легко и в предсказуемые сроки в общем-то на любом языке. И я сейчас не только про простенькие приложения, но и про суровые Enterprise системы для большого бизнеса.

Поэтому необходимость дважды пилить UI считаю серьезным недостатком KMP.

Однако, спасибо за обзор, это очень полезно знать.

11
Ответить

Под “бизнес-логикой” люди часто понимают разное. И в KMP действительно можно выносить в кроссплатформу разные части, по потребности. В статье мы не стали раскрывать что именно туда входит, тк не хотели закапываться в технику, но кратко опишу тут.
Кто-то в KMP выносит только логику работы с данными, а кто-то всю логику: презентационную, доменную, логику работы с источниками данных. Более детально можно посмотреть в опросе от JB (https://blog.jetbrains.com/kotlin/2021/10/multiplatform-survey-q1-q2-2021/). В наших проектах мы идем по второму пути, и поэтому из KMP-части прилетает только UiState, который нужно отрисовать на UI на платформах и передать из платформ в KMP событие от пользователя. Так получается достичь большего переиспользования.

3
Ответить

В основном мы как раз делаем приложения для бизнесов, в которых часто разработка интерфейса занимает либо меньше, либо столько же, сколько тратится на логику, всякие синхронизации с сервером, локальное хранение.

Поэтому эффект действительно ощутимый и для клиентов важна возможность сделать интерфейс нативным для пользователей каждой платформы

Но для кейсов где требований к нативности нет, можно использовать compose multiplatform

3
Ответить

Каждый из этих пунктов бред.

1. По опыту ищутся они также как и другие кодеры. Нам не нужен отряд разрабов, нам нужны 1-5 хороших
2. Для любой нативной фичи есть готовые пакеты, за 3 года работы с флаттером я ни разу не был в ситуации, где мне требовалось бы что-то писать ручками на нативе, обертки на дарте есть для всего.
3. Флаттеровские виджеты сейчас выглядят абсолютно также также, как и нативные. Может раньше и были еле заметные отклонения в анимациях с айосом, но сейчас даже их нет
4. Мне интересно посмотреть на разработчиков, которые на мидл/сеньор позиции на нативе пойдут учить флаттер. Далеко не каждый джун на такое пойдет. Для переписывания на другой язык/фреймворк нанимают людей, которые уже умеют на нем писать. А истории по типу где ты и швец, и жнец, обычно в компаниях, где весь айти отдел это полтора человека, думаю даже рассматривать смысла нет. Плавный переход кстати тоже осуществляется без проблем, такие кейсы тоже есть.

Итого что имеем. Если у вас мало интерфейса, но много логики, нужно брать кмп. Но по такой же логике можно брать хоть c++ разрабов, их на рынке на порядок больше айосов и андроидов вместе взятых.

Мое негодование вызвано тем, что чтобы показать кмп в лучшем свете зачем то приводят бредовые аргументы сравнивая с флаттером. Зачем говорить, что кмп переиграл и уничтожил флаттер? Вы сами сказали, что на флаттере экономия 40 процентов, а у вас 20-25. Хотя по опыту экономия 60-80.

Итого получается совершенно обратная ситуация, за исключением совсем спецефичных моментов флаттер переигрывает и уничтожает кмп, а не наоборот

UPD: на счет премиальности. Существует огромное количество "премиальных" приложений на флаттере. Так же как и для крупного бизнеса. Так что утверждение что он только для пет проектов и стартапов тоже бред

8
Ответить

Комментарий недоступен

1
Ответить

1. Опыт найма лично вами одного или 5 в разные моменты времени не опровергает факта, что их просто меньше в 2.5 раза. Из этой пропорции следует что нанять их при прочих равных сложнее.

2. На сколько сложные фичи с нативными штуками вам приходилось делать? В статье четко написано, что речь про глубокую работу с нативными фичами. Если делать приложения для рынка, в котором не требуется глубокая работа с нативкой, то даже за долгое время можно так и не столкнуться с ситуацией, в которой требуется что-то написать руками

3. Касаемо виджетов - реализованные виджеты не всегда ведут себя так, как на платформе.

Для примеров можно открыть тысячи issue платформ ios и android (https://github.com/flutter/flutter/issues?q=is%3Aopen+label%3Aplatform-ios%2Cplatform-android+). Некоторые из проблем кажутся незначительными. Но есть и глобальные, например: 1(https://github.com/flutter/flutter/issues/82906), 2(https://www.reddit.com/r/FlutterDev/comments/yywx66/attn_all_your_vote_is_needed_to_fix_critical/), 3(https://www.reddit.com/r/FlutterDev/comments/1140pdv/two_years_later_flutters_biggest_problem/)

4. Нативных разработчиков имеет смысл пересаживать на KMP, потому что можно ощутимо сэкономить не переучиваясь.

Можно сохранить команду, которая уже в курсе всех деталей бизнеса, но при этом сэкономить в деньгах и скорости

5. Если мало интерфейса, но много логики действительно лучше брать KMP. C++ разрабы не сравнятся в скорости разработки с разрабами на Kotlin и swift, на сколько бы много их не было

6. Премиальность. В статье описаны причины и аргументы, почему премиальные приложения лучше делать с нативными интерфейсами. Факт, что кто-то делает их на флаттере / реакт нейтиве / ксамарине не опровергает этот аргумент

P. S. Ну а переиграл и уничтожил - это мэм такой, а суть чётко описана в заголовке - 4 сценария, когда kmp лучше флаттера

Ответить

Из всей статьи можно сделать вывод, KMP нужен только в том случае, когда у вас уже есть команда нативщиков, а заказчики их не хотят брать, потому как дорого, а изучать новую технологию они не хотят. Все остальное из пальца высосано, помимо этого автор не рассказал о мешке проблем, с которыми столкнулись при использовании KMP в проде, а не для pet проектов.

5
Ответить