Прочесав сайт HeadHunter по объявлениям откликающимся на слово "программист", я составил небольшую статистику распределения языков программирования, по нескольким городам. Кроме результатов здесь опишу как это делалось - возможно мудрые коллеги порекомендуют что добавить или улучшить. Конечно идея не новая - так наверняка делали и раньше. Я постараюсь рассказать, что и как сосчитал - и покажу "разбивку по городам", а также разницу между подсчетами по вакансиям и по компаниям.
Мотиваций к этой статье было три: во-первых давно хотелось повнимательнее посмотреть насколько "сломан" наиболее известный у нас (наверное?) сайт поиска работы; во-вторых, как и многим, интересно поточнее понять популярность разных языков программирования на примере именно вакансий (а не tiobe или github); в-третьих субботним утром я никак не мог собраться с духом и заняться чем-то из более насущных задач :)
Начнём с результатов
А потом подробнее обсудим как они посчитаны. Вкратце - считаем по ключевым словам в заголовках вакансий. Статистика посчитана по городам отдельно - и начинаем мы с Северной Столицы (не столько потому что я здесь живу и HH подсовывает мне регион по умолчанию, сколько по технической причине упомнутой далее).
Подробные результаты также опубликованы в текстовых файлах которые желающие могут скачать и почитать либо погрепать как душе угодно.
Санкт-Петербург

Диаграммы включают наиболее "массовые" языки - опять же не из-за того что мы притесняем Rust, Perl, Erlang и т.п. - а потому что для более редких языков данных не так много чтобы делать серьёзные выводы - и потому что на диаграмме они будут смотреться "исчезающе тонкими" ломтиками.
По схожей причине 1С в общем рассмотрении не участвует, но отдельная диаграмма показывает сколько вакансий его упоминают в сравнении с несколькими другими популярными языками. Включать его в "основные" диаграммы я пока не хочу т.к. он является специфическим и притом региональным (не уверен что международные рейтинги его упоминают). Есть и статистическая причина отделить его - но об этом в разделе про "методику".
Мы смотрим распределение как по отдельным объявлениям, так и по компаниям. Компании нередко публикуют похожие (или даже одинаковые) объявления и это нужно как-то учитывать. Крупные компании порой держат объявления явно "про запас". Например здесь видно что хотя C++ нашёлся в 75 вакансиях, но на деле им соответствуют только 47 компаний. Понятно что подсчёт "по вакансиям" может перекашивать статистику в одну сторону, а "по компаниям" в другую - но лучше видеть две стороны монеты и помнить что "истина где-то рядом". Всё равно мы не можем знать сколько именно сотрудников в компаниях на каких языках работают.
Языки посчитаны иногда по совокупности ключевых слов - особенно это касается JavaScript, синонимом к которому считается и React и Angular и т.п. - подробные регэкспы приведены ниже, в описании "методики" подсчета. Некоторые категории (например scada/plc) включены больше из любопытства. Нужно ли было считать отдельно Bitrix - я затрудняюсь решить.
Детальный результат по Петербургу (полный файл здесь):
# positions total
1412
# position counts per language
{'cs': 27, '1c': 152, 'cpp': 75, 'php': 20, 'py': 39, 'java': 34, 'go': 16, 'js': 46, 'bitrix': 9, 'swift': 11, 'kotlin': 9, 'android': 16, 'scada': 6, 'rust': 1, 'erlang': 1, 'scala': 4, 'ruby': 1}
# companiy counts per language
{'cs': 25, '1c': 133, 'cpp': 47, 'php': 18, 'py': 33, 'java': 22, 'go': 13, 'js': 38, 'bitrix': 9, 'swift': 9, 'kotlin': 3, 'android': 13, 'scada': 6, 'rust': 1, 'erlang': 1, 'scala': 1, 'ruby': 1}
Москва

Результаты для Первопрестольной не умещаются в лимит выдачи HH поэтому довольствуемся примерно половиной из них - учитывая что в конце идёт много нерелевантных, возможно мы не так много и потеряли. Однако именно поэтому я поместил Санкт-Петербург первым - как самый крупный город который всё-таки влез в лимит целиком.
Любопытно что 1С здесь занимает больше половины. В то же время можно сделать вывод что программистам на Go и C# в столице относительно больше раздолья :)
Детальный результат по Москве (результаты поиска якобы включают около 4400+ объявлений):
# positions total
1929
# position counts per language
{'cs': 104, 'bitrix': 31, '1c': 385, 'php': 63, 'cpp': 115, 'py': 132, 'java': 106, 'js': 77, 'go': 107, 'ruby': 6, 'swift': 29, 'scada': 8, 'android': 43, 'erlang': 3, 'scala': 3, 'kotlin': 18, 'rust': 10}
# companiy counts per language
{'cs': 76, 'bitrix': 31, '1c': 344, 'php': 61, 'cpp': 98, 'py': 99, 'java': 71, 'js': 68, 'go': 58, 'ruby': 6, 'swift': 23, 'scada': 7, 'android': 35, 'erlang': 3, 'scala': 3, 'kotlin': 15, 'rust': 9}
Новосибирск, Екатеринбург, Казань
Для сравнения логично взглянуть распределение в "милионниках", однако тут возникает нюанс с тем что вакансий меньше, а значит результаты менее достоверные да и некоторые мелкие категории могут исчезать. Всё же на пробу проверим хотя бы три города. Тут будут только картинки с диаграммами и ссылки на файлы, где можно найти аналогичные вышеприведённым агрегации (в конце файлов).
У Новосибирска картинка схожа с Москвой, а детальные результаты тут (360 вакансий).

В Екатеринбурге "доминирование" 1С, детальные результаты тут (456 вакансий).

Казань - город контрастов, где С++ сильно отстаёт от прочих. Подробые результаты (232).

К сожалению видно что количество данных по "миллионникам" действительно невелико, поэтому продолжать с ними (пока) не будем. Даже небольшая компания открыв несколько вакансий может сразу значительно изменить распределение. К тому же, чем меньше вакансий в самом городе, тем вероятнее что здесь будут активнее искать удалёнку.
Технические замечания
Для сбора данных я использовал Python-скрипт и Selenium (вспомнил что довелось научить несколько тестировщиков им пользоваться - вот пришла пора когда и самому пригодилось). Скрипт можно найти там же где и файлы с результатами, но в целом он не очень интересный так что его обсуждать не будем.
Страницы извлекаются такими запросами (см ниже "методика" насчет фильтрации):
https://hh.ru/search/vacancy?text=программист &excluded_text=менеджер%2Cаналитик%2Cqa%2Cmanager &area=1 &items_on_page=100&page=%s
Файлы данных, ссылки на которые даны выше, имеют простой формат:
строчки с объявлениями содержат номер вакансии и номер компании (на сайте HH их можно найти по урлам
/vacancy/xxxи/employer/yyyсоответственно)третье поле - скиллы "распознанные" в заголовке вакансии (см ниже) - если ничего не распозналось то
---так что можно по этому признаку грепнуть все "нераспознанные" вакансии и либо посмеяться, либо предложить дополнения в регэкспы ниже.строчки с вакансиями можно грепать по признаку что первый символ в строке - цифра (точнее даже - единица).
Если вакансия упоминает несколько скиллов, она входит в несколько категорий (например "Java или C# с переходом на Go".
В качестве примера - посчитаем сколько в "московском" файле вакансий со словом Backend, в заглавии которых, однако, не был распознан ни один "скилл":
grep -e '---' msk.txt |grep -i backend |wc -l
(таких строчек 25, да ещё 9 с русским словом "бэкенд")
Методика
Проблемы с HeadHunter
Если зайти на HH и искать по слову "программист" то будут выпадать и те вакансии, где указано "разработчик" и даже "developer". Это хорошо. К сожалению будут выпадать и "тестировщик", "менеджер", "аналитик" - относящиеся к IT но не обязательно программистские вакансии. До кучи будет немало совсем посторонних вакансий, например:
132871394 — Разнорабочий (озеленение)
132533570 — Химик-хроматографист R&D
133136811 — Главный бухгалтер
132871179 — Руководитель проектов (по озеленению)
133042625 — Финансовый директор (CFO)
132535302 — Технико-коммерческий представитель
133131959 — Руководитель проектных международных продаж
Номера вакансий указанные тут же позволят интересующимся почитать полное описание и попробовать разобраться, как они сюда попадают.
Вообще странностей с HH полно. Например, при поиске по любом из городов вверху болтается плашка "найдено 48 компаний" - ровно столько. Возможно это без учёта географии - но выходит как будто маловато.
Фильтрация
Количество результатов в поиске на HH ограничено 2000. В наших "двух столицах" просто по запросу "программист" результатов будет больше. Поэтому решено было добавить указать чтобы в поиск не включались слова "менеджер", "аналитик", "qa" - никаких претензий к этим специальностям но с точки зрения нашей конкретной задачи они вряд ли сделают статистику более точной.
Вообще насчет QA ситуация противоречивая. С одной стороны программисты редко рассматривают переход в автотестировщики. С другой стороны если человек пишет автотесты то он тоже программист хотя его задачи носят "внутренний" характер. Вероятно такие позиции могут немного добавить вклад в Java, Python, JavaScript - может быть в следующий раз включим их (только понять бы, не нужно ли их сосчитать отдельно).
Поэтому мы парсим названия языков программирования из заголовка вакансии
Это не очень строго. В заголовке может быть указано "Backend-разработчик" или "Программист 1й категории". Можно бы пытаться парсить текст описания вакансии, но зачастую там нетривиально выявить (машинным способом) "основной стек". Поэтому в первом приближении заниматься этим не будем - считаем что работодатели которые не указывают технологию в заголовке - сами себе злобные буратины ведь в выдаче HH по умолчанию объявления не показывают ни описания, ни тегов - соискателю надо кликать каждое и смотреть что там.
Именно из-за этого категория 1С может выглядеть немножко больше чем на самом деле. Объявления с заголовками вроде "Backend-разработчик" почти наверняка относятся например к Java, Go, Python, C#, PHP или C++, но мы их пропускаем. В то же время 1C вряд ли будет отмечен как Frontend или Backend - вероятно он-то как раз чаще указан явно.
Почему на HH нет поиска по тегам? Необъяснимо - но как идея на будущее можно попробовать применить и это (если парсить их из вакансий).
Как именно определяются названия языков (или технологий)
С этим ситуация несколько путанная. Язык "go" порой указывают как "golang", а сложнее всего ситуация с JavaScript/TypeScript - вообще непонятно лучше ли их разделять (с точки зрения поиска работы) или нет - да и часто указаны названия фреймворков а не языка (React, Angular).
В текущей версии использован следующий набор регэкспов (если видите что стоит улучшить - смело комментируйте):
skills = { 'java': r'java\b', 'go': r'(?:\bgo\b)|golang', 'cpp': r'[cс]\+\+|\bqt\b', 'cs': r'[cс]\#|\bnet\b', '1c': r'\b1\s?[cс]\b', 'py': 'python|django', 'php': 'php', 'rust': 'rust', 'ruby': 'ruby|rails', 'bitrix': 'bitrix|битрикс', 'scada': r'scada|\bplcb|\bплк\b', 'swift': r'\bios\b|swift', 'erlang': 'erlang|elixir|phoenix', 'scala': 'scala', 'kotlin': 'kotlin', 'android': 'android|андроид', 'js': r'javascript|\bnode(?:js)?\b|react|angular|\bjs\b' }
Все они применяются без учёта регистра. При этом есть ещё пара исключений, применяемых если не распарсился ни один язык - проверяется наличие отдельного слова "C" (латинское) либо "си" (считать их в составе вакансий упоминающих "C/C++" или "1 C" не хочется), либо вхождение подстроки SQL, чтобы учесть DBA, но всё-таки с вакансиями где SQL упомянут вместе с каким-либо языком программирования не путать.
Заключение
Тут сразу видно что можно что-то улучшать. Например чтобы Москва всё-таки "влезала в выдачу", можно делать по ней несколько отдельных поисков ("java программист", "python программист") и потом аггрегировать. Пока оставляем это как мысль на будущее - желательно ещё проверить на меньших городах что это работает как надо.
Я сознательно уклоняюсь от какого-либо развёрнутого анализа (и фантазий), чтобы не вносить предвзятости. Посмотрев на диаграммы и прилагаемые файлы уважаемые коллеги сами смогут предложить какие-то выводы и поделиться ими, например, в комментариях.
Одно не очень приятное наблюдение - что вакансий в принципе меньше чем HH изображает. Если погрепать все пропущенные вакансии и посчитать сколько там абсолютно нерелевантных (водители, уборщицы - тоже попадают) - кажется что их может быть 15-20%. И это мы уже отфильтровали менеджеров и аналитиков которые тоже "затесались в программисты" в выдаче.
Немного жаль что я не пробовал делать такой анализ раньше (вот и понял бы, выросла ли популярность Go в сравнении с Java - я перешёл на него несколько лет назад - или связана ли популярность C++ с какими-то геополитическими событиями). Но попробую повторять это упражнение периодически так чтобы потом можно было сделать какие-то наблюдения.
Если вы видите что желательно улучшить - смело пишите в комментариях и попробуем учесть. Желательно с какой-то ссылкой на строчку в файле данных (нераспознанную например) - чтобы исправлять именно реальные кейсы.
Комментарии (4)

unreal_undead2
01.06.2026 06:35Android - это Котлин, Java, JS, чистый C (для BSP под свою железяку), что то ещё?

nomadfromx
01.06.2026 06:35Почему во всех подобных статьях никогда не встречается язык программирования SQL?
Dhwtj
Чёрный текст на синем фоне не читается