image


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


Обо мне


Я разработчик PHP с 5-летним стажем, в своей практике успел попробовать в продакшне много разного, начиная от Zend Framework, заканчивая Symfony-Laravel экосистемой, Memcached-Redis, MySQL-Postgres, MongoDB, RabbitMQ-Gearman и т.д. Со временем стек технологий, которые захватывают Вас снижается, а с ним накатывает тоска по тому былому ощущению познания. Весь мой код и воркфлоу прошли мутации от правок самописных сайтов через FTP в продакшне, до грамотного подхода деплоя и анализа кода. На своем опыте я выделил список того, что позволяет получать максимум мотивации при минимуме действий.


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


Удобство разработки


Речь идет не об ортопедических стульях и десятке мониторов (хотя при наличии бюджета — это вряд ли навредит), а об очень простой и одновременно важной сфере — инструментах разработки. Если Вы серьезно занимаетесь проектом — просто необходимо настроить свое рабочее окружение максимально удобно. В идеале — использовать IDE с интеграцией и анализом, не только синтаксиса и логики всех ЯП, которые используются, но и с анализом на более высоком уровне — на уровне фреймворка и интеграций. Для примера: разрабатывая на Symfony из-под PhpStorm — очень сильно упрощает жизнь Symfony Plugin + PhpAnnotations Plugin. Таким образом часть мыслительной деятельности выносится на "аутсорс" в IDE, и освобождает мозг для более серьезной работы.


Анализ кода и тестирование


Многие разработчики занимаются сугубо разработкой функционала, но, как показывает практика, не меньшее значение имеет базовое покрытие юнит тестами. Это достаточно рутинный процесс, который иногда может свести Вашу мотивацию в ноль. Начните с малого — покройте тестами End-части своего приложения, например — работу со сторонними Api, простую бизнес-логику на уровне I/O, и т.д., это покажет Вам этот функционал с другой стороны, позволит осознать какие решения были приняты правильно в конкретном случае, а какие лучше немедленно пересмотреть. Вырастет стабильность и качество разрабатываемого продукта, а это уже большой плюс.


Но как получить из этого долю заслуженного дофамина? Генерируйте coverage + статический анализ кода. Отчеты на выходе можно деплоить на тестовом сервере (staging, например) для постоянной доступности их разработчику (команде). Они превращают весь процесс покрытия тестами в своего рода игру, отображают классы, которые покрыты тестами, и подсвечивают что еще нужно покрыть, стимулируя "проходить эти уровни", для минимизации блоков непокрытого функционала. Например для PHP-проектов для юнит тестов обычно используют PhpUnit, в команду запуска которого можно добавить параметр --coverage-html (лучше глянуть --help для более подробной документации), который сгенерирует покрытие в удобном для человека формате. Для статического анализа кода в PHP можно использовать следующие продукты — phplint, phploc, phpcs, phpcpd, phpmd.


ПРЕДОСТЕРЕЖЕНИЕ: При деплое отчетов куда-либо позаботьтесь о сокрытии их от внешнего мира, ибо это кладезь информации о вашем продукте, которая может способствовать его компрометации. Не стоит забывать о безопасности в выполнении любых действий.


Версии


Как бы это не звучало банально — используйте системы контроля версий! Я знаю много разработчиков, для кого это "лишние проблемы", хотя поддерживаемые ими системы давно перевалили за CRUD. Системы контроля версий как минимум позволяют бекапить свой код, как максимум — грамотно контролировать выкатку кода, сравнение, версионирование и много-много другого. Как нажить на этом дофамина — каждая фича в своей ветке позволяет визуализировать процесс вливания кода в основное русло, теги — позволяют вести свой продакшн по версиям и наблюдать прогресс от версии к версии. Это, на самом деле, очень сильно движет дальше.


Сборка и дистрибуция


Так уж повелось, что сборкой люди привыкли считать компиляцию программы, опуская в этом понятии системы, которые запускает интерпретатор. В наш век миллиона PHP-пакетов и миллиарда js библиотек, понятие сборки уже не является чем то сугубо компиляторным, количество действий над системой, необходимых для ее запуска, давно перевалило за 1 десяток, поэтому важно максимально ускорить процесс развертки конкретного приложения, автоматизировав рутинные действия. Есть много приложений, которые занимаются сборкой вашего продукта, для PHP я выбрал для себя Phing, который можно легко установить через composer и описывать задания сборки в достаточно удобном формате (хоть и xml, но интуитивно понятно даже новичку на примере). Цель данных манипуляций — свести развертку продукта до нажатия кнопки "сделать все хорошо".


Подтягивание пакетов, поставка актуальных конфигов, запуск миграций, выполнение тестов, warmup кеша — это малая часть того, что может делать сборщик. Даже если Ваш код еще никуда не деплоится, в будущем, наличие автосборщика существенно упростит начало разработки проекта на новой машине и существенно упростит деплой и релизы софта. В паре с Continuous Integration (CI) системами — вся рутина уходит на плечи машин, предоставляя Вам пространство для полета фантазии и, непосредственно, решения задач. Ну, и как минимум, имеем меньше шанса забыть что-то сделать при деплое.


Как выдавить капельку дофамина из этого — найдите баланс в автоматизации сборки своего продукта, начните с простых вещей, и попытайтесь глянуть как это работает хотя бы в песочнице, даже с минимальным количеством потраченных часов ощущение того, что машина работает за вас — непередаваемое. Для примера я использую Jenkins в качестве CI системы, у которого установлен плагин Phing. Достаточно в сборщике выбрать шаг сборки "Invoke Phing Target" — и все зашуршит, завериться, соберется.


Общая визуализация процессов


Очень заряжает ощущение контроля над системой, поэтому попытайтесь визуализировать максисум продуктов, которые используете. Начиная со статистики по загрузке сервера, до визуализации различного ПО, с которым работает Ваш продукт. К примеру — для RabbitMQ есть Management Plugin, в виде web-интерфейса для просмотра статистики и содержания очередей, очень помогает в отладке, а в продакшне — для контроля оптимальности работы процессов.


В целом для визуализации логов есть очень много софта, который можно подобрать под свои нужды, основная цель — предоставить себе максимально возможную визуализацию того, что происходит в Ваших продуктах (особенно актуально для Service Oriented Architecture (SOA), где множество компонентов общаются между собой). Информация о Вашей системе даст не только возможность быстрой отладки происходящего, а и моральное удовлетворение от наблюдения изменений, динамики. Все узкие горлышки сразу видны, все неоптимальные части системы под Вашим надзором.


Совместимость


Если продукт выходит за рамки одной системы — очень мудрым решением будет вести версии каждой подсистемы (модуля) и составить карты их совместимых версий, обновляя их при каждом релизе. Такой подход позволит выбросить из головы информацию по их фичах, что там в какой версии было добавлено и не сломает ли оно всю работу. Таким образом можно избавить себя и других разработчиков от рутины в копании историй коммитов, для определения все ли там окей.


Вывод


В мире, где так много технологий, где постоянно растущее количество информации давит на Вас со всех сторон, очень важно иметь пространство для гибкости, как в своем продукте, так в своих мыслях. Основной посыл — ищите то, что позволяет Вам визуализировать прогресс, избавить себя от Monkey-job и тогда, даже самые скучные задачи будут приносить большое удовольствие.


Заключение


Данный пост предназначен в первую очередь разработчикам выше новичка, которые хотят улучшить (или сравнить) свой workflow. Весь изложенный материал взят сугубо из своего опыта, если есть замечания — с радостью выслушаю в комментариях.

Поделиться с друзьями
-->

Комментарии (8)


  1. comerc
    22.05.2017 22:51
    -1

    Удобство разработки — странная штука. Развесистый IDE позволяет чрезмерно усложнять структуру проекта. Как я плевался от WebStorm после Atom. И как я ныне счастлив на VSCode после WebStorm.


  1. nekt
    23.05.2017 02:43
    +3

    Добавлю пару мыслей, будучи разработчиком PHP с 10-летнем опытом работы.

    Тестирование. Если вы еще не пишете юнит-тесты — начинайте. Всего полгода опыта написания юниттестов дадут понимание таких важных вещей, как зацепление и связанность на интуитивном уровне. Я сомневаюсь, что многие об этом догадываются, но тесты в первую очередь нужны не для тестирования кода, а для тестирования разработчика, что пишет этот код.

    IDE — палка о двух концах. От IDE программисты тупеют. Зачастую это вырождается в небрежное структурирование проекта и ощущение, что если IDE не может дать подсказку про код — его не существует. В общем случае мне кажется, что разработчик вместо того, чтобы изучать код, и язык, изучает среду разработки. Ладно бы, если бы это был один из используемых инструментов, но зачастую IDE становится единственным инструментом, сводя к нулю полезность инфраструктуры. В особенно вырожденном случае это выглядит как «IDE этого не поддерживает, значит мне это не нужно».

    Версионирование. Здесь все просто. Курить git, git-flow, git-book, semver. Примерно в такой очередности, сдабривая костылями в зависимости от проекта. Но этот базис позволит успешно интегрировать свой проект в крупную инфраструктуру разработки.

    Сборка очень полезная штука. Автоматическая сборка — еще и приятная. Если это дополнить автоматическим тестированием — можно быть уверенным в том, что текущая сборка прошла или не прошла тесты и найти виноватого. Но если вы вдруг начитаетесь статей про CI — не пытайтесь сразу внедрить его у себя. Полноценный CI очень трудозатратен и не факт что он окупится. лучше начинайте с малого и последовательно двигайтесь в сторону CI:
    — Сначала стоит сделать девстенд, на котором будет крутится текущая версия проекта из дев-ветки
    — Написать скрипт по деплою его туда. rocketeer или magelanus вполне подойдут. По первости такой монстр как дженкинс не особо и нужен.
    — Автоматизировать этот скрипт, чтобы он исполнялся автоматически.
    — Прикрутить к нему обратную связь.
    — Начать писать юниттесты.
    — Прикрутить к скрипту деплоя скрипт тестирования.
    — Прикрутить к автотестам обратную связь.
    На этом этапе можно будет считать, что у вас есть треть от CI. Остается всего ничего — начать писать приемочные (acceptance) тесты, начать выпускать стабильные версии кода в собранном виде и размещать их в хранилище в удобном для деплоя формате(deb, rpm, tar), вместе с картой совместимости версий, обеспечить возможность конфигурирования проекта по окружениям, независимо от версии кодовой базы, начать автоматически выгружать стабильные версии на тестовый стенд (с учетом зависимостей), начать их доставлять на продовские серваки и сделать кнопку деплоя на прод с поддержкой отката миграций. Где-то тут это будет уже боле-менее полноценный CI. Работы года на три в меру крупном проекте, если не отрываться от разработки.

    И хочу добавить еще один пункт от себя — старайтесь получать обратную связь от системы.
    То, что вы написали и протестировали, еще ничего не значит. Неизвестно как поведет себя система в проде. Какие полезут в ней ошибки, и какие проблемы могут возникнуть. Любое отхождение от позитивного сценария должно логгироваться и сообщаться разработчикам как минимум только для того, чтобы они были в курсе. Без обратной связи от системы можно никогда не узнать об ошибках или о проблемах — логи и метрики — это значительно более надежный (и быстрый) канал получения информации о системы, нежели пользователи и даже тестировщики. В идеальном мире разработчик должен узнавать о 80% проблем в тот момент, пока тестировщик еще только думает, заводить баг или нет.


    1. iqw
      23.05.2017 07:42

      Насчёт IDE — во всем нужен баланс, от экономии времени до зацикливания один шаг, но в целом, реально экономит время, особенно на этапе исследования чужого кода (и вендоров). В остальном — согласен, спасибо за развернутый комментарий.


    1. VolCh
      23.05.2017 13:35

      Насчёт сборки, деплоя и прочего CI: начинать бы я советовал c автоматизации разворачивания и деплоя препродакшен среды (из мастер-ветки), аналогичной проду. Хоть на bash/cmd, если что-то типа ansible выглядит непонятным и(или) ненужным. Тупо поднять голый сервер(а) для препрода и начинать писать скрипт, который сделает его в итоге неотличимым от прода (кроме разве что доступных ресурсов), а потом использовать его для прода.


    1. kozzztik
      23.05.2017 13:54

      Да уж, написание юнит тестов круто заряжает дофамином.


      1. Fesor
        24.05.2017 10:53
        +1

        если перед кодом и они становятся зелеными — то да)


  1. Fesor
    23.05.2017 08:25

    Для статического анализа кода в PHP можно использовать следующие продукты — phplint, phploc, phpcs, phpcpd, phpmd.

    а как же phpstan/phan? Еще есть phpmetrics, php dependency analyzer и куча других...


  1. alexunder
    23.05.2017 22:18

    Спасибо. имхо структурно и по делу.