Tab выглядит как обычное автодополнение из любого редактора, и это первая ловушка. Серое продолжение появляется под курсором, его принимают клавишей, работа идёт быстрее - кажется, что перед вами тот же механизм, что и в ванильном VS Code, только точнее. Из этого впечатления растёт привычка нажимать Tab не глядя, и именно она позже оборачивается правками, которых никто сознательно не вносил.
На деле Tab в Devin Desktop опирается на куда более широкий контекст, чем словарь текущего файла. По документации он учитывает текущий файл и соседний код, недавние действия в редакторе, активность терминала и историю чата с агентом; буфер обмена подключается только при явном включении в расширенных настройках. Значит, предложение - не продолжение строки по частоте токенов, а догадка о вашем намерении, собранная из нескольких источников сразу.
Отсюда и вторая особенность: Tab предсказывает не только текст, но и следующий шаг. Режим Supercomplete, который документация рекомендует по умолчанию, показывает подсказку в отдельном окне у курсора и умеет предлагать не только вставку, но и удаление. Tab to Jump переносит курсор к следующему логичному месту правки, а Tab to Import добавляет нужный импорт в начало файла, не сбивая позицию. Одна клавиша здесь запускает разные по последствиям действия.
Наивная модель "серое продолжение - это просто текст" ломается именно на этой многозначности. Приняв по инерции, вы могли согласиться не с концом строки, а с удалением куска кода, с прыжком в другой участок файла или с импортом, который тянет не ту зависимость. Обычное автодополнение так себя не ведёт, и перенос старой привычки сюда даёт тихие, неочевидные изменения.
Профессиональный приём прост и невелик по цене - микро-ревью до нажатия. Прежде чем принять, взгляд проверяет три вещи: тип и сигнатуру, к которым ведёт предложение, вызываемый API и направление изменения - дополняет оно код или что-то убирает. Это не замедляет работу до чтения каждого символа; это привычка на долю секунды удостовериться, что предложенное совпадает с задуманным.
Почему предсказание сделали таким широким, а не свели к безопасному дополнению строки. Узкий автокомплит не ошибается страшно, но и помогает мало: он не перенесёт курсор туда, где правка продолжается, и не подтянет импорт. Широкий контекст и предсказание шага экономят десятки мелких движений за сессию - ценой того, что каждое предложение теперь надо читать как намерение, а не как текст. Скорость покупается вниманием, и это честный обмен, пока внимание действительно тратится.
Цена невнимания не одинакова везде. В черновом коде, в тесте, в строке лога принятая по инерции подсказка стоит дёшево и легко откатывается. В коде авторизации, в миграции схемы и в обработке денег та же инерция стоит дорого: неверный оператор сравнения, пропущенная проверка прав или сдвинутая граница суммы не выглядят как ошибка в diff и переживают беглый взгляд. Опасна не сама подсказка, а одинаковое доверие к ней в разных по последствиям местах.
Управлять поведением стоит осознанно, а не по умолчанию. Tab to Jump, Tab to Import и участие буфера обмена настраиваются по отдельности; если прыжки сбивают вас в незнакомом коде или импорт тянет не то, отдельные переключатели позволяют сузить механизм до того, чему вы доверяете. Supercomplete с его вставками и удалениями удобнее оставить там, где вы читаете каждое окно, а не там, где нажимаете вслепую.
Есть и промежуточная степень доверия между "принять всё" и "отклонить". Кроме режима Supercomplete существует классический Autocomplete прямо у курсора, а принять предложенное можно не целиком, а по словам - в VS Code это Cmd со стрелкой вправо, в JetBrains своё сочетание. Когда предложение верно наполовину, частичное принятие берёт нужный кусок и отбрасывает остальное, не заставляя выбирать между слепым Tab и полным отказом. Это и есть способ пользоваться широким предсказанием, не отдавая ему решение целиком.
Проверять результат Tab надёжнее всего не по ощущению скорости, а по diff перед коммитом. Прочитайте изменения глазами и спросите себя по каждому куску, вносили вы его сознательно или он появился принятием по инерции. Прогон линтера и типов ловит часть таких вставок, но не смысловые: неверную ветку условия или не ту, но валидную по типу функцию. Поэтому финальная проверка - чтение diff, а не зелёный компилятор.
Инженерный вывод короткий: Tab - это ускоритель ввода под надзором, а не соавтор, которому делегируют решение. Типичные провалы все растут из одного корня - из переноса привычки "автокомплит безопасен". Приняли удаление, приняв "продолжение". Прыгнули Tab to Jump и потеряли место, где были. Подтянули импорт из соседнего пакета с похожим именем. Признак один во всех случаях: клавишу нажали быстрее, чем прочитали предложенное. Сначала прочитать, потом принять - и почти все эти провалы не случаются.