KMP vs Flutter: 4 сценария, когда нужно сделать ставку на Kotlin Multiplatform, а не Flutter
Привет, это Максим Павлов— управляющий партнёр KTS. Мы создаём IT-продукты для бизнеса.
Кроссплатформенные инструменты помогают бизнесу не писать код два раза под iOS и Android, а переиспользовать его на обеих платформах. В статье — о том, чем Kotlin Multiplatform отличается от Flutter и в каких случаях он переигрывает и уничтожает Flutter.
При переходе от нативной разработки к кроссплатформенной многие выбирают Flutter, мы выбрали KMP. Я поспрашивал у нашего руководителя мобильной разработки Максима Мялкина, почему мы выбрали его, а не попсовый Flutter — делюсь результатами.
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 использовать не получится.
Мелкий и средний бизнес выбирает flutter, поскольку он значительно экономит финансы на разработку. Не "нативность" UI он часто не принимает во внимание, когда речь идёт о каком-то каталоге товаров или условном небольшом личном кабинете. А учитывая, что этот же разработчик ещё может и веб админку сверстать, делает его (разработчика) очень ценным для бизнеса. Поэтому спрос на такие скилы очень высокий и думаю будет расти и дальше. Что делает flutter технологию весьма востребованной у этого сегмента рынка. И мне как разработчику очень важен этот аспект и я бы предпочел развиваться именно в эту сторону . Имхо у flutter и kmp разные сегменты рынка и я не вижу острой конкуренции между ними. Они играют на разных полях
С точки зрения разработчика хорошая стратегия, стать одним из 1900 человек, которые умеют во flutter:)
А с точки зрения заказчика/работодателя получается наоборот))
А насчёт разных рынков вы правы, для этого и написали статью, чтобы подсветить кейсы, в которых KMP лучше решает задачу чем Flutter
И про сотрудников, напомню что 5000 андройд разработчиков, не значит KMM разработчиков. Большинство уже на собесе отказываются, когда узнают, что КММ проект, а не нативка
По нашему опыту другая ситуация - ребятам интересно с этим работать. И отказов из-за KMP не было. Если у вас есть статистика на большом масштабе, было бы интересно взглянуть.
Что касается порога входа - андроид разработчику не составляет никаких проблем перейти на KMP: сменить несколько библиотек, изучить несколько нюансов как написать код, чтобы в ios было легко с ним работать (можно делать в процессе дальнейшей разработки уже, если не сталкивался до этого). В остальном все очень схоже, если у разработчика есть опыт работы с актуальным стеком на android.
У нас было 3 попытки перевести часть разработчиков на КММ, чтобы сохранить нативных андройд разработчиков, по итогу текучка у таких сотрудников была под 80%, либо на flutter, либо в другие компании.