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

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

Идеология

  • Мы — технари

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

  • Делаем сложные процессы и интеграции

    Делаем сложные процессы и интеграции

  • Растим специалистов

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

  • Гибкость в подходе к работе

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

  • Следуем за целью бизнеса

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

  • Фокус на долгосрочную перспективу

    Фокус на долгосрочную перспективу

Организация

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

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

  • Выбираем способ управления

    Scrum, Kanban, XP, Waterfall

  • Техническое задание

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

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

  • Разбивка на задачи

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

  • Релизы и контроль сроков

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

  • Code review

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

  • Тестирование

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

  • Документация

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

Техника

  • Единое окружение

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

  • Единый инструментарий

    Используем единый и эффективный инструментарий (например, OS Linux, IDE PhpStorm).

  • Стандарты и принципы

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

  • Контроль версий Git

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

  • Зависимости

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

  • Декларативный подход

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

  • Протоколы взаимодействия

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

  • Continuous Integration, Continuous Delivery

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

  • Хранение состояний

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

  • Масштабирование

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

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

  • Использование Docker

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

  • Логирование

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

  • Используем консоль

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

  • Приемочные и модульные тесты

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

  • Мониторинг приложения

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

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

  • Нагрузочное тестирование

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

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

  • Оптимизация проекта

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

  • Интерактивные интерфейсы

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