Подход к разработке

Веб-интегратор «Максимастер» занимается разработкой веб-проектов с 2002 года, и за это время мы выстроили гибкий процесс разработки, который опирается на международный опыт и стандарты.

Идеология

Мы - технари. Инженер не знает тонкости всех предметных областей в мире, но знает общие принципы переложения предметной области в программный продукт.

Шаблонные сайты со стандартной логикой — не только скучно, но и гарантия застоя специалистов. Наш фокус — сложные процессы и интеграции. Испытания = Рост.

Находим молодых и многообещающих специалистов и воспитываем их на задачах попроще. Опытные разработчики не появляются из ниоткуда.

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

Не только слушаем, но и предлагаем. Пытаемся понять цель, а не слепо реализовать идею.

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

Организация

Проводим сбор требований и их аналитику.

Производим предварительную оценку.

Выбираем способ управления (Scrum, Kanban, XP, Waterfall).

Придаем вашей идее форму в процессе проектирования, преобразовывая ее в техническое задание.

Производим конечную оценку с детализацией.

Дробим техническое задание на задачи для разработчиков.

Управляем группировкой задач (релизы) и контролем сроков через Redmine.

Готовый код задачи всегда проходит ревью-аудит (code review в GitLab) у другого разработчика, как правило, более опытного. Одна голова хорошо, а две — лучше. И ошибок меньше.

Проводим тестирование (ручное и автоматическое) на копии сайта.

Документируем результаты для упрощения передачи проекта от одного разработчика другому (знаем про bus factor). Документацию по техническим аспектам храним рядом с кодом проекта — ближе к разработчикам. Пользовательскую документацию формируем в Wiki.

Техника

Управляем проектами в едином окружении, используя Redmine.

Используем единый и эффективный инструментарий, например:
  • OS Linux — эффективная консоль, нативная контейнеризация окружений, приближенность к реалиям серверов (они тоже на Linux);
  • IDE PhpStorm — лидер на рынке, быстрая навигация и поиск, и десятки других инструментов.

Следуем зарекомендовавшим себя методологиям, стандартам, спецификациям и принципам (Twelve-Factor App, PSR, Airbnb JS Style Guide, OpenAPI, JSON:API, DRY, SOLID и др.)

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

Явно объявляем и изолируем зависимости — с помощью Composer, Npm, Docker.

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

Подключаем внешние сервисы по любому протоколу взаимодействия (SOAP, REST, GraphQL и др.). Если продукт должен общаться с миром, то он будет иметь собственный API (например, OpenAPI и JSON:API).

Разделяем этап сборки и релиза — с использованием GitLab CI/CD.

Храним состояние только в сторонних службах, например:
  • Percona как реляционная база данных общего применения (более быстрый и функциональный форк MySQL)
  • Redis для данных ключ-значение
  • memcached для хранения кеша.

Осуществляем горизонтальное масштабирование — распределяем проект на несколько серверов (несколько бекенд серверов, баз и т.п.).

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

Используем Docker, с помощью которого описывается и запускается локальное окружение для разработки, приближенное к продуктивным настройкам (те же версии серверного ПО и их настройки).

Используем monolog в качестве интерфейса для записи логов по стандарту PSR-3. При необходимости пишем логи как поток в сервис сбора логов Fluentd или аналог.

Выполняем разовые операции через консоль в регулярном окружении приложения, например:
  • Миграции с использованием Doctrine Migrations;
  • Другие консольные команды с использованием symfony/console.

Пишем автоматические приёмочные и модульные тесты, которые обеспечивают гарантию работы ключевых функций приложения (минимальный объем приёмочных авто-тестов пишется именно для них) после любых изменений. Используем PHPUnit, Codeception, Jest и Selenium WebDriver.

Следим за состоянием приложения через Zabbix и Grafana, чтобы видеть профили нагрузки на разные составляющие в реальном времени, а также иметь архив этих данных для ретроспективного анализа, если понадобится.

Обеспечиваем качественное резервное копирование через BorgBackup.

Проводим нагрузочное тестирование через Apache JMeter и Siege когда нужно предсказать допустимую нагрузку (полезно, если планируются промо-акции, которые могут значительно повысить нагрузку).

Разворачиваем (и обновляем) продуктивную конфигурацию сервера с помощью декларативных и воспроизводимых рецептов Ansible.

Создаём проекты быстрыми — минимизируем передаваемый объем данных клиенту (gzip, webpack), используем эффективные алгоритмы и кеширование. Даём вторую жизнь медленным проектам — проводим аудит производительности, находим узкие места (Lighthouse, Google PageSpeed Insights, XHProf) и устраняем их (оптимизируем алгоритмы, перерабатываем архитектуру, добавляем или оптимизируем кеширование).

Делаем интерактивные интерфейсы быстрыми и отзывчивыми используя современные фреймворки: React, Vue и Angular. Делаем интерфейсы адаптивными используя HTML5 и CSS3 (flexbox, grid layout).