Становимся профессиональными PHP разработчиками. Часть 1: Недостающее звено

Предлагаю вашему вниманию перевод статьи «Becoming PHP professional. Missing link».

Введение


Когда я читаю различные блоги, связанные с PHP, вопросы на Quora (англоязычный сервис вопрос-ответ, прим. переводчика), сообщества в Google+, газеты и журналы, я часто замечаю крайнюю поляризацию навыков программирования. Вопросы бывают или уровня «А как же мне подключиться к базе данных MySQL», или что-то из области «Как мне лучше распределить ресурсы моей почтовой системы для того, чтобы отправлять более одного миллиона писем в час без использования нового сервера?»

Лично я выделяю 4 четких уровня «славы» в PHP (применимо так же и для любого другого языка или профессии): новичок, среднячок, профессионал и элита.

Коротко обо всех уровнях


В PHP новички узнают о переменных, инклудах, о работе с html-формами. Они изучают простые логические конструкции; отправляют электронную почту, пользуясь при этом уроками-туториалами, а иногда даже затрагивают примеры, где используется объектно-ориентированное программирование, но даже понятия не имеют, что это вообще такое. Новички работают с WordPress (WP) и меняют несколько классов CSS. С этими знаниями они берутся за работу, но, к сожалению, не справляются с ней.

Профессионалы – люди, которые уделили немалую часть своей жизни различным проектам. Они разрабатывали коммерческие приложения на большинстве, если не на всех, фрэймворках (“каркас” вашего приложения или проекта), они эффективно сочетали РНР и различные базы данных, они посещали конференции и даже выступали на них. Они знают шаблоны проектирования и могут с легкостью спроектировать целый проект в одиночку – от построения диаграм до запуска проекта, и уже давно не пишут процедурный код.

Элитные программисты – те же профессионалы, которые потратили более 10000 часов на повышение своего уровня. Они используют в своих разработках расширения, написанные ими же, могут найти баг, просто просмотрев ваш код беглым взглядом, а также они крайне щепетильны к внешнему виду своего кода. Элита берется только за самые сложные проекты и находит альтернативные пути решения проблем, о которых люди даже и не догадываются. Они написали пару хорошо продаваемых книг о PHP, выступали на десятках конференций, возможно даже создали свое направление в PHP или даже очень успешный фрэймворк, а то и два.

Но кто же такие «среднячки»?

Недостающее звено


Так как же новичок может стать профессионалом? Если человек не знает ничего, кроме азов, то как же он может повышать свой уровень и начать практиковаться в более сложных задачах? Это тот вопрос, который мне задавали очень много новичков. Первый шаг для того, чтобы стать профессионалом – стать чем то средним, т.н. «среднячком».

Далее мы рассмотрим то, что должен сделать каждый на пути своего плавного перехода от новичка до среднего звена.

Забудьте «спагетти-код»


Большинство думает, что использование классов означает, что вы пишите объектно-ориентированный код, тогда как использование функций означает, что код – процедурный. Давайте соедим воедино распространенные мнения: процедурный код это тот, в котором вы не используете ни классы, ни объекты, а объектно-ориентированный код – с использование классов и объектов по максимуму.

Мой совет – полностью забыть о процедурном коде. Используйте ООП как можно чаще – пишите классы, применяйте инкапсуляцию, думайте реальными сущностями. Выигрыш процедурного кода в производительности над кодом, основаном на классах, выглядит ничтожно в сравнении с последующим использованием вашего проекта другими разработчиками. Часто встречаю фразу «Но ведь WordPress процедурный!». Честно говоря, и как бы это резко не звучало, но «разработчики» WP такие же PHP разработчики, как и люди с Instargam – фотографы. Но не стоит воспринимать это как то, что WP бесполезен – он идеален для блогов, простых вэб-сайтов и проектов-однодневок, на которые вы не хотите тратить много времени. Он идеально подходит для быстрого заработка или для людей, кто не настолько техничен, но использование WP никогда не сделает вас профессионалом в PHP – ведь WP это, по сути, длинный «спагетти код», который вряд ли научит вас правильным принципам проектирования.

Начните с малого. Обдумайте концепцию реального мира и попытайтесь возпроизвести ее испольюзуя ООП. Изучайте различные базовые туториалы и постепенно становитесь более опытными и продвинутыми. Работайте с ООП до тех пор, пока вы не разберетесь с классами в целом, перед тем как переходить к работе с фрэймворками и в недоумении смотреть на такие понятия, как «Model», «View» и «Controler» — это все слишком туманно без понимания ООП.

Анализируйте существующие проекты


Разбирайте уже существующий исходный код отовсюду, где его можно найти. Например, находите проекты на Github’e, установите их себе на компьютер и экспериментируйте с кодом. От файла к файлу, от строки к строке, и до тех пор, пока не поймете, что делает каждая строка в каждом файле.

Ищите такие проекты, которые хорошо раскомментированы и/или документированы, с хорошей структурой и до сих пор актуальны. Проекты, которые в последний раз обновлялись в 2008 году, вряд ли помогут вам разобраться с PHP версии 5.5 – вы можете упустить из виду новейшие и великолепнейшие функции, которые помогут вам выделяться среди других в этой области.

Научитесь настраивать свою среду разработки


Уметь устанавливать свою среду разработки – бесценный навык. Это не только позволяет вам хорошо настроить вашу среду, но также знакомит вас с процессом разработки расширений из исходного кода.

Забудьте про ОС Windows для разработки. Если у вас установлена операционная система Windows — установите виртуальную машину с ОС Linux на ней. Причина такого решения это окончание строк, а также другие странные противоречия на большинстве серверов с Windows, так что лучше всего разрабатывать на той ОС, которая больше всего похожа на ту, на которой вы будете запускать свой проект.

Виртуальные машины также помогают вам экспериментировать – если что-то пошло не так, вы можете перезапустить ее с нуля или просто сделать откат системы. В буквальном смысле, вы можете экспериментировать столько, сколько захотите, без страха того, что что-нибудь испортите. Средства разработки важны, равно как и рабочее место.

Различные эксперементы с вашими настройками могут познакомить вас с различными серверами – используете ли вы Apache или Nginx, или же ни тот, ни другой, и предпочитаете AppServer.

Приучайтесь к хорошему тону


Когда вы пишете свой код, убедитесь, что вы хорошо закомментировали его при помощи блоков документации, и ваш код хорошо структурирован и хорошо выглядит. После того, как вы создали класс, проект или библиотеку, воспользуйтесь хорошо известными инструментами документации (PHPDocumentor, ApiGen) для выделение блоков документации и их улучшения.

Хорошая среда разработки стоит занимаемому ей пространству в золоте – использование одного кросс-платформенного редактора поможет вам быстро разобраться с новой средой разработки, и вы сможете сразу погрузиться в код, не тратя время на настройку горячих клавиш и тем оформления. Убедитесь, что у вас есть резервная копия конфигурационных файлов вашей среды разработки на облачном хранилище, например, Google Drive, Dropbox, для того, чтобы вы могли использовать его в любой момент времени. Одна из хороших сред разработки – это PHPStorm, или же если вы не можете себе это позволить или у вас нет открытых проектов, для которого вы можете попросить бесплатную лицензию, Netbeans – бесплатная альтернатива. Обе среды являются кросс-платформенными.

Чем раньше вы приучитесь к хорошему тону, тем раньше ваш код смогут читать «не напрягаясь» другие разработчики. Найдите свой стиль и придерживайтесь его – это поможет и вам, и другим. Старайтесь придерживаться стандартов PSR (PSR-0, PSR-1, PSR-2, PSR-3) настолько, насколько можно – на то они и стандарты. Большинство из нас использует их и любит, а они, в свою очередь, делают код читаемым и позволяют использовать для своих нужд.

Так же, для новчика хорошо подойдет такой ресурс, как PHP The Right Way – свежие подсказки для начинающих и не только – пользуйтесь ими для того, чтобы глубже понять основы ООП, безопасности, запуска проектов, писать код в соответствии стандартов, которые были упомянуты ранее и многое другое.

Пробуйте разные фрэймворки, выберите один


Длительное время PHP был языком с самым большим количеством фреймворков для него (JavaScript обошел PHP лишь недавно). Так или иначе, это говорит о непоследовательности нашего сообщества или же о популярности языка, но факт остается фактом: выбор фрэймворка – это сложная задача, особенно для начинающих.

Попробовав многие из них, я могу искренне посоветовать вам Phalcon для знакомства с фрэймворками, т.к. он надежный и качественный, по факту, написан на C и устанавливается как расширение PHP (поэтому он быстрее, чем все существующие на данный момент фрэймворки). Тем не менее, попробуйте различные фрэймворки – это действительно неообходимо.

После того, как вы поработаете с ними, вы узнаете о новых подходах к обычным проблемам каждый раз. У каждого фрэймворка есть свои причуды, которые вам понравятся, а так же и свои минусы, которые вы будете ненавидеть. Но самое важное то, что вы поймете, как думают другие разработчики (в частности, разработчики данного фрэймворка). Вы увидите, сколько появилось новых возможностей и подходов, и очень хорошим упражнением будет перенос одного вашего проекта на столько фрэймворков, сколько вы сможете найти. Это поможет вам объективно оценить эффективность отдельно взятого фрэймворка: скорость разработки на нем и его производительность.

Читайте литературу


Не стоит пренебрегать советами и подсказками других. Читайте столько, сколько можете – если вы будете это делать, то это не займет у вас столько времени, сколько вам кажется. Найдите хорошие блоги, читайте туториалы на sitepoint.com, обсуждайте вопросы и ответы на StackOverflow, зайдите на форумы sitepoint.com, оформите подписку на газеты, следите за хорошими источниками на Google+. Не стоит читать стандартные учебники по PHP – они устарели еще в тот момент, когда вышли – вместо этого, сфокусируйтесь на личных заметках и уроках, где есть полезный и современный код, который вы можете найти повсюду вы сети. Даже если вы наткнулись на тему, с которой уже знакомы, попытайтесь прочесть ее снова – часто вы сможете найти новую пищу для размышлений и разные подходы к одним и тем же вещам.

Нет работы? Придумайте!


Всегда есть чем заняться. Никогда не говорите фразу «У меня нет проекта для работы» или, что еще хуже, «Мне скучно, я устал». Если у вас нет проекта для работы – создайте его. Вам приходится использовать что-то ежедневно и оно вас расстраивает недостаточной функциональностью? Создайте альтернативное, но лучше! Нет идей для нового проекта? Создайте уже существующий – попробуйте переписать, например, Facebook, воссоздайте то, что вы уже видели.

Самое главное – никогда не останавливаться. Нельзя накопить 10000 часов, если вы не проводите их за делом! Продолжайте работать, интересуйтесь новым, постоянно занимайте себя чем-то. Создайте простую адресную книгу. Потом сделайте ее на другом фрэймворке. Затем попробуйте другую базу данных (перейдите с MariaDB на Mongo, например). Займите себя чем то!

Найдите друга/наставника


Легче всего учить что-то, когда есть с кем это делать. Найдите человека, который разделяет вашу страсть. Возможно, вам повезет, и вы окажетесь одним из тех, кто разделяет интересы вашего партнера. Возможно, вы учитесь в школе или университете и у вас есть сверстники, которые хотят начать это удивительное приключение, но им нужна компания. Вы так же можете найти наставника и получить советы от эксперта.

Заключение


Когда вы сфокусируетесь на этих аспектах настолько, насколько можете, когда вы поймете, что вы хотите двигаться дальше – вы на пути к тому, чтобы стать профессиональным PHP разработчиком. Помните о дисциплине, никогда не сдавайтесь (даже если окружающие сдались) и практикуйтесь.
Поделиться публикацией
Ой, у вас баннер убежал!

Ну. И что?
Реклама
Комментарии 16
    +6
    Эта статья напоминает разработку сайтов на Wordpress. Вроде и результат есть, а ни одной строки кода не написано.
      +3
      Используйте ООП как можно чаще – пишите классы

      Проблема в том что если начинающие разработчики будут просто «писать классы» то это еще не значит что они будут использовать ООП. Вы собственно в предыдущем абзаце это и говорите.

      Обдумывание концепций реального мира — это тоже весьма сложная штука. Из опыта общения с начинающими могу сказать что люди не понимают инкапсуляции и прочего. Ну мол что такое инкапсуляция все знают, а как определить не нарушена ли инкапсуляция, тут уже сложности почему-то. Была например статья "объектная гимнастика", это очень годная статья которая учит правильным концепциям. Но обычно реакция на подобные статьи совершенно неадекватная (почитайте комментарии).

      я могу искренне посоветовать вам Phalcon для знакомства с фрэймворками


      Phalcon в качестве первого фреймворка? Серьезно? Нет, как фреймворк он конечно неплохой, но… надо брать фреймворки с большим комьюнити (нынче это laravel или symfony, как фреймворки с самым большим комьюнити). Фалькон — я бы сказал что это чуть другой уровень потребностей.

      Мое мнение.

      Начинающим надо давать «бандаж», те средства разработки которые буду оооочень сильно ограничивать его полет фантазии. То есть это строгие фреймворки и строгие инструменты которые заставляют думать что ты делаешь. Проблема с этим только в том, что брать фреймворки типа Zend или Symfony без какого-то менторинга со стороны более опытных разработчиков весьма сложно.

      Так же новичкам было бы неплохо практиковать TDD. В контексте PHP можно взять PhpSpec, вооружиться принципом «если тебе неудобно писать тесты значит что-то надо делать с твоим кодом» и вперед. PhpSpec сильно ограничивает возможности того, что человек может тестировать (только публичный интерфейс по сути), удобный мокинг зависимостей (нет большой ментальной нагрузки) и легко определить когда мы сломали инкапсуляцию или там зависимостей много, стало быть мы скорее всего нарушили принцип единой ответственности. Короче надо следовать старому доброму «трехфазному» обучению (сю-ха-ри)

      Проблема PHP в том что слова типа «пишем тесты» или «рефакторинг» среди PHP разработчиков не сильно то встречаются.

      p.s. оффтопик на тему: What Killed Smalltalk Could Kill Ruby, Too, прикольная лекция Дяди Боба (2009-ый) на тему качества кода и как это вообще влияет.

      tl;dw Smalltack умер потому что на нем можно было легко написать плохо.
        0
        Phalcon в качестве первого фреймворка? Серьезно? Нет, как фреймворк он конечно неплохой, но… надо брать фреймворки с большим комьюнити (нынче это laravel или symfony, как фреймворки с самым большим комьюнити). Фалькон — я бы сказал что это чуть другой уровень потребностей.

        Мое мнение.

        Тут полностью согласен, но автор на момент написания статьи, видимо, посчитал Фалькон более привлекательным.
          +1
          мне кажется проблема не в комьюнити, а в том, что если новичек захочет разобраться как это работает, он не сможет прощелкать по классам в IDE и глянуть как же это реализовано. Если уж новичка загонять в рамки работы с фреймворками — то вначале дать глянуть какой-нибудь микро-фреймворк, типа Silex или Slim — они элементарно проще.
            0
            Согласен. На примере silex например удобно разбираться как устроен Symfony (потому что на любом хоть сколько нибудь серьезном проекте из silex-а вырастает symfony).
              0
              Ещё относительно недавно вышел Lumen. Тоже прост в освоении, как, собственно, и Laravel.
            • НЛО прилетело и опубликовало эту надпись здесь
                0
                всё сущее объявлять приватным и расширять доступ по мере необходимости.


                скажите это людям, которые делают все приватным и потом просят IDE сгенерить геттеры и сеттеры для всего.
                  0
                  Это лучшая инкапсуляция, чем объявлять всё публичным. Пускай публичный интерфейс у нас излишен и слишком детализирован, но, главное, остаётся куда бОльшая свобода манёвра в изменении внутренней реализации вплоть до проксирования, адаптирования и прочего делегирования.
                    0
                    $entity->getEntityDetail()->breakEncapsulation(); // инкапсуляция курильщика
                    $entity->encapsulatedBehaviour(); // инкапсуляция нормального человека.
                    


                    Так то я согласен что с геттерами/сеттерами хоть какой-то простор для моневров есть, но проблема не в геттерах а в том что их делают на все и раз они есть — везде используют вместо того что бы скрыть детали.
              +2
              Основной недостаток Фалькона в качестве первого фреймворка является таким же прямым следствием как и его главного преимущества — он написан на Си, а значит начинающий разработчик не сможет толком понять как он работает. Истинная инкапсуляция :)
                +2
                По-скольку на хекслете мы обучаем php разработчиков, то постоянно сталкиваемся с вопросами роста, последовательности обучения, направлений развития. В итоге родилась «карта знаний», что учить в каком порядке и почему это важно: map.hexlet.io/stacks/php.

                А если говорить про фреймворки, то много лет назад синатра, основатель жанра микрофреймворков, задала тон и движение в сторону простых каркасов. И изучать mvc лучше всего именно с них. В каждом языке минимум по три своих синатры. В php это slim, lumen и другие.
                  +1
                  Неплохая карта, эх если бы PHP разработчики учились по примерно такому плану…
                  0
                  Ну, я бы не сказал что книги не стоит читать. Да, книги безусловно быстро устаревают, но читая статьи ты набираешь информации только поверхам, а для глубинного понимания и структурирования информации нужно читать книги.
                  Профессионалом не стать без прочения хотя бы GoF.
                    0
                    Профессионалом не стать без прочения хотя бы GoF.

                    без понимания принципов SOLID и GRASP (да банально понимать что такое инкапсуляция) толку от GoF паттернов не много.
                      0
                      Толку не много потому что это только каталог шаблонов, не все из которых имеют смысл в php, но без понимания что такое «шаблоны проектирования» и например чем Singleton отличается от Lazy Load, далеко не уедешь.

                      Можно конечно про шаблоны и в вики прочитать, но на мой взгляд в книге это лучше разжованно. А закрепив материал из книги можно почитать про другие шаблоны не описанные в книге, тот же MVC, DI, Front Controller.

                      Ну и про GRASP тоже книжка есть.

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                  Самое читаемое