Вы что-нибудь слышали об AI-кодерах? Это такие программисты, которые не умеют писать код. Нас ими все пугают, что вот они придут и отнимут нашу работу. Насколько эти опасения оправданы? А вы знаете, что они уже среди нас?

Им пока не просто, им все еще приходится проходить собеседования, притворяясь обычными программистами и заучивая принципы SOLID. Никто из кандидатов в здравом уме не скажет работодателю: "Я не умею писать код, за меня его пишет ChatGPT", и работодатели пока тоже не понимают, что с ними делать, смогут ли они создавать хорошие продукты, они не понимают, как оценивать их работу, сколько они стоят, как их собеседовать.

Я пока тоже отношусь к скептикам, но поскольку я считаю себя человеком с ярко выраженным критическим мышлением, я задался вопросом: а что если?

Я решил провести эксперимент и сделать задачу, не написав ни строчки кода, обладая минимальными техническими знаниями, и вот что у меня получилось. Дабы этот пост влез в рамки 10-15 минутной статьи, я сделал допущение, что проект уже существует, кто-то помог мне развернуть его у себя на машине. У меня стоит PhpStorm, настройки которого были подготовлены старшими товарищами, и я знаю, где находится командная строка, в которую я буду копипастить команды. Задача, которую я буду решать, будет уровня джуниор+.

Итак, вводные данные — небольшой готовый проект на Symfony на чуть больше чем 200 файлов с кодом и около 35'000 токенов (слов). В проекте есть рекламные объявления, где пользователи могут загружать фотографии и видео. Загрузка фотографий и их постобработка уже реализована (ресайзинг, удаление метаинформации). Постобработка происходит асинхронно через Messenger. Пока фотографии не обработаны, они и само объявление находятся в статусе ENQUEUED. После обработки получают статус ACTIVE. Задача, которая стояла - сделать постобработку видео. Перекодировать видео не нужно, но удалить метаинформацию было очень важно, поскольку в видео с телефона содержатся координаты, где видео было сделано, а это очень персональная информация.

Поскольку код писать мы не умеем, первая мысль, которая приходит в голову — загрузить весь проект AI и написать ему задачу. Я написал небольшой скрипт (все-таки одну строчку кода пришлось написать!), который собрал весь проект в один файл:

find . -type f \
  -not -path './vendor/*' \
  -not -path './var/*' \
  -not -path './assets/fonts/*' \
  -not -path './assets/vendor/*' \
  -not -path './.*' \
  -not -path './public/assets/*' \
  -not -path './public/uploads/*' \
  -not -path './*.lock' | \
  while read file; do
    echo "# $file";
    cat $file;
    echo "";
  done > project.txt

Размер файла у меня получился 424K, это проблема, поскольку максимальный размер контекста ChatGPT — 32K. Но зато есть Claude, и у него размер уже 200 тыс. токенов (слов). В моем проекте 35 тыс. токенов, так что должно хватить. Тем более что буквально на днях вышла новая версия 3.5 Sonnet. Что ж, попробуем.

Загружаю ему проект и прежде чем он начнет писать код, хочу обсудить с ним задачу и послушать, как он будет ее реализовывать:

Analyze project code, use its content and stylistic as a reference. I need to implement the following task:

On posting new ads, it’s possible to upload videos. Currently, video is uploaded and then publicly available as it is, which causes some security issues. We need at least to remove meta tags.

First let’s talk about how you will implement this task. Suggest ideas.

Claude дает вполне разумное решение: создать по аналогии с обработкой картинок новое событие для видео и обработчик для него. Вызывать событие в контроллере при загрузке видео. Он предлагает использовать библиотеку FFmpeg для редактирования видео, предлагает менять статус видео на время обработки и изменить вывод видео, чтобы необработанные видео не показывались. Как бонус предлагает создать превью для видео. Такой задачи у меня не было, но я не сразу обратил на это внимание и не сказал ему об этом ничего.

Здесь нужно сделать небольшое отступление. Это классно, когда у меня есть опыт, и я могу понять, что советы разумные. Но как человеку без опыта в программировании вообще понять, что он не советует полную дичь? Ответ на этот вопрос на самом деле простой. Точно так же, как понять, что профессор в университете, не рассказывает какую-то ересь — во-первых, он ее все-таки иногда да рассказывает, и ничего страшного в этом нет, ошибки делать можно и нужно. Во-вторых — ну нам же не нужно быть великим поваром, чтобы сказать, что стейк вкусный. Здравый смысл рано или поздно подскажет, как делать можно, а как не стоит. Плюс, пообщавшись с AI какое-то время, вы начинаете хорошо чувствовать, где AI уверен в своих суждениях, а где не очень. В конце концов, если вы не уверены, его можно переспросить! Но даже если ваша "чуйка" еще недостаточно развита, всегда можно просто принять на веру факт, что то, что он делает, — скорее правильно, чем нет. Мы делаем это каждый день в повседневной жизни, не вижу никакой проблемы сделать это и тут.

Итак, я принимаю его решение как подходящее. И мы идем дальше. Мне нужно как-то получить изменения, которые нужно сделать. Если я просто попрошу все, что надо поменять, то с высокой долей вероятности он после пары десятков строк скажет что-то вроде: “Ну а вот тут сам допишешь”. Нужно попросить его дать результат по частям, и я прошу его дать список файлов, в которых будут какие-то изменения.

Print complete list of files that need to be changed

Claude выдает мне список файлов, которые нужно добавить, изменить или потенциально изменить, дополняя небольшим описанием того, что в каждом файле находится. В том же порядке, в котором он дал список, я прошу их содержимое.

print the content of src/Message/ProcessVideo.php

Он выдает какой-то код, создаю файл и копирую его туда. Прошу следующий файл:

print the content of src/MessageHandler/ProcessVideoHandler.php

Он выдает содержимое файла и говорит, что необходимо выполнить команду для подключения FFmpeg. Не имея ни малейшего понятия ни что такое FFmpeg, ни что такое Composer, слепо выполняю команду, и она отрабатывает.

В этом файле кода уже было побольше. Во мне, вдруг, проснулся внутренний программист и я увидел, что FFmpeg используется в обработчике явно, а на проекте у нас принято передавать все зависимости извне. Я не считаю это большой проблемой. Действительно, на каждом проекте есть свои практики, у нас принято так, Claude сделал по-другому. По-хорошему, вместе с проектом я должен был в изначальный prompt дать наш coding standard, в котором вероятно было бы что-то сказано про SOLID и Dependency Inversion, и я почти уверен, что он бы сразу написал правильно. Поскольку такого документа я ему не дал, я просто попросил передавать все зависимости извне.

Дальше начались проблемы, поскольку я человек внимательный. Я увидел, что PhpStorm мне выделяет отдельные куски кода. При наведении на них мышью он выводил какой-то текст, что он не может что-то найти. Я понятия не имею что это, но если PhpStorm мне об этом сообщает, значит, считает это важным, и я копирую это в Claude, он генерирует новый код, ошибка уходит.

Seems like method stripMetadata does not exist in $video->filters()

Мой пытливый ум заметил, что среди кучи непонятного кода иногда встречается вполне себе человеческий текст. Например, мой глаз зацепился за такие слова:

// Generate a thumbnail (optional)
// Create a new video format
// Remove metadata and save the processed video
// This removes all metadata
// Use H.264 codec for video
// Use AAC codec for audio
// Remove the original unprocessed video

Я слегка удивился, ведь я не просил генерировать превью (thumbnail), и еще меня смутило, что он использует какие-то кодеки. Зачем, если мне надо просто удалить метаданные? В задаче четко стояло, что перекодировать не нужно.

Не уверен, поэтому решаю задать вопросы.

1. Remove code related to video thumbnail generation, I don't need thumbnails for video.

2. I’m wondering about the performance of your approach. Will it re-encode the entire video file or just remove meta tags?

Claude соглашается, что действительно наделал лишнего. Из кода пропадают упоминания о thumbnails и появляются комментарии вида:

// Create a format that copies streams without re-encoding

Кажется, это уже то, что нужно, но теперь PhpStorm снова начинает подсвечивать слова. По старой схеме я кидаю ему все ошибки, и рано или поздно он пишет код, который на первый взгляд можно запускать.

Аналогичным образом я применил все изменения, которые он мне предложил. Я писал ему обо всех своих мыслях и переживаниях, которые возникали в процессе, и он их исправлял. Он делал ошибки, иногда получалось просто субъективно некрасиво, иногда он предлагал добавить код, который уже есть, но в целом ничего такого, для чего мне понадобилось бы умение писать код, он не делал.

Итак, все изменения применены, пробую загрузить видео, на экране ошибка и много другого текста:

App\Message\ProcessVideo::__construct(): Argument #1 ($videoId) must be of type int, null given, called in /home/eug/PhpstormProjects/my-project/src/Controller/UserController.php on line 148

Хотя мне кажется, что если бы я просто выделил все содержимое окна и скопировал его в окно чата, то Claude бы все равно понял, где ошибка, но я немного помог ему и полез в дебаг консоль за машиночитаемым бектрейсом. Мне кажется, что скоро мы должны увидеть, как отладочную информацию фреймворки будут выводить, не только красиво для глаза, а и удобно для ИИ.

Claude не составило труда понять, что он вызывает getId() перед тем как сделать flush(), и, соответственно, далее вместо id он в обработчик передает null.

В очередной версии ошибка ушла, видео успешно сохранилось, метатеги были успешно удалены.

В принципе, на этом можно было бы и остановиться, задача в целом успешно выполнена. Но я заметил, что видео обрабатывается синхронно при загрузке. Я, конечно, понял почему — нужно было настроить роутинг для нового сообщения на использование транспорта async, но так не интересно. Я хочу, чтобы он сам догадался. Он ведь сам в начале задачи писал, что видео будет в статусе ENQUEUED, пока не будут обработаны. Я задаю ему вопрос:

I uploaded video, but in database it's in active state, shouldn't it be enqueued?

И с этим вопросом он тоже отлично справился, предложил несколько вариантов, почему может быть так, один из которых был перенастроить роутинг.

Выводы

Итак, что мы имеем в итоге? Задача сделана, code review пройдено, да, были ошибки, но они были найдены и исправлены, ни одной строки кода я лично не написал (ну ладно, всего одну).

Главный вопрос: может ли человек, не умеющий программировать, писать код? Мой ответ - да, это уже вполне возможно. Кажется, что интерфейс в виде чата пока не очень удобный, потому что приходится копировать куски кода. Было бы куда удобнее, чтобы ИИ-помощник сам создавал и редактировал нужные файлы в проекте прямо в IDE, но мне кажется, это вопрос нескольких месяцев.

Я вас серьезно призываю перестать спрашивать на собеседованиях про разные виды сортировок и различие между B-Tree и AVL-Tree, а начать проверять умение пользоваться AI-помощниками. Хотите вы или нет, AI-кодеры уже появляются среди нас, и они уже сидят сутками перед мониторами и решают реальные задачи не хуже, а местами лучше "традиционных" программистов, при этом вообще не умея писать код.

Комментарии (33)


  1. wataru
    28.06.2024 20:50
    +7

    Как и всяких лентаев, которые копипастят ответы чатжпт, когда им сказать нечего, спрошу у вас, если с вашими задачами справляется "ai-кодер, который не может написать ни одной строки кода", то зачем работадателю нанимать вас? Он сам не справится спросить у нейросетки что ли? Если ему рук не хватает, то всегда можно нанять хоть студента журфака на пол ставки за 10% от вашей зарплаты.


    1. EugeniyPetrov Автор
      28.06.2024 20:50

      Работодателю нужно решение проблем, а не код. Работодатель как человек мудрый, вероятно, многие вещи мог бы сделать сам, но поскольку рук у него всего 2, то физически не успевает. Если студент журфака сможет (а главное захочет) решать технически задачи за 10% от зарплаты, то я только за. Но он скорее всего не захочет.


      1. apodavalov
        28.06.2024 20:50

        Не совсем правда. Работодателю еще нужно, чтобы его (всего скорее) сайт не хакнули.


        1. EugeniyPetrov Автор
          28.06.2024 20:50

          Для того, чтобы сайт не хакнули вообще не достаточно просто нанять человека, который умеет писать код. Я очень давно пишу код и даже я иногда могу что-то случайно упустить. Чтобы сайт не хакнули - этому нужно уделять время. Нужно делать регулярные секьюрити аудиты, сканы, вовремя ставить обновления, следить за парольной политикой, сегментировать сеть, настраивать разные фаерволы и много-много-много другого. Программист умеющий писать код в данной цепочке для меня скорее минус чем плюс. Я бы скорее доверился коду тупо написанному в ChatGPT (которому скормили гигабайты рабочего кода), чем коду, написанным человеком, который программирует год


          1. apodavalov
            28.06.2024 20:50
            +3

            Отвечу на последний пункт: мы же не знаем какой код ему скормили: плохой/хороший, правильный/неправильный, делающий то, что нужно или нет. Как тут вообще можно на что-то рассчитывать, если "ai-кодер" не может оценить "ошибку"?


            1. EugeniyPetrov Автор
              28.06.2024 20:50

              Это большое заблуждение, что "традиционный" программист может оценить. Он пишет код основываясь на тех знаниях, которые он когда-то поглотил. При этом по умолчанию он не знает плохой это код или хороший. Он узнает об этом в процессе набивая шишек.

              LLM модели делают ровно тоже самое, ну только вместо набивания шишек они возьмут скажем наиболее популярное решение, которое в большинстве случаев окажется приемлемым.

              Представьте, что вы вообще ничего не понимаете в программировании и вам нужно нанять программиста. Откуда вы будете знать, что программист не сделает ошибку? Да ниоткуда не знаете, и он ее скорее всего сделает. Ну для этого вы наймете еще кого-то, кто проверит.

              В конце концов я нигде не писал, что AI-кодер - это низшая ступень развития человечества, они тоже в процессе учатся, они тоже рано или поздно узнают об OWASP Cheetsheets, они могут спросить ИИ а как сделать безопасно. Это просто люди, которые получают тот же код другим способом.


          1. lair
            28.06.2024 20:50
            +5

            Я бы скорее доверился коду тупо написанному в ChatGPT (которому скормили гигабайты рабочего кода), чем коду, написанным человеком, который программирует год

            А зря.


          1. Wesha
            28.06.2024 20:50
            +2

            Я бы скорее доверился коду тупо написанному в ChatGPT (которому скормили гигабайты рабочего кода), чем коду, написанным человеком, который программирует год

            ... и именно поэтому надо задавить в себе жабу и нанимать человека, кототрый программирует минимум лет пять, а лучше — десять.

            ...Потому что иначе его наймёт тот, кто хочет Вас сломать.


            1. EugeniyPetrov Автор
              28.06.2024 20:50

              Ну что же теперь, совсем не брать джунов на работу? Каждый опытный когда-то был джуном и очень вероятно, что его ошибки до сих пор кто-то разгребает. Будь у него 5 лет назад такой инструмент как ИИ-помощник, вы думаете было бы хуже?


              1. lair
                28.06.2024 20:50

                Будь у него 5 лет назад такой инструмент как ИИ-помощник, вы думаете было бы хуже?

                Скорее всего - да.


                1. EugeniyPetrov Автор
                  28.06.2024 20:50

                  Процитирую фразой одного хорошего человека - "утверждение нуждается в формализации и доказательстве."


                  1. lair
                    28.06.2024 20:50
                    +1

                    Это не утверждение, а мнение. "Я думаю, что скорее всего".

                    Невозможно доказать (и особенно опровергнуть) "я думаю".


              1. Wesha
                28.06.2024 20:50

                Ну что же теперь, совсем не брать джунов на работу?

                Вас — точно не брать, потому что Вы не умеете оценивать границы применимости. На некртичиные работы, типа, условно, написания кода для печати формочек джунов нанимать можно и нужно (а как, во-Вашему, я начинал?) — а вот по мере набора опыта соответственно поднимать человека выше и выше. Изучил детали протокола TCP/IP? Можешь приступать к разработке интернет-девайсов и т.п.


  1. dezahrise
    28.06.2024 20:50

    На все мои вопросы они отвечали плохо. Иногда отвечали нормально, если пошагово описывал архитектуру и алгоритмы. Иногда даже описав пошагово алгоритмы, все равно получал не то что нужно.

    Быстрее было написать самому

    Хотя тесты копилот делает не плохо, если в проекте есть аналогичные. А если аналогичных нет пихает то, что вообще не нужно


  1. apodavalov
    28.06.2024 20:50

    Хотелось бы понять как "ai-кодер, который не может написать ни одной строки кода" будет оценивать, например, следующие пункты: адекватность написанных тестов (они имеются?) пусть даже со 100% покрытием, соблюдение единого стиля, следование лучшим практикам (не только выбранного языка/фрейморка, но и например использования криптографических библиотек вместо "велосипедизма")? Как "ai-кодер" поймет, что задача решена правильным способом (например, квадратичный алгоритм вместо линейного)? Какими критериями этот "разработчик" будет руководствоваться? Работает или нет?


    1. EugeniyPetrov Автор
      28.06.2024 20:50

      А как это делает "традиционный" программист, который копирует код со stackoverflow или использует рандомные библиотеки с гитхаба? Методом проб и ошибок, методом тыка, общением с коллегами.

      По поводу сложностей алгоритмов, обычно такой задачи сделать линейно а не квадратично не стоит. Стоит задача сделать быстро - именно с таким запросом он и пойдет в ИИ помощник и тот ему, я уверен, все быстро расскажет.


      1. apodavalov
        28.06.2024 20:50

        То, про что Вы говорите в первом абзаце по сути есть накопление знаний и опыта. Хорошо, если "ai-кодер" это быстро поймет.

        По поводу второго абзаца: задача может включать в себя "должно работать вплоть до 1 000 000 элементов". А тут "квадрат" на ровном месте ...


        1. EugeniyPetrov Автор
          28.06.2024 20:50

          Если есть такое требование то и подход будет другой. Нельзя просто написать алгоритм O(n) и надеяться что он будет работать быстро на 1 млн элементов. Если требование есть, то уже надо думать как проверять. И если не будет удовлетворять производительности то просить его переписать, чтобы удовлетворял.

          В прочем в моей статье речь была о задачах совсем другого уровня. Ну разумеется чатгпт не заменит профессоров, которые новые алгоритмы придумывают, речь о 90% CRUD задач, в которых нет никаких требований на 1 млн элементов, нет никаких высоких нагрузок. Нужно просто, чтобы работало


    1. dezahrise
      28.06.2024 20:50
      +3

      Никак. Точно так же как будет падать качество, когда в базе будет попадаться большинство кода написанного такими

      Так что беспокоится не о чем

      Банальный пример. Я не видел ии которая бы решала задачи с леткода через стек или хеш таблицы. Все предлагают через рекурсию. А это самое банальное и плохое решение. Почему выбирают ? Потому что большинство пишут и публикуют такое решение. Оно лучшее? нет конечно

      Пока в ии не появятся функция написания сравнения бенчмарков, нагрузочного тестирования. Сравнения результатов здесь и сейчас. Их решения - максимум на троечку


      1. EugeniyPetrov Автор
        28.06.2024 20:50

        Правда в том, что большая часть программистов напишет тоже самым банальным и простым способом, чтобы оно просто работало. И в 90% реальных задач они даже вероятно будут правы.


  1. lair
    28.06.2024 20:50
    +2

    Хотите вы или нет, AI-кодеры уже появляются среди нас, и они уже сидят сутками перед мониторами и решают реальные задачи не хуже, а местами лучше "традиционных" программистов, при этом вообще не умея писать код.

    Утверждение про "не хуже, а местами лучше" нуждается в формализации и доказательстве.


  1. DarthVictor
    28.06.2024 20:50
    +1

    Автор интересную тему поднял. От следующих таких статей хотелось бы видеть ответы на

    • Сколько времени ушло на задачу. Сколько бы ушло у вас в ручном режиме?

    • Что нейронке удаётся лучше, хотя бы субьективно?

    • Насколько код похож на другой код проекта?

    • Для чистоты эксперимента, хорошо бы чтобы задание попробовал выполнить чей-нибудь проджект менеджер. То есть человек знающий продукт с точки зрения функционала, но не умеющий непосредственно программировать. Или вообще человек незнакомый с проектом, например, из другого отдела.


    1. EugeniyPetrov Автор
      28.06.2024 20:50
      +1

      • Про время был уверен, что написал, но в какой-то редакции эта информация из поста видимо исчезла. В ИИ режиме на задачу ушло 1.5 часа. В ручном режиме было бы быстрее, но только потому что код я пишу уже давно, рука набита, хоткеями, сниплетами и прочими генераторами быстро все делаю, а чату нужно писать целые предложения, ждать пока он сгенерирует, выделять текст, вставлять. Это долго. Ну т.е. сейчас я вижу больше проблему с интерфейсом для работы с ИИ. Среднестатистический джун эту задачу делал бы дольше - 100%

      • Нейронки хорошо придумывают названия переменным. Не копипастят код. Субъективно.

      • Именно в этом проекте получился очень похож, но это относительно новый, относительно "чистый" и небольшой проект. Наверное если как такового стиля в проекте не было бы, то и соблюдать его было бы сложнее.

      • Это было бы интересно, может быть когда-то проведу.


  1. SergeyVoronkov
    28.06.2024 20:50
    +1

    А мне кажется, что ИИ это новый инструмент, который реально очень полезен в определенных ситуациях. Но он именно дополняет, а не заменяет.

    Так что теперь, скорее всего, работодателей будет интересовать как знание классических подходов, так и умение использовать ИИ.


  1. fo_otman
    28.06.2024 20:50

    ChatGPT решила 2 задачки с Yandex Code Run с первого раза. Вообще я уже полгода плотно сижу на ChatGPT и, кажется, я хуже начинаю думать сам. Но производительность да, выросла значительно.


    1. lair
      28.06.2024 20:50

      Но производительность да, выросла значительно.

      Есть у меня подозрение, что это очень сильно зависит от решаемых задач.

      Потому что я вот смотрю на свой последний квартал, и там задач, где была бы важна моя производительность как кодера... ну одна, может быть. Большую часть времени я трачу на то, чтобы раскопать существующий код, и понять в нем, что случится, если я вот эти две строчки поменяю на другие. И потом еще немало времени - на обсуждение с коллегами, как должны выглядеть эти две новые строчки, чтобы всем было понятно, что они делают.

      Как тут померять производительность - хрен поймет.


  1. kozlov_de
    28.06.2024 20:50
    +1

    По моему опыту LLM может написать максимум 100 строк или 150 строк хуже качеством.

    LLM не создаёт жизнеспособный продукт, только демо. При попытке изменения требований или рефакторинга всё рассыпается. То есть архитектура хрупкая, да и глючить его начинает.

    Итого. Для рыбы сойдёт, но потом всё равно придется всё переписать руками.

    А для вашего случая алгоритм элементарный

    По клику заливки файла асинхронно:

    Файл видео прочитать. Теги удалить. Файл сохранить. Добавить к списку обработанных файлов. При ошибке записать лог.

    Реализация не должна быть значительно сложнее этого алгоритма.

    А в результате ты провозился час-два и пропустил в прод код который до конца не понимаешь, скинув всё на ревьюера.


    1. Wesha
      28.06.2024 20:50

      Для рыбы сойдёт

      Ну....


  1. Seenkao
    28.06.2024 20:50

    Лучше всего с этим делом справится программист который умеет правильно формулировать вопросы ChatGPT. Чтобы потом можно было исправить ошибки в коде который предоставил ChatGPT. А вернее всего "подсмотреть" решение, чтоб можно было реализовать своё решение.


    1. Wesha
      28.06.2024 20:50

      Я так понимаю, Вы ещё молодой и ещё не знаете, что написать свой код на порядок легче, чем понять, а что вообще делает чужой.


  1. rodion-m
    28.06.2024 20:50

    Попробуйте Aider - он сам за вас найдет нужные файлы, отправит их LLM и пропатчит старые / добавит новые.


  1. tzlom
    28.06.2024 20:50
    +1

    Вы внесли в LLM кучу правок и уточнений из за того, что у вас есть навыки программирования, если бы вы этого не сделали то эта хрень бы не заработала.

    Но если бы вы были условным пастухом который сразу бы начал промптить то как вы узнали бы что нужно уточнять и спрашивать? Чтение сгенерированого LLM кода вас не научит программированию, LLM не понимает что пишет, она просто даёт статистически средний результат, она не может объяснить почему надо так а не иначе.

    То же самое с безопасностью - LLM может элементарно воспроизводить типичные проблемы безопасности т.к. средний программист делает те же самые ошибки. И LLM так же ленив как и средний программист, потому что не понимает что часто люди пишут не идеальный пуленепробиваемый код, а "и так сойдёт".


    1. wataru
      28.06.2024 20:50

      она не может объяснить почему надо так а не иначе.

      Гораздо хуже - она может сгенерировать вам объяснение. Очень правдоподобное и при этом совершенно не правильное. Это еще хуже отсутствия объяснений.