Подход к рефакторингу с ИИ
ИИ уже давно получил широкое распространение в разработке программного обеспечения. Это неплохой инструмент для написания нового кода, но когда дело доходит до рефакторинга, я думаю, что существуешь фундаментальный недостаток…
ИИ работает как статистическая модель, то есть выдает наиболее вероятный результат. Такой подход отлично работает, при создании новое. Но когда мне нужен рефакторинг, то мне нужна полная уверенность, что преобразование кода не изменяет поведение кода. Иначе я получаю не рефакторинг, а новое поведение — лучше ли оно, хуже ли, уже не столь важно. Так что мне нужна 100% уверенность, что рефакторинг не вносит изменений в поведение кода, а это то, что ИИ не может предоставить, разве что код на 100% покрыт тестами — но это совсем другая тема, которую я сейчас развивать не буду.
Делает ли это ИИ бесполезным для рефакторинга? И да, и нет. Я не буду использовать инструмент ИИ для выполнения самого рефакторинга, но есть кое-что, что ИИ может сделать для рефакторинга, и что было для меня настоящей болью.
Всякий раз, когда мне нужен рефакторинг, самое сложное — это угадать, какой форма кода (code shape) в конце. Я прекрасно знаю, чего хочу от кода заранее — я хочу сделать что-то новое возможным, вроде более легкого внедрения фичи или чтобы баг стал легко исправимым. Другими словами:
Для каждого желаемого изменения, сделай изменение легким (предупреждение: это может быть сложно), потом сделай легкое изменение. Кент Бек (Источник)
Поскольку я редко знаю (или должен сказать «знал» к этому моменту…), на что будет похож код после рефакторинга, то каждый шаг рефакторинга — это небольшой «шаг в никуда», который, я верю, приведет меня к «сделать легкое изменение». Но это не обязательно правда, что приводит к довольно значительному количеству переделок и отмененным коммитам, если не целым веткам, пока я пытаюсь найти ту самую форму кода, угадывая к ней пути.
Но если посмотреть на проблему с обратной стороны, то «легкое изменение» должно быть довольно очевидным перед рефакторингом — иначе зачем вообще рефакторить. И это «легкое изменение» можно легко выразить на человеческом языке, вроде «я хочу иметь возможность добавлять новые компоненты здесь одной строкой кода». Проблема в том, что мы не знаем выражение этого на коде.
И помощь ИИ может быть бесценной — он может генерировать эти формы кода, к которым код можно отрефакторить. Я использую промпты вроде этого, чтобы получить побольше возможностей:
```tsx
// код здесь
```
Вот мой код модального окна входа, написанный на React. Видно, что добавление новых шагов довольно сложное и требует много кода. Предложи мне 5 способов отрефакторить это, чтобы добавление новых шагов стало простым, в идеале одной строкой.
Я выбираю форму кода (не сам код), которая мне нравится, теперь у меня есть желаемый результат, и я могу рефакторить к нему маленькими, безопасными шагами. В конце результат может не совпадать с тем, что предложил ИИ (по ходу дела часто рождаются новые идеи), но это и не надо, ведь я стремлюсь в первую очередь к нужной форме кода, и ее нахождение с помощью ИИ было чрезвычайно полезным.