Содержание
- Краткое резюме
- Анализ AI в программировании: пример с редактором Cursor
- Споры о «подходящем» коде и контексте валидации
- Ограничения AI: неспособность принимать глобальные решения
- Как лучше использовать AI в программировании
- Ошибки безопасности и риски
- Итоговые мысли и личная позиция автора
- Заключение
Краткое резюме
- AI-инструменты для программирования популярны, но часто плохо справляются с задачами и могут снижать продуктивность.
- Пример AI-сгенерированного кода из редактора Cursor показывает, что код часто избыточен, содержит бесполезные проверки и спорные решения.
- Основная проблема — не в самом инструменте Cursor, а в том, как огромные языковые модели (LLM) обрабатывают и генерируют код без контекста и осознанных решений.
- AI решает только конкретные задачи, не понимая контекста, что приводит к повторению однотипных, плохо структурированных фрагментов и недоработкам.
- Чтобы добиться пользы от AI, программисту необходимо критически оценивать и дорабатывать код — без этого риски ошибки и уязвимостей возрастают.
- Важнейшие решения в программировании нельзя полностью передать AI — нужен человеческий контроль и понимание.
- Безответственное использование AI-кода может привести к крупным проблемам, особенно в безопасности.
Анализ AI в программировании: пример с редактором Cursor
Автор видео, опытный разработчик, который предпочитает использовать редактор Neoim, кратко делится впечатлениями по поводу AI-ассистированных редакторов. Он признаёт, что периодически пользуется Cursor и другими AI-инструментами, но скептически относится к эффективности таких систем.
Негативные эффекты AI на продуктивность
«Эти инструменты могут быть хуже, чем бесполезны — они снижают продуктивность».
Это сильное утверждение иллюстрирует скептицизм автора. Он подчёркивает, что многие AI-решения порождают код, который требует множества исправлений и обсуждений.
Пример из Cursor: «лучший» AI-сгенерированный код
Cursor демонстрирует генерацию кода для функции, считывающей строку с ограничением по длине из бинарного протокола на Rust.
Основные ошибки и недочёты:
-
Бесполезная проверка длины строки:
Код читает длину в U16, но вводит проверкуif length > max_length
, где max_length — максимальное значение для U16. Эта проверка избыточна и никогда не будет истинной. Вместо неё логично использовать более реалистичный лимит или вовсе пропустить условие. -
Сомнительная «санитизация» строки:
Код фильтрует байты, считая символы ниже 32 «плохими», но подобная фильтрация недостаточно чётко определена. Различные контрольные символы и пробельные символы по-русски и в Unicode трактуются неоднозначно, некоторые из них могут быть важны в определённых контекстах. -
Некорректное использование байтов вместо символов:
Работа напрямую с байтами, а не с Unicode-символами, усложняет понимание и может вести к ошибкам при обработке текста. -
Повторяющийся и избыточный код:
AI склонен генерировать многократное повторение одних и тех же операций, вместо того, чтобы структурировать код и выделять повторяющиеся куски в функции.
Цитата авторитетного эксперта:
«Лучшие инструменты, вроде Clippy в Rust, подскажут программисту, что условие никогда не может выполниться».
Таким образом, AI часто не совершает простых оптимизаций и предупреждений.
Почему AI сгенерировал такой код?
Автор обращает внимание, что проблема не в Cursor, а в самих языковых моделях, которые генерируют код «по поводу и без» без понимания контекста и целей.
Он подчёркивает, что AI буквально реализует инструкцию в промпте, но не может оценить смысл или качество:
«AI — это очень быстрая автозаполнение, она не думает и не рассуждает».
Пример с проверкой длины показывает, что AI выполнил задание (добавить проверку), но с точки зрения логики и здравого смысла сделали это непродуманно.
Споры о «подходящем» коде и контексте валидации
Касаясь санитизации строк в бинарном протоколе, подняты вопросы:
- Как правильно обрабатывать управляющие символы и пробелы с учётом различных стандартов ASCII и Unicode?
- Нужна ли строгая валидация со сбоем при ошибке (ошибка протокола), или достаточно просто отфильтровывать символы?
Автор признаёт, что для низкоуровневых функций обработки сетевого протокола эти вопросы критичны и их нельзя решать универсальными методами.
«Программирование — это принятие большого количество решений, и AI не предлагает объяснений или альтернатив, он просто выбирает один вариант, зачастую неудачный».
Ограничения AI: неспособность принимать глобальные решения
Автор делится наблюдением, что AI склонен к повторению однотипных вычислений и не выделяет повторяющийся код в функции — то, что сделал бы человек:
«AI встраивает всю математику и логику тысячи раз подряд вместо того, чтобы выделить отдельные функции».
Это происходит из-за природы языковых моделей — они не строят внутреннюю структуру программы, а просто продолжают текст.
Как лучше использовать AI в программировании
- Воспринимать AI как ускоренное автозаполнение, а не полноценного разработчика.
- Всегда проверять и дорабатывать сгенерированный код самостоятельно — AI не умеет брать ответственность и даёт лишь предположения.
- AI может сэкономить время на типовых и рутинных задачах, но для критичных частей кода (валидация, безопасность) нужно полагаться на экспертизу программиста.
Ошибки безопасности и риски
Особое внимание уделено безопасности. Пример из видео — сгенерированная система сессий позволяет злоумышленнику подделывать user-id, так как данные не защищены криптографически.
«Люди, которые слепо используют AI, рискуют выпустить в продакшен уязвимый код, непреднамеренно создавая дырки в безопасности».
Автор вспоминает свой опыт ручного создания JWT-подобного механизма с SHA-256, что показывает необходимость понимания фундаментальных принципов безопасности.
Итоговые мысли и личная позиция автора
- Автор поддерживает критику и аргументы, приводимые в статье, отмечая высокую информативность и важность осознания ограничений AI.
- В то же время он считает, что AI-инструменты, вроде Cursor, были неправильно обвинены в проблемах, которые больше связаны с LLM и неправильным использованием.
- Сам автор не использует AI активно, но признаёт, что иногда применяет его для разработки и генерации простой или неважной части кода.
- Главное — человеческий контроль и принятие решений остаётся ключевым фактором.
«Писать код — это не только решение задачи, но и принятие важных решений, которые AI пока не может взять на себя».
Заключение
На данный момент AI — полезный, но несовершенный помощник в программировании. Он:
- генерирует много «шума» и дублирует код,
- не понимает глубины задач и контекста,
- не принимает ответственность за качество и безопасность,
- требует от разработчика внимательного подхода, исправлений и контроля.
Потенциал AI велик, но нужна разумная интеграция в рабочие процессы и чёткое понимание его ограничений.