Нейросеть агенты для программирования: план, код и тесты
Нейросеть агенты для программирования работают по шагам: план, код, тесты. Разбор на маленькой задаче — дубли email без учёта регистра — и что дают тесты новичку.
Евгений
Дизайнер-партнёр LibraChat
7 мин чтения
Мою рассылку с новыми работами один клиент получил трижды. В списке он был записан как «Alice@Example.COM», «alice@example.com» и ещё раз с пробелом в начале. Для программы это три разных адреса. Для клиента это спам от дизайнера, который не умеет навести порядок в собственных контактах. После этого я попросил нейросеть написать функцию, которая чистит такой список, и попросил работать по шагам, как работают нейросеть агенты для программирования: план, код, тесты. Ниже моя ошибка, запрос, ответ и почему тесты оказались для меня важнее кода.
Как я отправил одно письмо трижды, ещё не зная про нейросеть агенты для программирования
Список адресов я собирал годами. Визитки с выставок, формы на сайте, переписка, старые таблицы. Перед рассылкой я сводил всё в один файл и удалял дубли штатной функцией таблицы. На это уходило 20 минут, и я считал, что сделал работу аккуратно.
Штатная функция удаляет только полные совпадения. «Alice@Example.COM» и «alice@example.com» для неё разные. Пробел в начале адреса тоже делает его «другим». Я этого не знал, пока клиент вежливо не написал: «Евгений, мне пришло три одинаковых письма, у вас всё в порядке?»
Сам грешил тем, что считал данные чистыми, потому что они выглядели аккуратно. Как макет, в котором все кнопки на вид одинаковые, а в коде у каждой свой оттенок.
Что я вынес: сначала правило, потом код
Первое. Прежде чем писать что-то, нужно сформулировать правило: что считать одинаковым. В моём случае: адреса, которые отличаются только регистром букв и пробелами по краям, — это один адрес.
Второе. Правило нужно проверить на примерах, а не на глаз. Пример — это вход и ожидаемый выход. «Из трёх вариантов Алисы должен остаться один».
Третье. Если можно, примеры должны проверяться сами, каждый раз, когда меняется код. Это и есть тесты. Раньше я думал, что тесты — для больших проектов программистов. Оказалось, они нужны и для одной маленькой функции, если от неё зависит, сколько писем получит клиент.
Запрос: действовать как агент для программирования
Я попросил идти по шагам, как это делают агенты для кода: сначала план, потом код, потом тесты.
Действуй по шагам, как агент для программирования: сначала короткий план, потом код на Python, потом тесты к нему на pytest. Задача: функция принимает список email-адресов, убирает дубликаты без учёта регистра и пробелов по краям и возвращает отсортированный список.
Порядок здесь важен. План показывает, правильно ли нейросеть поняла задачу, ещё до кода. Если план не тот, код можно не читать.
План: три решения, о которых я не подумал
План уложился в три предложения, и в каждом было решение:
каждый адрес нормализуется: обрезаются пробелы по краям, всё переводится в нижний регистр;
в ответе все адреса будут в нижнем регистре, иначе непонятно, какой из вариантов Алисы оставить;
пустые строки после обрезки адресами не считаются и в результат не попадают.
Второй пункт я бы упустил. Если оставлять «первый встреченный» вариант, результат зависит от того, в каком порядке я собирал список. Единый регистр снимает вопрос.
Третий пункт тоже из жизни. В моём файле были пустые ячейки, в которых стоял только пробел. Без этого правила один «пустой адрес» попал бы в рассылку.
Код и тесты: что проверяют нейросеть агенты для программирования
Код вышел короче, чем план: десяток строк с понятным описанием. Но меня больше интересовали тесты. Их было шесть, и каждый проверял одну вещь:
Тест · Что проверяет
пустой список — на пустом входе функция возвращает пустой список
три варианта Алисы и Боб с табуляцией — регистр и пробелы по краям не создают дублей
три разных адреса — сортировка и то, что разные адреса не склеиваются
«a b@x.com» и «ab@x.com» — пробел внутри адреса не удаляется
строки из одних пробелов — пустые строки выбрасываются
один адрес в смешанном регистре — один элемент превращается в нижний регистр
Четвёртый тест меня удивил. Он проверяет, что функция не слишком усердная. Пробел внутри адреса — это уже другой адрес, и склеивать их нельзя. Я бы никогда не написал такой тест сам, потому что не думал, что функция может «перестараться».
Как я запустил тесты
Тесты в ответе импортируют функцию из модуля `emails`. Значит, код надо сохранить в файл `emails.py`, а тесты рядом, в файл, имя которого начинается с `test_`. Дальше одна команда в терминале, и pytest сам находит и запускает все тесты.
Шесть зелёных точек. Ни одной ошибки. Все тесты прошли с первого раза. Потом я сделал то, что советовал знакомый программист: специально сломал функцию, убрав перевод в нижний регистр. Два теста стали красными. Значит, тесты действительно ловят ту ошибку, из-за которой клиент получил три письма. Если когда-нибудь я или кто-то другой поправит функцию и случайно уберёт эту строку, тесты сразу покажут это красным, ещё до рассылки.
Свой список на 1400 адресов я проверил этой функцией. Осталось 1 312. Восемьдесят восемь писем я больше не отправлю дважды.
Нейросеть агенты для программирования: что они дают новичку
Я не программист и не стану им. Но после этой истории я по-другому смотрю на любую маленькую автоматизацию. Порядок «план, код, тесты» полезен даже тому, кто код не пишет:
План я читаю и понимаю, даже без знания Python.
Тесты я читаю как список примеров «вход и выход», это тоже понятно.
Код я могу не разбирать, если тесты проходят и покрывают мои случаи.
Отдельно скажу про чтение тестов. Тест — это одна строка вида «вот такой вход должен дать вот такой выход». Чтобы понять его, не нужно знать Python. Достаточно прочитать, что в скобках, и что после знака равенства. Я прочитал все шесть за пару минут и для каждого мог сказать, правильный ли ожидаемый результат с точки зрения моей рассылки.
Это похоже на работу с подрядчиком. Я не проверяю, как он держит кисть. Я проверяю, что результат соответствует брифу. Тесты — это бриф, который проверяет себя сам.
Что я сделал после этой истории
Сначала я, конечно, извинился перед клиентом. Коротко, без оправданий: дубли в базе, исправлено. Он ответил смайликом, и на этом всё закончилось.
Потом я попробовал применить тот же порядок «правило, примеры, тесты» к другим своим спискам. Названия проектов в портфолио: «Кофейня Зерно» и «кофейня зерно» оказались одним проектом, записанным дважды. Телефоны клиентов: «+7 999» и «8 999» — одни и те же номера. Для каждого случая правило своё, и для телефонов оно сложнее, чем для почты.
Главный вывод для меня не про код. Аккуратный на вид список может быть грязным внутри. И прежде чем доверять ему рассылку, стоит один раз проверить его по правилу, а не на глаз.
Где граница
Агенты для кода в больших проектах сами открывают файлы, запускают тесты и правят ошибки. Это инструменты для разработчиков. Мне хватило обычного чата LibraChat: я дал задачу, получил план, код и тесты, а запустил всё сам на своём компьютере.
Чего чат не сделает за меня: не узнает, какие адреса в моём списке на самом деле. Например, бывают корпоративные адреса, где регистр формально важен. На практике почтовые сервисы его почти всегда игнорируют, и для моей рассылки правило «без учёта регистра» подходит. Но решать это мне, а не функции.
Профессиональная сторона темы, где тестов сотни и код живёт годами, есть в статье нейросеть для программиста.
Посмотри на свой список
Возьми любой список, где могут быть дубли: адреса, телефоны, названия товаров. Сформулируй правило, что считать одинаковым. Отправь задачу в чат LibraChat со словами «сначала план, потом код, потом тесты». Попробуй потом сломать функцию и посмотреть, какой тест покраснеет. Подписку ради одной функции оформлять не придётся, а сравнить тарифы можно здесь.
нейросеть агенты для программированияpythonpytestтестысписок рассылкичистые данные