Как мы разработали HR-систему: парсер резюме, чистый PHP и база данных ClickHouse

Дмитрий,
Руководитель направления веб-разработки Neti

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

 

Как появилась HR-система

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

В 2018 году я возглавил новое направление веб-разработки и стал набирать людей. Ребята из 1С поделились со мной Google-таблицей, в которой фиксировали результаты технических собеседований. Мне она показалась неудобной, и в свободное время я написал веб-приложение для проведения тестирований. После собеседования программа выдавала комплексный отчет, который помогал быстро оценить сильные и слабые стороны кандидата.

Я показал приложение коллегам из 1С, и они захотели на него перейти. Техническое собеседование для разработчика 1С состоит из двух частей: теории и практики. Оба этапа проходят по Skype. Во время теории кандидат отвечает на вопросы программиста, а на практике решает задачи, при этом собеседующий наблюдает за ходом решения по демонстрации экрана. Несмотря на то, что у 1С-ников собеседование более объемное, чем у моего направления, расширять функционал тестирований в приложении не пришлось — он изначально был достаточно гибким.

Как мы разработали HR-систему: парсер резюме, чистый PHP и база данных ClickHouse

Профиль разработчика, который проводит собеседования

Дальше программу увидели наши HR-специалисты. К тому времени они уже настрадались со сторонним сервисом и попросили доработать мое приложение в полноценную HR-систему. Для работы над проектом я выделил штатного веб-программиста. Он реализовывал «хотелки» HR-отдела, а я выступал в качестве архитектора и второго разработчика. Техническое задание мы не составляли, разработка велась in material.

 

PHP без MVC

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

В нашем случае в представлениях было много логики и запросов к базе данных, которые второму программисту иногда приходилось вычищать. Целые куски кода дублировались и не были вынесены в отдельные классы и функции. Чтобы изменить обращение к новым или измененным полям, приходилось тратить на 10–20% времени больше, чем если бы правки вносились через MVC.

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

Сейчас мы подключили к HR-системе Doctrine ORM и постепенно переводим ее на Symfony Framework, где-то используем View JS.

 

Парсер файлов резюме вместо нейросети

Раньше данные из резюме HR-специалисты переносили в карточку кандидата вручную и на заполнение полей уходило много времени. Хотелось автоматизировать этот процесс.

Сначала мы планировали подключить к системе нейросеть, которая бы создавала карточку кандидата и сама переносила в нее из резюме основную информацию: имя, фамилию, город, должность и так далее. Но оказалось, что существующие механизмы ИИ не способны распознать все нужные данные, например нейросеть не может определить стаж работы или город соискателя. Чтобы обучить ИИ, необходимо загрузить в систему минимум пять тысяч резюме, а лучше десять тысяч. Это очень долгий процесс, а у нас на разработку было всего полгода, поэтому мы решили задачу по-другому и разработали парсинг файлов резюме на регулярных выражениях. В нем используются сторонние библиотеки tika-server (Apache Tika), которая работает с PDF, и LibreOffice, которая обрабатывает DOC и XLM. Рекрутеры загружают резюме в форматах PDF, DOC, XLM, TXT в HR-систему, а библиотеки преобразуют эти файлы в обычный текст. Обработчик через регулярные выражения вытаскивает из текста данные, раскидывает их в подходящие поля карточки кандидата и записывает в базу данных. Процесс короткий, но кода много. Чтобы вытаскивать корректную информацию, мы написали множество регулярных выражений под разные структуры резюме. При этом учитывались и русский, и английский языки.

Несмотря на то, что мы многое предусмотрели, около 20% резюме парсер распознает с ошибками. Это происходит, когда резюме приходит в нетипичном формате, например в виде картинки. Однажды нам прислали фотографию с резюме, написанным от руки. Такое тоже бывает.

 

Удобный визуальный редактор

Первое время в системе стоял стандартный визуальный редактор LTE Admin, который иногда неправильно отображал данные в карточке кандидата после распарсивания резюме. Так как  редактор не основной инструмент, мы решили не покупать его, а поискать free-редактор. Однако хотелось, чтобы и бесплатный редактор был удобным. Мы перепробовали 5–6 вариантов, прежде чем нашли подходящий.

Сейчас в HR-системе стоит Trumbowyg с расширенным функционалом. Рекрутеры хотели при вводе данных переключаться с текстового редактора на визуальный и обратно. В текстовом варианте содержится много html-тегов, и другие бесплатные редакторы при переключении плохо их обрабатывали. В Trumbowyg есть специальные API-методы, которые позволяют это обойти.

 

Добавили метрики «источники» и «каналы»

Один из важнейших отчетов для рекрутеров — это воронка кандидатов, которая показывает эффективность работы HR-отдела. В стороннем сервисе, которым мы пользовались раньше, можно было формировать воронку по источникам. Источники — аналитика, которая позволяет увидеть, откуда пришло резюме: HeadHunter, почта, сайт. С ее помощью рекрутеры, например, понимают, что в рамках вакансии 1С-программиста HeadHunter — эффективная площадка, а для вакансий битрикс-разработчика или разработчика Dynamics она не подходит. Мы перенесли этот механизм в нашу систему и доработали. Теперь, если резюме приходит через сайт или на почту, сервис сам распознает и проставляет источник в карточке кандидата. В остальных случаях источник рекрутеры заполняют вручную.

Как мы разработали HR-систему: парсер резюме, чистый PHP и база данных ClickHouse

Воронка кандидатов по источникам с 1 ноября по 21 декабря 2020 года

Но наши HR-менеджеры мечтали о том, чтобы воронка использовалась для более глубокой аналитики и с ее помощью выявлялись наилучшие каналы для рекламы вакансий. Так была придумана метрика «каналы», которую мы не встречали в описаниях других, даже платных систем. Аналитика по каналам позволяет узнать, как кандидат попал в то место, откуда отправил резюме: через рекламу в Яндексе, через поиск в Google, через рекламу на каком-то другом сайте. Чтобы вытаскивать эти данные, мы сначала хотели подключить к системе API Яндекс.Метрики, но оказалось, что оно не отслеживает путь пользователя. Из документации Яндекса узнали о базе данных ClickHouse, которая полностью синхронизируется с Яндекс.Метрикой. Когда человек заходит на наши сайты, ему присваивается идентификационный номер. Если этот пользователь отправит резюме, то его идентификатор попадет вместе с заявкой в HR-систему, и по нему мы сможем посмотреть весь путь кандидата до отклика. Пока мы подключили ClickHouse к тестовой HR-системе и проверяем, как база работает. Позже перенесем ее в рабочий сервис.

 

Приложение для автотестирований

Для коллег из 1С мы реализовали отдельное приложение для автотестирований на View JS, которое через API обращается к HR-системе для получения данных. Автотестирование — это упрощенное техническое собеседование: там есть вопросы с вариантами ответов. Если человек не уверен, что готов к собеседованию, он может пройти автотестирование и узнать свой результат.

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

***

На разработку HR-системы ушло полгода и около 800 тыс. рублей. Точной суммы нет, потому что делали сами и сметы не составляли. По моим подсчетам, эти затраты уже окупились. Мы не тратим деньги на сторонний сервис, который ломается после каждого обновления, а наши рекрутеры счастливы, что работают в удобной гибкой системе.