Как пользоваться AI и не отупеть
Продолжаю отвечать на ваши вопросы. В прошлый раз разбирались, что остаётся программисту, когда код становится дешёвым. Сегодня — вторая часть: А можешь раскрыть тему ИИ и программирование? Точнее, как правильно пользоваться ИИ, чтоб разработка шла быстро, но при этом программист не терял навыков. Как правильно пользоваться ИИ и не терять квалификацию? Мне кажется, здесь всё довольно просто. Один и тот же AI можно использовать так, чтобы довольно быстро отупеть, а можно — чтобы постоянно становиться сильнее.
Первый вариант выглядит примерно так. Получили задачу, скормили её coding-агенту, получили код и отправили на review. Пришли замечания — тоже отдали железяке. Она всё поправила, тесты зелёные, коммит уехал в репозиторий. Если работать так постоянно, разработчик постепенно превращается в прокладку между LLM и Git.
Проблема здесь не в том, что код написал AI. Мне вообще не кажется важным писать весь код руками. Проблема в другом: за время выполнения задачи у самого разработчика не появилось никакого нового понимания.
Можно пользоваться той же самой LLM иначе. Получить задачу и сказать: «Давай подумаем, как это сделать». Она предложит какой-нибудь вариант и упомянет незнакомый механизм. Я спрашиваю: «А что это такое? Почему здесь лучше сделать именно так? Чем это отличается от другого подхода? Правильно ли я понимаю, что тогда произойдёт вот это?» Через десять минут задача всё ещё не сделана, зато я уже знаю что-то, чего не знал до неё.
Я сейчас читаю книгу по внутреннему устройству PostgreSQL. Последние главы стали заметно сложнее первых: иногда я дочитываю главу и понимаю, что усвоил процентов 25. Тогда я загружаю текст в ChatGPT и начинаю разбирать именно те места, где потерял нить. «Объясни вот этот кусок. А правильно ли я понял связь между этим и этим? Почему здесь нужен такой механизм?» После такой сессии мои условные 25% превращаются в 50–60%.
То же самое постоянно происходит в работе. Недавно мне прислали большой pull request с заметными изменениями в Makefile. Make я знаю плохо, а его синтаксис местами напоминает древние письмена: $(NAME).c: $(NAME).py cp $< $> $стоимость понимания тоже резко снизилась. Раньше ответ на маленький частный вопрос мог стоить часа чтения документации. Поэтому часто было рациональнее вообще не разбираться слишком глубоко. Теперь я могу потратить на получение знания усилие, соразмерное значимости этого знания для основной задачи.
И это отличный способ учиться: ты постоянно получаешь знания ровно на переднем крае собственной некомпетентности. Не проходишь заранее огромный курс «на всякий случай», а разбираешь именно тот кусок, которого прямо сейчас не хватает для следующего шага.
При этом я бы не делал вывод, что знания теперь вообще не нужны. Можно не помнить конкретную команду GDB или синтаксис Make. Но всё ещё важно понимать, как устроена программа, какие свойства алгоритма имеют значение, что именно происходит с процессом и какую гипотезу ты проверяешь. AI хорошо компенсирует забытый синтаксис. Гораздо хуже — отсутствие собственной модели происходящего.
Поэтому моё правило очень простое: после работы с AI я должен понимать решаемую систему лучше, чем до неё. Если задача закрыта, а всё понимание осталось внутри контекста LLM, — я использовал AI плохо. Если задача закрыта, а я заодно разобрал новый механизм, проверил несколько гипотез и лучше понял систему — отлично.
Не так важно, кто написал код. Важно, у кого осталось понимание.