IT Leaks. Как стать back-end программистом на PHP с нуля, план самостоятельного обучения
Публикую план удалённого разработчика back-end на PHP, которым пользовался сам и проверял со студентами при работе наставником. Дополнительный раздел касается удалённой работы.
Цель «удаленная работа backend PHP»
Начну с перспективы. В статье Как выбрать специальность будущему айтишнику? я подсказал, что есть довольно простой способ определения целей и планов на 5 лет вперёд. Один из принципов выбора — посмотреть вокруг, определить чужие потребности, определить свои интересы, найти пересечение их потребностей и твоих интересов (это я называю возможностями), определить цели начерно и двигаться к ним, уточняя детали по пути.Один из вариантов определения целей — посмотреть на вакансии, специалисты в которых решают интересующие тебя проблемы. Через 5 лет могут появиться новые языки программирования, но они не смогут вытеснить все остальные языки. Кроме того, кто знает один язык программирования — легко освоит другой. Кто знает протокол HTTP, разберётся в других протоколах на его основе. Главное научиться учиться.
Внимание! В конце статьи — интересное предложение: помощь в составлении твоего резюме или веб-портфолио.
Итак, смотрим на абстрактную вакансию, которая найдена по фразе «удаленная работа backend PHP». В ней есть такие требования:
- знание PHP 7 и выше
- понимание принципов ООП
- понимание принципов MVC
- умение верстать (HTML, CSS, jQuery, Bootstrap)
- знание фреймворков
- знание MySQL
- умение разбираться в чужом коде
- чистый и аккуратный код
- опыт администрирования linux серверов достаточный для поддержания работы веб-проекта
Это довольно интересный список. Под спойлером я его кратко расшифрую.
Это была цель. Теперь про путь, то есть про план достижения цели.
Личный план обучения
Если кратко — если изучать с нуля, то устройство на такую вакансию возможно через 1-2 года. Это как если бы ты поступил на обучение в ПТУ и потом пошёл работать. Через год или два можно будет заниматься практикой по веб-разработке самостоятельно или в команде энтузиастов, или устроиться на работу в компанию. В целом мастерство приходит медленно. Есть правило 10 000 часов: в любой области человек становится специалистом через 10 000 часов практики. В статье Как выбрать специальность будущему айтишнику? я отметил, что на некоторые вакансии не удастся устроиться сразу, придётся идти к ним постепенно. Сначала устроиться на вакансию попроще, набрать опыта и либо получить повышение на текущем месте работы либо сменить работу.Если такой срок тебя не пугает — читай дальше. Иначе сначала прочитай, почему иногда кажется, что нет прогресса и всё изучается медленно, а когда прочитаешь — возвращайся к этому плану.
Начальный этап — базовый сведения о web, HTML, CSS и JS (около 3-6 месяцев на изучение)
Этап описан в плане Как самостоятельно переучиться на веб-разработчика?Для серверной разработки не обязательно знать всё-всё-всё про HTML, CSS и JavaScript. Но надо понимать, что веб-проекты состоят из страниц HTML, данные передаются через HTTP туда и обратно, клиентская часть может обмениваться с серверной через AJAX или веб-сокеты.
Базовая практика серверной разработки на PHP с использованием MySQL (1 год на изучение)
В качестве опорного плана я взял описание с курсов от Центра компьютерного обучения «Специалист» при МГТУ им. Н.Э.Баумана
PHP. Уровень 1. Основы создания сайтов
PHP. Уровень 2. Разработка web — сайтов и взаимодействие с MySQL
PHP. Уровень 3. Профессиональная разработка на PHP
РНР. Уровень 4. Проектирование и разработка сложных веб — проектов на РНР
MySQL. Проектирование и создание баз данных для web
Система управления версиями Git
Git – распределенная система управления версиями (VCS). Это универсальный, свободный и удобный инструмент для командной работы программистов над проектами любого уровня. Git позволяет нескольким разработчикам работать одновременно над своими подзадачами, создавая равноправные ветви. При этом каждое сохранение (коммит) в Git не перезаписывает предыдущее, и в любой момент Вы сможете вернуться к исходной версии кода.Отличным пособием будет книга Pro Git
Насыщенный практикум по дискретной математики, логике и алгоритмам
Все практические задачи по программированию подразумевают использование дискретной математики (в частности — булева алгебра, теория множеств, графы и другое) и алгоритмов (сортировки, поиск элемента в множестве, поиск минимума/максимума и многое другое). Нужно научиться их понимать, комбинировать, придумывать новые, реализовывать на языке программирования. Не уверен что есть такие курсы. Тебе понадобится книга для практикума по алгоритмам.Обзорные курсы:
- Видео-курс ‘Введение в логику’ :
- Видео-курс ‘Структуры данных’ : список, итератор, двусвязный список, стек, очередь, динамические массивы
Из книг порекомендую:
- Новиков «Дискретная математика для программистов»
- Красиков «Алгоритмы. Просто как 2×2»
- Елена Андреева и другие. «Математические основы информатики. Элективный курс»
На странице Какие книги посоветуете начинающему программисту в блоке-врезке “Задачи для тренировки программирования” указаны несколько больших баз с заданиями по логике и алгоритмам, некоторые из них предполагают автоматическую проверку решений, что очень удобно.
Следующий этап — продвинутая практика по серверной разработке.
Продвинутая практика по серверной разработке на PHP (ещё 1 год на изучение)
Список технологий, которые используются в веб-приложениях и которые надо отработать на практике:- Системы контроля версий git (см. выше), mercurial, subversion
- думаю, к этому времени ты уже завёл учетную запись на github.com или bitbucket.org
- прочитал Pro Git
- прошёл курс по Git
- надо научиться создавать и оформлять репозитории
- настраивать доступ по ключам, изучить принципы работы хуков
- поработать с ветками, желательно с кем-нибудь на пару с одним и тем же репозиторием
- оформлять изменения
- делать pull-request в чужой репозиторий, принимать pull-request в свой репозиторий
- делать code review чужого кода
- делать слияние кода через merge или rebase, и решать конфликты в коде
- Пакетный менеджер Composer и сервис packagist.org
- Протоколы SSH, FTP, SFTP и утилиты для обмена данными по этим протоколам
- Установка и настройка сервера на базе операционной системы Ubuntu/Debian CentOS/RedHat
- ищи информацию на тему виртуальных машин VirtiaBox / VMWare
- ищи информацию на тему управления виртуальной средой Vagrant / Docker
- ищи информацию о Virtual Private Server (VPS) / Virtual Dedicated Server (VDS) / Dedicated Server, возможно понадобится хостинг — вот купон на $10 от Digital Ocean — этого хватит на два месяца аренды VDS сервера
- менеджеры пакетов
- права доступа к файлам и папкам
- сервисы (демоны)
- Установка и настройка веб-сервера (apache, nginx, .htaccess, rewrite)
- Работа с кэшем (файловый, memcached, RedisIO и другие)
- Работа с базами SQL (MySQL, PostrgeSQL)
- Работа с базами NoSQL (RedisIO, MongoDB)
- Работа с файлами (windows / linux)
- Работа с HTTP запросами (обмен данными между серверами по HTTP серверными методами — это не про AJAX, а про php-curl и SOAP)
- Моделирование данных в SQL базах, на примере MySQL и PostgreSQL на практических задачах, цель — способность спроектировать базу из 10-15 сущностей
- Полнотекстовый поиск через Sphinx и Elastic Search
- Очереди событий Beanstalk, RabbitMQ, ApacheMQ
- Работа с crontab
- Работа с электронной почтой по протоколам SMTP, POP3, IMAP
- Навые поиска и устранения SQL injection
- Навые поиска и устранения XSS injection
- Практическая работа с файлами в форматах JSON, XML, CSV
- Реализация сервиса с API на базе JSON и XML
- Работа с GEOIP
- Практическая работа с изображениями
Необходимо на учебных примерах или в иной практической работе отработать все перечисленные пункты.
Примеры учебных задач:
- https://copist.ru/ru/blog/2016/05/12/new-project-idea-part1/
- https://copist.ru/ru/blog/2016/02/11/pet-project-ideas/
Современная практика бакенд-разработки (1 год)
Понятие “современная” через два-три года может измениться. Я дам ссылку на OpeSource проект, который систематизирует сведения про современную разработку на PHP: PHP. The Right Way. Индексная страница не велика, просканируй сверху вниз и читай постепенно все ссылки.Также порекомендую рассылки про backend-разработку на PHP
- http://habrahabr.ru/company/zfort/
- http://habrahabr.ru/users/nazarpc/topics/
- http://habrahabr.ru/company/it-grad/blog/275163/
И тематические группы в соц сетях
Следи на новинками, изучай как они работают, проверяй, применяй на деле — НО СИЛЬНО НЕ УВЛЕКАЙСЯ, потому что технологий слишком много, но на практике достаточно иметь одну-две в портфолио, а потом уже на работе разберёшься с неизвестными тебе технологиями, если потребуется. Изучить всё сразу не получится. Оптимальнее всего создать учебные приложения на основе некоторой частной комбинации технологий, про которые узнал.
Работка под CMS и фреймворки (1 год)
Крупные приложения редко пишутся на “чистом” PHP, обычно используют CMS или фреймворк.- CMS: WordPress, Joomla, Magento, osCommerce, Drupal, Typo3
- Фреймворки: Yii, Laravel, Phalcon, Zend Framework, Cohana
- статья Какие задачи возникают в результате отказа от использования веб-фреймворков?
Для закрепления знаний по CMS надо написать несколько модулей, плагинов и расширений, тему можно выбрать позже. Не везде требуются CMS, поэтому их нужно изучить поверхностно, для ознакомления с архитекторой, то есть только узнать, как пишутся модули, расширения и плагины, где искать документацию.
Мои первые работы были «самописами», без фреймфорков. Когда я познакомился с Zend Framework, я понял, что потратил кучу времени зря — из решение лучше моего. Когда я познакомился с Yii, я понял, что Zend — просто монстр. А затем были Laravel и Phalcon. Знание устройства этих фреймворков позволяет мне легко ориентироваться в чужом коде и быстро решать тестовые задачи при трудоустройстве.
Для закрепления знаний по фреймоворкам, надо реализовать заново одно или несколько учебных приложений из списка выше на базе одного или нескольких фреймворков. Как вариант — сделать плагин (виджет, компоненту, надстройку, расширение) для CMS, который получает курс валюты из чужого источника, серверными методами. А затем реализовать вывод данных в блоках CMS через AJAX.
Технология разработки программного обеспечения (frontend и backend)
Тема сложная и большая, разделы условно перечислены в wikipedia: Разработка программного обеспечения. Изучается в некоторых ВУЗах, на некоторых специальностях.Большинство сталкивается с некоторыми из перечисленных задач на практике и таким образом усваивает. Специальной литературы не читают, но она есть и знание её значительно расширяет кругозор и помогает в получении правильных навыков (Soft Skills).
Разработка программного обеспечения включает в себя не только программирование. Это длительный процесс, многосторонний, требует много дополнительных навыков, не связанных с составлением и записью алгоритмов на каком-нибудь языке программирования.
Обрати внимание из каких подзадач может состоять разработка и эксплуатация веб-проекта: Как строится современное веб-приложение
Основные навыки, которые надо выработать (каждый из них не сложный, но их большое разнообразие):
- спецификация задач: составления исходных требований (requirements), составление шагов последовательности действий (use-case), критерии завершённости задачи (acceptance criteria), тестовые наборы данных, декомпозиция задач, определение зависимостей, а также системы ведения задач (task manager)
- описание задач в условных понятиях, абстрациях, блок-схемы алгоритмов, диаграммы последовательностей, временные диаграммы, модели данных
- прототипирование интерфейса
- интернационализация — поддержка нескольких языков и языковых стандартов
- тестирование программного обеспечения — модульное, функциональное, интеграционное и прочие
- конфигурирование приложений
- сопровождение — работа с ошибками, системы учёта учёта ошибок (bug tracker)
- стратегии разработки (водопад, Agile, Scrum, Kanban, XP)
- жизненные циклы задач (постановка, уточнение, оценка трудоёмкости, реализация, тестирование, релиз)
- управление процессом разработки ПО, жизненные циклы разработки ПО
- оптимизация под поисковые системы, интернет-аналитика, интернет-маркетинг
Пригодятся книги и статьи про
- UML
- SCRUM
- Kanban
- Agile
- средства визуального прототипирования RationalRose, Enterprise Architect
Курсы на coursera.org:
- Create better software. Confidently interact with clients
- Learn how to design great user experiences
- Software Processes and Agile Practices
- Agile Planning for Software Products
- Client Needs and Software Requirements
Часто в группах вКонтакте анонсируются видео-лекции по проектированию, по построению приложений, по разработке программного обеспечения
Удалённая работа и Soft Skills
Особенность удалённой работы в том, что твои коллеги могут находиться не здесь-и-сейчас, с ними очень мало способов установить контакт (только слух и, иногда, зрение), они могут быть заняты своими задачами.Также особенность удалённой работы в отсутствии палки над головой, начальника за спиной, что подразумевает высокую концентрацию над текущей задачей, общей мотивацией к самому процессу и ответственность за результат.
Рекомендую прочитать книги Rework и Remote (есть переводы на русский), чтобы понимать, что именно ценится в удалённой работе. Это не знание языков и технологий (!), а навыки общения.
Если рассматривать именно удалённую работу, то нужно найти и изучить работу программного обеспечения, используемого для совместной удалённой работы, часть из которых перечислены в статьях
- Средства разработки online
- Лучшие способы протестировать скрипт на PHP, Python, Ruby, JavaScript в онлайн
- Да, нужна ещё статья про совместную удалённую работу
Надо научиться работать вместе, когда вы далеко. Надо научиться контролировать своё время, когда никто не стоит за спиной. Надо вовремя делать то, о чём договаривались.
Для этого следует
- правильно излагать задачу к встрече, чтобы все участники могли подготовиться — рекомендую DropBox для файлов, которые нужно просто скачать, и Google Docs для документов, которые нужно совместно изменить
- согласовать время и регламент встречи, повестку — рекомендую Google Calendar
- выбирать подходящее ПО для встречи (возможно потребуется совместно видеть один экран, комментировать, ставить пометки к коду, или даже удалённо управлять компьютером)
- вести протокол, чтобы не переспрашивать по несколько раз о том, что обсуждали и что решили (я все конференции пишу в видео, пересматриваю при необходимости — рекомендую программу HyperCam)
- не отвлекаться от повестки и регламента
- статья Записывай всё
Также нужно будет прочитать несколько книг по мотивации, тайм-менеджменту и развитию Soft Skills и применить все новые знания на практике
Мне помогли книги:
- “Программист-прагматик”
- “Программист-фанатик”
- “Не откладывай на завтра”
- ”Начни”
- “Легкий способ начать новую жизнь”
- “12 недель в году”
- “Тайм-драйв”
- “Путь программиста: Человек в эпоху ИТ”
- статья Умные книги про карьеру в ИТ и навыки профессионального программиста
Статистика: 60% кандидатов на вакансии не проходят по причине того, что они не умеют общаться — опаздывают, уклоняются от контакта, врут (ведь это так просто через Интернет). Ещё 60% не проходят испытательный срок, потому что за 2-4 месяца не осваивают навыки управления личным временем, планированием работы и взаимодействием с коллегами.
Отнесись к этому серьёзно.
Портфолио или как получить работу, если для работы нужен опыт, а без опыта нет работы
Для успешного трудоустройства требуется составить хорошее портфолио. Хорошее оно должно быть не тем, сколько в нём работ, а тем, как работодатель сможет оценить тебя. И начинать его надо не тогда, когда у тебя есть готовые классные интересные популярные проекты, а когда ты ещё начал учиться. Даже если ещё нет каких-то серьёзных работ, его нужно составить. Работы появятся. Если у тебя в планах стоит сделать свой блог с портфолио, но ты откладываешь до появления настоящих стоящих классных работ, то это может тянуться бесконечно, так как без портфолио у тебя не появятся настоящие работы. Замкнутый круг.Как разорвать этот круг? Простой практический способ описан в статье Веб-портфолио.
Наставничество или как учась учиться
Движение вперёд будет значительно более интенсивным, если начать помогать другим. Работа с менее опытными имеет свои плюсы- Рост навыка быстро разбираться в чужом коде
- Рост навыка начального проектирования, проектирования «с чистого листа», «с нуля»
- Рост навыка принимать архитектурные решения для роста модели
- Практика эффективно обсуждать задачи
Свой опыт я описал в своей статье Почему я занимаюсь наставничеством. Также рекомендую статью Путь наставника.
Про CMS. Сам я до недавних пор игнорировал CMS. Ну то есть я ими пользовался (эта статья опубликована на сайте, работающим под управлением CMS WordPress), но исходный код не изучал, не менял и не делал каких-либо надстроек. Однако недавно появилась необходимость сделать плагин под WordPress. Пришлось познакомиться с WordPress Codex, разобраться в системе плагинов, системе администрирования, системе редактировании и хранения статей, а также с процедурой публикации плагина в каталоге плагинов. История об этом на SmartProgress
Изображение «Walk This Way» было позаимствовано у Bobby Chiu (imaginism)