7 важных факторов PHP-приложения

7 важных факторов PHP-приложения

Инженеры платформы Heroku (https://www.heroku.com/) на основе собственного опыта создали методологию (https://12factor.net/ru/) для разработки SaaS-приложений.

Эта методология учитывает три важных аспекта:
— расширяемость — развитие кодовой базы и функционала;
— сопровождаемость и возможность командной работы над проектом;
— масштабируемость.

12 факторов приложения стали шаблоном для многих разработчиков и Ops-инженеров, а мы постарались адаптировать самые важные из них для приложений на PHP.

Кодовая база (https://12factor.net/ru/codebase). Забота о коде начинается с принципов его версионирования и хранения. Используйте Git Flow или его адаптацию с учетом специфики работы ваших команд.

Зависимости (https://12factor.net/ru/dependencies). Используйте менеджер зависимостей Composer (https://getcomposer.org/) и его основные операции install и update для манипуляций c composer.json (https://getcomposer.org/doc/04-schema.md) и composer.lock.

Конфигурация (https://12factor.net/ru/config). Предпочтительным методом обработки конфигурации является использование переменных среды. Для работы с ними мы применяем компонент symfony/dotenv (https://github.com/symfony/dotenv).

Параллелизм (https://12factor.net/ru/concurrency). Выполняйте процессы в фоне, тем самым снижая время отклика при взаимодействии с вашим сервисом. Выделяйте веб-процессы в реальном времени и рабочие процессы. Первые принимают http-запросы от клиента, а вторые — выполняют фоновые задачи, например, с помощью брокера сообщений RabbitMQ (https://github.com/rabbitmq).

Паритет разработки/работы приложения (https://12factor.net/ru/dev-prod-parity). Для того чтобы обеспечить схожесть сред разработки, тестирования и продакшена, мы используем виртуализацию на основе Docker и специально подготовленные образы, содержащие одинаковые наборы и версии библиотек. Промышленные и тестовые среды отличаются лишь степенью масштабирования, на основе технологий K8S и Swarm.

Журналирование (https://12factor.net/ru/logs). Фактор утверждает, что приложение должно просто писать в STDOUT и STDERR, а среда должна отвечать за маршрутизацию этих сообщений в хранилище. Технология PHP-FPM позволяет производить вывод логов в STDOUT, что крайне полезно при работе с Docker-контейнерами. Для организации процесса логирования на уровне приложения мы используем сторонние внешние библиотеки, например Monolog (https://github.com/Seldaek/monolog) или компоненты фреймворков.

Задачи администрирования (https://12factor.net/ru/admin-processes). Реализовать сценарии администрирования приложения можно с помощью внешних библиотек, например Symfony Console (https://github.com/symfony/console). Большинство современных фреймворков имеют встроенные средства для организации запуска консольных команд для служебных целей и миграций. Например, в Yii Framework есть понятие консольного приложения (https://www.yiiframework.com/doc/guide/2.0/en/tutorial-console) и команды.

Качество кода и счастье

Есть тип руководителей, которым я отказываю в консультациях после первой встречи — это люди, которые осознанно игнорируют счастье своих программистов.

Вот, к примеру, качество кодовой базы. По-идее, можно очень долго жить с горами говнокода в продакшене — просто нанимаешь в 2–3 раза больше программистов, игнорируешь высокий churn, пытаясь загасить проблему корпоративами/тимбилдингами/мотивацией, и привычно умножаешь все сроки на 3.

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

Ключевой элемент счастливой команды — качество кодовой базы: архитектура, стандарты кодирования, тесты и автоматизация рутины.

Вчера на сайте бюро вышел первый совет в серии о качестве кода (http://bit.ly/bureau-code-quality), с детальным рассказом о том, зачем это нужно бизнесу. Особенно совет полезен тем, у кого нет времени (или кому не дают времени) на рефакторинг.

Часть вторая. Розыгрыш брифов!

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

В этот раз брифы были зашифрованы текстами песен. То есть по 1-2 строчки ты должен был догадаться о чем идет речь.

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

Первый слайд — «Все на свете из пластмассы и вокруг пластмассовая жизнь…»
В голове быстро проносится анализ: так, это либо экология, либо производство чего нибудь. Быстро решаю, что это не интересно, тем временем нужное количество человек уже подняли руки, идем дальше.

Второй слайд — «I really need you really love you, И как бы далеко бы я ни был от тебя…»
Что то про близкие отношения, думаю я, либо сервис знакомств, либо поиск кого то. Точно нет. В аудитории тоже происходит заминка. Серей Гальцев решает дать подсказку сомневающимся и говорит, что тема очень душевная. В итоге появляется нужное количество рук.

Третий слайд — «Перемен, требуют наши сердца! перемен, требуют наши глаза».
Опа, звучит круто, решаю поднять руку, но так же решает добрая половина аудитории, в итоге я был даже не четвертым, строчки явно пришлись многим по душе, так что я в пролете. Идем дальше.

Четвертый слайд — «Я раньше и не думал, что у нас на двоих с тобой одно лишь дыхание…».
Так, звучит подозрительно, дыхание, опять близость? нет не буду рисковать. В итоге команда формируется без меня.

Пятый слайд — «А у нас алкоголь дешевле, чем учебник — Так что, если ты ноешь, ты обсос, как Чендлер.»
Так, тут явно замешано образование, образовательными проектами я в той или иной мере занимался в университете, так что тоже пропускаю.

Шестой слайд — «Город-сказка, город-мечта».
Я смело поднимаю руку. Не особо следил за порядком, поэтому даже не заметил, что это последний слайд, просто понял, что мне это интересно. Урбанистика, город, в этом направление сейчас много чего происходит, должно интересно. Таким образом моя и ещё 3 руки сформировали последнюю команду.
Далее, нам показали те же самые слайды, но с брифом от заказчиков. Это было небольшое видеообращение с описанием проблемы.

1. «Все на свете из пластмассы и вокруг пластмассовая жизнь»
Фонд WWF заказал сервис, который поможет людям более осознанно подойти к проблеме загрязнения пластиком.

2. «I really need you really love you, И как бы далеко бы я ни был от тебя»
Фонд Добрая планета, попросил помочь им с организацией помощи волонтерам по работе с детьми-сиротами.

3. «Перемен, требуют наши сердца»
Фонд Борьбы с Коррупцией — это было довольно неожиданно, бриф читал начальник штаба — Леонид Волков. Он рассуждал о предстоящих выборах и о сложности наблюдений за их честностью. Его просьба была в том, чтобы придумать сервис, который облегчил бы жизнь наблюдателей. Все были немного в шоке, и я в том числе.

4. «Я раньше и не думал, что у нас на двоих с тобой одно лишь дыхание».
Как я понял — это некий стартап, который продвигает идею умных датчиков, отслеживающих чистоту воздуха.

5. «А у нас алкоголь дешевле, чем учебник», Фонд поддержки образования и науки «Рекурсия» попросил помочь в проекте по менторству студентов.

6. И, наконец, «Город-сказка, город-мечта», где заказчик, в виде Студии транспортного проектирования, просил помочь в организации сбора данных на местности. И так как это моя тема, я остановлюсь на ней чуть подробнее.

Команда это важно

Проблемы с UI, которые возникли на нашем проекте, были также очень тесно связаны с плохой коммуникацией в команде. Многие команды, которые смогли добиться больших успехов в UI, сделали это благодаря грамотному распределению сил в команде — кто-то прорабатывает продуктовую часть и UX, а кто-то подхватывает работу и начинает накидывать UI.

У нас этого не произошло, и на это было две причины.

Первая, и самая большая — я не хотел делиться работой. Я поставил себе глобальную цель использовать учебу как трамплин для раскачки своих навыков (я писал об этом ранее https://t.me/bukhtiyar/152), поэтому мне было в кайф брать на себя как можно больше нагрузки, а не быть менеджером команды. В итоге ребята, увидев мой запал, вместо того, чтобы включиться в конкуренцию за работу над проектом, отступили и дали мне полный карт-бланш.

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

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

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

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

Меньше шума

Меньше шума

Несколько лет назад в каком-то хипстерском медиа типа the Village вышла статья про странный эксперимент.

Девушка рассказывала, что её выстёгивает от визуального шума вокруг. Даже когда ты принимаешь душ, бутыльки с мыльными жижами что-то тебе втирают.

Она настолько упоролась, что отодрала этикетки со всего в ванной комнате.

«Вау» — подумал я, вот это настоящие проблемы первого мира → и пошёл их решать у себя.

С того момента, я периодически убираю этикетки с ёмкостей, если это несложно.

Сегодня вспомнил про это, когда наткнулся на твит дизайнера Твиттера — so meta — где она рассказывала: как закрашивала ДОВОЛЬНО БОЛЬШОЕ лого на велосипеде 🙃

Потому что она — дизайнер, и её сводят с ума мелкие детали, о которых не подумали в достаточной степени

Про самоорганизацию

Про самоорганизацию

Пожалуй, самая важная трансформация, которая произошла со мной в части самоорганизации заключается в следующей смене парадигмы:
Как найти больше времени, чтобы всё успеть ➡️ Как успеть максимум за максимально короткое время.

Что меняется в концепции 👇

У каждого из нас есть бэклог: рабочие задачи, собственные инициативы и проекты, семья, друзья, обучение, чтение, спорт, сон, нормальное питание ...

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

В треугольнике "задачи, время, мой ресурс (эффективность)" я фиксировал задачи, а время растягивал.

Этот подход оказался неверным:
☹️ Волны успеваемости сменяются волнами апатии и прокрастинации.
☹️ Ощущение "я много работаю" позволяет чаще делать непроизводительные паузы-награды: соцсети и прочее.
☹️ Если растягиваешь время — меньше думаешь о производительности: она не в фокусе. Ну, посплю поменьше — зато, сделаю побольше.

В какой-то момент (не так и давно, на самом деле) я стал фиксировать не задачи, а время: у меня есть 8-9 часов на все рабочие задачи и свои инициативы. Успевай.

И тут началось самое интересное в самоорганизации:
🙂 Работаю над действительно важными задачами.
🙂 Острее ощущается ограничение времени: стал меньше отвлекаться на постороннее.
🙂 Делегирование и работа с подрядчиками заиграли новыми красками.
🙂 Думаешь больше о самоэффективности: больше мотивации точить пилу и выбирать максимально эффективные инструменты.
🙂 Не надо жертвовать важными нерабочими делами: семья, спорт, саморазвитие и т.п.
🙂 Появляются левел-апы и вызовы: а можно ли успеть всё не за 8-9, а за 6-7 часов?

Бывают дни, когда надо подольше поработать, но это не практика и каждый такой день — повод для ретроспективы на тему: почему не получилось зафиксировать время и как сделать, чтобы это не повторилось.

У меня появляются большие вопросы к людям, которые: "я работаю по 12-16 часов в день" — как долго они так могут работать и почему они считают это поводом для гордости?

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