Flutter-разработчик (Middle+ / Senior, Mobile + Web)
О продукте
Развиваем приложение с живыми спортивными трансляциями, статистикой матчей, видео и большим объёмом данных. Продукт работает на iOS, Android и Web на общей Flutter-кодовой базе.
Ядро приложения — собственный видеоплеер поверх HLS. Вокруг него работают реклама, подписки, аналитика и различные сценарии доступа к контенту. Рядом — десятки насыщенных экранов с данными из API: матчи, турниры, команды, составы, статистика и другие спортивные данные.
Кодовой базе несколько лет: есть внутренние пакеты, собственные обёртки над сетью и хранилищем, несколько брендов из одного репозитория.
Ищем человека, который придёт развивать работающий продукт, разбираться в существующей архитектуре и постепенно улучшать её, а не начинать всё с нуля.
Уровень
Middle+ / Senior.
Ориентируемся на разработчика с 3+ годами коммерческой разработки на Flutter, который сопровождал хотя бы один продукт достаточно долго, чтобы сталкиваться не только с разработкой новых экранов, но и с:
- релизами;
- регрессиями;
- production-багами;
- чужим кодом и архитектурными решениями;
- проблемами, возникающими только на части устройств или сетей;
- публикацией приложений в App Store и Google Play.
Чем предстоит заниматься
Видеоплеер и стриминг
Видео — одна из ключевых частей продукта.
Нужно будет развивать и поддерживать:
- HLS live-трансляции и VOD;
- буферизацию и восстановление после обрывов сети;
- повторное подключение к потоку;
- обработку зависаний и ситуаций, когда воспроизведение остановилось без явной ошибки;
- полноэкранный режим;
- работу со звуком и audio session;
- поведение приложения при уходе в фон;
- Picture in Picture;
- трансляцию на телевизор / casting;
- длительное воспроизведение без утечек памяти и деградации производительности.
Важно уметь воспринимать плеер не как один виджет, а как машину состояний и переходов.
Например, понимать, в каких состояниях плеер способен зависнуть навсегда, как это определить и какой fallback или watchdog должен сработать.
Реклама и подписки
Плеер тесно связан с рекламой и монетизацией.
Нужно будет работать со сценариями:
- показ рекламы перед или вокруг трансляции;
- гонки между загрузкой рекламы и запуском контента;
- ситуация, когда реклама не загрузилась;
- зависание рекламного SDK;
- возврат пользователя к контенту после рекламы;
- отсутствие чёрных экранов и бесконечных загрузок;
- различные состояния подписки;
- восстановление покупок;
- отключение рекламы для подписчиков.
API и данные
В продукте много экранов с большим количеством данных.
Предстоит вместе с backend-разработчиком:
- участвовать в проектировании API под реальные потребности клиента;
- подключать новые методы;
- продумывать кеширование;
- обрабатывать ошибки и недоступность сервисов;
- уменьшать количество лишних запросов и данных;
- корректно обновлять данные на live-экранах;
- собирать новые экраны по макетам.
Mobile + Web
Основная кодовая база Flutter используется для:
Для Web нужно будет учитывать особенности браузера, воспроизведения видео, CORS, проксирования и взаимодействия Flutter с JavaScript.
Производительность и стабильность
Отдельная часть работы — production-качество:
- профилирование;
- поиск лишних rebuild;
- оптимизация тяжёлых списков;
- контроль памяти;
- плавная прокрутка на слабых устройствах;
- стабильность при многочасовом воспроизведении;
- анализ crash reports;
- поиск проблем по логам и метрикам.
Релизы
Нужно уметь доводить задачу не до merge, а до production:
- CI;
- сборки;
- flavors;
- white-label приложения;
- подпись приложений;
- публикация в App Store и Google Play;
- работа с отказами ревью;
- исправление требований магазинов;
- наблюдение за функциональностью после релиза.
Что важно для нас
Flutter / Dart
Уверенное знание Dart и Flutter:
- жизненный цикл виджетов;
- понимание Flutter rendering pipeline;
- управление состоянием;
- Bloc / Cubit;
- локальное состояние там, где более сложный подход не нужен;
- Dependency Injection;
- слоистая feature-архитектура;
- работа с существующими внутренними пакетами и соглашениями проекта.
Важно уметь встроиться в существующую архитектуру, а не пытаться переписать продукт под свой любимый стек.
Видео
Практический опыт работы с видео:
- HLS;
- live и VOD;
- buffering;
- network errors;
- reconnect;
- foreground / background;
- fullscreen;
- audio;
- длительное воспроизведение.
Особенно ценим разработчиков, которые умеют диагностировать сценарии вида:
«Плеер просто остановился, ошибки нет».
Native
Не требуется быть отдельным iOS или Android-разработчиком, но необходимо комфортно чувствовать себя на уровне:
«прочитать → понять → поправить → собрать».
Желательно знать:
- platform channels;
- Swift;
- Kotlin;
- native player APIs;
- Picture in Picture;
- casting;
- audio sessions.
Инфраструктура продукта
Будет полезен опыт с:
- рекламными SDK;
- subscriptions / in-app purchases;
- аналитикой;
- crash reporting;
- remote config;
- feature flags.
Важно понимать, как удалённо выключить, изменить или подменить функциональность без нового релиза приложения, если в production возникла проблема.
UI
Ожидаем аккуратную реализацию интерфейсов:
- вёрстка по дизайну и спецификации;
- адаптация под разные размеры экранов;
- темизация через токены;
- локализация;
- корректная работа с насыщенными данными интерфейсами.
Будет большим плюсом
Спортивная тематика
Понимание того, как устроены:
- матчи;
- турниры;
- лиги;
- туры;
- составы;
- live score;
- турнирные таблицы;
- статистика;
- коэффициенты.
Когда разработчику интересен спорт и не нужно объяснять предметную область с нуля, работать с продуктом значительно проще. Кроме того, такой человек быстрее замечает проблемы и неудобства в интерфейсе.
Flutter Web
Опыт с:
- Flutter Web;
- JS interop;
- hls.js;
- HTML video elements;
- CORS;
- проксированием;
- особенностями браузерного воспроизведения.
Видео-инфраструктура
Плюсом будет понимание:
- streaming CDN;
- особенностей HTTP headers;
- DRM;
- ограничений разных платформ;
- Chromecast / casting;
- Picture in Picture.
Остальное
Также приветствуется:
- SQLite и offline cache;
- тестирование бизнес-логики;
- code review;
- наставничество;
- опыт развития больших Flutter-проектов.
Как мы ожидаем, что разработчик работает
Спокойно разбирается в чужом коде и legacy.
Не ограничивается фразой:
«У меня не воспроизводится».
А идёт дальше: смотрит логи, состояние плеера, сеть, устройство, версию ОС, метрики и crash reports.
Часть проблем со стримингом может возникать только у нескольких процентов пользователей — на конкретном Android-устройстве, версии iOS, операторе или нестабильной сети.
Поэтому важно:
- тестировать на реальных устройствах;
- проверять работу на плохом интернете;
- думать о нестандартных сценариях;
- доводить задачу до релиза;
- следить за ней после выкладки;
- заранее задавать вопросы по scope;
- реалистично оценивать сроки;
- коротко фиксировать важные технические решения в репозитории.
Тревожные признаки
Скорее всего, нам будет сложно сработаться, если:
- весь опыт Flutter ограничивается формами и списками поверх REST API;
- нет практического опыта с production-видео;
- нет собственных релизов в App Store и Google Play;
- при первом знакомстве с проектом возникает желание полностью переписать его на другой стек или архитектуру;
- разработчик не знает, с чего начать диагностику, если воспроизведение просто остановилось без ошибки;
- разработка тестируется только в эмуляторе;
- задача считается законченной сразу после merge, без проверки того, как она работает у пользователей.