Запуск американского Foodtech-стартапа, выбор между Flutter, React Native, KMP и доставка еды на велосипедах силами топ-менеджмента. Рассказываю, как прошел путь от Андроид-разработчика из России до CTO компании Sizl.
Привет! Меня зовут Максим, я управляющий партнёр в KTS.
Недавно я попросил бывшего коллегу Сеню Суздальницкого, CTO Sizl, стартапа доставки еды в Чикаго, поделиться своей историей. Получилось большое интервью, в котором мы поговорили о:
• работе в «Рокетбанке» и «Кухне на районе»
• запуске стартапа в США
• вкусовых предпочтениях американцев
• доставке заказов силами основателей
• выборе кроссплатформенной технологии для мобильного приложения
Как я начинал кодить: работа до Sizl в KTS
Я приехал в Москву после учебы в Красноярске. Сначала работал в «Айтеко» и параллельно учил Android. Однажды прошёл интенсивный курс по Kotlin и понял, как много он привносит в андроидную жизнь.
Вскоре приятель позвал меня в KTS на должность Android-разработчика. Там я занимался приложением для строительной компании ПИК и несколькими другими проектами поменьше.
«Рокетбанк» — вайб кальянов и неоновых ламп
Следующим местом работы был «Рокетбанк» — стартап, основатели которого потом сделали «Кухню на районе». Когда я начал там работать, «Рокет» уже выкупили QIWI. Несмотря на это сохранился молодёжный неформальный вайб кальянов и неоновых ламп.
Для ускорения разработки приложение «Рокета» изначально создавалось на кроссплатформенном фреймворке React Native. Однако он не был полностью самодостаточным. Например, задачи вроде сложных анимаций или отображения перелистывающихся видео требовали нативной разработки.
По мере развития приложения «Рокетбанка» появилась потребность писать нативный код с бриджами React Native. Поэтому в отделе мобильной разработки стало три команды — 5 разработчиков React Native, 3 iOS-разработчика и 2 Android-разработчика. Я был в команде Android-разработчиков, писал нативную часть и связывал её с React Native частью.
Из этого опыта я вынес, что React Native — скорее инструмент унификации интерфейса, чем супер-буст в скорости разработки. Вся польза от него — в том, что интерфейс и бизнес-логика работают одинаково на iOS и Android.
«Кухня на районе»: приложение для складов и курьеров
Когда я только устроился в «Кухню», там ещё были ребята из оригинальной команды «Рокета». Я написал CTO «Кухни» и спросил, не ищут ли они мобильного разработчика в команду. Оказалось, что место есть.
У меня вообще было много свободы в «Кухне». Не нужно было ни за кем ходить и отчитываться. Однажды я рассказал директору, что у нас будет новое приложение для доставщиков, а он ответил: «Круто!»
На старте «Кухни» при разработке приложения ребята продолжили использовать React Native, потому что им казалось, что это классный инструмент. Но к моему приходу от него уже отказались из-за высокого коста на разработку и проблем с перфомансом.
Разрабатывал приложение для складов
В «Кухне» мне дали одну общую задачу — сделать работу склада лучше. Это было большое здание, которое делилось внутри на помещения поменьше: холодный склад, молочный склад и другие.
Мне показали склад и познакомили с бэкенд-разработчиком. После этого я сам решал, как именно улучшать складскую работу.
Сначала я сделал мобильное приложение для уже существующего внутреннего сервиса работников склада. Раньше сотрудники постоянно курсировали между складскими товарами и компьютером, чтобы отсканировать штрих-коды и посмотреть, что это за товар.
С мобильным приложением в одной руке у вас сканер для штрих-кодов, в другой — телефон. И вы, как быстрый ковбой на Диком Западе, сканируете ящик и сразу видите: здесь замороженная курица, которая поступила на склад 3 дня назад в объеме 20 кг. Теперь сотрудники могли проводить все операции прямо с телефона — начиная от приёмки до выдачи сырья.
Вы, как быстрый ковбой на Диком Западе, сканируете ящик и сразу видите: здесь замороженная курица в объеме 20 кг, которая на складе уже 3 дня.
Улучшал приложение для курьеров — пытался всё сделать чуточку лучше
Работники склада и курьеры пользовались одним сервисом, который разделялся по типу учётной записи. Через время я начал работать с той частью сервиса, которой пользовались райдеры-доставщики.
Я пытался всё сделать чуточку лучше. Например, часто курьер, доставив заказ на высотки, не мог отметить заказ как «доставленный», потому что не было интернета. Я внедрил отложенные отправки статусов доставок и улучшил трекинг локации райдеров.
Внедрить приложение для райдеров оказалось не так просто. Если, например, сотрудник склада не понимал логику приложения, он мог подойти к начальнику, которому до этого всё объяснил я.
Однако каждому курьеру отдельно невозможно всё объяснить — их слишком много. Поэтому я приравнял райдеров к внешним пользователям и старался делать их часть максимально понятной и красивой — ориентировался на дизайн-подходы «Рокета».
Что такое Foodtech-стартап Sizl и с чем его едят
Sizl придумали те же ребята, которые сделали «Кухню». Если у «Кухни» была концепция домашней еды, то в Sizl такого нет. Мы готовим и доставляем Real food — это не фаст-фуд, но и не еда из ресторанов для гурманов. Качество еды немного лучше, чем если бы её приготовил дома среднестатистический человек, и готовится она из хороших, всегда свежих продуктов.
Мы хотим быть не просто историей про доставку, поэтому сейчас работаем над игровыми механиками с уже продуманными персонажами и лором.
В планах внедрение геймификации в разные взаимодействия, чтобы сделать заказ еды более увлекательным. В основе геймификации — понятная механика в стиле тамагочи. И у нас есть ощущение, что это должно хорошо сработать.
Как мы запускали стартап в Чикаго
Мы запускались очень постепенно, разделив всё на этапы.
Запуск в агрегаторах. В первые пару дней мы запустились в агрегаторе и заказывали сами у себя. Этому есть сразу две причины:
- После релиза хочется увидеть, как всё будет работать: что клиент может сделать заказ, а линейный персонал на кухне его увидит, соберёт и доставит.
- У агрегаторов сложная и никому не понятная система ранжирования. Есть ощущение, что если в ресторане не делают заказы, агрегаторы не показывают его вообще. Поэтому нам показалось важным первое время поднимать активность самим.
Подключение промоушена в агрегаторах. Для этого нужно выбрать разные поддерживаемые агрегатором акции, например: «Закажи два, получи третье в подарок». Мы начали пробовать разные комбинации, заказов стало больше.
Запуск в приложении проходил по той же схеме: сначала заказывали сами, потом конвертировали людей из агрегаторов в пользователей приложения.
А вообще у этого подхода даже есть название — догфудинг. Это практика использования сотрудниками компании собственных продуктов и сервисов. Такой подход позволяет компаниям «держать руку на пульсе» и понимать, какой результат получает конечный клиент.
Почему доставляем заказы на велосипедах
Каждая кухня обслуживает один район, в пределах которого можно доставить заказ за 30 минут. Почти всегда заказы везут на велосипедах — это удобно. Другие компании почему-то не доставляют еду на велосипедах, хотя у этого много плюсов: не нужно стоять в пробке и искать парковку. Но такая выгода есть в течение дня, когда дороги стоят. Вечером, когда нужно куда-то съездить, уже всё свободно, а на улице часто холодно. Поэтому иногда райдеры используют машины.
Что едят в Америке
Мы выяснили две вещи.
- Еда в Америке в целом — посредственная. И в доставке, и в ресторанах еда проигрывает той, которая в России.
- Среднему американцу вполне себе заходят русские блюда: борщик, шаурма, сырники. В начале мы боялись, что американцы не поймут в меню таких позиций и не будут их заказывать.
У нас нет фокуса на какой-то специфической кухне, поэтому рядом с борщом у нас в меню есть и чизбургер, и хот-дог. Сейчас мы думаем добавить какие-то азиатские блюда, вроде роллов и воков.
Живём командой вместе в пятиспаленном пентхаусе
Жить вместе удобно для прямой деятельности нашей компании. Несколько раз были ситуации, когда на кухню одновременно прилетало 5-6 заказов, а там только один курьер. Мы просто садились в две машины, доезжали до кухни и сами доставляли заказы. Или иногда на склад приходит доставка от поставщика упаковки, а складских сотрудников у нас нет. Можно быстро решить эту задачу вместе: поехать, забрать, привезти, увезти. В долгосрочной перспективе это уйдёт, но сейчас так выгодно.
Как мы доставляли заказы силами топ-менеджмента
Когда мы только запустились, у нас не было райдеров.
Мы ожидали, что заказов за день сначала будет немного, поэтому не хотелось тратить деньги на курьера, который бы был на фуллтайме и ничего не делал. Но на кухне всегда должен находиться ещё один человек кроме повара. Ответственный за точку мог бы доставить заказ и решить какой-нибудь вопрос. На запуске на кухне много чего происходило: например, как-то труба потекла. И мы по очереди становились этим ответственным.
Сейчас у нас несколько поваров и курьеров, но некоторые ребята из операционной команды всё ещё выезжают на кухню. Я тоже выезжаю, но уже не на дежурства, а для какой-то определенной работы: поменять жёсткий диск в системе видеонаблюдения или посмотреть, как дела с апдейтом приложения для райдеров.
CustDev по-стартаперски или как работа доставщиком помогает разработчику
У многих разработчиков, особенно в больших корпорациях, есть разрыв между тем, что делают они, и что непосредственно делает компания. Например, разработчик сидит, делает софт для курьеров, но не знает их боли. А мы все знаем, потому что во всем участвовали.
Как выбирал между KMP, Flutter, React Native и выбрал нативную разработку
Когда стартовал приложение, решил посмотреть ситуацию с кроссплатформенными решениями. Однако ни одно из них на тот момент не подошло. И вот почему:
Почему не React Native
React Native я сразу не рассматривал. Ещё с работы над приложением «Рокета» я помнил, что рано или поздно работа с React Native выльется в три команды из нативных разработчиков и специалистов на RN.
Также у React Native есть ограничения по сложным анимациям, а для нас это критически важно, чтобы выделиться по UX среди конкурентов.
Почему не Flutter
Flutter не привлекает меня из-за отсутствия нативных интерфейсов. Весь UI, который можно сделать на Flutter — это UI Flutter.
Я хочу, чтобы пружинистый скролл на iOS работал как пружинистый скролл на iOS, а на Android — как на Android. Хочется, чтобы использование приложения было привычным для пользователя конкретной платформы. Виджеты Flutter такого не дают, и этот недостаток всегда меня в нём отталкивал.
Почему не KMP
KMP мне тоже сначала не нравился, потому что были сложности с управлением памятью. Однако скоро эту проблему решили.
Планировал нанять iOS-разработчика, но так и не нанял благодаря KMP
Я кодил нативное приложение на Android и планировал найти в команду iOS-разработчика, который сделает нативное приложение на iOS. Во время разработки мне пришлось реализовать сложную логику заказа товаров.
Я хотел, чтобы пользователь мгновенно видел результат каждого действия в приложении. Например, когда добавляет товар в корзину, можно было показать результат: товар лежит в корзине. Но для подтверждения изменений нужно было обращаться к серверу.
Мне не нравилось заставлять пользователя ждать ответа сервера, лучше показывать результат сразу локально. А если что-то пошло не так, сервер все равно выдаст актуальную информацию, и локальное отображение скорректируется — приложение покажет корзину без борща и скажет пользователю: «Блин, борщ закончился».
С реализацией я справился, но это заняло довольно много времени. Дальше показалось глупо сидеть и реализовывать ту же самую логику для iOS. Поэтому я решил посмотреть, как можно переиспользовать то, что уже написал.
Решил, что наиболее адекватный вариант — перенести модуль с бизнес-логикой на Kotlin Multiplatform (KMP) и отдельно сделать iOS-интерфейс — найти человека на фронтенд. А потом подумал, что можно и фронтенд самому написать — современные подходы к вёрстке экранов в iOS и Android очень похожи. В общем, так никого и не нанял.
Вывод: KMP не только даёт главный профит нативной разработки — крутой привычный UI, но и позволяет сэкономить на переиспользовании бизнес-логики.
Чем KMP отличается от других кроссплатформенных фреймворков
Работа с KMP требует единоразовых усилий на начальной настройке, после чего процесс разработки становится более гладким и предсказуемым.
После первичной настройки KMP у меня не возникало ситуаций, чтобы фича потребовала больше времени, чем если бы я писал ее на нативной платформе. Пришлось провести некоторое время, разбираясь в деталях, потому что документации 1,5 года назад не хватало. Сейчас такой проблемы нет.
Если бы мы выбрали нативную разработку, каждая условная задача на создание экрана или фичи была бы разделена на четыре:
- интерфейсы для iOS
- интерфейсы для Android
- логика для iOS
- логика для Android
Время на задачу по логике на KMP сопоставимо со временем на эту же задачу на нативном iOS, поэтому это время просто экономится.
Вместо выводов
О будущем и целях думать сложно, могу сказать только о настоящем. Сейчас получается так, что я пишу и на iOS, и на Android, что-то умею по бэкенду, что-то по DevOps. Эта штука с превращением в T-shaped специалиста как будто реально работает. На практике это очень удобно.
Сейчас я задумываюсь, что было бы, если бы я, наоборот, сконцентрировался на чём-то одном. Если бы я остановился на Android, я бы мог назвать себя Adnroid-экспертом с 10-летним опытом в этой области. Но я, конечно, не могу этого сделать. Пока я для себя ещё не понял, хорошо это или плохо.
Заключительное слово от KTS
В конце хочется сказать про Sizl в целом.
Успешный запуск стартапа невозможен без высокого уровня самостоятельности и ответственности всех его участников. Хотя формально в команде нет руководителей, этого и не требуется.
Любой из команды может взять под контроль горящую задачу, решить её сам или найти исполнителя. Но главное, что каждый нацелен именно на рост и развитие, а не просто решает проблемы.
Желаем Sizl скорейшего расширения и ждём новостей!