Что общего у мобильной разработки с лентой Мёбиуса? С первого взгляда видишь две стороны: вот же они, Android и iOS. А потом присматриваешься — и замечаешь, что одно может плавно переходить в другое.
Вот смотрите. Мы скоро проведём конференцию Mobius. Казалось бы, хабрапост с описаниями докладов логично поделить на две части, чтобы любому разработчику было удобно читать именно о «своей» платформе.
Но будет, например, доклад про корутины в Kotlin. Этот язык привычен в мире Android, однако с Kotlin Multiplatform выходит за рамки платформы. И кому тогда стоит знать про такой доклад: Android-разработчикам или всем?
Ещё есть доклады про Flutter. Они интересны только флаттеристам, или нативные разработчики с обеих сторон тоже следят «что там происходит»? И есть другие «кроссплатформенные» темы, не привязанные строго к платформе. Их в посте где лучше поставить, в начале или конце?
В общем, вместо строгого деления на две половины получился текст из пяти блоков, постепенно переходящий от одной платформы к другой. Сами смотрите, какие части этой ленты актуальны для вас.
Содержание
Android
Kotlin
Кроссплатформенность
Flutter
iOS
Android
Воркшоп: Android + AI. Решаем задачи с умом
Анна Жаркова
Usetech
Внедрение ИИ-решений в приложения становится трендом. На Google I/O 2024 представили Gemini API, который можно как встроить в свое приложение для решения задач пользователя, так и воспользоваться им как AI-ассистентом для разработки. Своего AI-помощника GigaCode представил и Сбер.
Рассмотрим практические примеры использования различных нейронных сетей (Gemini, GigaCode, ChatGPT) при разработке Android-приложения. Обсудим, какие подводные камни могут встретиться в работе и как применять такие инструменты корректно и безопасно.
Воркшоп: Modo в действии: быстрая и гибкая навигация для Jetpack Compose
Игорь Кареньков
hh.ru
Откройте для себя Modo — минималистичную библиотеку навигации, которая упрощает работу в Jetpack Compose. На воркшопе вы узнаете, какие API предоставляет Modo, и поймете ее core-принципы. Разберем классические сценарии навигации, такие как работа со стеком и табами, а также более сложные и произвольные сценарии, включая встраивание экранов в произвольные контейнеры.
Не два байта переслать: эмуляция бесконтактных карт на мобильных устройствах
Павел Васильев
Positive Technologies
Павел расскажет про использование NFC-интерфейса на мобильных устройствах для эмуляции бесконтактных карт.
Неочевидные сложности и ограничения на Android и iOS. Что получится сэмулировать, а что нет. Cтандарты, определяющие взаимодействие по NFC. Простые и сложные примеры. NDEF-форматированные метки, транспортные карты, платежные карты, карты лояльности, пропуски систем контроля и учета доступа. Безопасность хранения ключей и передачи данных по NFC.
Спикер покажет наглядно и побайтно передачу реального полезного сообщения по NFC с одного смартфона на другой.
Backup в Android, или Как сэкономить бизнесу миллионы
Артур Илькаев
VK / ВКонтакте
Резервное копирование — малоизвестная и плохо задокументированная возможность Android. В VK ID решили провести с ней эксперимент и бэкапить некоторые авторизационные данные. Теперь это экономит значительные суммы на SMS. Это реальный продуктовый кейс, который может помочь и вашему бизнесу.
В докладе погрузимся в эту технологию:
как имплементировать;
как работает под капотом;
как тестировать;
как обосновать бизнесу внедрение.
Интеграция GeckoView в Dynamic Feature
Евгений Терновой
VK / Mail
Почему команда решила затащить к себе GeckoView в Dynamic Feature, как это делали и с какими проблемами столкнулись. Будет полезно тем, кто устал от багов в WebView и будет делать что-то аналогичное.
Опасности в Android: уязвимости и защитные меры
Юлия Стекачева
Райффайзен Банк
Готовьтесь к увлекательному путешествию в мир безопасности Android! Разберем самые интересные и коварные уязвимости, такие как Path Traversal, SQL-инъекции и Tapjacking. Но основное внимание уделим WebView: неправильной валидации данных, уязвимостям в библиотеке для парсинга URL, JavaScript Interface и загрузке диплинков.
Gradle Configuration Cache Hidden Gems
Сергей Опивалов
Кэширование фазы конфигурации (configuration cache, СС) — одна из самых ожидаемых и очевидных оптимизаций в процессе Gradle-сборки. Однако стабильной эта оптимизация была объявлена относительно недавно — в Gradle 8.1.
Сергей расскажет о сложностях реализации CC и о «неожиданных» улучшениях производительности, которые может принести СС в вашу сборку. Если вы сомневались, поддерживать ли CC в своих сборках, — эти инсайты помогут вам ответить утвердительно.
Кастомные лейауты в Jetpack Compose
Александр Власюк
Авито
В процессе написания компонентов дизайн-системы на Compose Александр столкнулся с нехваткой качественных материалов и скудностью документации по такой важной теме, как кастомные лейауты. Цель доклада — предоставить полноценный обзор средств для кастомизации лейаутов на Compose.
Разберем механизм работы layout-фазы в Compose и узнаем о ее ограничениях. Выясним, как работают стандартные лейауты, а также какие возможности существуют для написания кастомных. Рассмотрим нюансы и хаки, о которых не написано в документации. Вам продемонстрируют все на примерах, включая компоненты дизайн-системы Авито.
Последнее слово в Android-навигации
Данил Колесников
Дзен
Какой Mobius без доклада про навигацию в Android? Платформе уже 16 лет, а тема все еще актуальна. В своем докладе Данил хочет разобраться, почему же так происходит, а также предложить концептуально новый подход навигации в вашем приложении. Отличительной особенностью является то, что в ней отсутствует зоопарк команд: add, replace, remove, navigateTo, backTo, replaceScreen и т.д. Есть всего две команды: open и close. Ведь именно так дизайнеры и менеджеры рисуют навигацию в макетах.
Как получилось подружить экраны на View и Compose, поддержать анимации, восстановление состояния, диалоги, пейджеры, пейджеры в диалогах и множество других кейсов? Все благодаря декларации иерархии экранов, алгоритмам поиска в деревьях, а также Decompose.
Танцы вокруг дерева семантики: UI-тесты Compose-экранов
Павел Стрельченко
hh.ru
Вы узнаете, как:
Работают базовые инструменты от Google для UI-тестирования Compose.
Получить удобный API для тестирования Compose и организовать кодовую базу тестов.
Внедрили UI-тестирование Compose в hh и своей дизайн-системе: разбор частых кейсов и решения проблем.
Как мы разработали свой фреймворк SingleState-навигации на Android
Олег Дволятик
Авиасейлс
Во время перехода на Jetpack Compose появилась возможность переделать легаси-навигацию в проекте. Идеального готового решения не нашли и запилили свое.
В докладе Олег расскажет, как задизайнили архитектуру и с какими проблемами столкнулись по ходу. Будет полезно тем, кто интересуется проектированием систем и хочет придумать что-то свое.
Александр Юдин
RuStore / VK
При разработке SDK нельзя так просто и слепо использовать привычные технологии. Каждый шаг несет за собой последствия для пользователя SDK. Так что доклад будет о специфике разработки Android SDK, о том, как с этим боролись и к чему пришли.
Kotlin
Непростые вопросы про Kotlin Coroutines
Абакар Магомедов
Альфа-Банк
Александр Гирев
Wildberries
Однажды пятничным вечером один из докладчиков задумался над вопросом: где живут корутины, когда запустивший их coroutineScope героически погибает в жерновах GC? Субботнее утро было проведено за чтением статей и исходников.
Вот так и родилась идея доклада. В нем будут ответы на вопросы об устройстве и работе корутин для самых любознательных.
Материал доклада рассчитан на участников, которые знакомы как минимум с теоретическими основами Kotlin Coroutines.
Кроссплатформенность
Алексей Гладков
Mobile Developer
Как Android-разработчики мы привыкли, что многие вещи за нас делает компания Google. С развитием Kotlin Multiplatform мы можем разрабатывать приложения не только для Android. Но как только мы сталкиваемся с релизом приложения, то начинаем больше ценить то, как о нас заботится компания Google.
В этом докладе мы с вами разберем, какие проблемы возникнут у разработчика при релизе приложения, написанного на Kotlin для Desktop и для iOS, а также способы решениях этих проблем.
Kotlin in GitHub Actions. Расширяем горизонты KMP
Максим Качинкин
Dodo Engineering
Нет доступного и простого мануала или документа по быстрому написанию Kotlin/JS GitHub Action. Этот доклад послужит таким мануалом.
Иногда очень хочется написать кастомный Action, которого нет в Marketplace. На чем его написать? Просто workflow со скриптами? Или кастомный GHA на JS? Есть очень соблазнительный вариант — написать его на Kotlin!
У ребят был инструмент, который считал lead time. Он был написан давно и на Scala. Они хотели его переписать на Kotlin, но все равно было непонятно, как лучше и удобнее его запускать на CI.
И тут пришла идея — это можно сделать в виде GitHub Action на Kotlin! А если потом захочется перенести в другой вид, то Kotlin-код — он и в Африке Kotlin-код. Поэтому написали кастомный GHA на Kotlin, и Максим хочет поделиться опытом.
Как iOS-разработчику выжить на проекте с KMM?
Сергей Стельмах
Газпромбанк
Обсудим, как iOS-разработчику выжить на проекте с KMM. Рассмотрим проблемы, с которыми сталкиваются разработчики, и пути их решения. Узнаем, как iOS-разработчику эффективно освоиться на проекте с KMM и справляться с возникающими трудностями.
Погрузимся в проблемы, связанные с межплатформенной разработкой, такие как незнакомство разработчика с Kotlin, IDE, интеграция с Xcode, отладка кода, совместимость библиотек и разделение ответственностей разработки. Узнаем, как адаптировать код и использовать Kotlin вместе со Swift, чтобы оптимизировать рабочий процесс. В заключение обсудим перспективы использования KMM для iOS-разработчиков, преимущества и недостатки этого подхода. Сергей поделится рекомендациями для тех, кто хочет «вкатиться» в проект на KMM.
Как Kotlin Multiplatform изменил наши процессы
Данил Перевалов
Циан
Данил расскажет, как из-за интеграции KMP пришлось поменять процессы в мобильных командах, а также их взаимодействие. Акцент именно на процессах, а не на технической части KMP.
Рассмотрим, какие были процессы, что пришлось поменять и какие проблемы и нюансы возникают при попытке внедрить KMP в уже существующие процессы.
Pkl — язык программирования для конфигураций от Apple
Андрей Зонов
Т-Банк
Разберемся, зачем Apple понадобился отдельный язык для работы с конфигурациями, какие задачи он решает и что не так c JSON. Андрей расскажет про возможности языка Pkl для работы со статической конфигурацией. Рассмотрит:
кодогенерацию с Pkl на Swift, Kotlin, Java и Go;
глубину интеграции c IDE, такими как IntelliJ, VS Code, Xcode и Neovim;
использование языка для кодогенерации моков для тестов, тестирования конфигураций и контрактов.
Сравнит с аналогом — Swagger (OpenAPI) + Mustache.
Compose и SwiftUI: найди 10 отличий
Алексей Панов
Контур
С популярностью мультиплатформенной разработки, разработчикам приходится вникать в другую платформу, чтобы достичь эффективности. Изучать что-то с нуля непросто: легче изучить отличия между платформами.
Обсудим отличия декларативных UI-фреймворков: Compose и SwiftUI. Рассмотрим принципы работы в обоих случаях. Узнаем об отличиях в обновлении UI, жизненном цикле, системе модификаторов.
Заезжаем в KMP. Но какой ценой?
Денис Александров
Яндекс 360
Сегодня в Kotlin Multiplatform — не просто возможность сделать часть кода мультиплатформенным, это большой кусок разработки, который становится мультиплатформенным «сам по себе».
Денис поделится опытом следования такой практике: как написали мультиплатформенное приложение, чего это стоило на этапе поднятия Android + IOS, сколько по времени вышел таргет Desktop, и что нужно учесть. Мы на цифрах разберем «стоимость» такого решения: сколько весят сборки, сколько проходят билды, сколько времени уходит на «допиливание» мультиплатформенных решений.
В общем, максимально подробно разберем путь до Kotlin + Compose Multiplatform и прикинем, что этот подход дает с точки зрения цифр.
Совместная работа Kotlin/Native GC и ARC в iOS
Дмитрий Кузнецов
Magnit Tech
Kotlin Multiplatform (KMP) набирает популярность. Все больше компаний разрабатывают приложения, используя эту технологию, в том числе для iOS. При смешении разных технологий, языков, когда в одном приложении используются и Swift, и Kotlin, возникает ситуация, когда объекты могут мигрировать от ARC к Kotlin/Native GC (K/N GC) и обратно.
Несмотря на то, что в основе ARC и K/N GC лежат разные механизмы по управлению памятью, в большинстве случаев проблем не возникает. Посмотрим, как авторам K/N GC удалось достичь практически бесшовной интеграции, а также разберем особые случаи, когда системы управления памятью начинают «конфликтовать».
Что не так с мобильными сервисами в Android и iOS
Кирилл Розов
Android Broadcast
Мобильные сервисы — неотъемлемая часть современных мобильных ОС и ее ключевой компонент. Google Play Services — это инструмент контроля всего Android, а Apple легко может лишить разработчика всего, закрыв доступ к своим сервисам.
Поговорим о реализации и важности мобильных сервисов и о том, как сделать их правильно и справедливо, убрав монополию корпораций и предоставив выбор пользователю.
ОС Аврора 5 глазами мобильного разработчика. Разработка и функциональность
Денис Глазков
Открытая Мобильная Платформа
Доклад для разработчиков как под Aurora, так и Android и iOS, или разрабатывающих с Flutter или другими фреймворками.
Как устроен жизненный цикл приложений с точки зрения операционной системы и разработчика приложений.
Какая функциональность доступна и как ее применять в разработке.
Какие нововведения повышают комфорт разработки и расширяют ОС новыми возможностями.
Обсудим все, что интересно системным разработчикам в реализации функциональности в рамках жизненного цикла приложений. Еще и то, с какими трудностями придется столкнуться.
Fusion, или Как мы реализовали нашу версию BDUI
Алексей Телышев
AliExpress
В докладе расскажут про свою реализацию Backend Driven UI, которая называется Fusion. Рассмотрим этот подход со всех сторон: практическое применение, масштабирование в реальном проекте, порог входа необходимый для различных специалистов (мобильщики, бэкендеры, QA), соотношение цена/качество в сравнении с традиционной разработкой и многое другое.
Целевая аудитория: мобильные разработчики и те, кто интересуется темой BDUI (SDUI)
Flutter
Как я перестал бояться и полюбил компилятор Dart
Богдан Лукин
Яндекс Go
Пройдем весь путь от поломки компилятора до появления полноценных фиксов в стабильном релизе.
Богдан расскажет, какие шаги понадобились, чтобы разработка не остановилась. Разберем, как искать готовые решения, способы обхода и помощь в комьюнити. Посмотрим на необходимые для разбора инструменты.
Форкнем Flutter, Flutter Engine и Dart SDK. Разберем их взаимосвязь и научимся дебажить.
Бонус в конце: как сделать так, чтобы ваши issues решались за сутки.
Как мы делали суперапп «Дилер онлайн», и что из этого получилось
Олег Скирюк
ПАО Вымпелком
Олег поделится опытом по созданию многомодульного суперапп-приложения на Flutter. Основное внимание акцентируется на структуре и архитектуре приложения: какие инструменты были выбраны для организации монорепозитория, навигации. Он продемонстрирует подход к управлению состоянием, зависимостями в приложении, который является переосмыслением существующих подходов MobX, GetX, Flutter Modular, GetIt и применением их на практике.
Accessibility Flutter-приложений, или Как увеличить трафик на 20%
Самир Ахмедов
Surf
15% людей на земле имеют разного рода осложнения, связанные со зрением, слухом или моторикой. К сожалению, под таких людей адаптировано все еще малое количество приложений, и им приходится очень тяжело в современном мире.
Тему accessibility незаслуженно обходят стороной, и ее все сложнее игнорировать. В докладе, основываясь на личном опыте и результатах углубленного изучения инструментов, Самир расскажет, как сделать приложение на Flutter доступным.
iOS
Сергей Балалаев
Ozon
Вы когда-нибудь слышали о том, что большое мобильное приложение проектируется с нуля? Сергей расскажет вам об этом на своем опыте — как сравнительно небольшой командой вывели простое приложение в состав супераппа за короткий срок.
В начале доклада пройдем квиз на тему супераппа. После квиза вам расскажут, как строилась архитектура решения: о масштабируемости, time to market, параллельности и гибкости разработки. Будут интересные технические подробности и сравнение супераппа с многомодульными проектами и операционными системами: поговорим о версионировании библиотек в мультирепозитории, и, конечно, о команде разработки. И главное — вы узнаете, почему такое решение сильно отличается от основного супераппа, к которому шли годами.
В заключение Сергей поделится фундаментом, на котором базируется работа команды.
От модуляризации к Clang и обратно
Роман Горбенко
Яндекс
Роман представит уникальный подход для модуляризации больших проектов, который разработали в команде Яндекс Путешествий. Методика помогает визуализировать и анализировать структуру проекта, что позволяет оптимально разбить его на модули с минимальными усилиями.
Рассмотрим, как с помощью SwiftSyntax построить граф зависимостей между различными сущностями в коде. Особое внимание Роман уделит утилите Periphery, которая предоставляет функциональность для изучения связи между сущностями не только статически, но и динамически. Изучим малоизвестный инструмент swift-index-store, ключевой для работы с метаданными Swift-проектов.
В конце обсудим результаты подхода, включая генерацию специальных файлов, которые упрощают понимание и управление структурой проекта.
Одна билд-система, чтоб править всеми
Максим Вакула
KODE
Александр Евтухов
Т-Банк
Все iOS-разработчики привязаны к определенным системам сборки. Например, Tuist или CocoaPods. Когда на рынке появляется новое решение, невозможно быстро взять и проверить, как оно работает, поскольку проект жестко описан и привязан к конкретной системе сборки.
В докладе мы разберем, как перестать полностью фиксировать описание проекта в файлах и как написать абстрактную билд-систему, которая реализует кеширование. К этой билд-системе можно подключать что угодно для сборки вашего проекта: тот же Tuist или Bazel.
Позаботимся о памяти при использовании value-типов
Алексей Таран
Ozon
Начиная со Swift 5.9 миру была представлена концепция некопируемости для структур и перечислений. В числе возможных кейсов, где этот подход принесет преимущество, подразумевается подход к хранению уникальных ресурсов в приложении без необходимости использовать кучу и поддерживать ссылочную семантику. Однако инструмент не мог быть полноценным без поддержки протоколов и дженериков. В стандарте Swift 6.0 такая базовая возможность была добавлена.
В докладе, вооружившись обновленной версией языка и проектом Ozon Seller, мы применим эту концепцию, чтобы повысить прозрачность необходимости использования сущностей в коде. Разберемся, как применение некопируемости влияет на производительность приложения — в частности, на потенциальную экономию памяти. Изучим схожие подходы в других языках, рассмотрим потенциальные проблемы и перспективы их решения по мере развития технологии.
Никита Конашенко
Яндекс 360
Многие разработчики решают использовать в проектах Combine, воспринимая его как отличную альтернативу RxSwift, а так же из коробки совместимого со SwiftUI. Этим путем пошли в Яндекс Диске и переписали множество модулей на Combine.
В этом докладе будем разбираться, как на самом деле работают основные примитивы в Combine: Publishers, Operators, Schedulers, Subscription, BackPressure. Поговорим о всех багах, дата-рейсах, утечках памяти и неявном поведении, которые с ними связаны. Обсудим, как их исправляли, а также к каким выводам после всего этого пришли.
Никита поделится библиотекой со всеми фиксами и полезными экстеншенами к Combine.
Тёма Нестеренко
VK
Научимся рисовать первоклассные кастомные анимации в iOS на GPU. Для этого погрузимся в главный GPGPU API от Apple и рассмотрим основные сущности, с помощью которых производятся вычисления на графических процессорах. Погрузимся в Metal shader language, научимся с нуля анимировать свойства объектов, свяжем все это вместе и в итоге получим анимированную view, готовую для интеграции в продукт.
Альтернативы XCUITest, или Как и зачем разработчику писать автотесты
Кирилл Володин
Т-Банк
Доклад о написании автотестов в iOS-разработке. Обсудим, почему эта тема должна быть интересна не только QA-специалистам, но и разработчикам.
В начале будет немного теории, связанной с тестированием. Далее обсудим, почему XCUI-тесты — это не серебряная пуля и почему нужно уметь использовать весь доступный арсенал для автоматизации тест-кейсов.
Рассмотрим на примерах unit-тесты «на стероидах», фреймворк KIF. Поговорим о всех преимуществах написания тестов по методу белого ящика на примере абстракции многопоточного кода.
Запускаем приложения на своем iOS-симуляторе
Денис Кудинов
Лаборатория Касперского
Спроектируем и реализуем симулятор iOS для запуска приложений на macOS. Увидим внутреннее строение iOS-приложений. Плотно познакомимся с форматом Mach-O. Научимся динамически подгружать библиотеки в рантайме, выделять память под выполняемый код, а также запускать приложения, собранные через Xcode для iOS внутри приложения для macOS.
Разрабатываем CLI-инструменты на Swift
Игорь Шамрин
Яндекс / Авто.ру
Как разрабатывать инструменты для разработки и CI на Swift и какие возможности это открывает.
Во многих iOS-проектах инструменты сборки реализованы на скриптовых языках программирования, таких как Python, Ruby, shell и другие. Такой подход к разработке инструментов создает ряд трудностей:
сложность онбординга новых разработчиков в разработку CI;
сложность использования библиотек от Apple, таких как SwiftSyntax, SwiftPM;
затруднительная разработка нетривиальных инструментов.
Игорь расскажет, как в Авто.ру полностью перешли на инструменты на Swift и какой профит от этого получили. Затронет работу с API SPM, SwiftSyntax и сторонними CLI-библиотеками на Swift.
Влияние Swift Runtime на производительность приложения
Кристиан Бенуа
Т-Банк
Доклад о методе swift_conformsToProtocol из Swift Runtime.
Кристиан расскажет, что это за метод, как он работает под капотом, почему так долго выполняется и как свести к минимуму количество вызовов метода. Объяснит, какой код может работать медленно из-за явного или неявного вызова swift_conformsToProtocol: вызовы as?/as! SomeProtocol, String(describing:) и дженерик-типы с type-generic-constraint.
В конце даст набор рекомендаций, как малой кровью ускорить работу вашего приложения.
Это вам не игрушки: портирование кроссплатформенной С++ игры на iOS
Андрей Филипенков
Kaspersky
Андрей расскажет, с чего начать портирование, какие проблемы возникают при ручной сборке и как он перешел на сборку зависимостей (почти) без болей. Рассмотрим, как объединить несколько отдельных процессов в один, поговорим об адаптации CMake-проекта под iOS / Xcode. На десерт — перевод Android на менеджер зависимостей Conan и замена нативного Java-«лаунчера» на кроссплатформенный на Qt. И, конечно, представит наглядный результат проделанной работы — посмотрим на сетевую игру между iOS и Android.
Как мы адаптировали проект к Strict Concurrency Checking — Swift 6
Никита Землин
Яндекс
Как в Яндекс Путешествиях инкрементально затягивают Strict Concurrency Checking и Swift 6 в большой проект и побеждают все ворнинги и ошибки.
Обсудим механизмы, которые помогают писать потокобезопасный код и в compile time находить потенциальные рейс-кондишены. Будут обсуждаться основные инструменты (Actors, Sendable, @unchecked Sendable, nonisolated, nonisolated(unsafe), preconcurency import) и кастомные решения, которые применялись во время адаптации Яндекс Путешествий к Strict Concurrency Checking.
Евгений Рыжов
Ozon
Вы когда-нибудь пробовали научить кошку приносить мячик? Все знают, что практически это возможно. Однако далеко не факт, что именно ваша кошка захочет с вами сотрудничать, и вместо мячиков вам может быть принесена миска для корма. Вероятно, вы просто получите тотальный игнор с искренним непониманием в глазах.
С такой же своенравной дичью мы живем на четырех проектах, но вместо нужного мячика нам приносят Git-репозитории (которые мы не особо просили), а вместе с ними — транзитивки с обновленными версиями ровно в тот момент, когда нам это совсем не к месту. К счастью, SPM — не живое существо, а значит, его можно научить!
Ответ вы найдете в докладе. Евгений расскажет, как научил свою кошку приносить резиночки (уже победа!), а SPM — легковесные и стабильные архивы при помощи Swift Registry.
Заключение
Можете рассказать в комментариях, что из перечисленного интересно вам.
А нам остаётся напомнить формат: 11 октября у конференции онлайн-день, а вот 19-20 октября можно хоть лично прийти на неё в Петербурге, хоть подключиться удалённо.
И напомним главную ссылку — на сайт конференции: там можно и увидеть информацию вроде расписания, и приобрести билет.
mmshkurin
на самом деле доклады о Flutter интересны и тем,кто занимается веб разработкой,но задумывается о шаге в разработку мобильной разработки