Все, в чем вы не разбираетесь, ИИ делает отлично! Все, в чем вы понимаете и можете увидеть проблемы - ИИ делает ужасно
Решил разобрать три проблемы с вайб-кодингом, которые у меня возникли за последнее время. Все они от того - что ИИ послушный и терпеливый, безотказный даже если просят делать фигню. Он охотно выстрелит вам в ногу, если вы забыли вспомнить, где у вас была нога.
Я как-то понял, что мне платят за три вещи: 1) За то что я исполняю задачи 2) За то что я ставлю задачи и 3) За то что я отказываюсь от задач
И честно говоря, по первому пункту - мне явно переплачивают. Все что я делаю, может делать и юнга. Второе - это когда я (умея нырять глубоко в технические аспекты) вижу и поднимаю наверх проблемы и сложности, которые не видны с капитанского мостика. И третье - когда сверху просят сделать херню - я отказываюсь. У меня достаточно авторитета, веса, чтобы мои слова услышали. Так вот как раз самые ценные качества, 2 и 3 ИИ не может сделать. Наверное 50% моего дохода - не за труд, а за то, что я отказываюсь трудиться!
Примерно, как хороший гид на сафари. Вы платите 1000 долларов за экскурсии, из них 100 за то, чтобы он вас сводил посмотреть на фламинго, а 900 за то, чтобы когда вы попросите сводить вас погладить бегемотиков, он над вами поржал со своими друзьями.
Apache/mod_php vs Nginx/php-fpm
Самая чайницкая проблема, известная и понятная большинству админов, девопсов и программистов. Если мы делаем простейший PHP сайт на апаче, у нас веб-приложение работает от www-data, а системные юзера - от другого юзера. И дальше начинается проблема - если юзер (разраб) наживую что-то создал - владелец он, сервер уже не может перезаписать, и наоборот. Решение простое - переход на nginx/php-fpm, чтобы был юзер для проекта(-ов), и дальше и PHP и мы работаем из под одного юзера и этой проблемы нет.
Однако, попробуйте (в жизни или мысленно) попытаться решить эту проблему через ИИ. Он мне предлагал любую хрень, игры с ACL, постоянно усложнял решение (я намеренно “купился” на его идею и начал раскручивать) - но он не смог выйти out of the box, пытался решить нерешаемую проблему. Возможно, он смог бы выйти out of the box, но только если самому про это знать, догадаться и предложить ему решение. Тогда он, угождая вам, выйдет. Но не сам.
Вывод: Горе тому вайб-кодеру, который не видя собственного решения подобной проблемы (которое выходит за пределы имеющейся структуры и парадигмы проекта), не понимая проблем каждого варианта, попросит ИИ решить ее.
Забытая деталь проекта
Был у меня давний простенький телеграм бот. В целях безопасности он весь жил внутри юзера tgbot, ставился локально в $HOME для этого юзера. С тех пор я так не делал - это не очень удобно. Мне удобнее - когда боту в конфиге прописываешь юзера, и даже если стартуешь его от root - он все равно сам сбрасывает привилегии. И обновлять от рута удобно (pipx upgrade –global NAME), не требуется прыгать между юзерами.
Так вот, я забыл как у меня был устроен этот давний проект, и попросил новую фишечку сделать, неявно полагая, что тот старый бот работает по той же схеме, что и новые. Так как я ошибся в своем предполжении, а клодкод послушный - он там чего-то нагородил, совмещая элементы дизайна старого бота (то что было по факту) и нового (то что я попросил).
Вывод: Давая задания ИИшке, вы должны держать в голове всю правильную картину проекта. ИИ вам не откажет, если вы попросите глупость. И может даже на первой итерации глупость будет работать, проходить тесты, вы не увидите проблем. Просто все следующие задачи по проекту будет сложнее выполнять, потребуется все больше кода на простые вещи, все больше внимания, все больше тестов будет фейлится и потребуется больше и больше исправлений, потому что где-то вначале вы попросили впрячь в одну телегу коня и трепетную лань и он впряг и теперь он все делает этой вот чудесной бригадой. Вы может даже и не заметите проблем - он их сам решит, вот только токены будут лететь…. и для решения возникающих проблем в вашу упряжку придется впрячь еще и крота и единорога.
Параллельность, асинхронность, сложность
Асинхронность - это хорошо, но у всего есть цена. Программист эту цену знает потому что платил ее - долгими часами и днями отладки, багами которые бывают, но не воспроизводятся. ИИ не понимает этого. У него это слово не связано эмоционально со страданиями. Поэтому он беззаботно пихает ее везде, ведь это стильно, модно, молодежно. Да, потом будут вылезать баги, но он же их и исправит (вы только токены оплатите). Но токены - лишь первая проблема.
Более опасная проблема - race conditions, когда что-то происходит одновременно. Ее невозможно легко с одной попытки воспроизвести. Соответственно, ошибки такого рода легко могут пройти тесты.
Если у вас два клиента приложения могут нажать кнопку “в одно время” есть два пути:
- Сложный: городим сложную схему, чтобы оба запроса обрабатывались одновременно, с максимальной скоростью, используя параллельность где только можно, два ядра процессора, два запроса к базе, две операции с файлами. При успешной реализации этой сложной схемы - все прекрасно и оба получают ответ очень быстро.
- Простой: В этой ситуации (которая случается раз в год) работу по одному из клиентов мы исполним только после того как обслужим другого. В таком случае он подождет четверть секунды. Или даже 3 секунды.
- Еще более простой: просто игнорируем один из запросов. Раз в год один из тысячи пользователей удивляется: Я же вроде нажал кнопку? Или не нажал? и нажимает ее повторно и все хорошо!
Человек понимает трейд-оффы и может ответственно понять, когда параллельность важна, а когда она того не стоит.
ИИ - ваш слишком послушный раб. У вас появился скольчик на автомобиле. Что делает человек? Или подмазывает кисточкой похожим (но не совсем) цветом или вообще забивает. Что делает человек с послушным ИИ? Говорит ему исправить проблему, и ИИ понимает, что не может найти краску заведомо в цвет и отдает всю машину в покраску - только так можно исполнить ваш каприз.
Вывод: Хороший, качественный проект может (и даже должен быть) “немного плох”. Многие хорошие технические решения - это “контракт с дьяволом”, у них есть цена. Одни фичи можно навешивать как угодно, а другие - только ответственно взвешивая плюсы и минусы. Нейросетка по природе своей лингвистической модели не может качественно взвешивать.