Как я перешел из веб разработки в мобильную?

e12610de7f264ad6887167f121ba8f65.jpg

Это был 2014-й год. После 3-х лет работы в маленькой аутсорс компании я набрался опыта в совершенно разных проектах. И небольшое корпоративное приложение на WPF, и корпоративное файловое хранилище онлайн для шведского заказчика на ASP.NET и даже что-то наподобие мессенджера-аггрегатора. Это не считая множества мелких PoC проектов.

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

У меня было 0 опыта в мобильной разработке. Наша задача была — разработать кросс-платформенное приложение на Xamarin. Это была абсолютно новая для меня область, с кучей сложностей, несмотря на то, что язык остался тот же. Более того, тогда, в 2014-м году, этот фреймворк еще был платный. Через полгода его сделают бесплатным, а еще через полгода его выкупить Microsoft.

Компания в которой я работал была стартапом с молодой и перспективной командой. Денег на разработчиков не жалели, поэтому наши беседы и холивары всегда были интересными. Бэкенд был на Node.JS, фронтенд на Angular и 4 приложения для Windows, Android, iOS, macOS. Windows приложение был написано на отдельной кодовой базе, к которой я не имел отношения, что усложняло его поддержку.

Одной из интересных и сложных задач было воспроизведение зашифрованного видео и PDF большого размера на мобильных устройствах. Держать большой файл в памяти было невозможно из-за ограниченного размера памяти (тогда были устройства и по 512MB ОЗУ). Была возможность передать Stream в приложение, но с этим тоже были сложности. Нам пришлось использовать CipherMode.ECB — режим, при котором каждый результат шифрования любого фрагмента не зависит от предыдущих. Это нужно было для случайного доступа к любому фрагменту на видео-дорожке. Однако CryptoStream в .NET не поддерживал случайный доступ. Из-за этого пришлось реализовывать собственную реализацию метода Seek.

Также в этом проекте я впервые возглавил разработку мобильных приложений. Одной из моих основных задач была разработка и поддержка общего кода, который переиспользовался во всех приложениях. Xamarin давал возможность разработки приложений с помощью 2х подходов. В обоих подходах основных паттерном был MVVM:

  • Общий код бизнес-логики, но слой View пишется на нативных инструментах (разметка в xml через Android Studio и Storyboard и xib через XCode). В этом подходе выручал фреймворк MvvmCross.

  • Общий код бизнес-логики и общая разметка на XAML (Xamarin Forms). Таким образом достигалось максимальное переиспользование кода. Однако для сложных приложений такой подход не очень удобен.

В этом проекте я проработал 3 года. Я не знаю, насколько верным тогда было решение поменять область разработки и уйти из бэкенда в мобильную разработку. С тех пор я стал развиваться T-Shape специалист и это безусловно дало мне более широкое знание о разработке продуктов в IT в целом, а также понимание многих паттернов разработки под разными углами. К примеру, без знания устройства GC и умения находить и устранять утечки памяти ваше приложение быстро упадет из-за недостатка памяти. Это менее критично для бекенд приложений, они могут просто увеличить себе память, но пользователь мобильного устройства — это сделать не может.

Еще одним из самых интересных примеров, который я многократно пересказывал на технических собеседованиях стало применение Dependency Inversion на примере кросс-платформенной разработки. На популярный вопрос «Зачем нам нужен принцип Dependency Inversion?» Обычно следует популярный ответ: «Чтобы мокать зависимости в юнит-тестах». И это правильный ответ, но не единственный. В кросс-платформенной разработке, когда бизнес-логика зависит от интерфейсов, а реализации специфичные для платформы регистрируются в контейнере — поддерживаемая разработка без DI невозможна в принципе.

Следующий пост будет про то как я стал фрилансером. Подписывайтесь на мой Telegram канал, чтобы не пропустить. Там рассказываю про 13-летний опыт, поиск себя в мире IT, руководство командой и личную продуктивность.

© Habrahabr.ru