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