Предлагаю вашему вниманию перевод статьи «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)


  1. Biblusha
    18.12.2015 13:21
    +6

    Эта статья напоминает разработку сайтов на Wordpress. Вроде и результат есть, а ни одной строки кода не написано.


  1. Fesor
    18.12.2015 13:24
    +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 умер потому что на нем можно было легко написать плохо.


    1. dMarley
      18.12.2015 13:52

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

      Мое мнение.

      Тут полностью согласен, но автор на момент написания статьи, видимо, посчитал Фалькон более привлекательным.


    1. MetaDone
      19.12.2015 18:18
      +1

      мне кажется проблема не в комьюнити, а в том, что если новичек захочет разобраться как это работает, он не сможет прощелкать по классам в IDE и глянуть как же это реализовано. Если уж новичка загонять в рамки работы с фреймворками — то вначале дать глянуть какой-нибудь микро-фреймворк, типа Silex или Slim — они элементарно проще.


      1. Fesor
        19.12.2015 19:37

        Согласен. На примере silex например удобно разбираться как устроен Symfony (потому что на любом хоть сколько нибудь серьезном проекте из silex-а вырастает symfony).


      1. dMarley
        19.12.2015 23:16

        Ещё относительно недавно вышел Lumen. Тоже прост в освоении, как, собственно, и Laravel.


    1. Temirkhan
      22.12.2015 02:51

      Внесу свои 5 копеек. Касательно инкапсуляции, есть замечательное правило — всё сущее объявлять приватным и расширять доступ по мере необходимости.


      1. Fesor
        22.12.2015 03:40

        всё сущее объявлять приватным и расширять доступ по мере необходимости.


        скажите это людям, которые делают все приватным и потом просят IDE сгенерить геттеры и сеттеры для всего.


        1. VolCh
          22.12.2015 08:01

          Это лучшая инкапсуляция, чем объявлять всё публичным. Пускай публичный интерфейс у нас излишен и слишком детализирован, но, главное, остаётся куда бОльшая свобода манёвра в изменении внутренней реализации вплоть до проксирования, адаптирования и прочего делегирования.


          1. Fesor
            22.12.2015 11:08

            $entity->getEntityDetail()->breakEncapsulation(); // инкапсуляция курильщика
            $entity->encapsulatedBehaviour(); // инкапсуляция нормального человека.
            


            Так то я согласен что с геттерами/сеттерами хоть какой-то простор для моневров есть, но проблема не в геттерах а в том что их делают на все и раз они есть — везде используют вместо того что бы скрыть детали.


  1. VolCh
    18.12.2015 16:40
    +2

    Основной недостаток Фалькона в качестве первого фреймворка является таким же прямым следствием как и его главного преимущества — он написан на Си, а значит начинающий разработчик не сможет толком понять как он работает. Истинная инкапсуляция :)


  1. toxicmt
    20.12.2015 12:48
    +2

    По-скольку на хекслете мы обучаем php разработчиков, то постоянно сталкиваемся с вопросами роста, последовательности обучения, направлений развития. В итоге родилась «карта знаний», что учить в каком порядке и почему это важно: map.hexlet.io/stacks/php.

    А если говорить про фреймворки, то много лет назад синатра, основатель жанра микрофреймворков, задала тон и движение в сторону простых каркасов. И изучать mvc лучше всего именно с них. В каждом языке минимум по три своих синатры. В php это slim, lumen и другие.


    1. Fesor
      20.12.2015 22:10
      +1

      Неплохая карта, эх если бы PHP разработчики учились по примерно такому плану…


  1. ghost404
    21.12.2015 18:54

    Ну, я бы не сказал что книги не стоит читать. Да, книги безусловно быстро устаревают, но читая статьи ты набираешь информации только поверхам, а для глубинного понимания и структурирования информации нужно читать книги.
    Профессионалом не стать без прочения хотя бы GoF.


    1. Fesor
      21.12.2015 19:12

      Профессионалом не стать без прочения хотя бы GoF.

      без понимания принципов SOLID и GRASP (да банально понимать что такое инкапсуляция) толку от GoF паттернов не много.


      1. ghost404
        21.12.2015 20:21

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

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

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