<? phpukraine СТАТТІ
⌕Пошук по платформі
КАРʼЄРА 1 жовтня 2026 · 8 хв читання

Як читати PHP-вакансію: вилка, стек, «ринкова зарплата» і тривожні сигнали

Текст вакансії пишуть не для кандидата, а для внутрішнього погодження: рекрутер збирає вимоги з тімліда, HR додає блок про печиво й динамічну команду, хтось вставляє рядок про Kafka на майбутнє. Через це частина оголошення не означає нічого, а частина означає більше, ніж здається. Розбираю типові формулювання і те, що з них можна витягнути за двадцять хвилин першого дзвінка.

РP
Редакція phpukraine
Редакція платформи

Оголошення пишуть як маркетинговий текст з технічними вкрапленнями. Читати його варто так само, як чужий код: зʼясовувати, чому формулювання саме такі і чого в тексті немає взагалі.

Вилка, «від» і «ринкова зарплата»

Більшість PHP-вакансій в українських джерелах іде без суми. Коли сума є, вона набуває однієї з чотирьох форм, і кожна читається по-різному.

«Від X» означає суму, яку компанія готова платити вже зараз. Верхня межа існує, але її не публікують, бо її отримає хтось, хто закриває і основні вимоги, і блок «буде плюсом». Якщо ви закриваєте половину тексту, розраховуйте на X і невелику надбавку.

«X-Y» з широким розривом майже завжди означає, що одним оголошенням закривають дві позиції або два грейди. Питання на дзвінку одне: що саме відрізняє кандидата у верхній частині вилки від кандидата у нижній. Нормальна відповідь звучить як перелік обовʼязків («веде інтеграції сам, без тімліда»). Відповідь «залежить від кандидата» без критеріїв означає, що верхня частина вилки для новачка в компанії не існує.

«Ринкова зарплата», «конкурентна винагорода», «за результатами співбесіди» не означають нічого. Відгукуватись все одно варто, просто назвіть свою цифру першим і подивіться на реакцію.

Є кілька речей, яких у тексті не буває ніколи. Сума в оголошенні зазвичай до податків, бо більшість PHP-розробників працює через ФОП, тож питайте прямо: чи входять у названу суму єдиний податок, військовий збір і ЄСВ, і хто платить бухгалтеру. Далі валюта й курс: якщо виплата в гривні, домовленість буде або за курсом НБУ на день виплати, або за внутрішнім фіксованим курсом, і різниця між цими двома варіантами видна в кінці кожного місяця. І випробувальний: знижена ставка на час пробного періоду трапляється часто, тому в офері мають стояти обидві цифри та критерії переходу, а не «потім обговоримо».

І питання, яке економить рік: коли востаннє переглядали зарплати в команді і чи той перегляд справді відбувся. «Раз на рік за результатами performance review» та «минулого разу перегляд перенесли» це дві різні компанії з однаковим рядком у вакансії.

Стек із десяти технологій

Список із десяти рядків описує все, що лежить у репозиторіях компанії, а не вашу майбутню роботу. Звужує його одне питання: яких трьох пунктів зі списку я торкнусь у перший місяць.

Найбільше в стеку говорить версія PHP, і саме її майже ніколи не пишуть точно. «PHP 8+» покриває все від 8.0 до 8.5, а це помітно різний щоденний досвід:

final readonly class Payout            // readonly-клас: 8.2
{
    public function __construct(
        public PayoutStatus $status,   // enum: 8.1
        public int $amountCents,       // promoted property: 8.0
    ) {}

    #[\Override]                       // 8.3
    public function __toString(): string
    {
        return $this->status->value.':'.$this->amountCents;
    }
}

Property hooks і asymmetric visibility з 8.4 чи pipe operator з 8.5 на співбесіді важать мало. Значно більше важить, чи можна в цьому коді писати enum замість констант і readonly замість сетерів. Тому питання на дзвінку формулюється конкретно: яка версія в проді, яке обмеження "php" стоїть у composer.json, і чи є в компанії проєкт на 7.4, який теж доведеться підтримувати.

Та сама логіка з фреймворком. «Symfony» в заголовку це і 7.4 LTS, і 6.4 LTS, і 4.4, яку планують оновити «наступного кварталу». «Laravel» це і 12, і 10, і 5.8 з власним форком якогось пакета. Запитайте номер мінорної версії та дату останнього мажорного апгрейду: друга цифра показує, чи взагалі в команді є час на технічну роботу.

Довжина списку оманлива так само. Один обробник повідомлення чесно закриває чотири рядки типового оголошення:

final readonly class SyncSupplierStock
{
    public function __construct(
        private StockApi $api,
        private StockRepository $stock,
        private LockFactory $locks,
    ) {}

    public function __invoke(SupplierStockChanged $message): void
    {
        $lock = $this->locks->create('stock:'.$message->supplierId, ttl: 30);

        if (! $lock->acquire()) {
            return;
        }

        try {
            foreach ($this->api->stock($message->supplierId) as $item) {
                $this->stock->upsert($message->supplierId, $item->sku, $item->quantity);
            }
        } finally {
            $lock->release();
        }
    }
}

Тут є черга, Redis під локом, інтеграція з чужим REST API і запис у базу. Чотири технології зі списку, один файл, два дні роботи. Коли на дзвінку описують «складний високонавантажений стек», просіть назвати найважчу задачу, яку команда закрила за останній квартал. Якщо це така ж синхронізація, ви це вмієте.

Окремо про «мікросервіси». Питайте дві речі: чи деплоїться кожен сервіс незалежно і чи є в них спільна база. Два сервіси зі спільною MySQL це розподілений моноліт, і на співбесіді про це краще дізнатись раніше, ніж на першому інциденті.

Рядки з блоку «буде плюсом» не вчать на роботі. Якщо там Kafka або Kubernetes, запитайте, хто в команді їх зараз обслуговує. Коли відповідь «поки ніхто, хочемо впроваджувати», за цим рядком стоїть ваша майбутня задача без виділеного часу.

Формат роботи і що за ним ховається

«Віддалено» рідко буває просто віддалено. Під ним живуть кілька різних домовленостей: повністю розподілена команда, віддалено з обовʼязковим оверлапом, віддалено з поїздками в офіс на планування, віддалено «поки що». Різниця зʼясовується питанням про годинні пояси: де фізично сидить тімлід, де замовник, у який час дейлі. «Гнучкий графік» разом з «оверлап з командою» означає фіксовані core hours, просто названі інакше.

Тип договору визначає все, чого в оголошенні немає. Гіг-контракт з резидентом Дія.City, звичайний договір з ФОП і трудовий договір дають різні гарантії щодо відпустки, лікарняних і строку попередження про розрив. «Unlimited vacation» без процедури погодження означає відпустку, яку ніхто не бере. Питайте кількість оплачуваних днів, хто підписує, і скільки днів попередження з кожної сторони.

Для позицій в офісі є ще один блок, якого в тексті зазвичай немає: укриття в будівлі, генератор, політика на час тривоги, чи можна в такі дні працювати з дому. Якщо вакансія згадує бронювання або відстрочку, уточніть формулювання: наявний статус критично важливого підприємства це одне, «допомагаємо з документами» це інше.

І технічна дрібниця, яку забувають: чи дають техніку, чи є доступ до прода через VPN і чи можна працювати з-за кордону. Остання відповідь часто залежить від вимог замовника, а не від компанії.

Тривожні сигнали

Безіменна вакансія, де назву компанії обіцяють після вашої згоди на співбесіду. Нормальна причина для такого існує (заміна людини, яка ще працює), але питати її треба відразу.

Одне й те саме оголошення, яке перезапускають щомісяця з тим самим текстом. Або позиція не закривається, або закривається і знову відкривається.

Вимоги, які описують трьох людей: PHP, фронтенд на Vue, налаштування CI, адміністрування MySQL і спілкування з замовником у рамках однієї middle-позиції. Широким профілем це не є, обовʼязки просто не розподілили.

Опис процесу найму на чотири-пʼять етапів для середнього грейду без вказаних строків відповіді. Питайте, скільки календарних днів між етапами і хто дає фідбек у разі відмови.

Тестове завдання до першого дзвінка, особливо якщо воно описане бізнес-задачею з дедлайном. Нормальне тестове приходить після розмови й не має продакшн-цінності.

Фрази про стресостійкість, багатозадачність і готовність «гасити пожежі» в тексті про сам продукт. У блоці вимог вони означають, що пожежі регулярні. Поруч перевіряйте питанням: скільки разів за минулий місяць релізили у вихідні і чи є чергування.

Згадка «легасі» без згадки тестів. Рефакторинг успадкованого коду без тестів рефакторингом не є, і дізнатись про це краще до офера: запитайте, що саме запускає CI на пулл-реквесті.

Відсутність код-ревʼю, подана як довіра до розробників. Тут допомагає просте прохання: розкажіть шлях однієї зміни від комміту до прода, з іменами інструментів.

Питання для першого дзвінка

Розмову варто вести так, щоб після неї у вас залишились цифри й назви, а не враження. Мінімальний набір:

  • Чому позиція відкрита: ріст команди чи заміна. Якщо заміна, скільки людей змінилось на цій ролі за рік.
  • Вилка для цього грейду і що відрізняє верхню частину від нижньої. Ставка на випробувальному і після.
  • Тип договору, податки, валюта й курс, оплачувана відпустка, строк попередження.
  • Версія PHP у проді, мінорна версія фреймворку, дата останнього мажорного апгрейду.
  • Які три технології зі списку в щоденній роботі, і хто обслуговує решту.
  • Частка часу на новий код і на підтримку. Цю відповідь корисно порівняти з тим, що написано в оголошенні.
  • Що запускає CI на PR, скільки часу від мерджу до прода, хто має доступ до прода.
  • Чергування, релізи у вихідні, інциденти за останній місяць.
  • Хто буде вашим тімлідом і чи він на цьому дзвінку чи на наступному.
  • Скільки етапів далі, строки й формат фідбеку.

Якщо на половину цього відповідають «уточню в тімліда», для рекрутера це нормально, але відповіді мають прийти до технічної співбесіди, а не після офера. Текст вакансії нічого не коштує компанії, конкретні відповіді на дзвінку коштують, і саме по них видно, з чим ви маєте справу.

ПИШЕТЕ ПРО PHP?Опублікуйте розбір або історію з проєкту на платформіРедактор із чеклістом, редактура, авторська сторінка. Републікація з блогу отримує canonical на оригінал. Відкрити редактор →
РP
Редакція phpukraine
Редакція платформи
Матеріали, які готує команда платформи на основі власних даних: каталогу вакансій, зарплатного звіту й банку питань. Кожна цифра в них рахується з бази, а не береться з голови.
оновлено 3 жовтня 2026 · ліцензія CC-BY-SA-4.0
ДАЛІ ПО ТЕМІ
ЧИТАТИ ДАЛІ
← Усі статті