Да будет справедливость или как найти друзей на удалёнке

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

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

Мне посчастливилось работать в одной очень крутой и заботливой компании, которая закрывала описанные мною выше потребности. То есть, оплачивала групповые интересы своих сотрудников. Так я ходил с переменным постоянством на сквош, большой теннис, скалолазание, гонку героев. Кроме этого было еще много коммьюнити — это и настольные игры, и занятия по пению, футбол, воллейбол, беговой клуб и, скорее всего. что-то еще, что я не смог вспомнить. Честно говоря, такая забота меня просто поразила, и я нигде такого не встречал.

У каждого коммьюнити был свой лид, который организовывал взаимодействие с площадкой по ее аренде и аренде тренеров. И я очень хорошо общался с лидом большого тенниса. Туда я чаще всего на занятия и ходил. Да и сам я мечтал научиться играть в большой теннис с детства. Поэтому это коммьюнити мне было не безразлично.

У участников этого коммьюнити была проблема, на которую они чаще всего жаловались. Это способ записи на еженедельную тренировку. Дело в том, что на каждое коммьюнити компания выделяла определенный бюджет. И конкретно в большом теннисе его хватало на 2 тренировки в неделю максимальной вместимости по 8 чел в группе. При этом желающих в зависимости от сезона было больше чем могла вместить группа.

Запись на занятия происходила через выкладку в 12:00 в определенный день google docs документа с общим доступом. Соответственно, в 12:00 начиналась бойня за то, кто раньше успеет вписать себя. Кто-то перезаписывался поверх другого человека, кто-то в этот момент был на встрече и не смог вовремя зайти и записаться. В общем, это был хаос. А кроме того, некоторые постоянные участники наловчились записываться быстрее всех, что приводило к тому, что люди, которые хотели хоть раз попробовать, ни разу не могли записаться (да-да, я был среди тех жуликов). "Несправедливо как-то. Кто-то уже 3 раза подряд ходит, а я не могу и раза записаться", — говорили они.

Мы с лидом коммьюнити пытались как-то пофиксить малой кровью это дело. Я написал формулу в excel, которая рандомно и с учетом тех, кто уже был на прошлой тренировке, давала итоговый список. Но это было неудобно лиду каждый раз копировать в telegram группу, кто в итоге идет на тренировку. Кроме того, у этого способа появился один неприятный side-effect. Люди записывались на тренировку на всякий случай. Когда их выбирала функция в excel и админ отправлял список в telegram группу — они пропускали это сообщение, так как у многих она была на mute.

Помимо excel искал другие решения. Но в первую очередь находил инструменты, которые не контролировали количество мест или работали с не авторизованными пользователями. Ну и запись через отдельное приложение / сайт не очень удобно.

Кроме хобби активностей компания еще организовывала хакатоны, где каждый может собрать команду или в одиночку сделать что-то полезное (но не бизнесовое) для компании и сотрудников (и, конечно, получить ачивки). Я несколько раз уже участвовал в них, и мне в голову пришла идея, как закрыть боль моих любимчиков - теннисистов. Если коммьюнити ведут в telegram - то почему бы и не записываться там же с автоматизацией всех описанных проблем? Идея есть - ищу ребят которые мне помогут, потому что сутки на реализацию выглядят маловато... Нашлись еще 3 энтузиастов. Засучили рукава, взяли по энергетику. И за сутки написали бота.

Смысла расписывать технически как он работает особо нет, так как никакого рокет саенса в сервисе нет. Лучше опишу как он работает с картинками:

  • Бот добавляется в чат с участниками коммьюнити.

  • Админ настраивает событие с параметрами опроса (если событие регулярное - то можно размножить его на пару месяц вперед).

    enter image description here
    Создание нового мероприятия через админку бота
  • Голосовалка в настроенное время приходит в чат, и желающие участвовать голосуют.

    enter image description here
    Первая голосовалка, которая отправляется ботом в группу
    enter image description here
    Результаты первой голосовалки
  • Опционально в настроенное время приходит голосовалка подтверждения с теганьем тех, кто отметился в прошлом голосовании (вдруг у кого-то изменились планы).

    enter image description here
    Второая голосовалка, которая отправляется ботом в группу
  • В настроенное время приходит итоговый список с теганьем тех, кто будет участвовать в мероприятии. Он строится следующим образом: пересечение двух первых списков + рандомизация с учётом тех, кто участвовал в прошлой тренировке (чтобы не было такого, что кому-то часто не везёт). Кроме того, публикуется список запасных участников на случай, если кто-то откажется.

    Пример: желающих 20 человек. Тренировка на 8 человек. В первой голосовалке они отметились, потом во второй голосовалке отметились 18 из 20. Итоговый список будет состоять из 8 участников (в приоритете те, кто не был на прошлой тренировке) и 10 запасных.

    enter image description here
    Итоговый список участвующих с заменами
  • Если человек попал в основной список, но понимает, что не может прийти — он пишет боту о том, что хочет отказаться, и тогда автоматически в основной список попадает человек по очереди из списка запасных.

    enter image description here
    Прошу заменить меня
    enter image description here
    Бот заменяет на первого человека из резерва
  • Если было много замен, то сложно отследить, кто в итоге идёт на мероприятие. Для этого есть команда, доступная админу коммьюнити — вывести итоговый список.

    Итоговый список после всех замен
    Итоговый список после всех замен

Где это может быть полезно?

  • Фитнес-центры, в которых есть ограничение на количество мест (например, cycle). К примеру, как я записываюсь сейчас. В 00 минут определённого часа открывается запись, и начинается race condition (авторизацию можно допилить — код открыт, у нас использовался отдельный бот, который удалял из группы не сотрудников).

    enter image description here
    Запись в моем фитнесе через приложение
  • Групповые занятия в теннисных школах или подобных заведениях.

  • Мероприятия, на которых надо знать, сколько из записавшихся придёт на один из уроков, чтобы посчитать количество оборудования/фасилитаторов или чего-то такого. Например, у нас был кейс, когда на обучение во внутреннем портале записалось 20 человек, а на уроках было от 4 до 12 человек. И куратору надо было знать, сколько человек будет на каждом из уроков.

  • Остальные use case можете придумать сами))

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

Теперь о второй части заголовка. Полгода назад я сменил работу. Несмотря на то, что у компании был офис в Москве, вся моя команда была распределённой, и коллег я видел только в Zoom (чаще всего с выключенными камерами). Иногда я ездил в офис, чтобы пообщаться, но когда ты работаешь в обособленной команде, сложно подходить к каждому в офисе и говорить: "Привет, я такой-то, давай пообщаемся". У вас нет общих точек соприкосновения. В итоге я приходил в офис и лишь пару раз с кем-то перекидывался парой слов. Грустно и не вкусно!

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

И тут я вспомнил, что хожу уже 3 года в один и тот же фитнес. Особенно часто в последние пол года пытаясь залечить сердечную травму (реально помогает). Посещаю я в основном групповые тренировки (да-да, вы тоже про эту картинку подумали?)

enter image description here
На поперечный шпагат я так и не сел))

Я знаю там пару человек, но помимо фитнеса мы нигде не общаемся. С несколькими обменялись контактами, поговорили о том, кто где работает. И всё. А благодаря моей рыбьей памяти я забыл половину имён, как только их услышал. И тут возник вопрос: а можно ли превратить людей, которые вместе ходят на одни и те же тренировки уже несколько лет, в комьюнити? Чтобы было не просто "привет-пока", а можно было бы посмотреть, как кого зовут, и видеть сториз людей, чтобы можно было о чём-то поговорить и хоть как-то косвенно узнать друг друга. Я знаю пример из моего прошлого фитнеса, когда из тех, кто постоянно ходил на тренировки, сформировалась команда, которая пробежала "Гонку героев". И вот теперь они друзья, ходят по барам и тусят вместе. Бинго! Это то, что мне было нужно! А если это нужно пользователю, значит, нужно и организаторам.

P.S. Уже четвёртую неделю заменяют хорошего тренера. И заменяющие не знают почему. Вот бы была группа, где можно было бы спросить у тренера лично...

Cсылка на тестирование бота https://t.me/+u5ZceP9JSChjZTYy
Ссылка на исходный код https://github.com/lashnag/community_bot (не серчайте за качество кода - делалось в режиме хакатона)

Источник: https://habr.com/ru/articles/851816/


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

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

В данной статье мы рассмотрим правильный подход к Frontend разработки в Bitrix. А именно разделение на расширения которые сможем подключать в любой момент времени. + напишем SPA приложение на React.
Управление большим числом изменяемых шаблонов бизнес-процессов — непростая задача. А необходимость поддержки актуальных версий шаблонов на нескольких копиях проекта добавляет еще больше сложностей. Де...
ЗадачаЕсть AWS аккаунт, на котором требуется поднять статический сайт (html, js, css, png, jpg) на своём домене example.com.Ссылки: http://example.com, http://www.example.com, https://www.example.com ...
Retrieval Augmented generation - генерация ответа с использованием результатов поиска. RAG-архитектура - это подход к созданию приложений, в которых большая языковая модель без дополнительного обучени...
Привет, мы команда СберМегаМаркета, и это обзорная статья о нашей площадке, пробный камень для блога Хабре. За нашими плечами спешный переезд с PHP на GO, ребрендинг и решение таких задач, с которыми ...