О нас

    О компании

    • Сайт hh.ru — высоконагруженный проект. По данным Similarweb, HeadHunter входит в топ-30 самых посещаемых сайтов Рунета и занимает второе место в мире и первое в России среди сайтов по поиску работы.
    • Мы применяем передовые технологии онлайн-рекрутмента на всех доступных платформах, чтобы работодатели могли быстро найти подходящего сотрудника, а соискатели — хорошую работу. Ежедневно мы помогаем сотням тысяч человек изменить свою жизнь к лучшему.
    • Основной источник дохода — продажа работодателям доступа к базе резюме и возможности размещать вакансии.
    • В компании работает свыше 1 000 человек, из них более 450 в Москве.

    Команды и процессы

    • В техническом департаменте работает порядка 230 человек.
    • Весь техдеп разделен примерно на 45 команд, в каждой из которых по одному или по два бэкендера и фронтендера, тестировщик, тимлид и менеджер.
    • У каждой команды есть внутренний заказчик — Product Owner (PO), его задача — развивать наши продукты. Для команды развитие продуктов означает постоянный поток проектов. Проекты прорабатывает PO, иногда вместе с командой и дизайнером. Когда проект проработан, дизайнер готовит макеты и вместе с PO презентует макеты и проект команде.
    • Команда принимает проекты в потоковом режиме один за другим. Процесс работы над проектом можно разделить на этапы: декомпозиция на небольшие задачи, оценка, разработка, ревью, тестирование, выпуск. Почти всегда задача выходит в режиме эксперимента, когда изменения выкатываются только на часть пользователей. В зависимости от результатов эксперимента изменения раскатываются на всех или дорабатываются, либо код эксперимента удаляется. Команда переходит к следующему проекту.
    • Дизайнеры пока не прикреплены к конкретной команде, но сидят рядом с нами, мы активно взаимодействуем и консультируем друг друга.
    • Команды работают по Agile, с Kanban в основе и корректировками под наши процессы. У нас приняты ежедневные стендапы. Планирования, декомпозиции, оценки — по мере необходимости. Демонстрации по задачам для PO, ретроспективы по процессам и проектам — регулярно.
    • Кроме бизнес-проектов, есть понятие «технического налога» — это задачи на ускорение разработки, рефакторинг, избавление от старого кода, внедрение новых технологий. Каждая команда 30% своего времени тратит на «техналог».

    Разработка

    Бэкенд

    • Бизнес-логику стараемся реализовывать на основе микросервисной архитектуры. Каждый сервис ответственен за свою часть логики. Как следствие, у нас появляется отдельный слой интеграционной логики. К примеру, страница вакансии, которую видит пользователь — это результат совместной работы нескольких сервисов.
    • Бэкенд пишем на Java, используем актуальные версии фреймворков и языков, базовая версия Java для разработки на текущий момент — 17.
    • Есть несколько сервисов на питоне, в которых мы используем наш фреймворк frontik на основе tornado, версии питона - 3.8+
    • Создать новый сервис в hh.ru — дело пары кликов! Мы поддерживаем свои инструменты для разработчиков, которые призваны уменьшить количество рутины при создании и поддержке сервисов NaB, jclient.
    • Данные храним в PostgreSQL, Cassandra, Hadoop, Clickhouse.
    • Основной транспорт — http\rest, но есть также Kafka и Rabbitmq.
    • Используем инструменты диагностики и мониторинга, которые работают с большими данными и позволяют нам быстро анализировать и разрешать возникающие проблемы
    • Подробнее про используемые технологии можно посмотреть в техрадаре.

    Фронтенд

    • Основной стек — React, Redux, SSR, TypeScript. По мере необходимости выделяем код в отдельные фронтовые сервисы. В основном проекте и некоторых других помимо Реакта есть ещё легаси стек — XSL для шаблонизации на сервере (знать его при устройстве на работу не нужно — можно обучиться за несколько недель), преимущественно чистый JavaScript на клиенте, свой мини-фреймворк для организации компонентов.
    • CSS пишем с помощью LESS, для новых сервисов используем CSS Modules.
    • Есть библиотека блоков для всех интерфейсных элементов — ее используют и разработчики, и дизайнеры. Благодаря ей мы редко верстаем, обычно составляем страницу из готовых «кирпичиков», дописывая логику интеграции.
    • Весь JS-код «транспайлим» Бабелем, пишем на ES6 и выше. Есть линтеры, Prettier и стайлгайды.
    • В ведении фронтендеров находится сервис на Python на основе фреймворка Tornado. Его задача — получить с бэкенда нужные данные, собрать их в XML/JSON и отдать Node.js или XSL для шаблонизации. Мы не требуем знания Python при приеме на работу — он используется на базовом уровне.
    • В библиотеке блоков обязательно пишем юнит-тесты. В новом стеке юнит-тесты пишем по желанию. В старом стеке юнит-тестов практически нет.
    • Подробнее про используемые технологии можно посмотреть в техрадаре.

    iOS

    • У нас есть два iOS приложения: для соискателей и работодателей, кодовая база общая, многомодульная архитектура реализована при помощи Tuist.
    • Для внешних зависимостей используем Carthage и SPM.
    • Весь код проекта реализован на Swift.
    • Используем реактивную архитектуру со стейт-машиной MVI, MVVM, Сombine, самописным DI и Nivelir для навигации
    • Есть стайлгайды, применяем статические анализаторы, линтеры.
    • Автоматизируем рутинные процессы, используем шаблоны, сниппеты, кодогенерацию.
    • На каждый PR прогоняются тесты и различные проверки, сборка и выкладка приложений автоматизированы через CI сервер и fastlane.
    • В кооперации с QA пишем UI-тесты, используя XCUITest.
    • Постоянно развиваем дизайн систему.
    • Подробнее про используемые технологии можно посмотреть в техрадаре и плейлисте на youtube.

    Android

    • Мы работаем над двумя приложениями: для соискателей и работодателей, кодовая база общая с мелким дроблением на модули
    • Разработка ведется на языке Kotlin.
    • Используем реактивную архитектуру с MVI на базе MVICore, RxJava и Toothpick в качестве DI-Framework.
    • Есть стайлгайд, применяем различные статические анализаторы: Android Lint, detekt.
    • Инфраструктура на базе технологий: Gradle на kts, Fastlane, Bamboo, Docker, K8s.
    • На каждый PR прогоняются тесты и различные проверки. В тестах используются JUnit5, Kaspresso и Marathon для тестов.
    • Совместно с QA пишем UI-тесты, с использованием Kaspresso и оркестратора Marathon. Критичный функционал покрываем Unit и компонентными тестами на JUnit5.
    • Автоматизируем рутинные процессы, пишем и используем шаблоны, собственные IDE-плагины для автоматизации рутинных задач.
    • Постоянно развиваем дизайн систему.
    • Подробнее про используемые технологии можно посмотреть в техрадаре и плейлисте на youtube.

    Тестирование

    • У нас нет отдела тестирования. Специалисты по тестированию работают внутри кросс-функциональных команд. Они участвуют в работе над фичами с самого начала их проработки и до самого выхода на продакшен.
    • Мы не используем тест-кейсы. Применяем исследовательское тестирование и сам тестировщик определяет те способы и виды тестирования, которые необходимо провести для каждой задачи.
    • У нас нет сложностей с доступом к коду, базе и логам. Специалисты по тестированию имеют полный доступ к кодовой базе, и всем приложениям и базам на тестовом стенде.
    • Мы не проводим полное ручное регрессионное тестирование. Весь регресс стараемся автоматизировать. Сейчас у нас более чем 8000 автотестов, которые проходят примерно за час. При тестировании каждой отдельной задачи тестировщик самостоятельно определяет объем необходимого ручного регресса в зависимости от затронутого функционала и его покрытия автотестами.
    • Отдельных людей, которые пишут и запускают тесты, у нас нет. Автотесты обязательны к прохождению при тестировании каждой задачи. Каждый специалист по тестированию запускает, исправляет и пишет автотесты. Используем Java, TestNG, Webdriver и Selenoid — для веб, Kaspresso и Kotlin — для Android, XCUITest и Swift — для iOS, Jenkins и свои разработки — для запуска тестов.
    • Подробнее про используемые технологии можно посмотреть в техрадаре и плейлисте на youtube.

    Общее

    • Код хранится на GitHub, там же в формате пулл-реквестов мы проводим обязательное ревью.
    • Нет общих сред для тестирования или разработки. Каждому специалисту выдается один или несколько тестовых стендов. Эти же стенды используются для разработки. Инфраструктура тестовых стендов автоматизирована и позволяет с легкостью управлять ими.
    • Мы не готовимся к каждому релизу как к событию. У нас десятки релизов каждый день. Часть из них собирается и тестируется вообще без участия человека, другая часть потребует нажатия пары кнопок.

    Сложность проекта

    • Соискатели видят лишь малую часть нашего сайта. Мы делим сайт на такие составляющие: анонимная, соискательская, работодательская, бэк-офис, который в свою очередь делится еще на биллинг, модерацию, статистику и прочее. Всё это усложняется правами и ролями работодателей и пользователей бэк-офиса.
    • Есть страновые сайты — rabota.by, hh.kz и другие. Этот тот же код и база данных, но с различиями в бизнес-логике, например, из-за особенностей законодательства.
    • Есть API, которым пользуются клиенты и наши нативные мобильные приложения для iOS и Android.
    • Пиковая нагрузка на сайт — свыше 10 000 RPS.

    Обучение и развитие

    • Каждому новичку на первые два-три месяца назначается ментор, помогающий освоится с проектом, технологиями и процессами.
    • На внутренних митапах любой желающий может рассказать о какой-то теме, связанной с работой.
    • Есть возможность поучаствовать от компании на конференции в качестве слушателей или спикеров. Во втором случае помогаем с подготовкой, прогонами и презентацией.
    • Каждый год организуем Школу программистов — полугодовое обучение программированию и смежным темам. Мы сами читаем там лекции и ведем практические проекты. Можно как читать лекции, так и приходить слушателем.
    • При необходимости проводим внутреннее обучение и каждый год организуем тренинги для желающих стать лекторами Школы программистов или докладчиками на конференциях.

    График работы

    • Работаем удалённо. При желании, есть возможность работать из офиса в Москве.
    • Восьмичасовой рабочий день плюс время на обед.
    • Начало рабочего дня гибкое, главное успевать на стендап и находиться на связи с 12 до 18 часов, чтобы иметь возможность общаться с коллегами. В разных командах стендап начинается в разное время, в среднем с 11 до 12. Время московское.