Лидеры мнений

Будущее построения приложений AI зависит от безопасности типов

mm
Добавьте Unite.AI в избранные источники в Google

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

Мы должны начать заставлять AI использовать строгую типизацию через контекст, инструкции, линтинг и обратные связи. Это занимает несколько дополнительных часов, но производит код, который прослужит долго.

Проблема стимулирования

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

Это почему AI любит любой. Или он выбирает широкий тип, такой как строка, где что-то более строгое, такое как UUID, ожидается. Код компилируется, но правильность уже компрометирована. Хуже того, AI не помнит, что он написал несколько файлов назад, поэтому без безопасности типов проект быстро разрушается под своим собственным весом при росте сложности.

Два вида ошибок

Когда код, сгенерированный с помощью AI, запускается, вы обычно видите два вида проблем с безопасностью типов:

1. Ошибки времени компиляции

  • Что происходит: компилятор обнаруживает несоответствие между объявленным типом и тем, что было передано.
  • Как человек исправляет это: решает, неправильен ли вызывающий (преобразует 42 в строку) или функция неправильна (изменяет ее, чтобы она приняла тип число).
  • Как AI “исправляет” это: изменяет тип аргумента на любой. Проблема “решена”, но вы только что удалили ограждение, которое бы поймало будущие ошибки.

2. Ошибки времени выполнения

  • Что происходит: компилятор думает, что все в порядке (часто потому, что типы были ослаблены), но реальное значение во время выполнения не соответствует предположению.
  • Как человек исправляет это: отслеживает переменную до ее источника (например, API или запроса к базе данных) и исправляет тип на границе, чтобы данные приходили в виде правильной строки.
  • Как AI “исправляет” это: без контекста, он угадывает. Может быть, он обернет все в Строку(…), или просто расширит тип снова. Сбой исчезает в этом месте, но теперь логика сломана. Числа, предназначенные для математики, внезапно становятся строками.

Этот цикл ошибок времени выполнения → “исправление” AI → ослабление типов быстро нарастает. Результатом является код, который компилируется и выбрасывает меньше ошибок времени выполнения, но которому нельзя доверять. Представьте себе систему планирования работы врачей, где смены врачей управляются приложением. Несоответствие типов проскальзывает: int для часов обрабатывается как строка. AI “исправляет” это, ослабляя тип до любой. Код компилируется, и ошибка исчезает, но расчеты смен сломаны, двойное бронирование врачей и оставление целого крыла больницы без покрытия.

Умножитель базы данных

Момент, когда вы подключаетесь к базе данных, ошибки умножаются, и их причины становятся труднее отслеживать. SQL имеет типы по причине. Каждая схема (INT, TEXT, UUID, BOOLEAN) кодирует предположения о ваших данных.

Когда AI упрощает все до строка | любой, вы теряете эти гарантии:

  • Плохие записи: вставка “true” в поле логического типа компилируется, но повреждает базу данных.
  • Плохие чтения: запрос возвращает NULL, но AI предполагал строку, что приводит к сбою во время выполнения.
  • Сломанные отношения: если ключ отношения ожидается как UUID, но AI обрабатывает его как строку и ошибочно отправляет мусорные значения, соединения не сломаются, но они не вернут никаких данных. Это скрывает ошибки, пока они не появятся позже как пропущенные или несоответствующие результаты..

Это почему серьезные команды используют языки с типами и обеспечивают безопасность типов от схемы до API. Если вы этого не делаете, база данных перестает защищать вас, и скрытые проблемы нарастают.

Почему зрелые команды обеспечивают строгую типизацию

Строгая типизация не о том, чтобы замедлить разработчиков. Она о том, чтобы сделать масштабирование возможным.

Типы:

  • Кодируют намерение в код.
  • Делают рефакторинг безопасным и предсказуемым.
  • Поймают целые классы ошибок до того, как они попадут в производство.
  • Покажут будущим разработчикам (и AI) точно, как использовать функцию или объект.

Без безопасности типов неряшливость кода AI нарастает. С ней же AI производит код, которому можно доверять и расширять.

Как заставить AI использовать безопасность типов

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

Предоставить правильный контекст

Дайте ему интерфейсы и типы, которые он может использовать. Покажите примеры использования. Будьте мнительными о правильном способе структурировать код.

Дать строгие инструкции

Очень четко скажите AI, чтобы он не использовал любой, никогда не допускал неизвестный и чтобы каждый метод, объект и переменная были типизированы. Ожидайте, что он будет иметь трудности с выполнением этих инструкций (особенно на первом проходе).

Обеспечить линтингом

Как и при проверке кода младшего разработчика, вам нужно проверить код AI. Разработайте пользовательские правила линтинга, которые определяют, что такое “хороший код” для вас. Верните неудачи линтинга обратно в модель, пока она не пройдет. Это может занять несколько раундов, но оно сдвигает функцию вознаграждения в сторону включения безопасности типов.

Итерировать с проверками

Ошибки времени компиляции, журналирование времени выполнения, клик-через тесты. Каждая итерация заставляет AI сужать типы и приближаться к коду, готовому к производству.

Лучший способ построения

Я узнал, что жертвование сырой скоростью генерации ради более высокого качества окупается в долгосрочной перспективе. Это означает борьбу за нулевую терпимость к любым типам, обеспечивая несколько обратных связей и строгих правил линтинга, которые AI должен пройти, прежде чем назвать код “готовым”. Это требует постоянных усилий, но это единственный способ сохранить качество от снижения.

Ранее я упомянул ключевую точку: как только AI начинает исправлять ошибки времени выполнения, ослабляя типы, вы входите в порочный цикл. Каждое исправление удаляет еще одно ограждение, и результат нарастает в код, который компилируется, но хрупкий и не поддерживаемый. Обратное также верно: если вы заставите AI уважать безопасность типов на каждом проходе, вы создаете добродетельный цикл. Каждая итерация сужает ограждения, код становится чище, и качество нарастает в нечто, чему можно доверять и на чем можно строить.

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

Брэд Эккерт - предприниматель и лидер в области инженерии с более чем десятилетним опытом вывода продуктов от стадии идеи до доставки клиентам и далее. Выпускник MIT, он сейчас является сооснователем и техническим директором Woz, платформы на основе ИИ, поддерживаемой Y Combinator, которая позволяет любому создавать и масштабировать программные бизнесы без необходимости программирования.