image

Итак, дано: команда чуть больше 50 человек. В основном занимаемся web-разработкой со всякими интеграциями, личными кабинетами и e-commerce. Однако в последнее время около 20% — это мобильная разработка. Есть еще отдельная компактная команда, пишущая на Dart/Flutter.

Задача: подготовить как можно больше программистов из основной команды к задачам мобильной разработки.

Основной мобильный стек, который мы использовали раньше — React Native и Flutter. Нам важна портабельность, это покупают. Оба показали себя очень достойно в своём классе для разработки бизнес-приложений. Есть известные ограничения и нарекания разработчиков, но это тема отдельной статьи («Есть всего два типа языков программирования: те, на которые люди всё время ругаются, и те, которые никто не использует» Bjarne Stroustrup). Например, приложения на Flutter получаются более сексуальными и шустрыми, но как дело доходит до виджетов — приходится писать на нативе. Реактовиков у нас исторически больше (пересесть с вебовского React в React Native довольно просто), а вот Dart/Flutter-разработчик — зверь редкий.

У нас уже был опыт разработки прикольных проектов в рамках хакатонов (бесплатный HelpDesk, Хуижин, PlanningPoker и еще пара подвигов). Но практика показала, что в рамках хакатона брать незнакомую технологию — дело гиблое. Половину времени будут IDE настраивать. Я решил сделать внутренний конкурс с деньгами и призами за первые три места. Судить будет та самая опытная-компактная команда, которая на Flutter уже собаку съела. Осталось выбрать не сильно сложный проект, желательно, чтобы в нем был еще какой-то практический смысл. Скажу сразу, не все прошло гладко, сказалась неопытность в таких делах.

Мы решили реинкарнировать Squarespace Note, которое в один момент перестал поддерживать его разработчик. Это «ловец идей», который ты открываешь, пишешь себе заметку и отправляешь в свой тудушник или электропочту. Завернули затею во внутренний конкурс среди программистов «Сибирикс». Назвали проект SingularityNote. Дали дизайн, бэклог, стэк технологий (Dart+Flutter или React Native) и все конкурсные дела: правила, жюри и призовой фонд.

Что пишем


За 3 новогодние недели (конкурс проходил в самом начале 2020 года) нужно сделать минималистичный редактор заметок с возможностью отправить заметку в Singularity App, на почту или Evernote, приложение должно быть на русском и английском языках в зависимости от локации пользователя.
Фичи конкурсного приложения:

  1. заметку можно отправить в свой Singularity App, Evernote или на почту (+ настройка их привязки, + стейты иконок в зависимости от настроек отправки),
  2. к заметке можно прикрепить изображение из галереи устройства или снимок камеры,
  3. функций — минимум. Все манипуляции с заметками — одним свайпом:
    • Отправить готовую заметку? Свайп вверх.
    • Удалить? Свайп вниз.
    • Посмотреть все отправленные заметки? Свайп вправо.
    • Изменить настройки? Свайп влево.
    • И смена темы при встряхивании телефоном.
  4. язык интерфейса — ру/en в зависимости от локации пользователя,
  5. для каждой отправленной заметки в списке видно: начало текста, дата создания, куда она отправлена,
  6. если заметку не удалось отправить (например, интернета нет), она становится серой, а при тапе на нее — повторная отправка,
  7. рекламный баннер на наш смежный проект.


image

Стек технологий и критерии оценки


Проект по условиям мог быть выполнен на:

  1. React Native (React + Redux (предпочтительно) / Mobx (норм паровоз).
  2. Dart + Flutter (должен использоваться паттерн BLoc).

Обычно на хакатонах мы применяем технологии, которыми ранее не пользовали на боевых проектах.

Посадили команду разработчиков Singularity App, ту самую опытную-компактную да съевшую собаку на Flutter, в жюри для судейства коллег по цеху. Эстетическую сторону оценивал арт-директор.

Участвовать мог любой, кто не жюри. Макеты есть, дизайн есть. В путь!

image

Чтобы приложение могло участвовать в конкурсе, оно должно:

  • содержать обязательные фичи (без них проект не рассматривается, дисквалификация);
  • быть полностью функциональным и покрывать всю рабочую цепочку (кроме пунктов, отмеченных в постановках как «желательные»);
  • быть разработано на одном перечисленном стеке технологии;
  • разрабатываться исключительно в нерабочее время;
  • и никаких коопераций с жюри.

Как это было


Решились участвовать четыре команды разработчиков. Старт 4 января. По пути одна команда слилась. Остальные 27 января отдают работы жюри на оценку. Оценивали по двум параметрам:

  1. Культурный код. В коде не должно было быть «дичи», и его можно легко поддерживать (от 1 до 10 баллов),
  2. Юзабилити. Качество реализации. Стабильность приложения (от 1 до 10 баллов).

Судейство — открытое. Побеждает приложение, набравшее наибольшее количество баллов.
Дмитрий
3 место

Значит, закидывают в вольер с дикими зверями 3 команды. Кто за месяц напишет лучший вариант приложения, тот больше всех бабок получит. Понеслась.

С моей командой приложение делали на Flutter. По началу было интересно: новый стек технологий, новый проект — это всегда для программиста глоток свежего воздуха. Потом мотивация куда-то испарилась, да и сил не так много оставалось: восьмичасовой рабочий день, потом вечером пары в универе (тогда я еще был магистрантом). Две с половиной недели мы толком нифига не делали, и вот, осталась последняя неделя. Владимир начинает подпинывать, чтоб заканчивали. Мы сгребаем силы в кулак и за несколько дней допиливаем приложение: я фигачил визуальную составляющую приложения, а Лена — все, что связано с логикой (сохранение, отправка заметок в сервисы).

В итоге мы заняли 3 место из 3. Жюри, которое проводило Code Review сказали, что было видно, что торопились, код не всегда аккуратный и читабельный (с чем я, собственно, солидарен). Однако приложение работало стабильно, функции свои выполняло и мы единственные, кто сделал анимацию сохранения заметки в список (свайпаешь вниз, появляется палец с текстом о том, что заметка будет сохранена).

Опыт получился необычный. С одной стороны, круто, что получилось потрогать разработку для мобилок. С другой стороны грустно, что уделил этому так мало времени, но это исключительно моя ошибка.

P.S. Участие в конкурсе потом сильно мне пригодилось в разработке мобильного приложения для «ПроАптека».

Евгений
2 место

Я выбрал React Native, потому что мне нравится JS и с ним я более-менее знаком, но конкретно на React Native + Redux писал впервые. Походу изучал, как всё работает по разным статьям и видео-урокам. На JS писал только я и обойти на нём крутых кодеров на Dart у меня не было шансов. Я даже был единственным, кто сделал авторизацию через QR-код, но и этого не хватило, чтобы победить «дартеров» :)

Денис
1 место

Выбрал Flutter, потому что гугловские продукты мне ближе, а еще в нем стейт храниться в потоках (паттерн BLoC) — я к нему привык. React Native принято использовать в связке с Redux, который я не очень люблю.

Сделал приложение примерно за 4-6 восьмичасовых дней (суммарно). Первые дни разработки проходили под температурой 38-39. Видимо, это скорее помогло, чем помешало :)

Что потом


А потом мы доработали то, что нужно было доработать, и отправили приложение в официальные сторы Google Play и App Store.
Денис
1 место

Боевую версию для сторов допиливал тоже я, уже в рабочее время. Моя конкурсная версия приложения работала только на Android, потому что дома не было ничего на iOS. Теперь нужна была и версия для iOS — сделал ее, еще дополнительный бэкенд для отправки писем и создания заметок в Evernote (такая опция была доступна только для PRO-аккаунта Evernote), сканер QR-кодов и еще мелкие доработки.

На Summer Tagline Awards в категории «Лучшее мобильное MVP-приложение» проект взял бронзу.

image

Это пятый хакатоновский проект, который получился и годным, и полезным. Его уже можно скачать в сторах и пользоваться. Это бесплатно.

Что получилось:

  • У меня теперь есть аналог того приложения, которым я пользовался несколько лет.
  • Сразу после разработки мы смогли подключить программистов уже к боевым, клиентским проектам.


Что не получилось:

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

Не знаю, получится ли в следующий раз найти баланс между практической пользой и кайфом от разработке, но будем щупать. Если у кого-то есть опыт, как совмещать приятное с полезным — буду рад обратной связи.