Рефакторинг чужого кода - как вычищать и документировать чужие проекты (и брать за это ×2 💸)

Работа с "унаследованным" кодом (legacy code) — это то, с чем рано или поздно сталкивается каждый разработчик. Часто это проекты, написанные в спешке, без тестов, с запутанной логикой и полным отсутствием документации.

Я не считаю это проблемой. Каждый опытный разработчик видит в этом не только головную боль🤣, но и надёжный способ монетизировать свои навыки. 💰

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

Фото: Рефакторинг чужого кода

Использование статических анализаторов

Вручную разбирать тысячи строк кода — долго и неэффективно. На помощь приходят статические анализаторы кода. Они сканируют код и выявляют потенциальные проблемы: неиспользуемые переменные, ошибки типизации, уязвимости и нарушения стандартов программирования.

Статические анализаторы для PHP

Инструмент Преимущества Недостатки
PHPStan Высокая точность проверки типов, очень гибкая конфигурация уровней анализа, активное сообщество. Может иметь высокую кривую обучения на высоких уровнях анализа, требователен к аннотациям типов в коде.
Psalm Глубокий анализ типов, поддержка функциональных возможностей (immutable collections), возможность автоматического исправления некоторых ошибок. Также требователен к аннотациям, может быть медленнее на больших проектах по сравнению с PHPStan.
PHPMD (PHP Mess Detector) Быстро находит общие "запахи кода" (Code Smell), полезен для обнаружения потенциальных проблем с архитектурой и сложностью. Менее глубокий анализ по сравнению с PHPStan/Psalm, не фокусируется на проверке типов.
PHP_CodeSniffer (PHPCS) Отлично подходит для поддержания единого стиля кодирования (PSR), имеет множество настраиваемых правил и стандартов. Не выполняет глубокий анализ логики или типов, сфокусирован только на стиле и синтаксисе.

Статические анализаторы для JavaScript

Инструмент Преимущества Недостатки
ESLint Чрезвычайно гибкий и настраиваемый, огромная экосистема плагинов для различных фреймворков и библиотек, широкое сообщество. Может быть сложно настроить с нуля, иногда требует много правил для достижения желаемого результата.
Prettier Полностью автоматическое форматирование, исключает споры о стиле, легко интегрируется с IDE и CI/CD. Не является линтером (не ищет ошибки логики), только форматирует код, иногда его правила могут быть слишком жёсткими.
TypeScript Compiler (tsc) Встроенная проверка типов в среде TypeScript, значительно уменьшает количество ошибок времени выполнения, улучшает предсказуемость кода. Требует переписывания JavaScript кода на TypeScript, что не всегда оправдано для существующих проектов.
JSHint / JSLint Старые, но всё ещё используемые линтеры для JavaScript. Проверка базовых синтаксических ошибок и некоторых проблем стиля. ESLint обычно более гибкий и мощный.

Статические анализаторы для Python

Инструмент Преимущества Недостатки
Flake8 Объединяет несколько инструментов (Pyflakes, pycodestyle) для проверки стиля (PEP 8) и базовых логических ошибок. Легко настраивается и расширяется плагинами. Не выполняет глубокий статический анализ типов, сфокусирован на стиле и простых ошибках.
MyPy Строгий статический анализатор типов для Python. Позволяет обнаруживать ошибки, связанные с типами, до запуска кода, что повышает надежность. Требует использования аннотаций типов в коде, что может быть дополнительной работой для существующих проектов.
Pylint Мощный и всеобъемлющий инструмент для анализа кода. Проверяет не только стиль и ошибки, но и "запахи кода", сложность и потенциальные проблемы безопасности. Может быть очень "разговорчивым" и генерировать много предупреждений, что добавляет работы в уже существующих проектах.
Black Автоматический форматтер кода. Подобно Prettier для JavaScript, обеспечивает единообразное форматирование. Не является линтером, а только форматератором. Его философия "без конфигурации" может не всем подходить.

Использование этих инструментов позволяет быстро составить "карту проблем" проекта и понять, с чего начать работу.

Фото: Рефакторинг кода - от хаоса к порядку

С чего начать? Пошаговый план аудита и рефакторинга

Работа с "плохим" кодом требует системного подхода. Не пытайтесь переписать всё сразу — это прямой путь к провалу.

  1. Шаг 1: Аудит и анализ.
    Сначала проведите полный аудит проекта. Используйте статические анализаторы, о которых я говорила выше, чтобы получить отчёт о состоянии кода. Не ленитесь! Пройдитесь по всем файлам, отмечая критические участки: места с высокой цикломатической сложностью, дублирующийся код и "волшебные" числа, разбросанные по всему проекту.
  2. Шаг 2: Рефакторинг.
    Начните с небольших, но важных улучшений. Вместо того чтобы переписывать всю систему, фокусируйтесь на конкретных участках кода. Применяйте паттерны проектирования, которые сделают логику понятнее, и используйте принципы SOLID. Ваша цель — не переписать, а улучшить существующий код, делая его читабельным и модульным. Важное правило: "Сначала тесты, потом рефакторинг". Напишите тесты для самого запутанного функционала, чтобы убедиться, что ваши изменения ничего не сломают.
  3. Шаг 3: Документирование.
    Документация — это ключ к успеху. Начните с создания общей схемы проекта, описывающей его архитектуру и взаимодействие компонентов. Затем переходите к документированию отдельных функций и классов. Используйте PHPDoc, JSDoc или другие стандарты. Документация должна быть написана так, чтобы другой разработчик смог разобраться в коде без лишних вопросов к вам.

Как продать рефакторинг — обосновываем цену клиенту

Работа с "плохим" кодом — это не просто написание нового функционала. Это устранение скрытых рисков, повышение надёжности и создание основы для будущего развития. Поэтому такая работа должна оплачиваться в 2 и более раза выше, чем стандартная разработка.

  1. Обоснуйте риски. Объясните клиенту, что без рефакторинга каждый новый функционал — это игра в рулетку. Ошибки, уязвимости и сбои будут неизбежны. Ваша работа — это страховка от будущих проблем.
  2. Предоставьте отчёт. По окончании аудита покажите клиенту отчёт, сгенерированный статическим анализатором. Цифры и графики наглядно продемонстрируют, сколько проблем скрыто в коде. Это не ваше субъективное мнение, а объективные данные.
  3. Подчеркните долгосрочные выгоды. Скажите, что ваши улучшения позволят новым разработчикам быстрее вливаться в проект, а добавление нового функционала будет занимать не недели, а дни. Это экономия времени и денег в перспективе.

Следуя этим принципам, вы превратите самую неблагодарную задачу в свою главную специализацию, которая принесёт вам высокий доход.

Nina Nokhrina
Привет! Я — full stack разработчик. Специализируюсь на реализации сложных проектов с использованием фреймворков, а также CMS (Bitrix, WordPress, PrestaShop и Magento). По вопросам разработки пишите сюда. На этом сайте я делюсь своим опытом работы на фриланс-биржах, и публикую статьи на IT-тематику. Я увлекаюсь спортом и считаю, что физическая активность важна для поддержания баланса в жизни разработчика.