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

Веб-интегратор «Максимастер» занимается разработкой веб-проектов с 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).

Подробнее о наших услугах

Посмотреть портфолио