Кодим-піца

Привіт Хабр. Ми спонтанно провели перший внутрішній хакатон. Вирішила поділитися з вами своїми болями та висновками про підготовку до нього за 2 тижні, а також проектами, які вийшли.

Кодим-піца

Нудна частина для тих, хто цікавиться маркетингом

Почну з маленької історії.

Початок квітня. У нашому офісі проходить перший хакатон MskDotNet Community. Битва за Татуїн у розпалі, у нашій галактиці цього разу. Субота. 20 команд. Піца. Все дуже душевно (пруфи). Надувний R2-D2 маячить по залі. Команди пишуть найправильніші алгоритми, щоб пройти найнебезпечнішу гонку на карті. Зрушуємо запуск перших заїздів. Печінки та каву рятують. Ми з організаторами очікували, що в суботу багато хто піде після обіду. Але немає. 12 годин кодингу за. Фінал. Щось відвалюється, щось не запускається. Але всі щасливі. Перемагає наша команда. Ми щасливі подвійно.

Ділюсь радістю в Slack і на думку спадає ідея: «Треба зробити свій хакатон». Пишу нашому СТО Сашка. Тиша.

Ранок. П'ю каву в офісі. Бачу Сашу, що наближається з-за спини. «Ліза, це ж чудово! У нас якраз 21 квітня є важлива дата. Давай робити! WTF!? Так швидко? А? Що? Мені потрібно відлітати в Сиктивкар на стажування в середині квітня. Та й чорт із ним! Давай.

Залишається 2 тижні. Я ніколи не була одноосібним організатором хакатону. Нехай і внутрішнього. Читаю статті з цієї теми. Жерсть. Потрібно кілька місяців. Потрібно кілька людей. Потрібно продумати мерч, призи, умови, розклад, зацікавити, зрозуміти мету, бюджети. А може навіть розібратися у сенсі життя. Я точно не встигну. І доки ти читав і готувався, уже тиждень минув. Саме час забити на статті та почати щось робити.

Ловіть наш чекіст проведення внутрішнього хакатону за 1 тиждень

  • План: спокійно сідаєш і пишеш список того, що необхідно зробити для хакатона 30 хвилин.
  • Завдання: учасники самі пропонують та обирають проекти, які хочуть створити в Google Sheets. Фонове завдання, 2 години.
  • Розклад: на коліні пишеш коротку розбивку за часом з урахуванням 3 перерв та фіналу 20 хвилин.
  • Команди: публікуєш повідомлення про хакатон з розкладом від СТО в IT-каналах у Slack/пошті/etc та створюєш окремий канал для хакатона. У ньому всі розбиваються на команди, а ті, хто не визначився, роблять це в перші 5 хвилин хакатона. Фонове завдання, 2 години.
  • Плюшки: вигадуєш мерч з двома розробниками, віддаєш дизайнеру у відмальовування, отримуєш готовий Фонове завдання, 3 дні.
  • Хакатон: приходиш в офіс, координуєш усіх на початку, займаєшся своїми справами, читаєш Reddit, з важливим виглядом повідомляєш кожну перерву про свіжу піцу, фотографуєш захід сонця, оголошуєш про фінал, разом голосуєте та обираєте переможця. 1 день.
  • Під зірочкою: звичайно, ти постійно думаєш про те, щоб все пройшло добре Звичайно, не всі побачать твоє повідомлення та з деякими краще поговорити особисто. Звичайно, якщо тобі хтось допомагатиме, все стане в 2 рази простіше (мені допомагала чудова Олена).

Менш нудна частина про дату хакатона

Чому 21 квітня? Цей день є значущим для нас. Рівно рік тому, 21 квітня, ми впали під навантаженням під час перших вихідних після старту Федеральної Рекламної Кампанії. Наступного дня в неділю наша команда була на роботі з 8 ранку. Тоді ми створили в Trello дошку sundayhackathon і почався тиждень позмінної роботи по 12 годин на день. Становище було настільки критичним, що нам ніколи було навіть їсти і нас підгодовували хлопці з інших команд.

Кодим-піца

Більш детальну розповідь ви можете прочитати на сторінці Федора Овчиннікова (Нашого СЕО). З того часу ми багато що змінили, але дату тепер точно не забудемо.

Цього року ми вирішили, що цю подію варто увічнити у пам'яті нащадків і в найкращих традиціях влаштували перший в історії Додо внутрішній хакатон, який тривав 10 годин.

Найнудніша частина про проекти хакатона

Disclaimer: всі описи писали самі хлопці, тому авторство тексту не моє.

Олег Лернінг (машин лернінг)

Діма Кочнєв, Саша Андронов (@alexandronov)

Хотіли зробити нейросітку, яка б визначала, що за піца на фотографії без будь-яких знань. У результаті зробили дуже просту та іграшкову – вона розпізнає 10 піц, приблизно розібралися як усе влаштовано, наскільки це можливо за день (~10 годин).

Кодим-піца

Зокрема, ми зрозуміли, що індустрія дійшла рівня, коли звичайний розробник може взяти готові бібліотеки, прочитати документацію і навчити свою нейромережу без глибоких знань предмета. І вона досить добре працюватиме для вирішення реальних завдань.

Інструменти, які використовували:

  • imageai — зручна та проста бібліотека для роботи з машинним навчанням та комп'ютерним зором.
  • Моделі спробували дві – ResNet50, Yolo.
  • Код писали, ясна річ, на пітоні.

У нас було 11000 фоток, але серед них майже 3/4 виявились сміттям, а в решті – різні, невідповідні ракурси. У результаті ми взяли готову модель (яка просто вміє знаходити піцу) і за її допомогою відокремили самий треш. Далі, у назві фотки була назва піци - так ми розклали по папках, але виявилося, що назви не збігаються з дійсністю і тут уже довелося підчистити руками. У результаті залишилося близько 500-600 фото, зрозуміло, що це мізерна кількість, але тим не менш, цього виявилося достатньо, щоб відокремити 10 піц одну від одної.

Для навчання сітки взяли найдешевшу віртуалку в Azure на NVIDIA Tesla K80. На ній навчали у 100 епох, але було видно, що мережа перенаситилася вже після 50 епох через те, що був маленький датасет.

Власне, вся проблема у відсутності хороших даних.

Кодим-піца

Ми, можливо, трохи наплутали в термінах, але треба враховувати, що в нас взагалі немає досвіду роботи з усіма цими справами.

GUI for NOOBS (консоль для замовлення піци)

Михайло Кумачов (Церидан), Женя Біккінін, Женя Васильєв

Ми зібрали прототип консольної програми для гіків, завдяки якому можна замовити піцу через термінал або командний рядок, або навіть вбудувати в deploy pipeline і при успішному релізі доставляти піцу в офіс.

Кодим-піца

Робота розбилася на кілька частин: розбиралися, як влаштований наш API для мобільних додатків, збирали свій власний CLI за допомогою окліф та налаштовували публікацію зібраного нами пакету. З останнім завданням було пов'язано кілька неприємних хвилин ближче до кінця хакатону. У нас все працювало локально і навіть працювали старі опубліковані версії пакета, але нові (в яких було додано більше кльових фіч та смайликів) працювати відмовлялися. Ми витратили хвилин 40, щоб зрозуміти, що пішло не так, але в результаті все магічним чином саме запрацювало).

Нашою програмою максимум на хакатон було справжнє замовлення піци в офіс через нашу CLI. Ми десяток разів все проганяли на тестовому стенді, але в мене все одно тремтіли руки, коли я забивав команди на проді.

Кодим-піца

Як підсумок – ми все-таки зробили це!

Кодим-піца

CourierGo

Антон Бружмєльов (автор), Ваня Звєрєв, Гліб Лісников (ентропія), Андрій Сарафанов

Взяли ідею «Додаток для кур'єра».

Передісторія для підготовки.Спочатку я прикинув, а які взагалі фічі можуть бути у додатку? Виник приблизно такий список функціоналу:

  • Програма логінується в касу доставки за кодом.
  • У додатку відразу видно доступні замовлення, які потрібно брати.
  • Кур'єр відзначає замовлення та бере в поїздку.
  • Йому показується розрахунковий час і встигає він чи ні.
  • Клієнту показує, що кур'єр виїхав.
  • Клієнту починає показувати точку кур'єра на карті та розрахунковий час.
  • Кур'єр може написати клієнту в чат із програми.
  • Клієнт може написати кур'єру в чат із програми.
  • За п'ять хвилин до приїзду клієнту надходить повідомлення, що кур'єр близько, будьте готові.
  • Кур'єр зазначає у додатку, що він під'їхав і чекає.
  • Кур'єр дзвонить з програми одним кліком і повідомляє, що (піднімається, підійшов і т.п.)
  • Клієнт приймає замовлення та вводить пінкод із програми або СМС для підтвердження доставки. (як підпис) Щоб кур'єр не міг завершити доставку заздалегідь, якщо запізнюється.
  • Замовлення зазначається у системі доставленим.

Плюс пара альтернативних сценаріїв:

  • Кур'єр може відзначити замовлення недоставленим та вибрати причину.
  • Кур'єр при запізненні може видати однією кнопкою електронний сертифікат через СМС. Або сертифікат надходить автоматично при недотриманні терміну доставки.

Відчуття перспективності та потреби даного проекту, звичайно, заряджало.

Наступного дня сходили з командою на обід та обговорили, як виглядатиме мінімальний функціонал програми.

У результаті утворився наступний список того, що потрібно встигнути зробити на хакатоні:

  • Логін до каси доставки.
  • Відобразити поточне положення.
  • Надіслати дані у зовнішню апі (координати, взяв замовлення, доставив замовлення).
  • Отримати дані із зовнішнього апі (поточні замовлення кур'єра).
  • Надіслати евент про те, що взяв замовлення на доставку/доставив.
  • Показувати поточне положення кур'єра на карті у сайті.

Основна робота, як бачилося, мала бути у створенні бекенда, самого додатка (після обговорень обрали ReactNative для розробки додатка, точніше обв'язку над ним - expo.io, що дозволяє взагалі не писати нативний код). У плані бекенда спочатку була надія на Ваню Звєрєва, як досвідченого у роботі з нашим шаблоном сервісу та k8s (яку роботу він і взяв). ReactNative взяли доторкнутися я і Андрій Сарафанов.

Я вирішив пробувати одразу створити робочий репозиторій для самого проекту. О 12-й ночі я натрапив на те, що в ReactNative погано працює геолокація в бекграунді, якщо не писати нативний код, трохи фруструвався. Потім відпустило, коли зрозумів, що читаю документацію не expo.io фреймворку, а ReactNative. У результаті за вечір мені вже було зрозуміло, як отримати в expo.io поточне положення, і малювати окремі екрани (для логіну, відображення замовлення тощо).

Кодим-піца

З ранку на хакатоні залучили Гліба до свого надперспективного проекту. Швидко накидали план того, що треба зробити.

Кодим-піца

Зробили помилку, коли відповідно до шаблону проекту намагалися зробити спілкування не через HTTP, а через GRPC, тому що ніхто не вмів збирати GRPC-клієнта для JavaScript. У результаті, витративши на це приблизно півтори години, кинули цю ідею. Через це хлопці та на беку почали переробляти готовий сервер із GRPC на WebApi. Через пів години, нарешті, ми змогли налаштувати спілкування програми з бекендом, диво. Але в цей же час Гліб майже добивав деплою в k8s і плюс автодеплою за коммітом у майстер. 🙂

Як сховище ми вибрали MySQL, щоб не ризикувати хоча б з базою (були думки про CosmosDb).

Кодим-піца

У підсумку:

  • Реалізували збереження поточних координат кур'єра із додатку до бази.
  • Прикрутили RabbitMQ і підписалися на повідомлення про взяття кур'єром замовлення, щоб відразу ж відображати замовлення у кур'єра у додатку.
  • Почали зберігати собі в базу час про доставку замовлення після того, як кур'єр натискав кнопку в додатку. Не встигли додати відправку події назад у хлопчик про те, що замовлення доставлено.
  • Я зробив показ карти на сторінці currentorder на сайті з поточним положенням кур'єра. Але цей функціонал залишився трохи недоробленим, оскільки на оточенні не вдалося настроїти CORS для отримання координат з нашого нового сервісу.

M87

Рома Букін, Гоша Польовий (georgepolevoy), Артем Трофімушкін

Ми хотіли реалізувати провайдер OpenID Connect, тому що на даний момент у нас використовується протокол аутентифікації власної розробки, і це створює ряд труднощів: кастомні клієнтські бібліотеки, незручна робота з боку зовнішніх партнерів, можливо проблеми з безпекою (все-таки OAuth2.0 і OpenID Connect в еталонній реалізації можна вважати безпечними, а ось щодо нашого рішення – я не впевнений).

Кодим-піца

Ми зробили окремий сервіс, що емулює сервіс зберігання персональних даних, щоб створити маленьку модель Country-Agnostic провайдера аутентифікації, який ходив би за персональними даними в окремий сервіс (це в перспективі дало б можливість мати один сервіс, за допомогою якого можна було б залогінитися з облікової записом у будь-якій країні, і при цьому відповідати GDPR та іншим ФЗ). Цю частину ми зробили, як і провайдер, і успішно пов'язали їх один з одним. Далі потрібно було зробити API, який був би захищений токенами, які видає провайдер, підтримувати їхню інтроспекцію через провайдер і віддавати захищені дані, якщо запит задовольняв би політикам авторизації (перевіряємо, що користувач автентифікований за схемою Bearer, у його токені міститься певний самого користувача є пермішен, що дозволяє виконання дзвінка). Ця частина також була виконана. Останнім компонентом був JavaScript клієнт, якому видавався б токен, за допомогою якого той викликав би захищений API. Цю частину ми зробити не встигли. Тобто була готова вся функціональна частина, але не була готова фронтендна частина для демонстрації працездатності всієї системи.

Е-Е-Е (іграшка)

Діма Афонченко, Сашко Коновалов

Ми зробили міні-іграшку на юні де жваві ручки накидають ковбаску на піцу. У випадку, якщо ти неправильно накинув ковбаску, на екрані з'являється сумний напис «Забраковано», а якщо вся ковбаска накинута правильно, то з'являється випадковий факт про піцу.

Кодим-піца

Хотіли зробити другий рівень із накиданням томатів, але не встигли.

Кодим-піца

Короткий продовження: хто ж переміг?

Перед хакатоном ми спілкувалися з хлопцями і я питала, який приз вони хотіли б отримати, якщо виграють. Виявилося, що найціннішим призом буде «дорога у прод».

Кодим-піца

Тому, незабаром чекайте від нас анонс гри з ручками, що накидають пепероньки на піцу.

Як міг помітити уважний читач, перемогла команда "Е-Е-Е". Вітаємо хлопців!

Тільки зареєстровані користувачі можуть брати участь в опитуванні. Увійдіть, будь ласка.

Який проект вам більше сподобався?

  • Олег Лернінг (машин лернінг)

  • GUI for NOOBS

  • CourierGo

  • M87

  • Е-Е-Е

Проголосували 5 користувачів. Утрималися 3 користувача.

Джерело: habr.com

Додати коментар або відгук