Выделение задаёт границы
Вторая скорость: вы показываете кусок кода и говорите словами, что с ним сделать. Редактор меняет этот кусок и показывает, что изменилось.
Отличие от поручения — в том, что место вы называете сами, и называете его не словами, а выделением. Отсюда и главное свойство этой скорости, и главный источник неожиданностей.
Что выделено, то и будет тронуто. Звучит очевидно, пока вы не выделили лишнего или недостаточно.
Выделили одну строку — правка будет внутри строки: переименовать, поменять условие, добавить проверку. Выделили функцию — правка внутри функции: вынести кусок, упростить ветвление, обработать край. Выделили весь файл — это уже не правка выделенного, а поручение, у которого не сказаны границы, и результат будет соответствующий.
Второе свойство, из которого растёт вся польза этой скорости: вы видите старое и новое рядом. Не готовый результат, а именно изменения — что было и что стало.
Это меняет проверку целиком. В поручении вам приходится читать дифф по нескольким файлам и держать в голове, что там было раньше. Здесь старое перед глазами, изменение подсвечено, и вопрос «то ли оно теперь делает» решается за секунды.
И третье, о чём стоит знать заранее: выделение попадает в контекст целиком, а остальное — по обычным правилам. То есть агент видит и то, что выделено, и открытый файл, и найденное поиском. Выделение не сужает контекст — оно указывает, где менять.
Практическое следствие приятное: ссылаться на соседнее можно. «Сделай здесь так же, как в функции выше» работает, хотя функция выше не выделена: она в открытом файле, и агент её видит.
Из чего состоит фраза
Теперь про слова. Фраза на этой скорости короткая — одна строка, — и состоит из трёх частей.
Что сделать — глагол: вынеси, упрости, добавь, переименуй, разбей. Он есть всегда, и обычно с ним проблем нет.
С чем именно — чаще всего заменяется выделением. Иногда всё же нужно: «в этом условии», «во втором цикле», «только в обработке ошибок».
Чего не менять — та часть, которую пропускают, и та, из-за которой правка выходит шире задачи.
Список глаголов, которые работают хорошо, короткий и стоит того, чтобы его знать.
| Глагол | Что получается |
|---|---|
| вынеси в функцию | точная механическая операция, почти без сюрпризов |
| переименуй | то же самое, и видно сразу |
| добавь обработку пустого значения | названо условие — значит, названа и граница |
| разбей на два шага | структура меняется, поведение нет |
| упрости условие | работает, если сказано «поведение не меняй» |
| сделай как в функции выше | образец вместо описания — лучший вид задания |
И список тех, что работают плохо, — он короче и полезнее.
| Фраза | Почему плохо |
|---|---|
| «сделай лучше» | лучше по чьей мерке? он выберет свою |
| «оптимизируй» | по скорости? по памяти? по читаемости? это разные правки |
| «почини» | не сказано, что сломано; он найдёт что-нибудь |
| «причеши» | приглашение тронуть всё, что покажется неровным |
И приём, который стоит освоить: вместо описания — образец. «Сделай здесь так же, как в функции выше» точнее любого описания стиля, потому что образец содержит то, что вы не сумели бы сформулировать: порядок, имена, способ обработки ошибок, привычные для проекта мелочи.
Это работает и через файл: «сделай как в services/orders.js». Файл не обязан быть открыт — достаточно назвать его, и агент его прочитает.
И последнее про слова — про то, чего в них быть не должно. Вежливость и объяснения тратят место и ничего не добавляют. «Пожалуйста, если тебе не трудно, посмотри вот этот кусок, мне кажется, он немного громоздкий, может быть, его стоит как-то улучшить» — это одна мысль, размазанная на строку, и мысль эта пустая.
Та же задача в рабочем виде: «вынеси проверки в начало, поведение не меняй». Семь слов, три части, проверяемый результат. Разница не в тоне, а в том, что во второй фразе есть всё нужное и нет ничего лишнего, — и читать её агенту так же легко, как вам.
Как принимать правку
Правка сделана и показана. Теперь как её принимать — быстро и не пропуская главного.
Смотрят на четыре вещи, и первая ловит больше всех остальных вместе.
Границы: тронуто ли лишнее. Изменённые строки за пределами того, что вы выделяли, — это сюрприз, и его надо заметить до того, как вы посмотрели на смысл. Проверяется за секунду: взгляд на то, где подсвечено.
Смысл: то же ли оно делает. Если вы просили не менять поведение — проверяется именно это. Если просили изменить — проверяется, что изменилось ровно так, как вы хотели, а не «примерно в ту сторону».
Имена: те ли переменные. Та же ошибка, что в дописывании, и такая же тихая: похожее поле вместо нужного.
Края: пусто, ноль, отрицательное. Правка могла быть верной для обычного случая и сломать край, который раньше обрабатывался случайно.
Первые три строки — ровно то, о чём просили. Четвёртая — нет: проверка появилась сама, потому что агент решил, что она здесь уместна. Поведение изменилось, хотя просили не менять, и в итоговом коде это выглядит совершенно естественно. Видно только в диффе.
Теперь про отказ. Отказаться от правки здесь дешевле, чем где-либо ещё: ничего не тронуто, файл в прежнем состоянии, и вы потеряли двадцать секунд.
Отсюда стратегия, которая экономит больше всего времени: не чинить неудачную правку, а отказаться и сказать точнее. Второй заход с уточнённой фразой почти всегда лучше, чем ручная доработка того, что пришло не тем.
И последнее про приёмку: после принятия запускают. Не тесты целиком — то, что можно запустить за секунды: сам файл, одну проверку, страницу. Правка выделенного мелкая, и её проверка тоже должна быть мелкой; откладывать её до общего прогона значит потерять то преимущество, ради которого эту скорость и выбрали.
Где выигрывает и где проигрывает
Последняя глава — про то, где эта скорость выигрывает у двух других и где проигрывает.
| Случай | Почему вторая скорость лучше |
|---|---|
| правка, в которой вы сомневаетесь | старое перед глазами, дифф маленький, отказ бесплатный |
| чужой код, который вы плохо знаете | тронуто будет ровно выделенное |
| денежные и правовые расчёты | изменение видно построчно, а не по результату |
| правка, которую надо объяснить на ревью | вы видели каждое изменение и можете его назвать |
Третья строка стоит отдельного слова. Там, где ошибка дорога, ценность не в скорости, а в прозрачности: вы видите каждое изменённое сравнение и каждое изменённое поле. Поручение на том же месте даёт правильный на вид результат и требует восстановления того, что было.
Где вторая скорость проигрывает — тоже три случая, и все три вы уже знаете.
| Случай | Почему лучше поручение |
|---|---|
| одно и то же в пяти местах | выделять пять раз — потерять целое |
| место неизвестно | выделять нечего: сначала надо найти |
| правка тянет за собой соседнее | тест, вызывающий код, документация |
Теперь про сочетание скоростей внутри одной задачи — то, ради чего написана глава.
Лучший порядок для сомнительной работы: поручить, потом поправить выделением. Агент находит места и делает основную часть; вы читаете дифф и в двух местах, где сделано не то, правите выделением — точечно, с границами, видя старое.
Обратный порядок тоже бывает полезен: сделать один пример выделением, потом поручить остальное. Тогда в проекте есть образец, на который можно сослаться, и поручение звучит просто: «сделай в остальных местах так же, как здесь».
И последнее — про то, что вторая скорость даёт помимо кода. Она показывает разницу между вашим вариантом и другим, а это единственный способ увидеть приём, о котором вы не знали.
Вопрос «вынеси это и скажи одной строкой, почему так лучше» стоит столько же, а даёт вдвое больше: код и объяснение, которое можно проверить, потому что код перед глазами. Это самый дешёвый способ учиться из всех трёх скоростей, и он не требует отдельного времени.
И совсем напоследок — про случай, которого в таблицах нет, потому что он не про выбор скорости. Иногда правильный ответ — не править вовсе. Вы выделили кусок, посмотрели на него, собрались сказать «упрости» — и поняли, что он не громоздкий, а просто незнакомый: вы его давно не читали.
Это стоит замечать, потому что вторая скорость делает переписывание слишком лёгким. Раньше желание «причесать» упиралось в десять минут работы и обычно проходило само; теперь оно стоит двадцать секунд, и код в проекте начинает меняться не потому, что так лучше, а потому, что так дёшево. Правило из курса про переделку действует здесь целиком: повод — приходящая сюда задача, а не ощущение.