Создание программного обеспечения может напоминать публичное выступление. Интернет вознаграждает запусками, скриншотами и пунктами в списках изменений (changelog). Поэтому, когда разработчик тратит целую сессию на проект и не может показать ничего видимого, инстинктивно хочется назвать этот день потраченным впустую. Последний лог разработки платформы для фуд-блогов доказывает обратное. Там не было новых рецептов для отображения, не было переработанных карточек или дополнительных кнопок для пользователей. Только код, который разбирали, изучали и собирали заново, но уже лучше, чем прежде.
Это та самая невидимая работа, которая поддерживает жизнь долгосрочных проектов.
Функции получают славу, а рефакторинг поддерживает жизнеспособность
Когда вы поддерживаете платформу для фуд-блогов, внешне всё кажется простым. Пользователи публикуют рецепты, загружают фотографии и просматривают категории. Однако под капотом вы жонглируете конвейерами обработки изображений, связями в базе данных между ингредиентами и инструкциями, поисковыми индексами и слоями кэширования. Со временем мелкие исправления накапливаются. Вспомогательная функция, скопированная в три разных файла. Запрос к базе данных, который имел смысл для десяти постов, но начинает тормозить, когда их становится тысяча. CSS, который был упорядоченным, пока пять экстренных патчей не превратили его в лабиринт.
Рефакторинг означает прямое противостояние этому хаосу. Это может означать объединение дублирующейся логики, чтобы форма редактирования рецепта и админ-панель использовали один и тот же слой валидации вместо поддержки параллельных версий. Это может означать упрощение процесса обработки изображений, чтобы процедура сжатия запускалась один раз, а не при каждой перезагрузке страницы. Или это может быть реструктуризация кодовой базы, чтобы добавление нового типа контента в будущем не требовало прочесывания шести несвязанных директорий.
Ничего из этого не отображается в пользовательском интерфейсе. Посетитель, зашедший на сайт, не увидит баннера с надписью «запрос оптимизирован» или «компоненты разделены». Но он почувствует это, когда сайт станет загружаться быстрее. Он заметит, когда новая функция появится через три дня после запроса, а не через три недели. Разработчик не добавил сегодня новых возможностей. Он расчистил путь, чтобы эти возможности можно было добавлять, не сражаясь с кодовой базой.
Чистый код — это инвестиция против будущих сбоев
В каждом проекте, который живет дольше месяца, накапливается трение. Вы создаете быстрый прототип, чтобы протестировать идею. Затем появляются реальные пользователи. Затем вам нужен слой аутентификации, затем очередь модерации, а затем мобильная верстка. Каждое из этих дополнений «прикручивается» к той структуре, которая уже существует. Без регулярного обслуживания архитектура начинает напоминать дом, где каждая новая комната проектировалась другим человеком, который никогда не видел общего плана.
Технический долг — это не отсутствие дисциплины. Это естественный побочный продукт компромиссов, на которые идут ради выпуска реального продукта. Опасность не в том, что ваш код несовершенен. Опасность в том, чтобы оставлять его несовершенным так долго, что изменение одной переменной ломает три несвязанные функции. Вы начинаете бояться прикасаться к строке поиска, потому что в прошлый раз, когда вы пробовали, сломалась система тегов. Вы откладываете добавление виджета планировщика питания, потому что знаете: схема базы данных превратилась в узел, на распутывание которого уйдут часы.
Потратить день на рефакторинг — это всё равно что выплатить этот долг до того, как проценты по нему станут неподъемными. Это предотвращает превращение мелких проблем в крупные. Когда платформа для фуд-блогов в конечном итоге добавит свою следующую крупную функцию, разработчику не придется обходить стороной хрупкий код. Он напишет новую логику, подключит её к чистому интерфейсу и пойдет дальше. В этом и заключается окупаемость таких усилий.
Маленькие шаги, реальное обучение
Существуют мифы о разработке ПО, согласно которым прогресс выглядит как гениальные прорывы и марафонские сессии кодинга, переписывающие всё за одну ночь. Большинство работающих разработчиков скажут вам, что это фантазия. Настоящий прогресс выглядит как diff во вторник после обеда, когда три функции стали короче, одна избыточная зависимость была удалена, а непонятное имя переменной изменено так, чтобы следующий читатель действительно понял, что она делает.
Лог разработки платформы для фуд-блогов идеально передает этот ритм. Создание программного обеспечения — это процесс маленьких, последовательных улучшений. Вы учитесь на каждом вызове. Возможно, сегодня задачей было понять, почему определенный модуль стал так сильно зависеть от другого. Возможно, вы осознали, что упрощение, сделанное две недели назад, уже начало стоить больше времени, чем сэкономило. Каждый коммит делает проект лучше, даже если этот коммит удаляет больше, чем создает.
Этот подход также помогает сохранить мотивацию. Масштабные переписывания кода изнурительны и рискованны. Они порождают новые ошибки, исправляя старые. Инкрементальный рефакторинг, выполненный
