В рубрике «Советы сеньоров»опытные специалисты делятся практическими советами с джуниорами — общие лайфхаки по обучению, какие книги и ресурсы читать, какие навыки осваивать и многое другое. В этом выпуске говорим о PHP разработчиках.
Александр Скакунов, PHP Architect, 14 лет опыта PHP разработки:
Главная проблема, с которой сталкиваешься, когда начинаешь изучать PHP — психологическое давление. Дело в непопулярности этого языка в среде программистов, по крайней мере, на словах. Можно услышать много неприятных эпитетов, в основном сводящихся к фразе: «Недоязык формошлёпов для создания говносайтиков». Твоя задача — не забывать, что «собаки лают, а караван идёт». Например, на РНР написан такой проект, как «Фейсбук», и этот факт сразу ставит на место любителей выбирать язык программирования по его модности.
Пс, сядь-ка поближе, что скажу. Чисто между нами: РНР — действительно не самый лучший язык в мире. Основных причин я назову две — и тебе лучше о них знать.
Первая проблема РНР — это неконсистентность, то есть похожие вещи сделаны по-разному. Например, одни имена функций названы с подчёркиванием (str_replace), другие — без (strrev), а оператор «::» вообще называется «Paamayim Nekudotayim» (это иврит, детка). Это связано с тем, что язык развивался в разное время разными людьми, поэтому получился такой конгломерат разных подходов.
Вторая проблема РНР — это работа с памятью и скорость. Например, заявленным удобством РНР является динамическая типизация (когда выражение «1» может быть по ситуации использовано как строка или как число). И это же заставляет РНР проигрывать по скорости более строгим, статически типизированным языкам.
Но есть одно но. Каждый инструмент хорош для своего круга задач. РНР — не исключение. Этот язык хорош для создания быстрых прототипов веб-приложений, а это и нужно бизнесу — быстро проверить бизнес-гипотезы. Именно поэтому статистика DOU по реальной популярности языков программирования за 2017 годпоказывает, что РНР находится на 4 месте и обгоняет Python и Ruby (т. н. «модные языки», хе-хе). Пример — тот же WordPress: хотя программисты могли бы написать код и получше, всё же на этом движке работает четверть всех сайтов в мире (если точнее, то 26% в 2016 году).
На интервью тебя могут спросить что-то низкоуровневое, типа «как обернуть строку». Но одно дело собеседование, а другое — реальная работа. На чистом низкоуровневом РНР давно никто не пишет (хотя в самом начале обучения это лучше всё-таки сделать, чтобы понять матчасть). Постепенно переходи на готовые решения, например, фреймворки (лично я рекомендую Symfony): так тебе будет легче отделить дизайн от бизнес-логики (мухи отдельно, котлеты отдельно), плюс использовать готовые решения, написанные другими умными людьми, чтобы ты этим пользовался. Так ты сможешь сосредоточиться на действительно важных вещах (бизнес-задачах), а не на том, какой формат данных принимает тот или иной API.
Кстати, про API скажу отдельно — изучи, как удобно и быстро их создавать, документировать и покрывать тестами. И тогда ты, один РНР-программист, сможешь делать бэкенд для целого отдела mobile-разработчиков: вендоров телефонов много, а backend у всех один. А не задокументируешь свой API (я имею в виду публичную документацию, особенно где можно сразу поиграться с API) — увязнешь в параметрах. Не покроешь тестами — построишь дуршлаг.
И потом, когда уже матчасть будет освоена, переходи на более высокий уровень абстрагирования — изучи основные паттерны проектирования, прочитай «Чистый код», и, если хочешь стать совсем джедаем, то и «Domain Driven Design». Так постепенно ты станешь «language agnostic developer», т. е. программистом, которому не важно, на синтаксисе какого языка писать. Важно научиться «дистиллировать знания» из нечётких требований заказчика в готовый алгоритм. «Тогда, мой сын, ты будешь Человек».
Aндрей Федык, Senior Software Engineer в Intetics, 14 лет опыта PHP разработки:
Не буду говорить, что мои советы подойдут всем. Я думаю, они будут полезнее всего самоучкам (я из их числа, по сути).
Команда
Команда — это ваше все. Догонять проще, чем бежать впереди всех. Если вам тяжело идти вперед, и вы знаете о своих проблемах с мотивацией, ищите сильную команду, все просто! Сами не заметите, как пойдете вперед семимильными шагами. Причем начинать советую с больших компаний — там обучение эффективнее. Но, если вы пока что не соответствуете запросам большой компании, начать можно с маленькой, но не засиживайтесь там. А еще — делитесь знаниями со своей командой, она, в свою очередь, будет делиться с вами. Получается взаимовыгода. Ну и не забываем про оптимизацию рабочего места — не тратьте свою энергию (мыслетопливо) на рутинные задачи, постарайтесь их автоматизировать (самое простое — настройте в хроме search engines, либо с %S, либо без). Чем меньше рутинных задач, тем больше мозг работает над основными задачами.
Теория
Самоучкам очень рекомендую фундаментальные книги. Если читать лень — делайте аудиокниги (можно txt перевести в голос) или смотрите видеолекции. Вот подборка, которую я советую:
Причем тут важно не просто открыть, прочесть и забыть. Делайте пометки, своего рода конспекты. Если что-то непонятно или сложно, вникните, а потом перефразируйте. Найдите лучший для себя вариант обучения. Еще я очень рекомендую слушать подкасты. Ниже подборка, с которой советую начать:
Опыт
Теперь о самом важном — об опыте и специализации. Честно — к годам опыта отношусь нейтрально. Можно за год с сильной командой и сложным проектом серьезно вырасти. А можно и десять лет сайты-визитки на PHP писать, что особого опыта не даст. К нам в компанию проходили люди с меньшим количеством лет в резюме, но за спиной у них было больше реального опыта.
Также не представляю PHP без JS — это вам такая пометка, что не стоит зацикливаться только на PHP. Расширяйте кругозор, смотрите по сторонам, выходите за пределы «зоны комфорта» в плане задач. Не делайте только то, что вам говорят — учите что-то новое, что вам интересно, обращайте внимание на другие задачи, которые могут вам дать в будущем. Не позволяйте мозгам простаивать, изучайте новое (даже если какие-то знания не лежат в вашей предметной области). Надо держать руку на пульсе — читать статьи, слушать подкасты (я лучше воспринимаю на слух, но опять же ищите свой вариант).
И еще раз — не ленитесь! Отговорки придумать можно всегда, но также можно всегда найти способ заняться образованием. Я, например, учусь в основном в маршрутке по дороге из дома на работу и наоборот. Лень идти к цели — лежите в направлении цели!
Александр Махомет, Product Architect в Upwork, 14 лет опыта PHP разработки:
Хорошим вариантом будет устроиться на работу в команду опытных PHP разработчиков, со сложными современными проектами да с возможностью находиться под менторством одного из коллег. В таких полевых, реальных условиях вы максимально быстро получите знания и опыт. К сожалению, это бывает нелегко. Конкуренция для уровня Junior достаточно высока. Да и отличить хорошую компанию от «не очень» бывает не просто.
Альтернативным вариантом является личное развитие, собственно, оно в любом случае должно быть. Рассмотрим несколько вариантов.
Во-первых, программирование на PHP — это в первую очередь программирование, поэтому имеет смысл ознакомиться с общими парадигмами и подходами. Из классики это труды Martin Fowler, GOF, Robert Martin, Steve McConnel. Читать этих ребят — это не «Игры престолов» смотреть (не так увлекательно), но постепенно с фундаментальными вещами знакомиться стоит. На GitHub (если вы не в курсе, что такое Git, тоже в список to do на изучение) есть большой список бесплатных книг, по программированию и по PHPв частности.
PHP существенно изменился за десятилетия, а в интернетах много устаревших туториалов. К счастью, не утонуть в этом огромном количестве информации для новичков поможет ресурс phptherightway. В нем собраны актуальные бест практики для PHP разработчиков, причем там затрагивается не только PHP, но и смежные тематики, например, вопросы развертывания (deployment). Есть даже частично переведенная украинская версияэтого ресурса, но я настоятельно рекомендую работать с первоисточниками, иначе у вас будет неполная и неточная информация. Знание английского языка хотя бы на уровне чтения — must have. Изучение или прокачивание английского языка будет хорошей инвестицией в карьеру разработчика.
Дальше можно сходить на offline-курсы, это обычно платно. Их в Украине есть минимум несколько. К сожалению, у меня нет информации, какие из них качественные, поэтому конкретные названия приводить не буду, изучайте рейтинги на DOU и в интернете. Если повезет с преподавателем, это будет эффективнее, чем самостоятельное обучение.
Еще бывают online-курсы, и тут одну хорошую ссылку я все же оставлю. Это курсы от hexlet (обучение частично платное, частично бесплатное).
Будьте в тренде. Следите за изменениями, новыми статьями и инструментами в мире PHP. Вам помогут два дайджеста: DOU PHP Digestи Habrahabr PHP Digest. Материалы этих дайджестов покрывают большую часть того, что происходит в PHP мире.
Читайте блоги и твиттеры передовых PHP разработчиков. В PHP сейчас эра фреймворков, стоит знать, кто такие и что такое Fabien Potencier (Symfony Framework), Taylor Otwell (Laravel Framework), Matthew Weier O’phinney (Zend Framework). Разберите по полочком код какого-то фреймворка, например, Symfony, попытайтесь написать свой.
Поучаствуйте в open source проекте, начните свой или присоединитесь к существующему. Это даст интересный опыт работы над open source проектом, знакомства с ключевыми разработчиками этих проектов, возможность перенять их опыт. Бонусом придет признание в сообществе и позитивная оценка работодателями.
Ходите на PHP митапы. В Украине и в частности Киеве проводятся как большие и платные конференции, например, PHP Fwdays, так и бесплатные встречи, например, PHP Friends Club, Symfony Cafeи другие. На таких встречах можно послушать доклады, но самое главное — пообщаться с более опытными коллегами, задать вопросы спикерам, к которым в обычном режиме достучаться сложно.
Успехов! :)
Сергій Камолов, Senior Software Developer в PROBEGIN, 10 років досвіду PHP розробки:
Перефразовуючи Марка Твена, можна назвати два найважливіші моменти у житті PHP розробника: рішення почати працювати з PHP та рішення перейти на Ruby. Це, звісно, жарт, але ще кілька років тому кар’єра PHP розробника виглядала саме так. Хіба що замість Ruby могла бути будь-яка інша мова програмування.
Із самого початку PHP вважалася мовою з найнижчим порогом входження, що, з одного боку, зумовило її стрімку популярність, а, з іншого, породило дещо зневажливе ставлення з боку представників інших мовних «філософій», адже розпочати кар’єру з PHP було набагато простіше, аніж, скажімо, з Java або .NET. Ще кілька років тому мінімальний перелік вимог на посаду Junior PHP Developer, окрім знання самої мови, обмежувався базовими знаннями HTML та MySQL, а знання JavaScript додавало неабияких переваг серед інших кандидатів.
Зараз ситуація інша, адже змінилися і сама мова PHP, і рівень задач, що вона вирішує. Навіть сам Расмус Лердорф, винахідник PHP, часом дивується, якого розвитку набуло його творіння. Якщо проаналізувати сучасний рівень вимог до кандидатів-початківців, то тут вже і знання з ООП та патерного програмування, досвід роботи з різними фронтенд-фреймворками, компіляторами та препроцесорами, SQL та NoSQL базами даних. А базові навички адміністрування Linux-систем тепер просто must have, як і розуміння ряду принципів, що формуються у зарозумілі слова із великих латинських літер (SOLID, KISS, DRY). І це ми навіть не дійшли до вимог щодо володіння самою мовою PHP, рівень знання якої має відповідати кільком рокам практичного досвіду. Звідси і виникає головне питання: як розпочати свою кар’єру в якості PHP розробника і як залишитися затребуваним фахівцем у галузі, де рівень вимог і технологій змінюється так стрімко і непередбачувано, як курс долара в нашій державі.
Перше, і, мабуть, найголовніше — це знання основ. І не стільки знання основ самої мови PHP та супутнього стеку, як розуміння принципів написання якісного коду як такого. Адже більшість проектів вимагають саме командної роботи, і володіння загально прийнятими практиками дозволяє створювати якісний продукт. Розвинути такі навички допоможуть:
- «Code Complete: A Practical Handbook of Software Construction»від Steve McConnell;
- «Refactoring: Improving the Design of Existing Code»від Martin Fowler;
- «Clean code»від Robert C. Martin (або його адаптований для PHP варіант);
- і також ресурс із категорії обов’язкового ознайомлення: PHP Standards Recommendations.
Друге — це практичний досвід. Але тут важливо розуміти, що досвід може бути як корисний, так і не дуже, особливо з огляду перспектив у майбутньому. Як от, наприклад, тривалий досвід роботи лише з певною CMS чи застарілим фреймворком. Якщо врахувати, що за темпами появи нових трендів PHP відстає лише від JavaScript, можна зробити висновок, що за деякий час такий досвід може виявитися абсолютно не потрібним. Тому дуже важливо слідкувати за трендами та тенденціями у галузі веб-розробки. Створення додаткових проектів чи навіть просте проходження «туторіалів» дозволить залишатися затребуваним, навіть якщо основний проект все ще працює на PHP 5.3. На щастя, кожен популярний фреймворк має гарну документацію та добре організовані спільноти для обговорення нагальних проблем.
Третє — де шукати інформацію про тренди? Можна, звісно, скористатися сервісом GoogleTrends, але тут великий ризик дізнатися, що розробка на Python має набагато кращі перспективи. Можна переглядати різні рейтинги фреймворків на технічних сайтах чи блогах, але об’єктивну оцінку знайти там важко, бо кожен, як то кажуть, хвалить своє болото. То де ж шукати об’єктивність? На допомогу приходить DOU із розділом «Робота» (головне не переплутати із розділом «Зарплати»), адже, переглядаючи відкриті вакансії, можна дізнатися, що попит на знання Symfony 2 набагато перевищує попит на, здавалося б, сучасніший Symfony 3, а Full Stack Web Developer — це не міф, а реальна вакансія.
Четверте — вчитися на успішних прикладах. Здібності до програмування — це, звичайно, добре, але вони майже нічого не варті без вміння шукати якісну інформацію та здатності переймати чужий досвід. На жаль, деякі початківці починають створювати свої власні фреймворки та СMS, намагаючись самостійно розробити продукт, кращий за результат роботи цілої спільноти висококваліфікованих фахівців. Тим часом перспективність будь-якого розробника-початківця залежить від його відкритості до запитань та здібностей аналізувати чужий код.
Найкраще, звісно, шукати відповідей у більш досвідчених колег — вони і вкажуть правильний напрямок, і «носом ткнуть» у провалені тести, а ще ніщо так не збиває пиху, як код-рев’ю проведене тімлідом. Якщо ж такої можливості немає — тут вже тільки Google, тільки хардкор, тобто Хабрахабр. Хоча краще одразу налаштовуватися на пошук інформації в англомовному сегменті інтернету — більше шансів отримати якісну відповідь. Хоча бувають і винятки: так, наприклад, найбільшими дописувачами на відомому StackOverflow є саме початківці, а, отже, і якість інформації там відповідна. Дуже корисно переглядати проекти на GitHub з великою кількістю контриб’юторів, особливо коли потрібно вирішувати архітектурні питання. Головне розуміти, що використання чужих напрацювань — значно краще, ніж створення велосипеда самотужки. Ось, наприклад, підбірка кращих рішень на будь-які випадки життя: Awesome PHP.
Наостанок, якщо ви вже розробник-практик, можете похвалитися кількома завершеними проектами і навіть почали розглядати вакансії на посаду Middle або й Senior, то прийшов час відповісти самому собі на просте запитання: Why You’re a Bad PHP Programmer.
Ігор Петрович, Deputy Production Director в CoreValue, 10 років досвіду PHP розробки:
PHP — це мова, яка добре підходить для старту кар’єри в ІТ незалежно від того, як ви потім захочете розвиватись. Кожна мова має певні сильні та слабкі сторони. Існує багато дискусій про слабкі сторони PHP, такі як витоки пам’яті, масштабованість та швидкість, проте є більша неочевидна проблема, яку я виявив з власного досвіду. Через низький поріг входу та специфіку PHP багато розробників починають свій професійний шлях саме з цієї мови, але з часом вони не розвиваються і не вчаться писати правильний код.
Загальні рекомендації
Моя порада для новачків-розробників: важливіше навчитися правильно програмувати, ніж вивчити синтаксис. Ви повинні зосередитися на загальній практиці програмування, а не тільки на самій PHP.
Ось декілька важливих елементів в нашій галузі, які ви можете недооцінювати на старті кар’єри, але вам необхідно працювати над ними:
1. Структури даних. Я бачив надто часто, що люди не знають доступних структур даних і коли їх використовувати. Це призводить до низької продуктивності та поганого коду. Так само як шаблони проектування, структури даних — це елементи, які допоможуть вам вирішити конкретні проблеми.
2. Алгоритми. Потрібно спрощувати обчислювальну складністьалгоритмів для підвищення продуктивності. Часто розробники використовують алгоритми, надані сторонніми бібліотеками, не розуміючи, як вони працюють. Навчаючись в університеті, я витратив якийсь час на алгоритмічне програмування. Брав участь у конкурсах ACM ICPC, завдяки чому досяг кращого розуміння алгоритмів і їх обчислювальної складності. Не потрібно перемагати у цих конкурсах, потрібно просто брати участі. Навіть якщо ви навчитеся вирішувати лише частину завдань, будете краще розуміти тему.
3. SQL. На великих проектах зазвичай є спеціаліст, який обробляє запити баз даних, особливо складні. Але якийсь час вам потрібно буде це робити самостійно. Згодом вам доведеться розібратись і зрозуміти роботу ORМ. Наприклад, як там формуються SQL запити. Іноді краще писати ці запити самостійно, ніж покладатися на ORM.
4. Шаблони. Зосередьтеся на тому, коли ТРЕБА їх використовувати, а коли НЕ треба. Повторно перечитуйте шаблони кожного разу, коли думаєте, що досягнули нового рівня, адже кожного разу ви будете розуміти і сприймати їх по іншому. Ваша ціль — досягти рівня, коли ви зможете автоматично розпізнати чи потрібно використовувати певні шаблони.
5. «Як працює веб» на рівні, який комфортний для вас. Ви повинні почати з основ і поступово заглиблюватися в кожну тему. Деякі важливі з них:
a. Як запити надходять із вашого браузера на сервер і як дані повертаються.
b. Cookies / Sessions
c. SSL / HTTPS
6. Принципи, яких рекомендовано дотримуватися:
7. Англійська. Вам потрібен хороший рівень англійської, щоб правильно розуміти завдання та щоб комунікувати з клієнтами.
Конкретна PHP порада
При розробці на PHP надзвичайно рідко ви будете використовувати чисту PHP. Як правило, ви будете розробляти, застосовуючи один з таких підходів:
- Фреймворки (такі як Symfony, Lavarel, ZF, Yii).
- CMS (наприклад, WordPress, Drupal, Typo3).
- Платформи (наприклад, Magento).
Для розвитку в PHP можна опановувати будь-який з вищезазначених варіантів. Тим не менш існує певна крива навчання для кожного з цих підходів, тобто ефективність в одному стеку технологій не означає ефективність в іншому. Але не поспішайте вивчати їх всіх одразу, вибирайте один за покликом серця. Зазвичай розробники спеціалізуються не у всіх.
Щодо літератури, існує багато книжок із загального програмування, алгоритмів, патернів тощо. Багато було рекомендовано в попередніх серіях статей DOUдля інших технологій. Я можу порадити такі сайти для початку:
1. php.net/manual/en
2. www.phptherightway.com
P. S.: Наприклад, мені достатньо було лише документації від офіційного php.net, щоб отримати PHP сертифікацію.
Подписывайтесь на наш Telegram-канал для джуниоров, чтобы не пропустить интересные вакансии, стажировки, курсы, статьи.