Согласно нашей статистике, 93% наших Клиентов, которые решили создать кроссплатформенное приложение, просят использовать фреймворк Flutter. И только единицы из этого числа на самом деле знают, что такое Flutter и почему им «писать надо именно на нем».  Привет! Меня зовут Громова Алена, я — основатель компании по разработке мобильных приложений. И сегодня мы поговорим про Flutter.  Клиенты говорят примерно одинаковые вещи: «Платить двум отдельным программистам, чтобы написать приложение под iOS и Android больше не нужно, ведь есть Flutter, где один программист может написать сразу под обе платформы.» При этом мало кто спрашивает «Есть ли нюансы?». А нюансы есть, и довольно интересные. Прямо сейчас я предлагаю всем заинтересованным разобраться в них. С нашей помощью, конечно.К делу мы подошли обстоятельно и подробно разобрали тему с экспертами в данном вопросе — нашими разработчиками, имеющими существенный опыт как в нативной, так и в кроссплатформенной разработке. Flutter и натив (нативная разработка — создание приложений под конкретную платформу, на «родном» для неё языке программирования) — это основные стеки нашей команды. За долгие годы мы повидали достаточно и со многим сталкивались. На Flutter пишем с 2018 года, почти с момента выхода альфа‑версии этого фреймворка. Мой главный соавтор — это Евгений. Именно с ним, в 2018 году мы написали для клиента наш первый Flutter‑проект на тему охраны периметров огромных предприятий. Евгений начал свою карьеру еще в 2012 году как Android‑разработчик, в 2018 перешел на Flutter и параллельно осваивает iOS. Формат нашей статьи местами будет похож на ток‑шоу, ведь перед ее написанием мы провели интервью внутри коллектива, собрали разные точки зрения, аргументы «за» и «против» Flutter.  Ну что, приступим? Кому будет полезна эта статья: Тем, кто хочет заказать свой первый проект, но не определились с типом разработки, не зная, какой из них экономнее и при каких условиях. Тем, кто сомневается, переходить ли с натива на Flutter. Начинающим или действующим разработчикам, которые сомневаются, стоит ли им осваивать Flutter. Для начала немного общих сведений о предмете разговора. Итак, что есть Flutter? Flutter — это открытый и бесплатный фреймворк для создания кросс‑платформенных мобильных приложений, а также web и десктопных приложений. Этот фреймворк разработан и поддерживается компанией Google. Flutter позволяет разработчикам использовать один и тот же код для разработки приложений под Android, iOS, веб и для десктопных платформ (Windows, macOS, Linux). Впрочем, эти сведения вы и сами легко можете найти в интернете. Как по мне — куда ценнее услышать мнение действующего программиста, дающее понимание причин популярности фреймворка. Вот что говорит наш Flutter‑разработчик Евгений: Flutter — это продукт, созданный гигантом Google. Если мы создаем кроссплатформенное приложение, используя фреймворк Flutter — это означает, что приложения под Android & iOS будут компилироваться сразу в нативный код. Google предоставляет современные инструменты и архитектурные средства, благодаря которым приложения создаются быстрее и получаются качественнее. Благодаря C++ движку для отрисовки элементов и качественной оптимизации, приложения, написанные на Flutter, ничем не уступают в скорости нативным приложениям, а анимации и другие кастомизации интерфейса зачастую выглядят более естественно. А поскольку разработкой данной среды занимается непосредственно Google, вопрос о поддержке новых версий операционных систем в будущем автоматически отпадает. Единая база кода позволяет спроектировать и написать свой код единожды, а затем использовать его на двух платформах, что сокращает цикл разработки и стоимость внесения изменений по сравнению с полностью нативными решениями.Слоган Flutter: «Beautiful native apps in record time», что переводится как «Красивые нативные приложения в рекордные сроки». Кроссплатформенную часть кода можно совмещать с традиционно‑нативным кодом (Swift/Java/Kotlin) в любом количестве и иметь возможность дорабатывать приложение силами нативных команд разработки.  Даже самые крупные компании в производстве своих приложений полностью переходят на Flutter и создают на его базе основной код, который будет использоваться во всех последующих продуктах компании. Действительно, такие компании как Alibaba, Philips Hue, Hamilton, Tencent, Grab, Groupon, ГК «Дикси», «Яндекс» уже работают на Flutter. Впрочем, список систем и бизнесов, которые уже доверились Flutter, перейдя на фреймворк полностью или частично, говорит сам за себя. Несколько лет назад, когда Flutter только возник, актуальность вопроса, писать ли на Flutter, еще стояла. Сейчас этого вопроса уже нет. Бесплатные библиотеки для Flutter активно развиваются и обновляются, покрывая актуальные задачи современной разработки. Если с вопросом актуальности и общих сведений мы разобрались, то теперь хотелось бы осветить все нюансы и поглубже разобраться в возможностях для разработчиков и выгодах для Клиентов. Об этом следующая часть. В деле разработки, наиболее насущные вопросы от Клиента звучат так: «Один разработчик на Flutter, покрывающий сразу несколько сфер разработки — это и правда рабочая концепция? Удешевляет ли это проект? Ускоряет разработку?» По нашему опыту это действительно так, поскольку в абсолютном большинстве случаев, даже если Flutter‑разработчик не обладает навыками нативной разработки, ему потребуется лишь эпизодическая помощь специалистов по целевым платформам, чтобы написать максимум пару плагинов или привязать «окно» (переход на отдельный экран) с нативным кодом. Это относительно несложно, может быть выполнено в формате задачи и явно дешевле, чем держать в проекте на зарплате нативных разработчиков под Android и iOS платформы.  Цитата Евгения: 95% всех задач разработки покрываются возможностями Flutter. Проблемы что‑то реализовать на Flutter — ее просто нет как проблемы в 95% случаев. В отдельных случаях нужна коллаборация с нативными разработчиками или же опыт в нативной разработке для написания собственного плагина, способного решить проблему. Сейчас конкурентоспособным и приоритетным для Клиента является разработчик, обладающий навыками как кроссплатформенной, так и нативной разработки. Такого сотрудника можно считать универсальным в своей области.  Если взять конкретный пример из жизни, то Евгений вспоминает это так: Например, большой продукт — это клиентское приложение по доставке еды. Все было совсем не так просто, но мы в итоге оказались очень довольны, что стали писать его на Flutter. Тут была и админка на web, которую писали мы (Flutter‑разработчики), тут было взаимодействие с Firestore, тут были автоматические сборки для разных клиентов, конструктор интерфейсов, нативные карты внутри Flutter‑приложения и сложная бизнес‑логика с кучей экспериментальных фичей. В общем, тут действительно малыми силами мы вели большой продукт, для которого по классике понадобилось бы больше программистов, если все делать нативно Android+iOS+web. Конечно, есть вещи, которые библиотеками и средствами фреймворка Flutter изначально не предусмотрены. Что же делать в этом случае? Не паниковать! Потому что: 1) Реализация этих функций не является невозможной, все решаемо. 2) Таких вещей совсем немного.И об этом поподробнее в диалоге наших программистов, где скептиком выступил Борис — наш опытный iOS‑разработчик и убежденный приверженец нативной разработки, уже 1,5 года профессионально преподающий разработку на iOS. Оппонировал ему Евгений, который тоже начинал с натива, но теперь давно уже предпочитает Flutter.  Борис:  Сложные фичи — к таким нативным инструментам, как: GPS, Bluetooth, Wi‑Fi, AR и т. д. Flutter имеет ограниченный доступ и не может использовать их на полную, соответственно, возникают ограничения. Также во Flutter используются готовые виджеты и нельзя легко и просто сделать что‑то свое. Решение остается только в виде надстройки интерфейса при помощи нативных инструментов, что уже превращает работу в нестабильные «костыли». Евгений: Стабильность или нестабильность кода в данном случае зависит от качества реализации решения, а не его метода. В остальном же — плагины. Стандартные вещи давно покрыты плагинами. Все, что доступно в нативном коде, доступно и на Flutter через плагины. Никакой проблемы тут нет, а наоборот плюсы — не зная особенностей реализации для каждой платформы, можно пользоваться этими вещами верхнеуровнево посредством плагинов. Нужно понимать, что в первую очередь Flutter — это UI‑фреймворк. Когда программисту приходит задача написать для приложения, например, подписки или внутренние покупки — это пусть и не UI‑задача, но реализовать ее через Flutter можно, поскольку для этого уже существуют развитые, регулярно обновляемые библиотеки, к тому же бесплатные. Эти библиотеки работают и люди им доверяют. Это простая задача — подключить готовую библиотеку, и максимум, что может понадобиться — разве что написать отдельные строчки кода под Android, iOS или Web. Другое дело, когда подходящих конкретно под ваш случай библиотек может не оказаться, тогда нужный плагин придется написать самому. Мне, в частности, приходилось делать это, чтобы подключать сертификаты безопасности в приложение отдельно для платформ iOS и Android. Но я соглашусь с Борисом, что риск нарушить функциональность всей сборки из‑за несоответствия версий, вызванного обновлением плагинов и правда существует, хотя это и довольно редко случается. Мой друг и по совместительству коллега из другой компании сталкивался с подобной ситуацией.  Тогда у их команды еще не было понимания сути проблемы и работа над ее решением заняла немало времени. Пришлось реализовать ответвление на старые версии плагинов. О таком моменте просто нужно всегда помнить и следить за обновлениями.Можно также обойтись и без плагинов, а просто создавать в Flutter‑приложении нативные «окна». К примеру, если требуется функция bluetooth — к ней можно обратиться через отдельный экран (окно), где код будет полностью нативным для целевой платформы, в то время, как код на других экранах будет написан на Flutter. В обратную сторону это работает также хорошо — в нативных приложениях можно делать кроссплатформенные окна. Само собой, пользователь этого даже не заметит, поскольку процесс происходит бесшовно. Евгений сталкивался с этим, когда работал над приложением, связанным с навигацией. Функционал, использующий Яндекс карты, тогда удалось реализовать полностью нативно, при помощи метода «окон».Борис: Нативная разработка требует меньше ресурсов для тех же задач, а значит быстрее и производительнее. Евгений: Все тот же вопрос «прямоты рук». «Не прямыми» руками можно сделать многое: можно некорректно сделать анимацию, можно искусственно занизить FPS, много чего еще.Сейчас актуальный движок Flutter выдает неотличимую от натива картинку и производительность на современных устройствах. Более того, уже анонсирован переезд на новый, более быстрый движок в скором времени. Борис: Отрисовка интерфейса не более 60 fps. Евгений: Больше, потому что есть устройства, способные выдавать больше. Как бы не видим, но разницу чувствуем. На современных устройствах Flutter старается поддерживать 120fps. Как мы уже говорили, на Flutter сейчас переходят крупные компании, в том числе российские. Дело не только в том, что это бесплатный Open Source фреймворк, но и в том, что он от компании Google, потому предполагаем, что развитие и поддержка технологии не ослабеют и дальше. Также очень важно поддерживать в актуальном состоянии библиотеки и плагины. Для этого необходимо следить за всеми обновлениями, чтобы не столкнуться с ситуацией, когда в силу неактуальности данных код перестанет правильно работать. Но такой мониторинг не является большой проблемой ни для крупных, ни для малых команд.Даже если произойдет невероятное, и коммуникации с Google вдруг оборвутся, то переписанный код останется работоспособным. Любая компания заинтересована в этом, ведь это сокращает степень ее зависимостей от внешних источников. Как говорил Евгений, в крупных компаниях он видел программистов, единственной задачей которых было переписывать код под Flutter.В качестве примера он приводит компанию Яндекс, где команды разработки мобайла переписывают свой код на Flutter. На YouTube‑канале «Яндекс Go» есть получасовое видео как раз об этом.  Евгений по своему личному опыту утверждает, что «порог входа очень простой». Фреймворк Flutter достаточно понятен и прост в освоении даже для начинающих, не говоря уже об опытных программистах. Основан он на языке программирования Dart. Dart — используемый язык, похож на много всего, что уже было до него, потому что он из «молодых». Все конструкции в нем будут комфортны, понятны и удобны. То есть переехать на Dart — очень быстро. Разобраться, как работает Flutter — тоже очень быстро. Дальше — уже тонкости. Написать хорошее приложение с нуля? Лучше почитать и предпринять «Best Practices» (Лучшая практика) — просто использовать то, что уже придумано и проверено до вас. Это нормальный подход. Меньше граблей соберешь. Я думаю, если полный рабочий месяц этим заниматься, то можно будет уже начать переписывать под Flutter готовые коды, для начала. Никакой магии нет, просто еще один язык. Для программиста выучить еще один язык довольно просто и привычно. Евгений убежден, что Flutter‑разработчик не должен быть ограничен исключительно этим же фреймворком. Как он говорит: «Программист — это не человек‑фреймворк». Освоивший Flutter разработчик и может и должен осваивать также натив. Как и наоборот. Если в команде есть разработчик Flutter, а вместе с ним и разработчики Android/iOS — они договорятся, скооперируются и создадут код, адаптирующий продукт к любым тонкостям целевой платформы и преодолевающий любые ограничения Flutter в этом вопросе. Конечно, еще лучше для Клиента, если все это может сделать один человек, владеющий как Flutter, так и навыками нативной разработки для всех платформ. Цитата Евгения:  Проблема скорее не в том, писать ли проекты на Flutter, а кто будет писать. Хороших Flutter‑разработчиков с опытом также и нативной разработки на самом деле не так много. Если подытожить все вышесказанное, то формируются следующие выводы: разработка на Flutter — это экономно. В каждом случае процент экономии индивидуален, но при правильном подходе он однозначно есть, как и сокращение сроков. Фреймворк Flutter — это актуально и легко. Но лишь при том условии, если в вашей команде (или в команде вашего подрядчика) работают люди с навыками нативной разработки, а в идеале — нативщик, освоивший Flutter, либо же Flutter‑разработчик, освоивший натив. Это значительно сократит затраты вашего клиента. Также необходимо уделять внимание обновлениям, следить за актуальностью библиотек. Если вы не уверены, что ваша команда может обеспечить все эти условия, советуем все же использовать нативные средства разработки.В материале мы не поднимали тему других, менее распространенных или более ранних кроссплатформенных средств разработки, таких, как React Native и прочие, но, возможно, сделаем это в следующий раз.  Надеюсь, теперь у вас есть понимание, что такое Flutter, каковы его сильные и слабые стороны, каким именно навыками должен обладать разработчик или подрядчик, чтобы реализовать весь его потенциал и в короткие сроки создать экономный и качественный в разработке проект. Но если есть вопросы или нужен совет — всегда обращайтесь! Директор компании CREAZARD