Знания — это хорошо, просто отлично. Но нужна еще и практика, чтобы можно было использовать полученные данные, переведя их из статуса «пассивное хранение» в статус «активное использование». Каким бы хорошим ни было теоретическое обучение, требуется еще работа «в поле». Сказанное касается практически любой сферы обучения, включая, конечно же, разработку ПО.
В этом году GeekBrains в рамках факультета онлайн-университета GeekUniversity по мобильной разработке начал работать с интерактивным агентством AGIMA, команда которого — профессиональные разработчики (делают сложные высоконагруженные проекты, корпоративные порталы и мобильные приложения, вот это всё). AGIMA и GeekBrains создали факультатив для глубокого погружения в практические вопросы разработки мобильных приложений.
На днях мы поговорили с Игорем Веденеевым, специалистом по iOS, и Александром Тизиком, специализирующимся на Android. Благодаря им факультатив по мобильной разработке обогатился практическим спецкурсом по фреймворку RxSwift и корутинам в Kotlin. В этой статье разработчики рассказывают о важности каждого направления для программистов.
Реактивное программирование в iOS на примере RxSwift
Преподаватель факультатива Игорь Веденеев: «C RxSwift ваше приложение будет летать»
Какую информацию получают студенты на факультативе?
Мы рассказываем не только про возможности фреймворка, но и показываем, как его применять в классической связке MVVM + RxSwift. Также рассматривается несколько практических примеров. Для закрепления полученных данных пишем приложение, максимально приближенное к полевым условиям работы. Это будет приложение поиска музыки с помощью iTunes Search API. Там мы применим все Best Practices, плюс рассмотрим более простой вариант использования RxSwift в парадигме MVC.
RxSwift — зачем этот фреймворк iOS-программисту, как он облегчает жизнь разработчику?
RxSwift упорядочивает работу с потоками событий и связями между объектами. Самый простой и очевидный пример — это биндинги: например, можно обновлять интерфейс, просто установив новые значение в переменную во viewModel. Таким образом, интерфейс становится data-driven. Кроме того, RxSwift позволяет описывать систему в декларативном стиле, что позволяет упорядочить код и повысить читаемость. Всё это помогает эффективнее разрабатывать приложения.
Для разработчика знание фреймворка — это ещё и хороший плюс в резюме, поскольку понимание реактивного программирования, и в особенности опыт с RxSwift, ценятся на рынке.
Почему стоит выбрать именно этот фреймворк, а не другие?
У RxSwift самое большое сообщество. То есть больше шансов, что проблема, с которой сталкивается разработчик, уже кем-то решена. Также большое количество биндингов из коробки. Более того, RxSwift — часть ReactiveX. Это значит, что есть аналог для Android, например (RxJava, RxKotlin), а коллеги по цеху могут говорить друг с другом на одном языке, несмотря на то, что одни работают с iOS, другие — с Android.
Фреймворк постоянно обновляется, исправляются мелкие недочеты, добавляется поддержка фишек из новых версий Swift, добавляются новые биндинги. Поскольку RxSwift опенсорсный, можно следить за всеми изменениями. Более того, есть возможность добавлять их самому.
Где стоит применять RxSwift?
- Биндинги. Как правило, тут речь идёт про UI, возможность изменять UI, как бы реагируя на изменения данных, а не явно говоря интерфейсу, что пора обновиться.
- Связь компонентов и операций. Сразу пример. Нам надо получить список данных из сети. На самом деле, это не такая простая операция. Для этого надо отправить запрос, смаппить ответ в массив объектов, сохранить его в базу данных и отдать его в UI. Отвечают за выполнение этих операций, как правило, разные компоненты (мы же мы любим и следуем принципам SOLID?). Имея под рукой такой инструмент, как RxSwift, появляется возможность описывать, ЧТО будет делать система, а КАК она будет это делать — будет находиться в других местах. Именно за счёт этого достигается лучшая организация кода и повышается читаемость. Условно говоря, код можно поделить на оглавление и саму книгу.
Корутины в Kotlin
Преподаватель факультатива Александр Тизик: «Современная разработка требует современных технических средств»
Что будет преподаваться на факультете GeekBrains в рамках брендированной четверти?
Теория, сравнения с другими подходами, практические примеры в чистом Kotlin и в модели Android-приложения. Что касается практики, то студентам будет демонстрироваться приложение, в котором всё завязано на coroutines. Дело в том, что большинство приложений — сплошные асинхронные и параллельные вычисления. А вот корутины Kotlin позволяют запутанный, разнородный или чересчур сложный и требовательный по производительности код свести к единому, простому для понимания стилю, получив выигрыш в корректности исполнения и производительности.
Мы научимся писать идиоматичный код на корутинах, который решает практические задачи и понятен с первого взгляда даже без глубоких знаний того, как устроены корутины (что нельзя сказать о таких библиотеках, как RxJava). Также поймем, как использовать концепции посложнее, например модель акторов, для решения более сложных задач, таких как хранилище данных в концепции MVI.
Кстати, ещё хорошая новость. Пока записывался факультатив, вышло обновление библиотеки Kotlin Coroutines, в котором появился класс Flow
— аналог типов Flowable
и Observable
из RxJava. Обновление, по сути, делает корутины feature complete с точки зрения разработчика приложений. Правда, и развиваться пока ещё есть куда: несмотря на то, что благодаря поддержке корутин в kotlin/native уже можно писать мультиплатформенные приложения на Kotlin и не страдать от отсутствия RxJava или аналогов в чистом Kotlin, поддержка корутин в kotlin/native ещё не полная. Например, нет концепции акторов. В целом, у команды Kotlin стоит в планах сделать поддержку более сложных акторов на всех платформах.
Kotlin Coroutines — чем они помогают разработчику Kotlin?
Корутины дают отличную возможность писать читаемый, поддерживаемый и безопасный, асинхронный и «конкурентный» (concurrency) код. Также можно создавать адаптеры под другие асинхронные фреймворки и подходы, которые уже могут использоваться в кодовой базе.
Чем Coroutines отличаются от потоков?
Команда Kotlin называет корутины легковесными потоками. Плюс ко всему, корутина может возвращать какое-то значение, потому что, по своей сути, корутина — это приостанавливаемое вычисление. Она не зависит напрямую от системных потоков, потоки только исполняют корутины.
Какие практические задачи можно решать с использованием Корутин, какие нельзя или сложно решать при помощи «чистого» Kotlin?
Любые асинхронные, параллельные, «конкурентные» задачи хорошо решаются при помощи корутин — будь то обработка нажатий от пользователя, поход в сеть или подписка на обновления из базы данных.
В чистом Kotlin эти задачи решаются так же, как и в Java — при помощи тысячи фреймворков, у каждого из которых есть свои плюсы и минусы, но ни один из них не имеет поддержку на уровне языка.
В качестве вывода стоит сказать, что оба факультатива (да и основные курсы тоже) обновляются в соответствии с изменениями внешних условий. Если появляются важные обновления в языках или фреймворках, преподаватели это учитывают и модифицируют программу. Всё это позволяет держать руку на пульсе процесса разработки, если так можно выразиться.
Автор: Мария