Перейти к содержимому
IT-риски

Как проверить разработчика по GitHub: девять сигналов и готовые команды

Марина Погодина8 минут
Обложка статьи: Как проверить разработчика

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

Я проверила этим методом собственный профиль на GitHub и нашла в нём шесть дыр. В конце статьи показываю каждую и говорю, что с ней сделала, чтобы вы могли повторить проверку на мне теми же командами.

Что GitHub показывает и чего он не показывает

Календарь вкладов на странице профиля считает далеко не только написанный код. В зелёные квадраты попадают создание репозитория, часть коммитов, заведённые задачи, запросы на слияние, ревью и обсуждения, причём каждое действие учитывается по своим правилам. Плотный календарь поэтому говорит об активности, но не о её содержании.

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

Есть и вторая причина пустоты, чисто техническая. Коммит засчитывается аккаунту только тогда, когда почта в заголовке коммита привязана к этому аккаунту, и обычно он должен попасть в основную ветку. Настройка машины с чужой почтой отправляет работу в никуда молча, без единого предупреждения. Разбор причин лежит в документации GitHub.

Главное ограничение метода стоит знать до того, как вы начнёте делать выводы. Git позволяет задать имя, почту и даты автора переменными окружения, поэтому правдоподобная история рисуется за вечер. Зелёный календарь без доступных проектов, обсуждений и релизов остаётся слабым доказательством.

Четыре слоя проверки разработчика Нижний слой: подтверждение личности и авторства. Выше: история аккаунта и непрерывность работы. Ещё выше: качество кода, тестов, документации и релизов. Верхний слой: разбор проекта голосом и короткое оплачиваемое задание. Каждый следующий слой опирается на предыдущий и без него не работает. Слой 1 Личность и авторство: профиль, сайт, продукты Слой 2 История: возраст аккаунта и непрерывность Слой 3 Качество: код, тесты, документация, релизы Слой 4 Разбор голосом и оплачиваемое задание Верхний слой стоит на нижних и без них не держится
Проверка идёт снизу вверх: пока не подтверждено авторство, качество кода ничего не доказывает.

Команды, которыми я проверяю профиль

Первый запрос отвечает на вопрос о возрасте аккаунта и о том, сколько у человека публичных проектов. Поле created_at говорит только о дате регистрации, поэтому дальше его придётся сопоставлять с первыми содержательными коммитами и релизами.

gh api users/LOGIN --jq '{login, created_at, public_repos, followers, company, blog}'

# ритм по годам, вместе с закрытой работой, если владелец её показывает

gh api graphql -f query='query{user(login:"LOGIN"){

contributionsCollection(from:"2026-01-01T00:00:00Z",to:"2026-12-31T23:59:59Z"){

restrictedContributionsCount

contributionCalendar{totalContributions}}}}'

Дальше репозиторий нужно склонировать и посмотреть на него изнутри. Три команды ниже показывают, кто писал код, как работа распределена по времени и совпадают ли даты автора с датами коммитера. Расхождение дат само по себе обманом не является, потому что поддерживающий проект человек применяет чужие правки под своим именем.

git shortlog -sne --all

git log --all --format='%h | author:%aI | committer:%cI | %aN | %s' | head -40

git log --since='2 years ago' --numstat --format='%H' | awk 'NF==3 {a+=$1; d+=$2} END {print a, d}'

На самой странице проекта стоит открыть раздел Insights. Вкладка Contributors показывает, кто вносил коммиты и в каком объёме, Code frequency даёт добавления и удаления по неделям, Pulse собирает активность за выбранный период. Описание вкладки с участниками лежит в справке GitHub.

Девять сигналов, которые стоит проверить дважды

  1. Аккаунт заведён давно, но вся содержательная работа началась прямо перед запуском рекламы.
  2. Календарь плотный, при этом доступных коммитов, запросов на слияние и обсуждений нет, а объяснения закрытой работой не дают.
  3. Десятки репозиториев созданы за несколько дней, у них одинаковые описания и одинаковая структура.
  4. Большинство проектов оказывается копиями чужих репозиториев или учебными примерами с единственным коммитом.
  5. Проект объявлен многолетним, а история загружена одним импортом, и ни релизов, ни внешних упоминаний у него нет.
  6. Человек называет себя автором командной работы, но вкладка Contributors и режим blame показывают минимальный вклад.
  7. На сайте перечислены крупные клиенты, при этом проверяемых продуктов, публикаций и отзывов с независимых доменов нет.
  8. Разработчик не может воспроизвести запуск своего проекта и найти в нём место, где сделана заявленная функция.
  9. В коде лежат ключи и пароли, отключённые тесты и пустая обработка ошибок, а зависимости живут без закреплённых версий.

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

Что уликой не считается

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

Теперь проверьте меня

Мой профиль лежит по адресу github.com/unnamed00bas, и сегодня утром он проверку проходил плохо. Разбираю его честно, по тем же признакам.

Аккаунт заведён в 2019 году, с 2020 по 2024 в календаре пусто, за 2026 год стоит 5152 вклада. Объяснение простое: 17 лет в ИТ и 14 лет в аудите ИТ означают работу с документами и системами заказчика, и код в те годы был закрытым. Показывать в профиле стало нечего, потому что и не показывали.

Шесть дыр, найденных за один заход, и что с каждой сделано.

Первая: показ вкладов из закрытых репозиториев был выключен, и календарь показывал 108 вкладов за год при пяти с лишним тысячах настоящих. Настройка включается одной галочкой в профиле и открывает только ритм по дням, оставляя код закрытым.

Вторая: часть коммитов уходила с почтой user@example.com, чужой заглушкой из настройки машины. Таких коммитов 398 в одном проекте, и они уже не станут моими: историю я не переписываю, потому что переписанная история проверяется за минуту и стоит доверия целиком. Настройки на обеих рабочих машинах приведены к почте, привязанной к аккаунту.

Третья: из четырнадцати публичных репозиториев описание было у одного. Теперь у каждого живого проекта написано, что он делает и на чём собран.

Четвёртая: три репозитория были пустыми, внутри лежал единственный заголовок в README, а ещё один оказался копией чужого проекта без единой моей правки. Все четыре удалены, потому что брошенная заготовка создаёт шум и мешает увидеть работу.

Пятая, самая показательная: в описании демо-проекта стояло "16+ years", а на сайте и в соседнем разделе того же файла стоит 17 лет. Расхождение внутри одного документа проверяющий находит первым, и оно обесценивает всё остальное. Привела к тому, что написано на сайте.

Шестая: связь сайта и профиля работала в одну сторону. Профиль вёл на promaren.ru, а сайт на профиль не ссылался нигде, и человеку, решившему проверить работу своими глазами, идти было некуда. Ссылка на профиль теперь стоит в подвале сайта.

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

Так же я работаю и с чужими системами: вывод делается по следам, которые можно открыть и пересчитать. Если нужен подрядчик, которого можно проверить до подписания договора, посмотрите список продуктов и напишите. Разборы вроде этого выходят в моём канале, t.me/promaren.

Частые вопросы о проверке по GitHub

Что делать, если у разработчика вообще нет публичного профиля?

Это обычная ситуация для человека, который годами работал в найме под соглашением о неразглашении. Попросите другое проверяемое доказательство: работающий продукт с датами публикации, пакет в реестре, документацию, отзыв заказчика с независимого домена. Отсутствие профиля перестаёт быть вопросом, когда есть что открыть вместо него.

Можно ли подделать календарь вкладов?

Да, и это делается за вечер: даты автора и коммитера задаются переменными окружения, а готовые инструменты рисуют правдоподобную историю автоматически. Поэтому календарь смотрят вместе с содержимым проектов, обсуждениями, релизами и внешними упоминаниями того же человека.

Сколько времени занимает такая проверка?

Первый слой занимает минут двадцать: профиль, описания, пара запросов к открытому интерфейсу GitHub. Разбор одного проекта на экране добавляет сорок пять минут. Оплачиваемое задание растягивается на день или два, и оно же отвечает на главный вопрос о том, справится ли человек с вашей задачей.

Стоит ли просить доступ к закрытому коду?

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

Что просить у подрядчика до договора

  1. Ссылку на профиль, названную им самим, и совпадение имени, сайта и почты между профилем и сайтом.
  2. Один проект на экране: точки входа, хранение данных, внешние интеграции, границы модулей.
  3. Один содержательный запрос на слияние: задача, альтернативы, замечания ревью, тесты, последствия.
  4. Реальный сбой: как воспроизвели, как нашли причину, что сделали, чтобы он не повторился.
  5. Сборку и запуск по инструкции из README в чистом окружении, без подсказок автора.
  6. Короткое оплачиваемое задание того же типа, что и будущая работа, с заранее оговорённым объёмом.
  7. Ответ на вопрос, что он сегодня переписал бы в этом проекте и почему.

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