По чему предсказывается продолжение
Дописывание — самая быстрая и самая незаметная из трёх скоростей. Вы печатаете, редактор показывает продолжение серым, вы соглашаетесь клавишей или продолжаете печатать своё. За рабочий день таких предложений сотни.
Чтобы пользоваться этим осмысленно, надо понимать одну вещь: откуда берётся предложение.
Предсказание строится из того, что рядом с курсором: строки выше и ниже, имя функции, в которой вы находитесь, её аргументы, соседние файлы проекта и ваши последние правки. Из всего этого модель собирает наиболее вероятное продолжение.
«Наиболее вероятное» — ключевое слово. Дописывание не понимает вашей задачи; оно продолжает узор. Если вы пишете третью однотипную ветку после двух похожих — узор очевиден, и предложение будет точным. Если вы пишете первую строку новой мысли — узора нет, и предложение будет правдоподобным, но случайным.
Из этого выходит приём, который стоит освоить первым и который не очевиден: комментарий над курсором управляет предложением.
Строка // считаем скидку по дням просрочки, максимум 30 %, написанная перед пустой функцией, меняет предложение целиком: вместо догадки о том, что здесь могло бы быть, появляется попытка сделать именно это. Комментарий — это способ сказать, чего вы хотите, не переставая печатать и не переключаясь на другую скорость.
И последнее свойство, о котором стоит знать заранее: дописывание видит и то, что вы написали неправильно. Опечатка в имени переменной двумя строками выше будет аккуратно повторена ниже; неверная формула в первой ветке продолжится во второй и третьей. Узор продолжается независимо от того, верен он или нет.
Практический вывод из этого простой и неприятный: ошибка, сделанная в начале однотипного куска, размножается быстрее, чем раньше. Раньше вы бы печатали пятую ветку руками и, возможно, заметили. Теперь пятая появляется сама и выглядит так же убедительно, как четыре предыдущие.
Отсюда приём, который стоит сделать привычкой при работе с однотипным: первые два примера пишут руками. Не из принципа, а потому что они задают узор для всех остальных. Две честно написанные строки стоят полминуты и определяют качество следующих двадцати; одна написанная и одна подсказанная — уже лотерея.
Тот же приём помогает и проверять: если третье предложение отличается от ваших двух по смыслу, а не только по данным, это видно сразу — глаз ловит расхождение узора быстрее, чем читает строку. Написав же первую строку подсказкой, вы теряете эталон, с которым сравнивать.
Где помогает, а где мешает
Теперь про то, где дописывание помогает, а где вредит. Мерка одна и простая.
Помогает там, где вы знаете ответ заранее. Третья однотипная ветка, десятое поле формы, привычная обвязка вокруг вызова, повтор соседней строки с другим именем. Здесь вы просто печатаете медленнее машины, и вся операция сводится к «да, именно это».
Мешает там, где вы думаете. Новая формула, непривычный алгоритм, место, где вы ещё выбираете между двумя способами. Предложение здесь не помогает, а прерывает: вы держали в голове нить, и на экране возник готовый вариант, который надо прочитать и оценить.
Третий случай стоит отдельно, потому что он самый неочевидный: дописывание вредно там, где вы не уверены в своей правоте.
Вы пишете условие и не до конца уверены, должно там быть «больше» или «не меньше». Редактор предлагает вариант. Вы соглашаетесь — не потому, что проверили, а потому, что предложение сняло неопределённость. Это худший вид принятия: сомнение было, и оно не разрешилось, а исчезло.
Теперь про объём. Длинное предложение — отдельный случай, и относиться к нему надо как к правке выделенного, а не как к дописыванию.
Строка-две читаются за полсекунды и принимаются почти рефлекторно. Десять-пятнадцать строк — это уже кусок кода, который надо прочитать целиком; принимать его тем же движением, что и строку, — значит принимать непрочитанное.
Практическое правило: больше пяти строк — либо читаете полностью, либо отказываетесь. Отказ здесь недорог: вы напишете первую строку сами, и следующее предложение будет точнее, потому что узор стал понятнее.
Как читать предложение за секунду
Раз предложений за день сотни, чтение каждого должно стоить меньше секунды. Иначе дописывание перестаёт экономить время и начинает его тратить.
Смотрят на три места, и только на них.
Имена. Те ли переменные и функции? Самая частая ошибка дописывания — похожее имя вместо нужного: total вместо totalNet, items вместо rows. Код при этом собирается и работает, просто считает не то.
Условия и границы. То ли сравнение и в ту ли сторону? > вместо >=, && вместо ||, первый элемент вместо последнего. Вторая по частоте ошибка и самая тихая: она проявляется на краях, а края проверяют реже середины.
Объём. Столько ли строк вы ждали? Если предложено вдвое больше ожидаемого, это уже не продолжение вашей мысли, а чужая мысль, и читать её надо по-другому.
Предложение выглядит безупречно и почти наверняка неверно: пеня считается от суммы долга, а doc.total — сумма документа с налогом. Имя правдоподобное, тип тот же, код работает. Это ровно первая строка списка — «те ли переменные», — и на неё уходит полсекунды, если знать, куда смотреть.
Теперь про то, что делать с принятым. Принять — не значит закончить. Есть три вещи, которые стоит сделать сразу, пока место перед глазами.
| Что | Зачем |
|---|---|
| запустить, если можно запустить | предложение проверяется дешевле всего сразу |
| посмотреть на края | пустой список, ноль, отрицательное — там и живут ошибки |
| спросить себя, смогли бы вы написать это сами | если нет — вы приняли непонятое |
Третья строка — не про самолюбие. Принятая и непонятая строка не исчезает: она остаётся в коде, её будут читать и править, и однажды её придётся объяснить. Проще потратить двадцать секунд сейчас, чем полчаса через месяц.
Привычки первого месяца
Последняя глава — про привычки, которые складываются вокруг дописывания за первый месяц. Складываются они сами, и не все полезные.
Первая привычка: печатать меньше слов. Заметив, что предложение появляется после трёх-четырёх знаков, человек начинает писать имена короче и небрежнее — всё равно допишется. Через месяц в коде calc, proc, tmp2, и читать его стало труднее, чем было.
Лечится это знанием одного факта: дописывание опирается на имена. Говорящее имя функции даёт точное предложение, невнятное — догадку. Короткие имена не экономят время, а ухудшают качество того, ради чего вы их сокращали.
Вторая привычка: соглашаться по инерции. После сотни верных предложений палец нажимает клавишу раньше, чем глаз дочитал. Это неизбежно и не лечится силой воли — лечится тем, что в местах, где цена ошибки высока, дописывание выключают.
| Где стоит выключить | Почему |
|---|---|
| расчёты денег и налогов | имя правдоподобно, цифра неверна, тест не всегда есть |
| условия доступа и прав | «не меньше» вместо «больше» открывает лишнее |
| миграции и скрипты, меняющие данные | необратимо, а предложение выглядит обычным |
| код, который вы сейчас придумываете | прерывает мысль и не экономит |
Третья привычка — хорошая, и её стоит завести намеренно: писать комментарий перед пустым местом. Это и управление предложением, и способ сформулировать задачу самому себе. Вторая польза нередко оказывается больше первой.
И последнее — про то, как дописывание сочетается с двумя другими скоростями. Оно не конкурент им, а основа: большая часть дня проходит на нём, и на другие скорости уходят по необходимости.
Переход происходит в момент, когда вы ловите себя на мысли «это надо объяснить словами». Объяснить словами — это уже правка выделенного; объяснить и не знать где — поручение. А пока объяснять нечего и вы просто пишете код, который знаете, работает первая скорость, и она самая дешёвая из трёх.
И совсем последнее — про то, что дописывание делает с чтением чужого кода, хотя, казалось бы, к чтению отношения не имеет. Оно приучает узнавать, а не разбирать. Сотня предложений в день, каждое из которых оценивается за секунду, тренирует именно узнавание: «выглядит как обычно — да».
Навык полезный и переносится он на чужой код целиком — вместе со своей слабостью. Место, которое «выглядит как обычно», перестаёт читаться, а именно в таких местах и прячутся тихие ошибки: те самые имена и границы. Отсюда простое противоядие: там, где вы проверяете чужое, читайте, а не узнавайте, — и различать эти два режима стоит намеренно.