Зачем мы создали еще один агрегатор удаленных вакансий

Всем привет! На связи опять Кирилл и Варя и у нас всегда «чешется» что-то запустить. За новогодние праздники (нууу, плюс-минус) мы запилили Bergamot, агрегатор remote-вакансий. Да, мы знаем, что сейчас конец мая. По определенным причинам мы откладывали и откладывали запуск (занимались другим).

И вот, пришло его время — хочется, чтобы продукт увидел свет, ну или что-то другое — тоже ок.

Зачем мы создали еще один агрегатор удаленных вакансий

Как пришла идея?

Нам показалось, что нет ни одного удобного агрегатора для поиска tech remote-вакансий. Они бесконечно появляются, но у них одни и те же проблемы, о которых расскажу ниже. Разработчики, с которыми мы пообщались, подтвердили этот тезис.

Почему это интересно?

Опять же — видны проблемы, которые можно решить (с поиском, с релевантностью, свежестью вакансий). Делать «тяп-ляп» мы не хотим, поэтому приправили все ML-алгоритмами и прочим весельем.

Определение: агрегатор вакансий - это ресурс, на котором вакансии попадают не напрямую от работодателя, а путем сбора предложений с других сайтов, где эти вакансии уже размещены. Например, HH.ru - это не агрегатор, а джоб-борд, тогда как Indeed - как раз-таки самый яркий представитель агрегаторов (хотя там сейчас уже тоже не все так очевидно).

Проблема №1: Мало вакансий на агрегаторах

Первая проблема заключается в том, что текущие агрегаторы собирают мало вакансий. Возьмем, например, один из самых больших агрегаторов CareerVault и сделаем поиск по навыку Python. В выдаче получаем всего 167 открытых позиций. Уверен, что никто из вас не поверит, что в мире всего 167 открытых удаленных вакансий для Python разработчиков.

Зачем мы создали еще один агрегатор удаленных вакансий

Чтобы подтвердить тезис «агрегаторы собирают мало вакансий», я провел небольшой эксперимент. С помощью всемогущего Google искал удаленные вакансии и проверял, есть ли ли она на агрегаторе, например позицию Senior Software Engineer в Zillow. Полчаса поисков и вот: вакансии нет ни на одном агрегаторе.

В целом, причину этого я понимаю. Расскажу об этом далее.

Проблема №2: Гарантия удаленности вакансии

Агрегаторы вакансий поверхностно оценивают «удаленность» вакансии. После детального изучения всех агрегаторов remote-позиций стало ясно, что:

  • либо сайт предлагает действительно удаленные вакансии, но их очень мало;
  • либо сайт предлагает достаточно вакансий, но значительная часть из них на самом деле не удаленные. Под такими вакансиями я имею ввиду «2 days a week on remote», «partly remote», «remote until the situation gets better», «remote during Covid-19», etc. Удаленные ли это позиции? Нет.

Почему это происходит? Расскажу также чуть ниже.

Проблема №3: Актуальность вакансии

Вообще эту проблему можно разделить на две части:

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

Проблема №4: Локализация

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

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

Проблема №5: Поиск

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

  • Поиск только по названию вакансии. Хотите посмотреть вакансии, где нужен React? Вам выпадут только позиции, в которых React есть в названии. И их будет очень мало, ибо в 90%+ Frontend вакансий стек пишется не в названии, а в описании. Пример: Сareervault.
  • Поиск только по одному навыку. Хотите посмотреть Full Stack вакансии с Ruby и Angular? Не получится, ибо такого механизма у большинства агрегаторов просто нет.
  • Релевантность выдачи. Какие вакансии вы ожидаете увидеть при поиске по навыку Vue? Думаю, что вакансии, связанные с Frontend-ом. При этом часто выпадают QA роли или вакансии на Backend-е, где просто в тексте был упомянут навык Vue (при этом очевидно он не в приоритете).

Всё это дурацкие проблемы, которые можно попробовать решить.

Сегодня мы запустились на ProductHunt, и, если у вас есть желание нас поддержать, найдите Bergamot в списке и — вы знаете, что нужно сделать.

Решение проблемы №1 (количество)

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

Чтобы решить эту проблему, я решил собирать вакансии ещё и напрямую с карьерных страничек компаний. Такие страницы есть у почти всех компании, которые пользуются современными Applicant Tracking Systems (например Lever или Greenhouse).

В результате нам удалось собрать самое большое количество вакансий в одном месте. Но, конечно же, есть ряд идей, как увеличивать покрытие и дальше. Например, собирать удаленные вакансии с Linkedin.

51 212
именно столько активных удаленных tech вакансий сейчас на нашем ресурсе

Решение проблемы №2 (реальная Vs мнимая удаленка)

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

Стратегия №1. Забирать вакансии, где в качестве локации стоит слово «remote». С одной стороны, это гарантирует что это удаленная вакансия. С другой, так отсекается множество позиций, где сам факт «удаленности» так или иначе отмечен в тексте.

Стратегия №2. Забирать вакансии, где в тексте есть упоминание слова «remote». Опять таки, так можно кратно увеличить количество удаленных вакансий, но это будет сделано в ущерб качеству. В выборку будут попадать псевдо-удаленные вакансии (с формулировками, например «partly remote»).

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

По моим оценкам работает алгоритм корректно в 87%+ случаев. Но главное — механизм дообучения модели понятен: со временем этот показатель будет улучшаться.

Решение проблемы №3 (актуальность)

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

  • Для того, чтобы у нас на ресурсе не было вакансий, которые уже закрыты для отклика, алгоритм проходится по каждой вакансии несколько раз в сутки. Если вакансия закрывается в первоисточнике, то мы просто её не выдаем в поисковой выдаче.
  • С датой публикации все немного сложнее. Если в первоисточнике есть дата публикации, то мы её забираем и публикуем у себя на сайте вакансию именно с этой датой. В том случае, если даты нет, то мы считаем, что вакансия появилась сегодня. Опять же — мы постоянно мониторим активность вакансии, так что проблем с «закрытием» вакансии возникать не должно.

Решение проблемы №4 (гражданство)

Зачем мы создали еще один агрегатор удаленных вакансий

Это, наверное, самая сложная проблема, которую мне пришлось решать в ходе работы над проектом. Изначально я также, как и в случае решения проблемы №2 хотел просто написать некий алгоритм, который будет выделять ограничения по гражданству из текста. Но в ходе анализа всё оказалось гораздо сложнее. Помимо очевидных алгоритмизируемых «only for US applicants» было множество других формулировок (например «This specific role is open to remote candidates based in European Union (a must for us»). Быстро стало понятно, что просто алгоритмом это не решить. Да на самом деле, до задачи классификации ML-ем тоже ещё надо было дойти. Но об этом я, пожалуй, расскажу в отдельном материале.

Решение проблемы №5 (поиск)

Зачем мы создали еще один агрегатор удаленных вакансий

Я разбил проблему на части:

  • Сделать поиск по всему тексту, а не только по названию, не составило особого труда. Но тут есть ещё один момент, который мы смогли учесть. Например, если делать обычный полнотекстовый поиск по навыку «React», то в выдаче будут как вакансии с React, так и с React Native, в то время как это далеко не одно и то же. Чтобы решить эту и схожие проблемы у нас на Backend'е используется словарь технологий. И поиск по React будет выдавать лишь вакансии с React / React.js / React js, но никак не с React Native.
  • Поиск по нескольким навыкам было сделать очевидно просто. Мы его и сделали.
  • С релевантностью всё гораздо интереснее. Как сделать так, чтобы приоритезировались вакансии, где искомый навык является основным? При этом, как мы знаем, в текстах вакансий любят указывать весь стек компаний и/или навыки, которые будут плюсом. Единственное решение, которое пришло в голову: рассматривать навыки не в изоляции (что по сути делает полнотекстовый поиск), а в комбинации. Например, в вакансии перечислено много технологий, относящихся к Python-стеку, то скорее всего это вакансия Python-разработчика (или, возможно, Data Scientist'a). Чувствую, что это все тоже заслуживает описания в отдельной статье.

Заключение

Все бы хорошо, но есть проблема - уделять развитию проекта на данный момент много времени мы не можем. При это уже есть неплохой трекшн и пачка гипотез на проверку. Так что, если вы хотите позаниматься, прости господи, growth hacking-ом и вам было бы интересно позаниматься с нам данным проектом, то можете писать мне напрямую в Telegram @kirillnikolaev.

4444
28 комментариев

Мне кажется эра просто джоб бородов или агрегаторов проходит. Слишком трудно собрать трафик. 

Я пойду программистов искать на стекоферфлоу, а не к вам. И то что у вас куча вакансий это не конкурентное преимущество. 

Основная проблема это то, как вы будете покупать трафик ищущих работу. А это бренд и т д. Короче много денег в маркетинг нужно вбухать

Сайты выглядит красиво. 

Если бы я был инвестором то задал бы вот такие вопрос

- Вы это сделали на коленке, на ноукод инструменте. Другие тоже могу собрать точно также и кокнурировать с вами. Как вы их обноните?

- То, что вы сделали может сделать существующий агрегатор за 1 год с миллионом баксов в кармане?

- Как вы будете привлекать трафик?

7
Ответить

Да это проблема любого продукта, услуги.
Придумать и сделать можно что угодно, причем практически всё можно сделать за пару дней или неделю. Но что потом с этим делать?

1
Ответить

Фильтровать по гражданству — хорошая идея. Но не получилось найти ни одной вакансии с opencv, хотя на hh есть такие удалённые работы.

1
Ответить

Совершенно неудобный поиск только по скилам. Ввёл "frontend", уже не понимает. Хотя у вас же отображается полно вакансий со словом "frontend" в заголовке. 

Ответить

В навыках лучше конкретные технологии вводить — Javascript, etc. Там нет навыка «frontend». А вот в Title можно и Frontend Developer написать :) 

2
Ответить

Очевидно тут не только Remote. И непонятно как найти только remote

1
Ответить

US only  — значит, вакансия удаленная, но доступна для трудоустройства ТОЛЬКО гражданам USA. Во многих вакансиях есть ограничения по гражданству. 

1
Ответить