Сталкивался ли с legacy code?

Ответ

Да, сталкивался. Работа с legacy кодом — это часть реальной разработки. Основные проблемы: отсутствие документации, устаревшие подходы, "спагетти-код".

Как решаю:

  1. Пишу тесты для критических участков перед рефакторингом.
  2. Использую постепенный рефакторинг (маленькими шагами).
  3. Документирую найденные зависимости.

Пример:

// Было
public void ProcessData()
{
    // 200 строк логики с side-эффектами
}

// Стало
public void ProcessData()
{
    ValidateInput();
    var data = ExtractData();
    TransformData(data);
    SaveResults(data);
}

Ключевое — не ломать работоспособность системы при изменениях.

Ответ 18+ 🔞

А, ну это классика, блядь! С legacy кодом сталкивался каждый, у кого руки не из жопы растут. Это как заходить в заброшенную квартиру — пыль, паутина, а где-то в углу старый дед сидит и бормочет на непонятном языке, который когда-то назывался Java 1.4.

Основные проблемы? Да их дохуя! Во-первых, документация — её либо нет, либо она написана так, что после прочтения хочется глаза спиртом промыть. Во-вторых, подходы там такие устаревшие, будто код писали на печатной машинке. И самое весёлое — это «спагетти-код», где всё так переплетено, что хуже, чем провода за твоим компьютерным столом. Ты тронешь одну строчку, а отваливается пол-продакшена, ёпта!

Как я это обычно решаю, чтобы самому с ума не сойти:

  1. Тесты пишу, как последний урод. Особенно для тех мест, которые выглядят как критически важные, но при этом напоминают шаманский ритуал. Пока не обложу это дело тестами — пальцем не трону. Иначе потом будешь сидеть и гадать, это ты сломал или оно так и должно было падать с 2015 года.
  2. Рефакторю по чуть-чуть, как крадучись. Не надо тут геройствовать и переписывать всё за один день. Маленькими шажками, постоянно прогоняя тесты. Сделал одно улучшение — проверил, что всё ещё работает. Это как разминирование, только вместо мины — баг на проде.
  3. Документирую всё, что нахожу. Но не в формальных гимнах, а так, как понятно мне и такому же бедолаге, который придёт после меня. Типа: «Вот эта хуйня здесь, потому что в 2012-м Петя из бухгалтерии попросил, а теперь все боятся это трогать. Зависит от старого сервиса X, который падает каждую пятницу».

Вот, смотри, как это бывает на практике:

Раньше была одна функция-монстр, в которую, блядь, страшно было заглядывать.

// Было (прям как в том анекдоте: "работает — не трогай", а внутри ад)
public void ProcessData()
{
    // 200 строк логики, где всё перемешано:
    // и данные читаются, и проверяются, и преобразуются,
    // и ещё куда-то записываются, а в промежутках — магические числа и side-эффекты.
    // Одним словом, пиздец.
}

А я это дело аккуратно так, по кирпичику, разобрал.

// Стало (уже почти человекопонятно)
public void ProcessData()
{
    ValidateInput(); // Сначала проверяем, что нам не подсунули хуйню
    var data = ExtractData(); // Потом вытаскиваем данные
    TransformData(data); // Превращаем их во что нужно
    SaveResults(data); // И сохраняем, блядь, результат
}

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