Вопрос «какой язык брать команде» обычно решают разговорами. Мы решили посмотреть на числа — не на опросы и не на рейтинги, а на собственный замер активности в публичных репозиториях.
Данные: GitHub, доля языка среди репозиториев с активностью за неделю; окно 6 июля — 30 августа; измерено 6 сентября. Метод описан ниже, ограничения — тоже.
Что именно измерено
Каждую неделю окна мы считали, сколько репозиториев с заметной активностью помечено каждым из шести языков, и переводили это в долю от суммы по всем шести. Окно — восемь полных недель; крайние недели не сравниваются между собой, потому что праздники и крупные релизы переворачивают знак.
Ключевое решение метода — считать долю, а не абсолютное число. Отметка активности у репозитория обновляется при любом изменении, и общее количество активных репозиториев в выборке дрейфует само по себе. Если смотреть на абсолютные ряды, растут одновременно все шесть языков — вывод из такой картины сделать нельзя.
Сразу об ограничениях. Это замер публичных репозиториев, а не отрасли: корпоративный код сюда не попадает вообще. Язык репозитория определяется по объёму файлов, поэтому проект со сборкой на одном языке и логикой на другом попадает в одну корзину. И это активность, а не количество людей, не деньги и не вакансии.
Ещё одно ограничение стоит назвать прямо, потому что оно объясняет, почему наши ряды нельзя складывать с чужими. Отметка активности у репозитория — это дата последнего изменения, а не число изменений. Репозиторий, куда за неделю пришла сотня правок, и репозиторий, куда пришла одна, попадают в выборку одинаково. Такой замер хорошо показывает, где работа идёт, и плохо — сколько её там.
Мы сознательно оставили это как есть. Взвешивание по числу правок сместило бы картину в сторону проектов с шумной историей: автоматические обновления зависимостей, боты, переносы файлов. Доля репозиториев с признаком жизни — грубее, но честнее.
Тупик: смотреть, кто «на первом месте»
Первая реакция на такую таблицу — найти строку сверху и объявить её победителем. Не помогает это по простой причине: доли ведущих языков велики и меняются медленно, а решение о языке принимается не про отрасль, а про конкретную задачу и конкретную команду.
Наш замер это подтверждает буквально. Python занимает 34,2% выборки, JavaScript — 27,5%, TypeScript — 27,1%. Три первые строки закрывают почти девять десятых, и любой из этих языков «первый» в своей области. Порядок в верхней части таблицы не подсказывает решения, он только говорит, что найм по этим языкам будет проще.
Полезная информация в другой колонке — в изменении доли за окно.
Что показывает изменение
Растут в доле два языка: Go прибавил 14,3% своей доли, Rust — 11,6%. Это не значит, что они догоняют лидеров: у Go доля 2,4%, у Rust — 2,0%, и рост считается от маленькой базы. Значит это другое: активность в них прибавляется быстрее, чем в выборке в целом.
Растёт также TypeScript — 4,7% к своей доле, и это уже рост крупной величины: доля больше четверти. На этом фоне JavaScript теряет 1,1%. Два числа удобно читать вместе: суммарно фронтенд не сдувается, внутри него идёт замещение.
Теряют долю Python (−3,3%) и Java (−3,6%). Про Python это не «падение популярности»: с долей больше трети он остаётся самой крупной строкой, и снижение доли на таком масштабе означает лишь, что соседи растут быстрее.
Что изменение доли значит на практике
Полезно перевести проценты в понятную величину. Прибавка доли означает, что за восемь недель в выборке стало больше репозиториев, где на этом языке что-то происходит, — относительно всех остальных. Это индикатор притока внимания, и у него короткая память: он реагирует на новые проекты быстрее, чем на существующие.
Отсюда следует неочевидное. Языки, на которых начинают новое, всегда выглядят в таком замере лучше языков, на которых поддерживают старое. Java и Python несут на себе огромный объём уже написанного, и этот объём в замере почти не виден: работающая система, куда не приходят изменения, для нас невидима.
Из-за этого таблицу нельзя читать как прогноз. Она отвечает на вопрос «где сейчас начинают», а не «где через несколько лет будет работать больше кода». Второй вопрос важнее для решения о найме, но по этим данным он не решается.
И последнее наблюдение из формы рядов: у растущих языков недельные значения идут ступеньками, у крупных — плавно. Чем меньше база, тем больше вес одного всплеска, поэтому по коротким окнам малые языки всегда выглядят более драматично, чем есть. Именно поэтому мы сравниваем половины окна, а не соседние недели.
Как это читать, выбирая язык команде
Первое: разделите вопрос найма и вопрос содержания. Верхняя часть таблицы отвечает на вопрос «сколько людей я найду», нижняя — почти ни на что не отвечает, потому что редкий язык не становится дешевле от того, что его доля растёт.
Второе: рост доли от маленькой базы — сигнал, а не аргумент. Он говорит, что язык живой и что вокруг него что-то происходит, но ничего не говорит о том, окупится ли он на вашей задаче.
Третье: замещение внутри одной ниши (как TypeScript и JavaScript) значит больше, чем движение между нишами. Оно показывает, куда переезжают команды, которые уже решили задачу того же класса, что и ваша.
Четвёртое: ни одно из этих чисел не отменяет стоимости содержания. Язык выбирают на годы, а платит за выбор тот, кто будет чинить систему через несколько лет.
Чего замер не говорит
Он не говорит, на чём пишут в компаниях: закрытый код в выборку не попадает.
Он не говорит, что происходит с языками вне шести измеренных. Ряд по каждому из них нужно собирать отдельно, и добавление седьмой строки меняет доли всех остальных — сравнивать наши числа с чужими таблицами по этой причине нельзя.
Он не говорит о качестве и не говорит о деньгах. Доля активности — это про то, где сейчас идёт работа, а не про то, где она окупается.
И он не переносится на следующий квартал. Восемь недель — короткое окно; направление в нём видно, скорость — нет.
Позиция редакции
Мы считаем, что таблицу долей стоит читать снизу вверх: полезное в ней — изменение малых величин и замещение внутри одной ниши, а не порядок лидеров. Практический вывод: если язык выбирается под задачу, которую в отрасли решают массово, смотрите на замещение внутри её ниши; если под редкую — таблица долей вам не помощник, считайте стоимость найма и содержания.
Мы неправы в одном случае: когда язык выбирается под наём стажёров и джуниоров. Там верхняя часть таблицы решает почти всё, и брать язык с растущей, но маленькой долей — значит платить за каждого человека дороже без выгоды, которую можно предъявить.