Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 5
×

Как мы создали Slack-бот и ускорили процесс найма новых специалистов

Всем привет! Меня зовут Дмитрий Гой. Я работаю Python Software Engineer в компании Grid Dynamics. В этой статье я расскажу о том, как мы автоматизировали процесс найма новых специалистов с помощью Slack-бота. Этот материал будет интересен разработчикам, hiring менеджерам, рекрутерам, а также всем тем, кто непосредственно задействован в процессе собеседования кандидатов. Итак, начнем.

Сколько времени уйдет на то, чтобы понять, когда могут все? или Выявление проблемы

Найм новых людей в компанию — довольно трудоемкий и затратный по времени процесс. В нем участвует рекрутер, кандидат и технические специалисты компании, которые оценивают уровень знаний соискателя.

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

Чтобы более наглядно отобразить масштаб ситуации, посмотрим на цифры. В локальных офисах у нас работает более 40 человек в команде рекрутинга и около 700 инженеров, которые желают участвовать в проведении технических интервью. Главной задачей Slack-бота было оптимизировать коммуникацию рекрутеров с интервьюерами для определения временных интервалов, оптимальных как для интервьюеров, так и для кандидата.

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

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

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

Что если собрать всех желающих вместе? или Сосредоточение запросов в чате

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

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

Средства реализации:

  • Slack-чат
  • Slack Workflows

Преимущества решения:

  • Ответственность за определение подходящего интервьюера передано самим специалистам. Каждый сам реагирует на запрос и понимает свою возможную роль на встрече.
  • Уменьшение времени на коммуникацию и ожидание ответов между ними.
  • Автоматически подразумевается оповещение о будущей встрече для специалиста, который самостоятельно принял запрос.
  • Легкая организация за счет существующих инструментов.

Недостатки:

  • Медленный ответ на запросы за счет меньшей ответственности со стороны специалистов в отличие от личного обращения.
  • Загрузка их информационного поля во время выполнения текущих задач не всегда релевантными запросами.
  • Не позволяет узнать общее число претендентов в интервьюеры под каждый запрос.

Резервирование времени через формы опроса и построение базы возможностей

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

Средства реализации:

  • Онлайн-таблицы

Преимущества решения:

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

Недостатки решения:

  • Дополнительные действия для специалистов в рамках еженедельных задач.
  • Сложность определения подходящих специалистов за счет дополнительных сопоставлений данных в таблицах.
  • Невозможность оповещения интервьюера о предстоящей занятости без непосредственного обращения.
  • Большая сложность фильтрации и актуализации информации при работе с таблицами.
  • Возможные пересечения запросов и коммуникации среди разных рекрутеров с интервьюерами.

Автоматизированный помощник по согласованию времени интервью

Этот вариант вобрал в себя все преимущества из предыдущих опций за счет возможности его реализации на базе Slack-приложения. Первым делом, используя автоматизированного помощника или, проще говоря, бота, мы можем построить для себя цепочку действий для всех участников таким образом, чтобы избежать разночтения в подходах к предыдущим вариантам реализации или инструкциям. Нормализуя и определяя нужную нам вложенность данных и распределение в базе данных, мы также упрощаем работу с непосредственными данными, предоставляя каждому пользователю определенный интерфейс взаимодействия.

Средства реализации:

  • Slack-приложение
  • Сервер с ботом
  • База данных

Преимущества решения:

  • Самостоятельное управление подходящим временем со стороны интервьюера.
  • Автоматизированное напоминание об указанном времени.
  • Удобный поиск подходящего специалиста с указанием необходимых параметров и даты.
  • Управляемое решение конфликтов при бронировании временных промежутков.
  • Автоматическое уведомление о брони времени.
  • Контроль над данными на каждом шаге взаимодействия.
  • Сведение коммуникации между участниками процесса до необходимого минимума.

Недостатки решения:

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

Реализация бота

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

Для реализации такого бота выбрали следующий набор технологий:

  • Python 3.10 — актуальная версия языка программирования, который в свою очередь быстрый для написания, очень распространенный, а также имеет большое сообщество разработчиков и множество библиотек для реализации задуманного.
  • Библиотека Slack Bolt — официальная библиотека для работы со Slack-приложениями, доступна на языке Python.
  • Библиотека Boto3 — официальная библиотека для работы с AWS, в нашем случае необходима для взаимодействия с базой данных DynamoDB, доступна на языке Python.
  • Библиотека Google API client — официальная библиотека для работы с Google API, используется для работы с Google Calendar и предоставляет возможность взаимодействия с календарями специалистов в Google Workspace, доступна на языке Python.
  • Библиотека APScheduler — open-source библиотека, предоставляющая возможность планировки автоматического выполнения определенного кода в заданное время (промежуток времени) с заданными параметрами.

Кроме того, для реализации мы написали дополнительные базовые функции, которые используются для улучшения качества кода и стабильности его работы. На мой взгляд это то, чего не хватает для более «pythonic» работы со Slack API.

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

Инфраструктура самого бота выглядит следующим образом:

Также написали небольшую ОRМ (модель отношения объектов), которая позволяет более гибко и качественно работать с данными, которые хранятся в базе данных. В этом случае мы также избавляемся от работы с ассоциативными массивами в пользу работы с объектами. К сожалению, подходящих готовых решений для работы с DynamoDB не было найдено.

Проект состоит из нескольких частей:

  • handlers — содержат классы, которые используются для отлова событий взаимодействия с ботом;
  • services — классы, отвечающие за взаимодействие со сторонними сервисами;
  • database — классы для работы с базой данных;
  • middlewares — позволяют обрабатывать запросы до отправки хендлеру непосредственно через контекст;
  • blocks — универсальные блоки и кнопки, которые переиспользуются в handlers;
  • utils — сюда вошли необходимые вспомогательные классы (helpers) для работы с таймзонами, рассылками сообщений и временными промежутками.

Что касается настройки самого приложения в Slack, в нашем случае необходимы были только права на отправку сообщений пользователям, разрешение на отображение Домашней страницы (Home tab), а также поиск информации в Workspace для более удобного маппинга пользователей бота и их информации, которая хранится самим Slack-ом.

В новом интерфейсе настроек приложений Slack позволяет работать напрямую с manifest.json для настройки ваших приложений. Это очень помогло для дальнейшего расширения прав. Например, для того, чтобы позволить боту в реальном времени делиться логами ошибок/багов в продакшене в виде файлов с отчетами.

Наиболее удобным вариантом взаимодействия с ботом оказалось использование отображения модальных окон, которые позволяют разместить до 100 блоков информации. Очень приятно то, что такие окна могут иметь возможность отправки (submit) и содержать блоки ввода информации (это и селекторы, и ввод текста). Также удобно использовать кнопки, которые напрямую помогают работать с данными, ассоциированными с информацией, указанной в блоке.

Например, ниже мы видим отображение выбранных временных интервалов, когда интервьюер имеет возможность провести интервью с кандидатом:

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

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

Выглядит это так:

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

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

Разделение на два отдельных окна, которые последовательно открываются, необходимо для того, чтобы брать релевантные технологии и платформы относительно необходимой нам дисциплины. Эти два селектора берутся из константы, в которой описаны отношения дисциплин к этим пунктам за счет использования функции взятия внешних данных по запросу значений для селектора (selector with external data). Для первичной реализации не было необходимости дополнительно хранить эти отношения в базе данных. В будущем, в связи с использованием этого элемента, есть возможность брать эти данные из таких таблиц. Сами окна знают о выбранных ранее значениях за счет использования параметра metadata который их хранит в виде текстовой строки.

Slack-бот имеет следующий функционал:

  • Сбор статистических данных и их обработка для получения менеджментом полезной информации и аналитики.
  • Создание и менеджмент информации об интервьюерах со стороны администраторов бота и предоставление прав для работы с ней представителям менеджмента компании (например, ответственным за дисциплины).
  • Вывод информации из базы данных пользователям, которые там описаны, и настройка некоторых параметров со стороны пользователей.
  • Рассылка сообщений и уведомлений по всем группам пользователей (как автоматизированная, так и по запросу от администраторов).
  • Обработка и вывод информации об ошибках.
  • Интеграция с Google Календарем для определения времени, которое может быть использовано интервьюерами для участия во встречах, а также сохранения заполнителя (placeholder) непосредственно в календаре интервьюера.
  • Маркировка временных промежутков, в которых уже есть подтверждения от схожих по параметрам интервьюеров.

Также выделим важные аспекты работы со Slack Application:

  • Открытие модального окна должно происходить в течение 3 секунд. Для обхода этого ограничения был выбран подход, подразумевающий открытие «окна ожидания», которое содержит соответствующий текст, а после обновления этого окна уже данные, которые, например, берутся из базы данных.
  • Приложение должно в течение 15 секунд ответить Slack-у, что запрос был обработан. Для такого ответа используется функция Acknowledge из библиотеки Slack Bolt и подход, описанный в предыдущем пункте, также помог нам обойти это ограничение в местах долгих запросов к базе данных или множественных запросов. Например, при валидации отправленных данных, когда вывод ошибки непосредственно к полю с ошибкой занимает больше предполагаемого времени.
  • Для сохранения данных пользователю необходимо отправлять сообщение с результатами некоторых операций. Также это помогло нам иметь дополнительную историю действий пользователя для дальнейшего получения полезной информации в процессе дебага.
  • Блоки, которые используются для формирования интерфейса, можно использовать в модальных окнах, в сообщениях, а также на Домашней странице. Это помогает построить гибкие интерфейсы. В нашей реализации эта возможность также используется для отображения сообщения, которое предполагается разослать пользователям. Таким образом администраторы бота видят, как будет выглядеть сообщение для пользователей.
  • Возможность нативного подтверждения действий пользователей (confirm object). Встроенный элемент интерфейса, который может быть прикреплен практически к любому пользовательскому взаимодействию, он позволяет вывести дополнительную информацию, объясняющую последствия действия, и дает дополнительный уровень подтверждения. Например, что произойдет и как будет понято ботом изменение поля или нажатие кнопки.

Что касается самой библиотеки Slack Bolt, то одним из важных аспектов является возможность создания интерфейсов, используя объекты классов различных блоков. Библиотека также позволяет использовать словари (dict) для определения информации блоков, но этот подход не очень эффективен как в процессе разработки, так и для дебага. Кроме того, использование встроенных в библиотеку классов помогло избавиться от проблем с валидацией на стороне Slack. Главной особенностью также является возможность использовать различные встроенные варианты получения событий и взаимодействия с серверами Slack. Само собой, для реализации нашего бота было выбрано взаимодействие через sockets.

Куда двигаться дальше? или Вывод

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

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

  • 2600 временных промежутков подтверждено;
  • 550 — забронировано рекрутерами;
  • более 1000 поисковых запросов выполнено через бота.

И за всё время работы:

  • более 750 временных промежутков сгенерировано для продакшена;
  • 7 ботов на stage окружении создано для работы над конечным результатом;
  • 12 релизов с функционалом задеплоены;
  • 4 таймзоны учтены в работе с ботом, еще 5 на подходе (США).

Как будет дальше развиваться Slack-бот? На этот счет есть много идей, но одной из первых задач — использование бота на уровне всей компании, то есть добавление всех интервьюеров и всех дисциплин, которые мы можем учесть. Для этого необходимо добавить людей из офисов в других частях света. Кроме того, началась работа над интеграцией с другими сервисами компании, которые позволили бы усилить автоматизацию процессов найма. Также уже намечены планы по созданию API, который позволил бы боту производить определенные действия по запросу от других сервисов.

Предлагаю всем желающим обсудить разработку корпоративных ботов и Slack-ботов в комментариях. Было бы интересно прочесть ваши предложения о том, про что дальше рассказать: корпоративные боты и их применение в крупных компаниях, Slack-боты или аспекты их разработки.

👍ПодобаєтьсяСподобалось16
До обраногоВ обраному6
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Если бот может ускорить процесс, насколько же там всё запущенно? Попробуйте нанять специалиста, будет ещё быстрее. А простидевок уволить оптимизировать

Для начала, стоило бы прочитать статью, а не только заголовок. 🤣

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

Тогда сократи до смысла, что из того мусора, что ты накидал, стоит читать? Попробуй систематизировать: задача отдельно, алгоритмы отдельно, реализация — отдельной статьёй, а то и несколькими, если они того заслуживают.

Здесь же — тупо «поток сознания», без структурирования. Типа «сами разберётесь». Зная мат.часть, могу сказать, что вы сделали по факту: поставили план по показателям, и сами же их накрутили. Что-то мне подсказывает, что реальная полезность — ОТРИЦАТЕЛЬНАЯ. Как и у всего, что творят бюрократы, не желая разбираться в процессах, но требуют чтобы реальный мир соблюдал правила их параллельного мира — где всё меняется под их хотелки.

По сути-то что автоматизировали, что медленно работало раньше и приносило пользу? Ничего. Не пришей кобыле х[вост]

Спасибо за отзыв! В любом случае вы остались неравнодушны. Могу предложить исключительно мои статьи не читать, если вас не устроил стиль написания. Никто не собирался писать советскую техническую статью из «НиТ». Тут передали информацию в таком стиле, как пожелал автор, а именно я.

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

Ну, из 11 текущих открытых вакансий — 7 относятся именно к рекрутменту. Бота они написали :)

Ничё, щас план по показателям подымут — бот же львиную долю работы делает! От них рекрутеры сбегут. И не просто сбегут, а с базой данных сотрудников на переманивание.

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

Очень рад что осилили прочтение статьи, жаль что «аргументы» и домыслы все равно «в молоко». Читайте ещё, может в следующий раз получится написать что-то хоть немного по теме статьи. К своей радости, не смогу поддержать вас в разнообразных выдумках, пустых осуждениях, и в «теориях заговора». Предпочёл бы не отвечать на этот бред, но не мог не отметить прогресс в усилиях над прочтением.

Конечно-конечно, г-н Дартаньян, понимаем, кто остальные

А зачем юзали динамодб и почему именно его?

Мы хостим бота на AWS и это (на стадии концепта) был хороший вариант для нашего случая, кроме того, изначально предполагалось что в базе мы будем хранить только некоторую информацию (минимально необходимую), например, выбранные часовые интервалы (как на скрине) и данные тех кто выступает в роли интервьюеров (достаточные чтобы с ними работать через slack).
В итоге по прошествию множества улучшений и развития бота стало немного сложнее работать с DynamoDB, но это не столь критично для конкретно этого бота. По правде говоря, сложнее просто потому что изначально не было заложено некоторых особенностей в архитектуру. Впрочем, на разработку или тестирование это сильно не повлияло.

просто сам на проекте юзаю динамо — досталось в наследство, и кроме как характеристики что это самое честное название БД — других слов нет) А slack бота использую для мониторинга системы — удобно настраивать метрики — пороговые значения, расписание — и выводить всю инфу в режиме риалтайм — без ограничения функционала онли авсклаудвоч.

Да, я тебя понимаю. :)

В целом, с ней можно жить в некрупном решении, как только решение её перерастает начинаются сложности.

Підписатись на коментарі