Які навички потрібно розвивати, щоб претендувати на роль Senior PHP Developer? Чи відрізняються вимоги в Україні та Каліфорнії, яка є Меккою програмування?
Щоб з’ясувати це, я проаналізував 100% відкритих вакансій на DOU в Україні та LinkedIn в Каліфорнії. На мої радари потрапили серед інших вакансії компаній Facebook та Dell. Для кожної технології було підраховано відсоток вакансій, у яких вона вказана як обов’язкова, і окремо як «бажана, але не обов’язкова».
Картина в Україні та Каліфорнії багато в чому схожа, але прослідковується низка відмінностей. Щоб можна було побачити «розклад сил» наочно, Ігор Яновськийстворив для нас інтерактивний віджет.
Методика
Станом на 20 січня в рубриці PHP на DOU було розміщено 57 вакансій Senior Developer. У Каліфорнії на LinkedIn станом на 3 лютого мені підійшла лише 31 вакансія, що вимагала PHP. Критерієм відбору була не назва вакансії, а вказівка на PHP як основну мову розробки, тому вакансії Senior Web Developer тощо теж потрапили в дослідження. Пошукова видача на LinkedIn, Indeed (який часто дублює LinkedIn) та Rabota.ua може показувати сотні та тисячі, але, як з’ясувалося, це відбувається за рахунок нерелевантних результатів: або не Senior, або не PHP, або ні те, ні друге.
Facebook принципово не використовує слово «Senior», але їхні вакансії «Engineer», що вимагали 5+ років досвіду, включені в дослідження.
Вакансії стафінгових агенцій я ігнорував. Це пов’язано з тим, що одну вакансію можуть вести декілька агенцій, що призведе до викривлення результатів. Крім того, деякі стафери можуть практикувати фейкові вакансії, щоб наповнювати свою базу кандидатів.
Аналіз був здійснений вручну, а не скриптом. Це пов’язано з тим, що назва технології може бути записана в вакансії з помилкою. Але значно вагоміша причина в тому, що в разі проходження скриптом поза увагою опинилися б технології, не включені в попередній список.
Англійська мова вирішує
Знання англійської мови в Україні вказується в більшості вакансій та поступається лише MySQL та JavaScript. Ясно, що без MySQL PHP-розробника бути не може. Відсоток англійської, співставний з MySQL, показує, яку роль відіграють іноземні замовники, та розвіює міф про роботу пехапешників на внутрішній ринок.
Рівень англійськоїє вирішальним для визначення компенсації. Найчастіше роботодавці згодні на Intermediate, тоді як Advanced не вказали в жодній вакансії. Причиною є висока ціна спеціалістів рівня Advanced.
Я звернувся до альтернативного зарплатного віджету, щоб побачити різницю в компенсації залежно від рівня англійської для Senior PHP-розробника. Вона колосальна.
Pre-Intermediate& Intermediate — 79 анкет, середня компенсація 3 036доларів США після податків.
Upper-Intermediate — 45 анкет, 3 361 долар.
Advanced — 12 анкет, 3 791 долар.
Небажання вчитись та підтягнути свій рівень до Advanced коштує (3 791 — 3.036) x 12 = 9 060 доларів на рік.
Не знаннями єдиними: Soft Skills
Впадає в око, яку велику роль відіграють soft skills. Ми часто буваємо дуже розумними, але не здатними конструктивно спілкуватись. Можливо, частину часу, який ми присвячуємо вивченню технологій, варто спрямувати на те, щоб попрацювати над своєю поведінкою та світоглядом.
Але які конкретно вимоги стоять за узагальненим формулюванням «soft skills»?
Dell: «Excellent written and verbal communications skills — communicate to engineers, managers, and senior leadership».
Ciklum: «Ability to relate positively to and engage with a wide range of people».
DevBranch (Луцьк): «You are a strong team player with very good communication skills».
Фреймворки: є явні лідери
Symfonyта Laravelє абсолютними лідерами серед фреймворків. Для Symfony в Україні часто конкретизують версію, і видно, що найпопулярнішою є Symfony 3.
Розповсюджені в Каліфорнії CodeIgniterта CakePHP — це фреймворки епохи фараонів Єгипту. В Україні лише в 1 вакансії як as a plus було згадано Kohana, що є відгалуженням CodeIgniter. Те, що ми не отримуємо такі проекти на аутсорсинг, може свідчити про відсутність актуальних проектів на цих технологіях. Можливо, їх вказують у вакансіях, щоб дати шанс розробникам, що загубилися в часі.
В той же час Drupalта Wordpressбезсумнівно є досить популярними, але тим не менше майже відсутні у вимогах. Просто вони є нескладними CMS, для роботи з якими ніхто не захоче платити людині за рейтом сеньора.
А от майже відсутність російського Yii, який є повноцінним фреймворком, свідчить про його непотрібність в Україні. Yii є дуже популярним в Росії, але, як ми бачимо, не в нас.
Що буде плюсом?
Плюсом для кандидата найчастіше є знання Docker, NoSQL та AWS, а також Python та Node.js.
Amazon Web Servicesскладно назвати бездоганним рішенням. Наприклад, AWS може віддавати помилку без жодного інформативного коду, назви чи опису. Але існуючи з 2006 року, має історично-обумовлені сильні позиції.
Концепція NoSQLлежить в основі таких технологій, як MongoDB, Redis та Memcached. Розуміння принципу NoSQL відкриває можливість опанування будь-якої з NoSQL-технологій. Їх тільки як вагомі Вікіпедіяназиває 45. Серед них є як технології персистентності, так і засоби кешування в оперативній пам’яті.
Існує термін LAMP Developer. У цій абревіатурі перші три літери мають сталу розшифровку: Linux, Apache, MySQL. Але остання символізує відразу 3 мови програмування: PHP, Python та Perl. Вони розглядаються як ідеологічно близькі та взаємозамінні, і в Америці є нормальною практикою залежно від задачі переключатись з PHP на Python, залишаючись при цьому LAMP-розробником. Саме з цим пов’язана висока частка побажань знати Python, хоча вимагати цього ніхто не стане.
Особливості України
Українські роботодавці масово вказують у вимогах PHP 7. Не секрет, що на старих проектах може не бути ООП, і вказівка на версію сигналізує, що тим, хто сидить на таких проектах, слід попрацювати над своїми знаннями.
Хоча російський сервер Nginxв Україні вказують частіше, перевага більш старої технології Apacheв Каліфорнії вказує на те, що є сенс її вчити.
Continuous Integrationта Unit Testsна масштабному проекті критичні. Але у нас ці знання нерідко бувають terra incognita навіть для досвідченого PHP-розробника. Раніше на DOU виходила статтяпро досвід впровадження Continuous Integration в PHP-проекті та статтяпро PHPUnit.
SOLIDвимагають 14% вакансій в Україні, але жодна в Каліфорнії. Про українську любов до SOLID цікаво писав у своїй статтіОлександр Скакунов, що повернувся з Данії: «Каждую букву из слова „SOLID“ мы использовали на практике, но расшифровывать аббревиатуры и именовать виды полиморфизма — seriously?»
В Україні люблять вказувати багато конкретики у вимогах, тоді як на Заході домінує думка, що є багато таких речей, які за потреби здібній людині буде нескладно вивчити. Ніхто не скаже «Не Redis-эксперт да не войдёт!».
Низка вакансій передбачають відрядження: до Берліна, Мюнхена та Чикаго.
Дуже відверто розповідаєпро свій проект компанія 12go.asia: «У нас сложный код, который писали разные разработчики, тестами не покрыт, не используются ООП, фреймворки».
Самокритика очень важна на позиции сеньора. Он должен критически относиться к своим реализациям и по возможности их улучшать до такого уровня, когда код становится легко поддерживаем и читаем другими людьми. Он должен участвовать в наставлении младших разработчиков. Важно уметь делать сложный рефакторинг, вам порой будет встречаться код, который будет настолько ужасен, что захочется его переписать, а времени никто не даст, только рефакторить по чуть-чуть, чтобы облегчить следующие изменения.
По стеку, по моему мнению, нужен опыт работы с одним из распространенных фреймворков и глубокое понимание его структуры и работы, умение воспроизвести его компоненты, опыт работы с MV* паттернами. Также досконально знать одну из популярных реляционных БД (MySQL, PostgreSQL) и опыт тюнинга запросов, опыт работы и знания noSQL-решений (какие типы бывают и для чего используются). Конечно, нужно хорошо знать и применять на практике разные парадигмы программирования там, где это уместно.
Знать JavaScript помимо PHP. Чистый JS сейчас уже практически не встречается, обычно в навесок идет фреймворк, поэтому знать, как современные JS-фреймворки работают, нужно. Контейнеризация давно уже не в новинку и используется в проектах командами, поэтому пользоваться Docker надо уметь. Умение работать в UNIX-системах и знание bash — это то, без чего не обойтись. Уметь правильно определять границы сервисов.
Разные принципы разработки ПО и паттерны нужно знать и следовать им на практике, если это оправдано. У сеньора не должно возникать трудностей с инженерными практиками, принципами и подходами, он их применял и сможет объяснить, зачем они, и имеет свое видение, где их использовать и почему.
Нужно уметь писать тесты, используя PHPUnit. Знать про существование разных типов тестов, selenium. Нужно уметь пользоваться разного рода вспомогательными тулами: XDebug, Blackfire (или XHProf). Уметь правильно писать и читать логи. Знать о существовании стандартов PHP, внедрять в проектах. Не везде, но нужно умение писать технический дизайн. Нужно уметь доносить свое видение. Умение разбить задачи и уточнить требования так, чтобы попадать в эстимейт. Уметь интегрировать решение с различными системами.
Самокритика очень важна на позиции сеньора. Он должен критически относиться к своим реализациям и по возможности их улучшать до такого уровня, когда код становится легко поддерживаем и читаем другими людьми. Он должен участвовать в наставлении младших разработчиков. Важно уметь делать сложный рефакторинг, вам порой будет встречаться код, который будет настолько ужасен, что захочется его переписать, а времени никто не даст, только рефакторить по чуть-чуть, чтобы облегчить следующие изменения.
По стеку, по моему мнению, нужен опыт работы с одним из распространенных фреймворков и глубокое понимание его структуры и работы, умение воспроизвести его компоненты, опыт работы с MV* паттернами. Также досконально знать одну из популярных реляционных БД (MySQL, PostgreSQL) и опыт тюнинга запросов, опыт работы и знания noSQL-решений (какие типы бывают и для чего используются). Конечно, нужно хорошо знать и применять на практике разные парадигмы программирования там, где это уместно.
Знать JavaScript помимо PHP. Чистый JS сейчас уже практически не встречается, обычно в навесок идет фреймворк, поэтому знать, как современные JS-фреймворки работают, нужно. Контейнеризация давно уже не в новинку и используется в проектах командами, поэтому пользоваться Docker надо уметь. Умение работать в UNIX-системах и знание bash — это то, без чего не обойтись. Уметь правильно определять границы сервисов.
Разные принципы разработки ПО и паттерны нужно знать и следовать им на практике, если это оправдано. У сеньора не должно возникать трудностей с инженерными практиками, принципами и подходами, он их применял и сможет объяснить, зачем они, и имеет свое видение, где их использовать и почему.
Нужно уметь писать тесты, используя PHPUnit. Знать про существование разных типов тестов, selenium. Нужно уметь пользоваться разного рода вспомогательными тулами: XDebug, Blackfire (или XHProf). Уметь правильно писать и читать логи. Знать о существовании стандартов PHP, внедрять в проектах. Не везде, но нужно умение писать технический дизайн. Нужно уметь доносить свое видение. Умение разбить задачи и уточнить требования так, чтобы попадать в эстимейт. Уметь интегрировать решение с различными системами.
PHP-сеньор должен понимать конечную цель использования того или иного пакета, фреймворка или части фреймворка, чтобы выбрать оптимальное решение. Для этого очень важно уметь задавать вопрос «зачем?». И в первую очередь задавать его самому себе: «Почему я выбираю именно это решение поставленной задачи?», «Является ли это решение самым оптимальным?», «А правильно ли само требование, которое я пытаюсь решить?».
Я бы не советовал зацикливаться на одном фреймворке, в том числе и на популярных, как, например, Symfony или Zend. Любой фреймворк — это ограничение. Разработчик, работающий только в одном фреймворке, даже имея огромный опыт, рано или поздно столкнется с задачей, которая не решается возможностями этого фреймворка. Кроме того, всегда есть риск, что разработчики фреймворка или компонента перестанут его развивать, как это случилось с Propel.
Поэтому нужно понимать, как работает компонент и уметь создавать свой. Способность находить золотую середину из всего предлагаемого готового функционала и не бояться создавать решение самостоятельно — это то, что отличает сеньора от менее опытных разработчиков.
PHP-сеньор должен понимать конечную цель использования того или иного пакета, фреймворка или части фреймворка, чтобы выбрать оптимальное решение. Для этого очень важно уметь задавать вопрос «зачем?». И в первую очередь задавать его самому себе: «Почему я выбираю именно это решение поставленной задачи?», «Является ли это решение самым оптимальным?», «А правильно ли само требование, которое я пытаюсь решить?».
Я бы не советовал зацикливаться на одном фреймворке, в том числе и на популярных, как, например, Symfony или Zend. Любой фреймворк — это ограничение. Разработчик, работающий только в одном фреймворке, даже имея огромный опыт, рано или поздно столкнется с задачей, которая не решается возможностями этого фреймворка. Кроме того, всегда есть риск, что разработчики фреймворка или компонента перестанут его развивать, как это случилось с Propel.
Поэтому нужно понимать, как работает компонент и уметь создавать свой. Способность находить золотую середину из всего предлагаемого готового функционала и не бояться создавать решение самостоятельно — это то, что отличает сеньора от менее опытных разработчиков.
Любой сеньор, не только РНР, во-первых, вдоль и поперек понимает инструментарий, которым пользуется. Например, он может не только рассказать, как правильно используется тот или иной подход или фреймворк, но и случае неправильного его использования, как без него можно обойтись и чем это обернется. Это то, что отличает умного от мудрого — умный знает как делать, мудрый знает, как не делать. Это приходит с опытом — без этого мы получаем «23-летнихсеньоров», которых можно отнести к категории «умных, но еще не мудрых».
Во-вторых, сеньор умеет это знание прокоммуницировать. Например, даже зная более подходящее решение, он не станет с выпученными глазами доказывать свою правоту, а если его не понимают, обзывать оппонентов «больными ублюдками». Сеньор все это уже проходил, поэтому просто задает точный вопрос — как система поведет себя в проблемных ситуациях А и Б. Дискуссия переходит в конструктивную плоскость. Этим он дает возможность оппоненту самому прийти к правильномурешению. Действовать так — и есть признак зрелости разработчика.
Любой сеньор, не только РНР, во-первых, вдоль и поперек понимает инструментарий, которым пользуется. Например, он может не только рассказать, как правильно используется тот или иной подход или фреймворк, но и случае неправильного его использования, как без него можно обойтись и чем это обернется. Это то, что отличает умного от мудрого — умный знает как делать, мудрый знает, как не делать. Это приходит с опытом — без этого мы получаем «23-летнихсеньоров», которых можно отнести к категории «умных, но еще не мудрых».
Во-вторых, сеньор умеет это знание прокоммуницировать. Например, даже зная более подходящее решение, он не станет с выпученными глазами доказывать свою правоту, а если его не понимают, обзывать оппонентов «больными ублюдками». Сеньор все это уже проходил, поэтому просто задает точный вопрос — как система поведет себя в проблемных ситуациях А и Б. Дискуссия переходит в конструктивную плоскость. Этим он дает возможность оппоненту самому прийти к правильномурешению. Действовать так — и есть признак зрелости разработчика.