Я 15 лет в IT, и меня достало делать «кнопочки». Пошёл на hh.ru, пересчитал все вакансии и выбрал бэкенд. Спойлер: PHP ещё жив
Сергей, Ульяновск. В IT с середины 2000-х: jQuery, ExtJS, Backbone, ранний Angular. Сейчас React и TypeScript. Коммерческий фронтенд — три года. До этого — всё подряд.
Полгода назад упёрся.
Не в деньги — в развитие. Делаешь сложные формочки. Микрофронтенды. Стейт-машины на XState. А хочется понимать систему целиком. Почему API тормозит. Как данные идут в базу. Что там, под капотом.
Fullstack. Но какой бэкенд?
На YouTube — ролики «ТОП-5 ЯЗЫКОВ, ПОКА НЕ ПОЗДНО». Парень с укладкой, Hello World три месяца назад. Я пошёл на hh.ru и начал считать сам.
Вот что вышло.
---
## Как я считал
Два источника.
**hh.ru.** Только совпадения в названиях вакансий. Без поиска по описанию — там слишком много шума. Пятнадцать запросов: Python, Java, Go, PHP, Node.js, C# — плюс их комбинации с fullstack и React. Фильтр: вся РФ, зарплата любая.
**Хабр Карьера.** 43 716 анкет, июль 2026. Медианы, а не средние — чтобы пара зарплат из Яндекса не перекосила картину.
Даты: 14–20 июля 2026. Всё руками. Без скриптов.
Что нельзя гарантировать:
Поиск по заголовкам режет абсолютные цифры. Вакансия «Senior разработчик» без языка в названии — мимо выборки. Но пропорции держиЎ смещение одно и то для всех языков.
Это срез недели. Не годовой тренд.
Закрытый рынок (внутрянка, рекомендации) не виден. Совсем.
Регионы: Москва и Ульяновск — разные галактики. Мои цифры — среднее по стране, а не по столице.
И всё же. Для карьерного решения точности достаточно.
---
## Общий рынок: Python — 519. Но это ловушка
Беру все бэкенд-вакансии. Без фильтрации. Грубая масса:
> 📊 **[ВСТАВИТЬ КАРТИНКУ: horiz_bar.png]**
- Python — 519
- Java — 468
- C#/.NET — 227
- PHP — 207
- Go — 141
- Node.js — 62
- TypeScript (бэкенд) — 53
- Ruby — 15
Python вдвое опережает C#. Картинка ясная?
Нет.
Я открыл эти 519 вакансий. Добрая половина — Data Science. Нейросети. ML. Автоматизация. Python-разработчик в банке может не писать API вообще — он обучает скоринговые модели. К fullstack это имеет слабое отношение.
Сырые цифры врут. Красиво врут — но врут. Нужна другая выборка.
Теперь Node.js и TypeScript. Если считать их одним (TypeScript-бэкенд — NestJS или Next.js, технически Node.js), вместе — 115. Третье место, сразу за Python и Java. По-моему, так честнее. Но в таблицах ниже я их разделяю — для прозрачности.
Go — 141. Много для 15-летнего.
PHP — 207. Язык, который «умер» в 2012. В 2015. В 2018. В 2020. 207 вакансий. Никак не добьют.
Ruby — 15.
---
## Fullstack-срез: PHP на первом месте. Я перепроверил трижды
Дальше — фильтрую. Только вакансии, где в заголовке или первом абзаце чётко: «фронтенд + бэкенд». Пришлось вручную просмотреть около 200 штук. Некоторые заголовки врут: написано «Fullstack Developer», внутри — чистый бэкенд.
> 📊 **[ВСТАВИТЬ КАРТИНКУ: fullstack_bar.png]**
- PHP — 30
- Python — 29
- Java — 28
- C#/.NET — 21
- Node.js — 15
- TypeScript — 10
- Go — 2
- Ruby — 1
PHP.
На первом месте.
Я не поверил. Пересчитал. Ещё раз. Цифра честная.
Только вот интерпретация. PHP вырвался не потому, что это лучший язык для веба — а потому что Laravel-экосистема исторически fullstack. Фреймворк даёт бэкенд и Blade-шаблоны из коробки. В вакансиях на Laravel ищут одного человека: база, API, фронт — всё он. Это артефакт экосистемы. Не сигнал «беги учить PHP».
Node.js + TypeScript — 25. Второе место. Я ждал меньше. Думал, fullstack занят PHP и Java, а Node.js где-то в нише. Ошибся.
Go — две вакансии на всю страну.
Две.
Не случайность. Go проектировали для микросервисов, не для fullstack. Искать fullstack на Go — как спорткар с кузовом универсал. Можно, но зачем.
### Несколько цифр без прикрас
- Fullstack-вакансий в выборке: 330
- Удалёнка: 190 (58%)
- Senior: 61, Middle: 24
- hh.индекс: 8,3 — конкуренция
- Динамика: вакансий +8%, резюме −2%
61 senior, 24 middle. В 2,5 раза.
Fullstack — не входная точка в IT. Сначала стань кем-то одним. Потом расширяйся. Рынок ждёт опытных, а middle-позиции подбирает по остаточному принципу.
---
## React + бэкенд: график, ради которого я это затеял
Главный вопрос. Какие бэкенды реально ищут в паре с React? Не «упомянут где-то в глубине требований» — прямо в заголовке или первом абзаце:
> 📊 **[ВСТАВИТЬ КАРТИНКУ: react_combos.png]**
- React + Node.js — 16
- React + PHP — 9
- React + Python — 8
- React + Java — 6
- React + .NET — 5
- React + Go — 1
16 против 9. Node.js отрывается почти вдвое.
И вот что интересно. На общем рынке Node.js — скромный середняк: 62 вакансии. В fullstack-нише — третье-четвёртое место. А в связке с React — уверенное первое.
Не самый массовый бэкенд вообще. Но для React-фронтендера — самый частый выбор нанимателя.
Почему? Четыре причины, которые, по-моему, не случаются сами собой:
**Один язык.** TypeScript на клиенте и на сервере. Типы кочуют туда-сюда без переписывания. DTO описал один раз — работает везде.
**Next.js размывает границу.** API routes, Server Components, Server Actions. Разработчик на Next.js пишет бэкенд, часто не замечая.
**NestJS — когда Next.js маловато.** Модульная архитектура, DI, guards, interceptors. Enterprise-уровень на знакомом TypeScript.
**Общий тулинг.** Zod для валидации, date-fns для дат, shared-библиотеки в монорепе. Никакого дублирования.
React + PHP (9 штук) — обычно Laravel на бэке, React как админка или SPA. Работает. Особенно в e-commerce.
React + Go (1 штука).
Одна.
Кто-нибудь вообще видел такую вакансию вживую? Отпишитесь, мне правда интересно, что за проект.
---
## Деньги: где самый толстый скачок
Хабр Карьера, 43 716 анкет. Медианы.
> 📊 **[ВСТАВИТЬ КАРТИНКУ: salaries.png]**
- Intern — 66 000 ₽
- Junior — 95 000 ₽
- Middle — 177 000 ₽
- Senior — 303 000 ₽
- Lead — 378 000 ₽
Ступеньки: Junior → Middle — плюс 82 тысячи. Middle → Senior — плюс 126 тысяч. Senior → Lead — плюс 75 тысяч.
Самый крутой подъём — между middle и senior. Рынок платит за глубину. Fullstack-middle, который «всё понемногу», стоит сильно дешевле fullstack-senior, который глубоко знает оба направления.
Что за кадром:
Разброс внутри грейдов — пропасть. Senior fullstack в региональной веб-студии и senior fullstack в финтехе живут в разных финансовых измерениях.
Хабр Карьера смещена вверх. Те, кто получает мало, реже заполняют анкеты.
Зарплаты по языкам — за регистрацией. Я не знаю, получает ли PHP-senior столько же, сколько Node.js-senior. Подозреваю, что нет. Доказательств у меня нет.
---
## Удалёнка: 190 из 330
190 fullstack-вакансий из 330 — удалённые.
Я в Ульяновске. Ближайшие офисы крупных IT — Казань, Самара. С удалёнкой это не проблема: работаешь на Москву или Питер из квартиры с видом на Волгу.
Деталь: большинство удалённых fullstack-позиций — аутсорсинг и стартапы. Enterprise осторожничает. Банки. Телеком. Им всё ещё нужен офис. Хотите Java в банке — готовьтесь к гибриду как минимум.
---
## Что я выбрал
Node.js + NestJS + TypeScript.
Не «потому что модно». Пять вещей, которые перевесили:
**Язык один.** Пишу на TypeScript больше пяти лет. Декоратор `@controller()` в NestJS — продолжение того, что знаю. Не прыжок в другую вселенную.
**16 против 1.** React + Node.js — 16 вакансий, React + Go — одна. Работодатель, которому нужен fullstack на React, ждёт Node.js. Мне не надо его переубеждать.
**Потолок далеко.** Простой CRUD на NestJS — за вечер. Дальше — CQRS, event-driven, микросервисы на Kafka/NATS. Есть куда расти.
**Next.js как трамплин.** Server Actions и API Routes — это бэкенд, просто в рамках одного фреймворка. Переход к NestJS — структурирование тех же концепций.
**Одна кодовая база.** Типы, валидация, утилиты живут в одном месте. Без дублирования.
Что через год-два? Не знаю. Может, вторым языком возьму Python + FastAPI — мост в AI/ML-проекты. Может, останусь в Node.js и пойду в ширину: базы данных, инфраструктура, девопс.
Посмотрим.
---
## Если примерять к себе
Ты React/TypeScript-фронтендер? **Node.js, NestJS.** Язык знаешь, рынок подтверждает, вход плавный.
Ты в Data Science / ML? **Python, FastAPI.** Строить веб вокруг ML-моделей — редкая комбинация. Только учти: вакансий меньше, чем в чистом вебе.
Ты в enterprise или планируешь? **Java / C#.** Стабильно. Дорого. Порог входа высокий, экосистема тяжёлая.
Любишь highload и инфраструктуру? **Go.** Fullstack-позиций почти нет. Но как чистый бэкенд — мощно.
Нужна работа прямо сейчас? **PHP, Laravel.** 30 fullstack-вакансий — больше всех. Только готовься к культурной адаптации после TypeScript.
---
Четыре вещи, которые остались после подсчётов.
Node.js — не самый большой рынок. Но для React-фронтендера — точка входа с наименьшим сопротивлением. 16 против 1. Не погрешность.
Fullstack — не старт. 61 senior-вакансия, 24 middle. Сначала глубина. Потом ширина.
Один язык на клиенте и сервере — не «удобно». Это скорость. Меньше ошибок, общий тулинг, никаких «забыл обновить типы после смены API».
Цифры — не догма. Срез июля 2026. Через полгода пересчитаю — и не поручусь, что картина не изменится.
Пишите в комментариях, какой бэкенд выбрали вы. И главное — почему. Реальный опыт интереснее любых цифр.
А если кто-то видел fullstack на Go вживую — маякните. Мне правда интересно.
---
*Данные: hh.ru и Хабр Карьера, 14–20 июля 2026, РФ. Поиск по заголовкам — абсолютные цифры занижены, пропорции репрезентативны. Детальные зарплаты по языкам — за регистрацией, не включены. Региональные перекосы возможны.*
Apache vs Nginx
В дополнение у посту про open server v6.
Коротко сравним какой веб -сервер выбрать.
Apache — надёжная классика.
Главная фишка поддержка файла .htaccess,это файл для настройки редиректа, ограничение доступа и параметров php , прямо в папке проекта не трогая глобальный конфиг . Супер удобно для локальной разработке и имеет низкий порог вхождения.
Идеален для cms Wordpress, Битрикс ,Joomla-все работает из коробки.Можно написать настройки в одном проекте и просто переносить их в другой , методом ctrl+c=>ctrl+v.
Из минусов медленнее работает со статикой (картинки , css ).Потребляет больше памяти , в локальное разработке вы вряд ли это заметите , но на проде может аукнуться.
Nginx — скорость и гибкость
Главная фишка :Скорость и производтельность.
Из плюсов, скорость , можно использовать как прокси с apache , в open server v 6.
Из минусов выше порог вхождения для новичков , что касается настроек . Отсутвует файл .htaccess.Все настройки пишутся в основном файле настроек , в open server v6 ,этот файл называется nginx.conf в папке с модулем. Необходимость разбираться в синтаксисе Nginx , если необходимо будем настроить к примеру , сложные проекты с «красивым» URL.
Если ты разрабатываешь высоконагруженные проекты, API, используешь современные фреймворки (Laravel, Symfony) и готов разбираться с конфигами-выбирай nginx.
Короткая таблица сравнения:
Характеристика apache nginx
.htaccess Есть Нет
Простота нас-ки Высокая Требует знаний
Производ-ть Средняя Высокая
Потр-е памяти Выше Ниже
Wordpress Подходит Да(но с руч. нас-кой)
Для Open Server 6 и локальной разработки:
Начинай с Apache — проще, привычнее, меньше головной боли.
Переходи на Nginx, если:
-нужна максимальная скорость
-хочешь разобраться, как работают веб-серверы
-проект уже требует сложных настроек, где Nginx даёт больше гибкости
В новой версии ты можешь переключаться между ними прямо в меню OSPanel или в project.ini, так что можно пробовать и менять без риска сломать систему
Если вам интересна тема веб-разработки, я также публикую разборы других кейсов в своем Telegram-канале и на Максе. Буду рад единомышленникам
Открываем сервер 6 версии-Guide setup open server v 6
Для разработчиков , которые переставили пользоваться open server до 2025 , а так же для тех кто только начинает свой путь в разработке , этот гайд будет очень полезным так как , приложение значительно изменилось , по сравнение с прошлой версией, прочитав этот гайд вы сможете легко запустить свой первый проект в open server.
И так вместо графического интерфейса-настройка основывается на работе с файлами и конфигами.
1) Находим папку home , которая в этой версии заменила папку domains, создаем там папку проекта.
2)Создаем папку .osp ,которая по дефолту должна быть скрытой , в ней файл project.ini -это файл настроек , в нем будет указан название проекта , движок веб сервера , версия языка php и название публичной директории ,ниже для примера как может выглядеть этот файл
[myproject.local]
web_engine = Nginx # или Apache
php_engine = PHP-8.2
public_dir = {base_dir}\public
В 5 версии было все более нативной , настраивалось через графическое дерево в меню open server , новый же подход позволяет задать более гибкие настройки.
3)Далее включаем модули , глобальный и для проекта отдельно.
Глобально через меню open server модули =>http=> выбираем нужный веб движок apache или nginx
После настройки глобальных модулей , мы можем настроить , веб сервер и версию php , локально для проекта
Так же локальная настройка , доступна через тот самый файл project.ini , про который я писал выше .В прошлых же версиях все было более проще , через трей интерфейса.
4) Что касается файла project.ini , и настройки корневой папка .Если файл лежит именно в корне проекта , оставляем настройку
[myproject.local]
public_dir = {base_dir}
если же присутствуют подпапки,как в laravel к примеру :
home/
└── myproject.local/
├── app/
├── config/
├── public/ ← вот она, папка с точкой входа
│ ├── index.php
│ └── style.css
├── storage/
└── vendor/
То добавляем через / название папки где находится наша точка входа в приложение
[myproject.local]
public_dir = {base_dir}/public
Думаю тут понятно что этой настройкой мы указываем откуда серверу отдавать файлы , где находится наша точка входа
Что будет, если не указать public_dir?
Без public_dir в project.ini домен появится, но сервер не будет знать, откуда отдавать файлы, и вы увидите ошибку 404 или пустую страницу.
5)Как теперь работают домены (Прощай, файл hosts!)
В 5-й версии мы были обязаны вручную править системный файл C:\Windows\System32\drivers\etc\hosts, прописывая туда строки вида 127.0.0.1 myproject.local.
В Open Server 6 всё работает иначе:
В программу встроен собственный DNS-сервер.
При запуске OSP 6 автоматически перехватывает DNS-запросы на вашем компьютере.
Как только вы прописали имя проекта в скобках [myproject.local] внутри project.ini, программа сама связывает этот домен с нужным внутренним IP-адресом.
Вам больше не нужно трогать файл hosts — Windows мгновенно увидит ваш сайт по его DNS-имени. Если вам всё же нужен доступ по IP, проект по умолчанию доступен на локальном адресе http://127.0.0.1 (или с указанием конкретного порта, если вы изменили его в глобальных конфигах)
6)Важное изменение при подключении к БД (MySQL)
Раньше в конфигурационных файлах ваших сайтов (например, в .env файле Laravel или wp-config.phpв WordPress) в строке подключения к базе данных (DB_HOST) мы всегда писали localhost или 127.0.0.1.
В OSP 6 из-за изолированной архитектуры модулей localhost больше не работает!
Теперь для подключения к MySQL нужно использовать:
DNS-имя модуля: Например, MySQL-8.2 (указывайте ровно то имя, которое запущено у вас в системе).
Или конкретный IP-адрес: По умолчанию OSP 6 выделяет модулям баз данных адреса в локальной подсети. Чаще всего это 127.0.0.1, но с уникальным портом, либо выделенный IP из диапазона 127.x.x.x (смотрите точный IP/порт в консоли OSP при старте модуля).
Пример настройки файла .env ,в проекте
DB_CONNECTION=mysql
DB_HOST=MySQL-8.2 # Вместо localhost пишем имя модуля DNS
DB_PORT=3306
DB_DATABASE=my_db
DB_USERNAME=root
DB_PASSWORD=
Вот и все основные нюансы для запуска проекта в open server v6.
А если вы не знаете какой веб-сервер выбрать apache или nginx .Об этом я тоже расскажу в след. посте.
Если вам интересна тема веб-разработки, я также публикую разборы других кейсов в своем Telegram-канале и на Максе. Буду рад единомышленникам.
Один портал вместо 14: как собирали цифровую ВДНХ
Представьте, что вы открыли сайт выставки, нашли интересное событие и перешли в раздел другого павильона. Цвета изменились. Меню стало другим. Кнопки находятся в новых местах. Кажется, будто вы случайно ушли с сайта и попали на чужой ресурс.
Примерно так раньше выглядело цифровое пространство ВДНХ. У разных направлений было 14 отдельных сайтов. И объединить их оказалось намного сложнее, чем нарисовать одинаковое меню.
14 сайтов одной локации
У музеев, выставочных площадок и других направлений ВДНХ были отдельные сайты. Они создавались в разное время и выглядели по-разному.
Посетитель мог открыть афишу на одном ресурсе, перейти к другому событию и оказаться в совершенно новом интерфейсе. Приходилось заново искать меню, расписание и покупку билетов.
Сотрудникам было не проще. Одну новость нужно было размещать сразу в нескольких местах. Если менялось расписание или закрывался павильон, информацию приходилось обновлять в разных системах.
Логичным решением казалось объединить все сайты. Но здесь началась самая сложная часть.
Старый сайт нельзя было просто выключить
С ним уже работали мобильное приложение и информационные экраны на территории ВДНХ. Они регулярно запрашивали расписание, описания мест и другую информацию.
Если бы старую систему просто заменили новой, часть этих устройств и приложений могла перестать работать. Тогда к проекту сайта добавилась бы срочная переделка всех подключенных сервисов.
Поэтому новую платформу научили отвечать старым приложениям на привычном для них языке. Внутри система стала другой, но мобильное приложение и информационные экраны продолжили получать данные как раньше.
Это похоже на переезд магазина в новое помещение, при котором старый вход временно оставляют для постоянных покупателей.
Одна база, разные разделы
События, новости и места перенесли в общую систему. Теперь информацию достаточно добавить один раз.
Если событие относится к нескольким разделам, оно появляется там автоматически. Редактору больше не приходится копировать один и тот же текст.
При этом направления ВДНХ не стали одинаковыми. У них сохранились собственные цвета, меню и оформление. Разница в том, что теперь все они собираются из одной системы.
Обучение сотрудников заняло 2 часа. Техническая команда заказчика уже через неделю смогла самостоятельно добавлять новые функции.
Почему сайт стал быстрее
Раньше серверу часто приходилось заново собирать одну и ту же страницу для каждого посетителя.
В новой системе часто используемые данные подготавливаются заранее. Если страница не изменилась, пользователю показывают уже готовую версию. Дополнительные элементы загружаются только тогда, когда они действительно нужны.
Особенно сложной была афиша. Пользователь может выбрать дату, цену, возраст, тему и другие параметры. Всего вариантов фильтрации было больше 100.
Если при каждом выборе обращаться к основной базе, она быстро перегружается. Поэтому события заранее распределили по упорядоченным спискам. Когда посетитель выбирает несколько условий, система находит пересечение этих списков.
Например, подборка бесплатных детских концертов на ближайшие выходные формируется за 3-5 мс. Нагрузка на основную базу сократилась на 90%.
Почему не пришлось покупать новые серверы
У городского портала нагрузка меняется в зависимости от событий. В обычный день посетителей может быть относительно немного. После открытия катка или крупной выставки их число быстро растет.
Система была разделена на несколько самостоятельных частей. Если одна из них начинает получать слишком много запросов, можно временно запустить дополнительные экземпляры именно этой части.
Это позволило оставить прежнюю инфраструктуру и при этом подготовить сайт к более высокой посещаемости.
Карта тоже могла стать дорогой
Интерактивная карта использует внешний картографический сервис. Некоторые обращения к нему оплачиваются.
Если отправлять запрос после каждого изменения, расходы постепенно растут. Поэтому маршруты пересчитываются только тогда, когда редактор завершил работу и нажал отдельную кнопку.
Часть информации о местах хранится внутри платформы. Повторно запрашивать названия, значки и другие базовые данные не нужно.
Если пользователь находится далеко от ВДНХ, построение маршрута может переключаться на Яндекс Карты.
Что получилось
Разработка заняла 6 месяцев вместе с дизайном, согласованиями и документацией.
Время ответа серверной части сократилось с 900 до 62 мс. Это почти 15-кратное ускорение. Первый экран загружается менее чем за 2 секунды даже при высокой посещаемости.
Но для посетителя важнее другое. Сайт перестал выглядеть как набор несвязанных ресурсов. События, места и маршруты находятся в одной системе.
Для сотрудников исчезла часть повторной работы. Для технической команды появилась возможность развивать отдельные части сайта, не перестраивая его целиком.
Самый заметный результат проекта находится не на экране. Он проявляется в тот момент, когда меняется расписание, появляется новое мероприятие или резко вырастает число посетителей, а система продолжает работать как обычно.
Здесь я обычно пишу про проекты, кейсы и ИТ-практику. А если хочется увидеть меня не только в рабочих текстах - приходите в мой тг https://t.me/alekseypostrigaylo. Там - сын, поездки, работа за кадром, личные наблюдения и попытка жить так, чтобы было что вспомнить.
Сделал self-hosted чат в стиле Discord, который работает на обычном PHP + SQLite — без Docker и Node [open-source]
Демо: https://4tusa.site Исходники (MIT): https://github.com/MrZer0x0/trueCORD
Всем привет.
Какое-то время пилил self-hosted чат в стиле Discord и наконец довёл до состояния, которым не стыдно поделиться. Бесплатный, открытый исходный код (MIT).
Зачем вообще: большинство self-hosted чатов требуют Docker, инстанс Postgres, очередь сообщений и полдня жизни до того, как увидишь экран входа. Мне хотелось, чтобы моё сообщество могло общаться, не завися от чужих серверов, и без необходимости быть админом-девопсом. Поэтому тут всё наоборот — только PHP и один файл SQLite. Если ваш хостинг тянет блог на WordPress, он потянет и это.
Что умеет: серверы, текстовые каналы и личные сообщения с редактированием и реакциями; голосовые комнаты и звонки по WebRTC с демонстрацией экрана; обмен файлами (картинки сжимаются автоматически, лента грузит лёгкие миниатюры); устанавливается как PWA на компьютер и телефон без магазинов приложений; несколько тем и 4 языка с переключением на лету; есть API мини-приложений (в комплекте демо 3D-шашек). Весь брендинг и лимиты живут в одном config.json — код трогать не нужно.
Что нужно на сервере: PHP 7.3+ (рекомендуется 8.1+), PDO SQLite, опционально GD для миниатюр, Apache или Nginx с HTTPS. Никакого Node, Composer, отдельной БД и сборки. Установка по сути: залить файлы → дать права на папку uploads → отредактировать конфиг → открыть в браузере.
Проект ранний, делаю один, так что буду рад фидбэку — особенно по голосовому стеку и безопасности. Баг-репорты и комментарии в духе «вот чего мне не хватает, чтобы я реально это развернул» очень приветствуются.
Ссылки:
Исходники (MIT): https://github.com/MrZer0x0/trueCORD
Демо: https://morrowind.site
Демо: https://4tusa.site














