Обновляем устаревший ИТ-проект. Способ, с которым справится не каждая команда

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

В моей практике был проект, код которого начали писать в 2000-ых годах на одном из самых популярных тогда (да и сейчас тоже) языков веб-разработки — PHP. В течение многих лет код дополнялся, дописывался, обрастал новыми функциями и даже прошел через пару частичных обновлений. И все же значительная часть проекта сохранялась с его зарождения. В этой статье я расскажу, как нашей команде удалось реанимировать его и постепенно обновить всю кодовую базу.

С чего все началось

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

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

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

С такими исходными данными проект попал в работу к ИТ-компании Resolventa.

Приступаем к работе

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

Второй вариант — параллельно развивать две версии сайта (старую и новую). Однако это было слишком дорого и влекло за собой возможные проблемы с синхронизацией двух команд разработки.

Третий вариант — постепенная модернизация кодовой базы. Код хоть и был устаревшим, но не выглядел безнадежно. В основе лежал какой-никакой MVC фреймворк, работающий на PHP 5.6. Совместно с владельцем проекта мы выбрали именно этот путь, потому что посчитали, что плавный перенос кодовой базы повлечет минимум потерь для бизнеса и ускорит внедрение новых возможностей на сайт.

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

Общие требования клиента относительно дальнейших бизнес-планов включали:

  • Развитие старого сайта. По запросу мы расширяем функциональность старой версии проекта на CakePHP.
  • Адаптивный дизайн. Пользователям удобно пользоваться сайтом вне зависимости от устройства.
  • Гибкость и изменяемость. Новый фреймворк и архитектура сайта позволяют быстро создавать и внедрять новый функционал.
  • Масштабируемость. Проект выдерживает рост пользователей и общую нагрузку.

Реализуем решение

В качестве новой платформы для FishingSib мы выбрали фреймворк Symfony. Библиотеки из него можно использовать независимо друг от друга и встраивать в другие приложения на PHP. Это позволило настроить тесную интеграцию со старым фреймворком на время переноса.

Чтобы реализовать поставленную задачу, мы составили пошаговый план:

  1. Организовали тестовое покрытие старого кода. FishingSib посещают десятки тысяч пользователей ежедневно, поэтому при обновлении было важно обеспечить бесперебойную работу сайта. Для этого наша команда написала больше 150 приемочных авто-тестов. Новый код писали сразу с нужным уровнем тестового покрытия, необходимым для проверки работоспособности сайта.
  2. Создали веб-приложение на Symfony. На этом этапе у нас уже было готово две версии сайта, но они еще не взаимодействовали.
  3. Добавили надстройку для предварительной подготовки запросов пользователей. Перенесли туда все промежуточные обработчики, которые используют обе версии сайта на разных страницах. В них выполнялась проверка прав доступа, авторизация, переадресация по страницам. Там же распределялись между Symfony и CakePHP запросы пользователей.
  4. Настроили связь между старым и новым фреймворками. Написали функции так, чтобы в Symfony можно было вызвать блок старого кода на CakePHP, а в CakePHP — вызвать новый код на Symfony. Тем самым мы наладили одновременную работу разделов сайта, которые написаны с разницей в десять лет.
  5. Поочередный перенос разделов сайта. На этом этапе также создавали новую функциональность, если появлялся соответствующий запрос от клиента. То есть, мы могли создать новый раздел на Symfony, не дожидаясь завершения полного переноса.
  6. Провели уборку. Когда разработчики закончили обновление, старый сайт на CakePHP удалили. Итоговая архитектура сайта стала стандартной для Symfony.
Веб-портал до обновления.
И после проведенной модернизации.

Подводим итоги

Полноценное обновление кодовой базы FishingSib было завершено к 2020 году. Перезапуск проекта позволил адаптировать проект под растущие требования бизнеса.

Мы расширили функционал веб-портала, например добавили бизнес-аккаунты — коммерческие страницы для размещения рекламы и общения с целевой аудиторией. Это нововведение стало основой для дальнейшего развития сайта.

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

  • Данные пользователей и владельца сайта лучше защищены от злоумышленников, так как в новой версии PHP меньше уязвимостей.
  • Сайт стало проще развивать и поддерживать, а благодаря актуальному стеку заказчику будет легче при необходимости нанять разработчика.
  • Пользователям стало удобнее просматривать сайт на планшетах и телефонах, так как теперь он автоматически адаптируется под размер экрана. Веб-портал выглядит современно, а навигация по разделам стала понятнее.
  • Страницы теперь загружаются в 2,5 раза быстрее, а значит, больше пользователей остается на сайте.
Визуализация скорости загрузки сайта.

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

Вместе с командой мы создаем и поддерживаем сложные ИТ-продукты: маркетплейсы, интернет-магазины, веб-сервисы и приложения, B2B-порталы, кастомные CRM- и ERP-системы, SaaS-платформы. В том числе, беремся за перезапуски и масштабные обновления устаревших проектов. За нашими плечами десятки задач, которые потребовали нестандартных решений. Если ваш проект сталкивается с подобными вызовами — напишите в комментариях, как вы с ними справляетесь.

0
Комментарии
-3 комментариев
Раскрывать всегда