Легаси-код — это не приговор, а вызов. Каждый разработчик хотя бы раз сталкивался с проектом, где правки занимают часы, а тесты напоминают русскую рулетку. Но что, если превратить этот хаос в управляемый процесс с помощью ИИ? Я собрал 10 промтов, которые использую сам, чтобы рефакторить legacy-системы без боли и с сохранением поведения. Они проверены на реальных проектах — от банковских монолитов до стартап-простыней. Вот как это работает.
Почему ИИ — идеальный партнёр для рефакторинга
Рефакторинг legacy-кода — это как операция на открытом сердце: один неверный шаг — и всё рухнет. ИИ не заменяет опыт, но берёт на себя рутину: анализ зависимостей, поиск дублирования, предложение безопасных изменений. Согласно отчёту McKinsey, ИИ может ускорить разработку на 30–50%, но главное — он снижает риск человеческой ошибки. Я не говорю о слепом доверии: каждый промт требует проверки, но экономит часы ручной работы.
Промт 1: Анализ зависимостей и «запахов» кода
Промт: "Проанализируй этот модуль на наличие антипаттернов (God Object, Spaghetti Code, Copy-Paste). Покажи зависимости между классами и предложи, как их разорвать."
Пример: В legacy-проекте на Java был класс OrderService на 2000 строк. Промт выявил 5 дублированных блоков и 3 скрытые зависимости. Мы разбили его на 4 сервиса, и время сборки сократилось на 40%.
Промт 2: Составление карты рисков перед рефакторингом
Промт: "Составь карту рисков для рефакторинга этого модуля: какие изменения могут сломать поведение, где нужны тесты, какие методы лучше не трогать без необходимости."
Пример: Для модуля оплаты на PHP промт выделил критические методы (расчёт налога) и предложил добавить юнит-тесты до рефакторинга. Это предотвратило регрессию в проде.
Промт 3: Пошаговый план рефакторинга с сохранением поведения
Промт: "Предложи пошаговый план рефакторинга этого класса. Каждый шаг должен сохранять внешнее поведение. Укажи, какие тесты добавить на каждом этапе."
Пример: Для Python-скрипта обработки данных план включал 5 шагов: от выделения функций до замены глобальных переменных. Каждый шаг сопровождался тестом, и мы не сломали ни одного кейса.
Промт 4: Выделение модулей и микросервисов
Промт: "Разбей этот монолит на модули, соблюдая принципы SOLID и DDD. Покажи границы модулей и их интерфейсы."
Пример: В C#-монолите промт выделил модуль Inventory и Billing, что позволило вынести их в микросервисы без переписывания всей системы.
Промт 5: Перевод на современный стек
Промт: "Перепиши этот код на современный стек (например, Java 17 → Java 21, Python 2 → Python 3). Учти изменения API, синтаксиса и лучших практик."
Пример: Перевод с Python 2 на 3 занял бы неделю вручную. Промт сгенерировал основную часть изменений (print → print(), xrange → range), осталось проверить 10%.
Промт 6: Автоматическая генерация тестов
Промт: "Сгенерируй юнит-тесты для этого класса, покрывающие основные сценарии и крайние случаи. Используй фреймворк [JUnit/pytest]."
Пример: Для класса PriceCalculator промт создал 15 тестов, включая граничные значения и null-кейсы. Покрытие выросло с 20% до 85%.
Промт 7: Рефакторинг с помощью «золотых мастер-тестов»
Промт: "Создай набор тестов, которые фиксируют текущее поведение (characterization tests) для этого модуля. Они станут основой для безопасного рефакторинга."
Пример: Для старого Perl-скрипта промт сгенерировал тесты, которые проверяли вывод на 50 входах. После рефакторинга все тесты прошли — поведение сохранено.
Промт 8: Улучшение читаемости без изменения логики
Промт: "Улучши читаемость этого кода: переименуй переменные, разбей длинные методы, добавь комментарии. Не меняй логику."
Пример: В JavaScript-функции на 150 строк промт переименовал x в userCount, вынес условия в отдельные функции. Код стал понятен новичку за 5 минут.
Промт 9: Поиск и устранение дублирования
Промт: "Найди дублирующийся код в этих файлах и предложи способ его объединить, сохранив поведение."
Пример: В двух модулях было 30% общего кода. Промт предложил вынести его в общий модуль, сократив размер кодовой базы на 20%.
Промт 10: Анализ производительности и узких мест
Промт: "Проанализируй этот код на предмет узких мест производительности. Предложи оптимизации, не меняя API."
Пример: В SQL-запросе промт нашёл N+1 проблему и предложил JOIN. Время ответа упало с 2 секунд до 200 мс.
Как выбрать правильный промт
| Ситуация | Рекомендуемый промт |
|---|---|
| Не знаешь, с чего начать | Промт 1, 2 |
| Нужен безопасный план | Промт 3, 7 |
| Переход на новый стек | Промт 5 |
| Улучшение читаемости | Промт 8 |
| Оптимизация производительности | Промт 10 |
Практические советы по использованию промтов
- Начинай с малого: выбери один модуль, а не весь проект.
- Всегда проверяй: ИИ может ошибаться, поэтому прогоняй тесты.
- Используй контекст: давай ИИ больше информации о коде, чтобы ответ был точнее.
- Комбинируй промты: например, сначала карта рисков, потом план.
Заключение
Рефакторинг легаси-кода — это не магия, а системный подход. ИИ с правильными промтами становится вашим ассистентом, который берёт на себя рутину и снижает риски. Начните с одного промта, протестируйте на небольшом модуле — и вы увидите, как «болото» превращается в чистую архитектуру. Поделитесь в комментариях, какие промты работают у вас!
Статья написана на основе личного опыта и рекомендаций из документации OpenAI и Martin Fowler's Refactoring. Все примеры являются обобщёнными и не раскрывают конфиденциальные данные.
Комментарии