Как мы разработали HR-систему: парсер резюме, чистый PHP и база данных ClickHouse
В статье расскажу, как проходила разработка HR-системы на PHP, какие трудности возникли в процессе и как мы с ними справились.
3К открытий3К показов
Дмитрий Сотсков
Разработчик программного обеспечения Neti
До 2019 года в компании, где я работаю, использовали внешнюю платную систему. Из-за неё рекрутеры страдали: сервис зависал, в нём не было нужных отчетов. А иногда он ломался и блокировал работу HR-отдела на полдня. Когда мириться с багам надоело, мы разработали собственный сервис, которым пользуемся уже год. В статье расскажу, как проходила разработка HR-системы, какие трудности возникли в процессе и как мы с ними справились.
Как появилась HR-система
В нашей компании собеседования проводят не только рекрутеры, но и программисты. Сначала HR-менеджеры созваниваются с кандидатом, чтобы уточнить информацию в резюме. Если всё нормально, человека приглашают на техническое собеседование, которое проводит опытный разработчик.
В 2018 году я возглавил новое направление веб-разработки и стал набирать людей. Ребята из 1С поделились со мной Google-таблицей, где фиксировали результаты технических собеседований. Мне она показалась неудобной, и в свободное время я написал веб-приложение для проведения тестирований. После собеседования программа выдавала комплексный отчет, который помогал быстро оценить сильные и слабые стороны кандидата.
Я показал приложение коллегам из 1С, и они захотели на него перейти. Техническое собеседование для разработчика 1С состоит из двух частей: теории и практики. Оба этапа проходят по Skype. Во время теории кандидат отвечает на вопросы программиста, а на практике решает задачи, при этом собеседующий наблюдает за ходом решения по демонстрации экрана. Несмотря на то, что у 1С-ников собеседование более объёмное, чем у моего направления, расширять функционал тестирований в приложении не пришлось — он изначально был достаточно гибким.
Дальше программу увидели наши HR-специалисты. К тому времени они уже настрадались со сторонним сервисом и попросили заняться разработкой полноценной HR-системы. Для работы над проектом я выделил штатного веб-программиста. Он реализовывал «хотелки» HR-отдела, а я выступал в качестве архитектора и второго разработчика. Техническое задание мы не составляли, разработка велась in material.
PHP без MVC
Я писал приложение на чистом PHP, не используя MVC-фреймворк, потому что не ожидал, что система получит дальнейшее развитие. Но когда к проекту подключился второй разработчик, выяснилось, что писать без MVC — ошибка.
В нашем случае в представлениях было много логики и запросов к базе данных, которые второму программисту иногда приходилось вычищать. Целые куски кода дублировались и не были вынесены в отдельные классы и функции. Чтобы изменить обращение к новым или измененным полям, приходилось тратить на 10–20% времени больше, чем если бы правки вносились через MVC.
Из этой истории я сделал вывод, что даже когда пишешь для себя, лучше использовать MVC-фреймворк. Ведь если проект перерастет во что-то большое, без MVC дальнейшая разработка станет сложной.
Сейчас мы подключили к HR-системе Doctrine ORM и постепенно переводим её на Symfony Framework, где-то используем View JS.
Парсер файлов резюме вместо нейросети
Раньше данные из резюме HR-специалисты переносили в карточку кандидата вручную. На заполнение полей уходило много времени. Хотелось автоматизировать этот процесс.
Сначала мы планировали подключить к системе нейросеть, которая бы создавала карточку кандидата и сама переносила в неё из резюме основную информацию: имя, фамилию, город, должность и так далее. Но оказалось, что существующие механизмы ИИ не способны распознать все нужные данные. Например нейросеть не может определить стаж работы или город соискателя. Чтобы обучить ИИ, необходимо загрузить в систему минимум пять тысяч резюме, а лучше десять. Это очень долгий процесс, а на разработку HR-системы было всего полгода. Поэтому мы решили задачу по-другому и разработали парсинг файлов резюме на регулярных выражениях.
В нём используются сторонние библиотеки tika-server (Apache Tika), которая работает с PDF, и LibreOffice, обрабатывающая DOC и XLM. Рекрутеры загружают резюме в форматах PDF, DOC, XLM, TXT в HR-систему, а библиотеки преобразуют эти файлы в обычный текст. Обработчик через регулярные выражения вытаскивает из текста данные, раскидывает их в подходящие поля карточки кандидата и записывает в базу данных. Процесс короткий, но кода много. Чтобы вытаскивать корректную информацию, мы написали множество регулярных выражений под разные структуры резюме. При этом учитывались и русский, и английский языки.
Несмотря на то, что мы многое предусмотрели, около 20% резюме парсер распознает с ошибками. Это происходит, когда документ приходит в нетипичном формате, например в виде картинки. Однажды нам прислали фотографию с резюме, написанным от руки. Такое тоже бывает.
Удобный визуальный редактор
Первое время в системе стоял стандартный визуальный редактор LTE Admin, который иногда неправильно отображал данные в карточке кандидата после распарсивания резюме. Так как редактор не основной инструмент, мы решили не покупать его, а поискать бесплатный. Хотелось, чтобы он был удобным, так что мы перепробовали 5–6 вариантов, прежде чем нашли подходящий.
Сейчас в HR-системе стоит Trumbowyg с расширенным функционалом. Рекрутеры хотели при вводе данных переключаться с текстового редактора на визуальный и обратно. В текстовом варианте содержится много html-тегов, и другие бесплатные редакторы при переключении плохо их обрабатывали. В Trumbowyg есть специальные API-методы, которые позволяют это обойти.
Добавили метрики «источники» и «каналы»
Один из важнейших отчетов для рекрутеров — это воронка кандидатов, которая показывает эффективность работы HR-отдела. В стороннем сервисе, которым мы пользовались раньше, можно было формировать воронку по источникам. Источники — аналитика, которая позволяет увидеть, откуда пришло резюме: HeadHunter, почта, сайт. С её помощью рекрутеры, например, понимают, что в рамках вакансии 1С-программиста HeadHunter — эффективная площадка, а для вакансий битрикс-разработчика или разработчика Dynamics она не подходит.
Мы перенесли этот механизм в нашу систему и доработали. Теперь, если резюме приходит через сайт или на почту, сервис сам распознает и проставляет источник в карточке кандидата. В остальных случаях источник рекрутеры заполняют вручную.
Но наши HR-менеджеры мечтали о том, чтобы воронка использовалась для более глубокой аналитики и с её помощью выявлялись наилучшие каналы для рекламы вакансий. Так была придумана метрика «каналы», которую мы не встречали в описаниях других систем, даже платных. Аналитика по каналам позволяет узнать, как кандидат попал в то место, откуда отправил резюме: через поиск в Google, рекламу в Яндексе или на каком-то другом сайте.
Чтобы вытаскивать эти данные, мы сначала хотели подключить к системе API Яндекс.Метрики. Но оказалось, что оно не отслеживает путь пользователя. Из документации Яндекса узнали о базе данных ClickHouse, которая полностью синхронизируется с Яндекс.Метрикой. Когда человек заходит на наши сайты, ему присваивается идентификационный номер. Если этот пользователь отправит резюме, то его идентификатор попадет вместе с заявкой в HR-систему, и по нему мы сможем посмотреть весь путь кандидата до отклика. Пока мы подключили ClickHouse к тестовой HR-системе и проверяем, как база работает. Позже перенесём её в рабочий сервис.
Приложение для автотестирований
Для коллег из 1С мы реализовали отдельное приложение для автотестирований на View JS, которое через API обращается к HR-системе для получения данных. Автотестирование — это упрощенное техническое собеседование: там есть вопросы с вариантами ответов. Если человек не уверен, что готов к собеседованию, он может пройти автотестирование и узнать свой результат.
Для прохождения необходимо указать адрес электронной почты. Этот адрес будет автоматически добавлен в карточку кандидата, которую создаст HR-система. Если пользователь через некоторое время пришлет нам резюме, программа распознает его электронную почту и подтянет его карточку вместе с результатом тестирования.
***
На разработку HR-системы ушло полгода и около 800 тыс. рублей. Точной суммы нет, потому что делали сами и сметы не составляли. По моим подсчетам, эти затраты уже окупились. Мы не тратим деньги на сторонний сервис, который ломается после каждого обновления, а наши рекрутеры счастливы, что работают в удобной гибкой системе.
Если вы тоже занимались разработкой HR-системы, поделитесь опытом, как прошло. А если у вас есть идеи, что еще можно улучшить в её функционале, пишите в комментариях.
3К открытий3К показов