← Назад к вопросам
Что будешь делать на старте работы с легаси-кодом?
2.0 Middle🔥 191 комментариев
#Архитектура и паттерны
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Работа с Legacy-кодом: мой подход
Работа с legacy кодом — это одна из самых частых задач в реальной разработке. Я разработал системный подход для такой работы.
Этап 1: Анализ и Понимание (неделя 1)
Что я делаю:
-
Документирование текущего состояния
- Читаю существующую документацию (если есть)
- Понимаю архитектуру проекта
- Инвентаризирую основные модули
- Чиню техдолг список
-
Запуск проекта локально
- Клонирую репозиторий
- Настраиваю окружение
- Запускаю existing tests
- Запускаю приложение, видю как оно работает
-
Читаю важные части кода
- Точка входа (index.php, routing)
- Основные бизнес-логика
- Интеграции с внешними сервисами
- Критичные функции для безопасности
-
Общение с командой
- Спрашиваю у того, кто писал/поддерживал код
- Узнаю историю проекта
- Понимаю что планировалось, но не реализовано
- Выясняю самые болезненные места
Этап 2: Оценка (неделя 2)
Создаю отчёт с приоритизацией:
# Legacy Code Assessment
## Критичные проблемы (Блокеры)
- Security уязвимости (SQL injection, XSS, CSRF)
- Performance проблемы (N+1 запросы, медленные endpoints)
- Нестабильность (частые crashes, memory leaks)
- Потеря данных
## Важные проблемы (Спринты 1-3)
- Отсутствие тестов
- Плохая документация
- Технический долг
- Code duplication
## Можно отложить (На потом)
- Рефакторинг красоты
- Переписывание работающих функций
- Миграции на новые версии (если текущие работают)
Этап 3: Сначала - Стабильность
Не рефакторю сразу! Сначала делаю:
-
Добавляю тесты для критичного кода
// Пишу тесты для существующего функционала // Это позволит обнаружить баги и не сломать во время рефакторинга public function test_payment_processing_with_valid_card() { $result = (new PaymentService())->process($validCard, 100); $this->assertEquals('success', $result['status']); } -
Исправляю критичные security баги
- SQL injections
- XSS уязвимости
- CSRF атаки
- Hardcoded passwords
-
Оптимизирую явные performance проблемы
- N+1 запросы в БД
- Неиспользуемые запросы
- Медленные endpoints
Этап 4: Документирование
Создаю документацию по ходу понимания:
# Project Architecture
## Database
- MySQL 5.7
- Main tables: users, orders, products
- No migrations (manual updates)
## API Endpoints
GET /api/users/{id} - получить пользователя (устарело, не использовать)
GET /api/v2/users/{id} - новый endpoint
## Known Issues
1. Payment processing sometimes fails (investigate async issues)
2. Reports generation too slow (needs indexing)
3. Email notifications not sent reliably
Этап 5: Postepенный Рефакторинг
Принцип: Boy Scout Rule (оставляй код чище, чем нашёл)
// ❌ Не делаю полный рефакторинг сразу
// Не переписываю весь код в один коммит
// ✅ Делаю маленькие улучшения
function getUserWithOrders($userId) {
$user = User::find($userId);
// Сначала добавлю тест
// Потом отрефакторю с использованием Eloquent relationships
// Результат: User::with('orders')->find($userId)
// Маленький шаг за шагом, каждый шаг протестирован
}
Приоритет рефакторинга:
- Код, который часто меняется
- Код, который читают многие
- Критичный бизнес-код
- Код с bugs (во время исправления bug фиксим и style)
Этап 6: Инструменты и Автоматизация
Внедряю постепенно:
# 1. Static analysis
composer require phpstan/phpstan --dev
phpstan analyse src/
# 2. Code style
composer require squizlabs/php_codesniffer --dev
phpcbf src/ # Auto-fix
# 3. Testing
composer require phpunit/phpunit --dev
phpunit
# 4. CI/CD
# Добавляю GitHub Actions / GitLab CI
# Тесты должны пройти перед merge
Этап 7: План на долгосрок
Создаю Roadmap рефакторинга:
Q1 2024:
- Написать тесты для payment module
- Исправить SQL injection уязвимости
- Оптимизировать slow queries
Q2 2024:
- Перейти на Laravel 10 (или стоит ждать?)
- Разделить на микросервисы (если нужно)
- Добавить proper logging
Q3 2024:
- Переписать legacy authentication
- Обновить dependencies
Основные принципы
- Не ломать — первая задача это стабильность
- Тесты первыми — перед любым изменением
- Маленькие шаги — не переписывать всё за раз
- Документировать — помогает себе и команде
- Обсуждать — легаси код часто имеет причины быть таким
- Метрики — отслеживаю улучшения (тесты, производительность)
Чего избегаю
- Переписывания кода, который работает
- Добавления новых dependencies без необходимости
- Рефакторинга без тестов
- Больших PR'ов (hard to review)
- Удаления кода "потому что он плохо написан"
- Игнорирования причин, почему код такой