Единица 3 / 12

Кодирование и парное программирование с ИИ

Прибыль:

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

Парное программирование — это когда два разработчика работают над одной и той же задачей: один пишет, а другой редактирует. Кодирование с помощью ИИ — это цифровая версия этих самых отношений: вы задаете направление, ограничения и критерии приемлемости; ИИ производит быструю тягу; Вы проверяете каждый шаг, компилируя и тестируя его. Самая большая ловушка здесь — сказать ИИ «напиши мне это приложение от начала до конца» и слепо принять блок из 200 строк. Хорошее парное программирование осуществляется небольшими шагами: каждый шаг должен быть понятным, проверяемым и обратимым.

В этом модуле вы научитесь печатать функции, классы и модули с четким контрактом ввода-вывода; Как шаг за шагом управлять ИИ; и мы увидим, как выявлять логические ошибки и ошибки крайних случаев, запуская создаваемый им код на небольших примерах. Цель не скорость, а выверенная скорость.

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

Печать кода с помощью Net Contract

Основа качественного кода — точно определить, «чего вы хотите» перед началом работы. При написании функции для ИИ дайте ей пять вещей: язык и версию, типы и значения ввода, вывод, условия ошибки и ограничения (производительность, запрет внешней библиотеки, стиль). Это не позволяет ИИ догадываться.

  1. Напишите договор. Ввод, вывод, ошибка, ограничение.
  2. Попросите небольшую единицу. Функция с единственной ответственностью; Это не огромный модуль.
  3. Запросите тестовый блок. Добавьте несколько примеров запуска/тестов рядом с кодом.
  4. Скомпилируйте и запустите. Попробуйте это с крайними случаями, проверьте результат на глаз.
  5. Перейдите к следующему шагу. Как только часть будет подтверждена, продолжайте ее развивать.

Подсказка контрактной функции: «Напишите функцию для TypeScript 5. Цель: вычислить общее количество товаров в корзине покупок. Входные данные: массив {цена: число, количество: число }[]. Выходные данные: число (всего). Правила: выдать ошибку, если количество или цена отрицательны; вернуть 0 для пустого массива; округлить сумму до 2 десятичных знаков для ошибки после запятой. Не использовать внешнюю библиотеку. Добавить 5 тестовых примеров под функцией (нормальное, пустое, отрицательное количество, десятичная цена, одинарная) предмет)».

Управление ИИ в паре

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

Пошаговая подсказка о прогрессе: «Мы напишем программу чтения, которая читает файл CSV и преобразует строки в объект. Пойдем ШАГ ЗА ШАГОМ, переходя к следующему шагу без моего подтверждения каждого шага. Шаг 1: просто напишите скелет, который разбивает файл на строки и отделяет строку заголовка. Пока не добавляйте преобразование типов или обработку ошибок. Будьте краткими, объясните».

Объясните и обоснуйте подсказку кода: «Объясните функцию, которую вы только что написали, не построчно, а решение за решением: какое проектное решение вы приняли и почему, какой крайний случай вы обработали и как, какие случаи вы намеренно исключили? Перечислите 3 предположения в коде, которые я не должен пропустить».

Совет: не принимайте код, сгенерированный ИИ, не понимая его. «Объясните мне, какие предположения вы сделали?» Вопрос не только выявляет скрытые ошибки, но и позволяет вам защитить этот код, поскольку ответственность за код остается вашей. Запустить в производство код, который вы не понимаете, — это все равно, что отправить контракт без его подписания.

Слабая подсказка/Сильная подсказка

СЛАБЫЙ: «Напишите функцию сортировки». (Результат: какой язык, что сортируется, стабильно ли оно, каковы ограничения производительности, код расплывчатый и, вероятно, не соответствует требованиям.) СИЛЬНЫЙ: «Для Java 17 напишите метод, который сортирует объект List<Employee> сначала по отделу (в алфавитном порядке), затем по зарплате (по убыванию). НЕ ЗАМЕНЯЙТЕ исходный список, возвращайте новый список. Пусть нулевой отдел будет последним. Объясните сложность в строке комментария укажите добавление основного тестового блока с 4 образцами.»

Мощная подсказка; Включает критерий сортировки (двухуровневый), правило побочных эффектов (замена исходного), нулевое поведение и ожидание теста. Без этих деталей ИИ выдает правдоподобное, но неправильное решение; например, это может повредить исходный список, что приведет к скрытой ошибке в другом месте.

Валидация с крайними случаями и небольшими выборками

Код, который работает в счастливом сценарии, не является правильным. Сознательно заставляйте каждую производимую функцию:

Тип корпуса Edge

образец ввода

ожидаемое поведение

пустой ввод

Пустой массив/строка

Не ошибка, логический пустой результат

Ноль/отрицательный

0, -1

Определенное и правильное поведение

большое значение

Миллионы записей

Контроль переполнения/производительности

нулевой/неопределенный

недостающее пространство

Контролируемая ошибка или дефолт

Дубликат/необычный

повторяющийся, обратный порядок

правильный результат

Мини-кейсы

Случай 1. Ошибка скрытого округления. ИИ пишет функцию, которая собирает деньги с десятичными типами (float); 0,1 + 0,2 дает 0,300000000000000004. Ошибка решена, когда инженер добавляет правило «Округляй до двух цифр и используй целые копейки». Правило трех строк предотвращает отклонения в тысячи центов при ежемесячной сверке.

Случай 2. Ловушка с побочным эффектом. ИИ пишет метод, который «сортирует» список, но модифицирует исходный список на месте. Неожиданное поведение происходит потому, что другой модуль использует тот же список. Если бы в приглашении было ограничение «изменить оригинал», ошибка никогда бы не возникла; попадает во время проверки кода и предотвращает 2 часа отладки.

Кейс 3 — Заработок шаг за шагом. Разработчик сразу печатает модуль импорта на 150 строк; Когда он находит ошибку, он не может понять, откуда она взялась. Другой разработчик делит ту же работу на 5 маленьких шагов, тестирует каждый шаг за 2 минуты и ловит ошибку сразу на 3-м шаге.

Распространенные ошибки

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

В заключение

Написание кода с помощью ИИ — это дисциплинированное парное программирование: четкий контракт, небольшие шаги, сборка и тестирование на каждом этапе. Задание квартета ограничений ввода-вывода-ошибок с самого начала определяет качество кода. Объяснение кода, который он создает, и использование в нем крайних случаев выводит на поверхность ошибки, скрытые в счастливом сценарии. Источник скорости не в слепом принятии; это быстрый черновик плюс быстрая проверка.

Задача приложения

Выберите небольшую, но реальную функцию (например, общая сумма корзины, разница дат, синтаксический анализ текста). Распечатайте, используя приглашение контрактной функции; Добавьте рядом с ним не менее 5 тестовых сценариев. Запустите код и сознательно попробуйте 5 крайних случаев, используя таблицу в качестве руководства. Найдите ошибку хотя бы в одном крайнем случае (если нет, создайте новый вход для принудительной активации функции), исправьте ее с помощью ИИ и проверьте повторным тестированием, что исправление сработало.

контрольный список

  • [ ] Я написал контракт, который включает ввод, вывод, ошибки и ограничения.
  • [ ] Я генерировал код небольшими шагами вместо одного большого блока.
  • [ ] Я добавил блок запуска теста/образца рядом с кодом.
  • [ ] Я сознательно протестировал как минимум 5 крайних случаев.
  • [ ] Я объяснил код ИИ и рассмотрел его предположения.
  • [ ] Я исправил найденную ошибку и подтвердил ее путем повторного тестирования.