Код работает. Криво, с повторами, с переменными a, tmp и data2, но работает. И внутри шевелится мысль: «надо бы причесать». А следом — растерянность: причесать что именно? Где тут грязь, а где просто непривычный тебе код, который трогать не надо? Новичок чаще застревает не на «страшно сломать», а на «не вижу, за что хвататься».
Вот про это и поговорим. Рефакторинг — это улучшение кода без изменения того, что он делает: снаружи всё работает так же, внутри становится понятнее. Но прежде чем что-то менять, надо это «что-то» опознать. У плохого кода есть узнаваемые приметы — программисты называют их запахами кода. Научишься их различать — и Claude из «давай улучшим как-нибудь» превратится в напарника с чётким списком дел.
Запах кода — это не про «уродливо», а про «потом будет больно»
Запах не значит, что код сломан. Он значит, что с ним будет тяжело жить: трудно понять, легко сломать при правке, страшно расширять. Это как трещина в стене — стена ещё стоит, но чинить лучше сейчас. Вот приметы, которые видит даже новичок:
- Копипаста. Один и тот же кусок в трёх местах. Поправишь в одном — забудешь про два других, и привет, баг.
- Имена-загадки.
d,flag,doStuff(). Через неделю ты сам не вспомнишь, что это. - Функция-простыня. Тянется на два экрана и делает пять дел сразу. Чтобы понять одно, читаешь всё.
- Лес вложенности.
ifвнутриifвнутриforвнутриif. Глаз теряется на третьем уровне. - Мёртвый код. Функции, которые нигде не вызываются. Висят и путают.
Заметил хоть одну примету — вот тебе и адрес для рефакторинга. Не «весь файл уродливый», а конкретно: «здесь копипаста», «тут имя ни о чём».
Пусть запахи ищет Claude
Хорошая новость: тебе не обязательно вынюхивать всё это вручную. У Claude перед глазами весь проект, и он видит повторы и мёртвый код надёжнее, чем глаз новичка. Начни не с правки, а с диагноза:
«Посмотри на этот файл и скажи, что тут стоило бы почистить и почему. Только покажи проблемы, пока ничего не меняй».
Получишь список с объяснениями: вот тут копипаста, вот эта функция делает слишком много, эту переменную никто не использует. Это твоя карта. Теперь главное — не кидаться чинить всё разом.
Совет
Раздели диагноз и лечение на два отдельных шага. Сначала проси только найти запахи и объяснить их — так ты увидишь масштаб и сам решишь, что важно. И лишь потом проси починить по одному пункту. Если сразу сказать «найди и исправь всё», Claude перепашет полфайла одной кучей, и ты не разберёшь, что откуда взялось.
Чистим по одному запаху — точными словами
Когда карта на руках, бери по одной проблеме за заход. Формулировки решают: чем точнее цель, тем меньше шансов, что Claude заодно перепишет логику. Сравни.
Слабо: «улучши этот файл». «Улучшить» можно как угодно — добавить функций, сменить поведение, переписать стиль. Получишь сюрприз.
Сильно — адресно под конкретный запах:
- Против копипасты: «Этот повторяющийся кусок вынеси в одну функцию, поведение не меняй».
- Против имён-загадок: «Переименуй переменные в понятные имена:
d→daysLeft,calc→calculateTotal». - Против простыни: «Разбей эту длинную функцию на несколько коротких, каждая делает одно дело».
- Против мёртвого кода: «Найди и удали функции, которые нигде не вызываются».
Волшебная добавка почти к любому запросу — «поведение не меняй, только структуру». Эта фраза прямо говорит Claude: это рефакторинг, а не новая фича. И сразу проси показать, что именно поменялось: «после правки покажи изменения». Беглый взгляд на правки занимает секунды и спасает от часов поиска поломки — как именно читать это «было/стало», мы разбирали в посте про diff.
Главное — не чинить всё сразу
Самая частая ловушка новичка — азарт. Claude выдал список из восьми запахов, и хочется одной командой «исправь всё». Не надо. Когда в одном заходе и переименование, и вынос функции, и удаление кода — а что-то отвалилось, ты не поймёшь, какая из правок виновата. Придётся откатывать весь ком.
Поэтому ритм такой: один запах — одна правка — проверка — и только потом следующий. Проверка здесь не формальность, а смысл всей затеи. Рефакторинг честный, только если ты убедился, что поведение не изменилось.
- Есть тесты? Прогони их после каждого шага. Зелёные — значит ничего не задел. Это и есть страховка; как её завести с нуля — в посте про тесты с Claude.
- Тестов нет? Тогда проверяй руками: запусти, прокликай то, что трогал. Медленнее, но обязательно.
- Удачный шаг — сохрани. Коммит на рабочей версии превращает любой следующий неудачный шаг в одну команду отмены.
Важно
Не смешивай рефакторинг и новую фичу в одном заходе. Это две разные задачи: первая меняет форму и не трогает поведение, вторая меняет поведение. Слепишь их вместе — при поломке не разберёшь, виновата чистка или новая функциональность. Сначала причешись на рабочей версии, потом отдельно добавляй новое.
Ритм важнее героизма
Рефакторинг перестаёт пугать, как только ты перестаёшь смотреть на файл как на монолит «всё плохо» и начинаешь видеть отдельные запахи. Дальше всё просто: спросил у Claude, что чистить → взял один пункт → попросил починить, не трогая поведение → проверил → сохранил → следующий.
В этом ритме Claude Code — быстрый и глазастый напарник: он находит грязь, которую новичок проглядит, и убирает её аккуратно. Но решаешь, что важно, и держишь руку на тормозе — ты. Чистый код — это не разовый подвиг, а привычка убирать по чуть-чуть, пока не разрослось.
Если хочется освоить и терминал, и Git, и сам цикл «правка → проверка» с нуля и на практике — у нас есть бесплатный курс ровно про это, с тренажёром прямо в браузере.