Постмортем: Как мы слили крупнейший хакатон в РФ и чему у нас можно научиться

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

Я обожаю хакатоны. Они - как демоверсия стартапов - надо сварганить MVP, провести аналитику, создать продукт. Вот только побеждать в этих самых хакатонах у меня не всегда получается.

Я со своей командой участвовал в хакатоне ЛЦТ-2022. Думали будет просто - мы были опытны, слаженны, побеждали ранее. Но в итоге, как это часто бывает, что-то пошло не так. Заняли мы, само собой, самое обидное место из существующих: 4-е из 97

Мы решили провести анализ ошибок, результатом которого и стала данная статья.

Как слили? Почему? Зачем? Давайте разбираться.

Заходят как-то бард, маг и воин в бар...

Давайте знакомиться с главными героями нашего боевого отряда. По регламенту, участвовать в одной команде может от 2 до 5 человек. Изначально нас было 4-ро, роли у нас были следующие:

  • Backend разработчик

  • Аналитик/PM

  • Fullstack разработчик

  • Frontend разработчик (Я)

Нам не хватало только дизайнера, поэтому мы решили как и всегда - попытаться найти его на просторах телеграм чатов с поисками сокомандников. Для того чтобы полноценно начинать участвовать, нам также нужно было выбрать трек (задачу).

Невероятно забавно, но уже на данном этапе у нас появились первые проблемы.

1. Оценивайте популярность трека и предсказывайте выборы других людей

Треков было 10, каждый со своими странностями. Треки были следующими:

Задачи для хакатона.
Задачи для хакатона.

Увидели темы? Вам они тоже показались какими-то странными?

Ну и мы сидим и думаем - а что брать то? Выбор пал на 2, 6 и 9. В итоге взяли 6-ю тему "Сервис для расчёта рыночной стоимости жилой недвижимости города Москвы" как самую понятную. Как оказалось - это было не самое умное решение - мы выбрали самый конкурентный трек хакатона. Зашибись.

На 6 треке было наибольшее кол-во команд - 97, Карл! Для понимания, на одном из других треков (не помню точно на каком) было ~14 команд.

Как споткнулись:

  1. Выбрали самый популярный и сложный трек

Какие выводы сделали:

  • Следует тщательней анализировать выбор задач на хакатоне. Порой выбрать самую "понятную" - не лучшее решение, т.к ее логично будет выбирать большинство.

  • Если мы спроецируем эту ошибку на коммерческие проекты и стартапы, она будет звучать как “делайте анализ рынка заранее, прежде чем начинать разрабатывать продукт”.

2. Берите в команду уже проверенных бойцов

Наш состав команды почти не менялся между хакатонами - единственное что приходилось делать всегда, это искать UI/UX дизайнера - каждый мы это делали с нуля.

В этот раз ситуация была еще хуже - начали активно искать дизайнера лишь за 2 дня до начала, затем поняли, что он нам не понравился, и начали искать другого. Нашли нового, когда прошла неделя от хакатона. Т.е, мы потратили 50% отведенного времени.

Как споткнулись:

  1. Не имели проверенного дизайнера в команде.

  2. Начали искать дизайнера слишком поздно.

  3. Потратили слишком много времени, прежде чем понять что нам не подходит человек.

Какие выводы сделали:

  • Лучший сценарий - иметь полностью готовую, наработанную и укомплектованную команду без поиска в условиях ограниченного времени

3. Используйте все доступное время

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

При этом, наш аналитик сделал очень подробный и внятный план за 2 дня - мы могли начать по крайней мере заранее пилить бекенд, а на фронтенде делать не красивый, но функциональный код который бы решал задачу. Надо было сразу писать бизнес логику, пока создавался интерфейс, а на фронтовой части просто использовать серые квадраты - главное чтобы они были рабочими.

Как споткнулись:

  1. Выбросили в никуда 50% времени

  2. Могли начать писать код спустя 2-3 дня, а не спустя неделю

Какие выводы сделали:

  • Используйте все время которое дано на задачу с первой минуты. Отдыхать будете потом.

  • По максимуму используй все возможности которые у тебя есть.

4. Набирайте команду по скиллам

Так. И вот началась наша разработка. Спустя половину потраченного времени, мда уж.

Какой стек был у нас: бэкенд - python + FastAPI, база - PostgreSQL, фронтенд - React (с связкой с Next).

Все из нас были бекендерами, я в том числе. На работе я нечасто взаимодействую с React, хоть и приходится это иногда делать. У нас фактически была команда из 4-х серверных разработчиков, но при этом фронтенд кто-то, да должен делать. В итоге нам, не сильно разбирающимся в фронтенд разработке, надо было писать фронтенд код.

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

Как споткнулись:

  1. У нас не было достаточных компетенций во фронтенде.

  2. Очень долго настраивали и пытались первично соединить бек с фронтом

  3. Нужно не просто верстать компоненты, а потом соединять их с беком. Необходимо делать сразу рабочие компоненты которые к этому беку обращаются.

Какие выводы сделали:

  • Много кто из нас значительно прокачался в React. Что-то не знать и пытаться внедрить новое на хакатоне может быть очень полезным опытом. Но если цель именно победа и получение приза - команда должна иметь всю необходимую квалификацию для этого изначально.

5. DDD в каждый стартап

Осталось 40 часов до дедлайна. Так как код писался очень быстро, то и его качество оставляло желать лучшего. Одна из причин его плохого качества - не следование принципу единого языка (Ubiquitous language). Так как мы работали параллельно и нечасто координировали свою работу, у нас было по 2-3 разных названия для одной и той же Entity в разных частях проекта. Помимо этого, все знание по проекту было сосредоточено у аналитика. Никто не понимал user flow кроме него - нам было лень в этом разбираться, и мы поплатились за это абсолютным непониманием того что происходит и что нам делать.

Не сказать что я эксперт в DDD, но книжку Эванса (синюю) и Вернона (красную) по Domain Driven Design я прочёл. И почему-то, у меня всегда было стойкое ощущение о том, что DDD - это дорого, сложно, занимает много времени и не всегда полезно (наверное потому что сам Вернон приводил матрицу DDD в которой описывал его применимость в проекте).

А на самом деле, если декомпозировать DDD на самые полезные его части - то их следует использовать абсолютно всегда. Теперь я убежден, что как минимум ubiquitous language нужно внедрять в любой проект, а каждый разработчик должен уделить время на понимание предметной области, и того что он вообще разрабатывает, особенно на начальных стадиях производства продукта.

Как споткнулись:

  1. Зависели от нашего аналитика. Bus factor был настолько большим, что если бы наш аналитик вдруг внезапно заболел - мы бы не смогли сделать абсолютно ничего с этим.

  2. Не вникали в предметную область на наших созвонах и QA сессиях, относились к этому халатно

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

Какие выводы сделали:

  • Единый язык необходим даже когда вы делаете MVP. Отсутствие словаря сильно отвлекало и мешало добавлять фичи, он должен быть всегда - особенно если разработка идёт быстро и параллельно.

  • Хорошее понимание предметной области должно быть у каждого члена команды, особенно на ранних этапах разработки. В нашем случае, хорошее понимание было лишь у нашего аналитика, и это нас сильно ограничивало.

6. Делай MVP. Делай MVP. Делай MVP.

Осталось 12 часов до дедлайна. Снова одна и та же проблема из раза в раз - мы сделали слишком большой акцент на вторичных фичах, при этом основа была все еще не готова.

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

Как споткнулись:

  1. Не разрабатывали проект итеративно

  2. Делали красиво, но не жизнеспособно

  3. Не использовали принципы продуктовой разработки

Какие выводы сделали:

  • Сначала нужно концентрироваться на главном - чтобы приложение работало, не важно как плохо оно выглядит. Не важно насколько красиво будет выглядеть ваш дизайн, если приложение не будет работать.

  • Составляйте Backlog с критическими задачами, от реализации которых зависит успех проекта. Делайте наиболее важные задачи в первую очередь.

7. Не унывайте

Вечер последнего дня, 5-6 часов до деделайна. Мы объективно не успеваем.

Большинство из нас в какой-то невероятной печали. Мы очень сильно устали, в последние 2 дня страдали от депривации сна и работы по 15 часов. Код лапша, жизнь отстой, всё достало, тлен. Тут всё очевидно - нам не сильно это помогало, напротив, только мешало.

Самым забавным является то, что мы прошли в финал (топ-10 команд трека). Да, мы это сделали, но при этом мы буквально на финишной прямой могли забить и уйти спать.

Как споткнулись:

  1. Были в унынии, и думали вообще уйти с проекта

Какие выводы сделали:

  • Если уж начал что-то делать, делай это до конца. Возможно от уныния в таких ситуациях не избавиться, но как минимум доделать дело - это твоё обязательство.

  • Уныние не всегда оправдано. В нашем случае все еще абсурднее - мы объективно сделали неплохое решение для финала, но при этом мы так не считали

8. Хороший Тимлид/PM реально решает

Наш тимлид все время был "на подъеме" - единственный кто нас поддерживал и поднимал наше настроение. Постоянно писал что все отлично, это легчайший хакатон, займём первое место - надо лишь немного поработать.

Он провёл идеальную аналитику, проработал план продукта и проекта, продумал в деталях весь user flow, а также скоординировал между собой работу всех членов команды. Без него все было бы сильно сложнее, мы бы не смогли дойти до финала, сдавшись в самый ответсвтенный момент.

Какие выводы сделали:

  • Кто бы что не говорил, но хороший Тимлид/PM реально решает и приносит колоссальную пользу в продуктовой разработке. Аналитику проведет, задачи декомпозирует, скоординирует разные части команды, vision всем свой даст, спасёт от уныния. Мы часто раздражаемся от "эффективных менеджеров", но по-настоящему эффективные менеджеры реально существуют. Таких людей немного, но они есть, и порой они могут быть причиной успеха или неудачи всего проекта.

Финал

Итак, проходит неделя. И каким-то чудом мы попали в топ 10, а значит мы официально участвуем в финале, на котором решение нужно питчить прямо на сцене.

Отдам должное организации мероприятия - она была на высоте. Здание было крутое, нас кормили завтраком, обедом и ужином, а вечером даже разливали шампанское и вино!

Заглушаем горе поражения алкоголизмом
Заглушаем горе поражения алкоголизмом

Раздавали бесплатные протеиновые батончики, можно было поиграть в PS4 или отдохнуть в массажных креслах. А, ну и мерч само собой за то что мы попали в финал выдали.

Настало время защиты решений. Мы сидели, и скрупулёзно смотрели за нашими соперниками. Конкурентны объективно имели крутые, проработанные решения, и это было офигенно.

После защиты, как нам показалось, что топ-3 точно наш. Но, как оказалось, это не так.

9. Надежность, Доступность и UX - важные штуки

Думали SLA - не для MVP? Думали высокая доступность и надежность - прерогатива highload приложений с кучей пользователей? А вот нифига.

Надежность - основная причина по которой мы проиграли. И заняли, внимание 4-место. Не дотянули совсем чуть-чуть до призового (обидно конечно).

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

В другие попытки проверить решение, у проверяющих оно также не работало - насколько мы поняли проблема в этот раз была на нашей стороне.

Как споткнулись:

  1. Не придали значение надежности - думали что для MVP это не важно.

  2. Не имели адекватной обработки ошибок на клиентской части - это могло спасти нас хотя бы частично.

Какие выводы сделали:

  • Надежность - важнейший параметр проекта, от него может зависеть его успех, даже если всё остальное было сделано на высоте.

  • Уделяйте достаточное время обработке ошибок с учетом UX.

Резюмируюя

Давайте подведём итоги, и выделим самые полезные инсайты из нашего опыта:

  1. В хакатонах не всегда стоит брать самый понятный на первый взгляд трек.

  2. Правильно набирайте команду - берите людей, которым доверяете, с которыми работали ранее, и навыки которых достаточны для реализации проектов. Либо, учитесь: хакатон отличная возможность взять незнакомый стек и научиться чему-то новому!

  3. Используйте все доступное время - не тратьте его на бесполезное уныние и реализуйте ваш проект до победного конца.

  4. Domain Driven Design очень важен даже на начальных этапах разработки - каждый разработчик должен погружаться в предметную область проекта.

  5. Делайте MVP. Выполняйте в первую очередь задачи, приближающие вас к работоспособному продукту

  6. Хороший PM реально решает. Ищите хорошего менеджера и тимлида - он может принести колоссальную пользу вам и команде.

  7. Надежность невероятно важна. Не пренебрегайте ей - от неё может зависеть судьба вашего проекта.

Спасибо за уделенное время. Надеюсь эта статья поможет вам не допускать ошибок, допущенных нами.

Источник: https://habr.com/ru/post/721034/


Интересные статьи

Интересные статьи

С каждым годом в наших командах появляется всё больше перспективных тестировщиков, разработчиков и аналитиков без технического бэкграунда, которых нам приходится «подтягивать» в процессе. Например, мы...
Когда я составляла подборку игр про алгоритмы, наткнулась на игру «Baba Is You», которую Арви Тейкари придумал во время «Nordic Game Jam» (Baba Is You — Jam Build). Мне стало любопытно, полезла ра...
Как известно, значение дата-центров для всех типов компаний и обычных пользователей неуклонно растет. При этом лишь одна минута простоя крупного ЦОД может спровоцировать ...
Знакома ли вам ситуация: решили провести вечер дома и посмотреть какое-нибудь кино в хорошей компании, но, попытавшись определиться, какое — провели за выбором столько времени, что на кино его не...
Тема статьи навеяна результатами наблюдений за методикой создания шаблонов различными разработчиками, чьи проекты попадали мне на поддержку. Порой разобраться в, казалось бы, такой простой сущности ка...