← 返回列表

AI серия интервю 16: Какво представлява доброто spec кодиране?

Едно добро Spec Coding (спецификационно кодиране) се състои в превръщането на „неясна идея“ в „точен, проверим и изпълним договор“. Не е просто документ, а изграждане на недвусмислен език за комуникация между човек и AI (или между хора). По-долу ще разгледаме четири измерения: структура на съдържанието, принципи на писане, процес на сътрудничество с AI и проверка на качеството.


I. Стандартна структура на спецификационния документ (с пример за функционален модул)

Секция Задължително съдържание Пример
1. Цел и обхват Едно изречение какво се прави, ясно какво не се прави „Реализация на API за регистрация на потребител, без проверка на имейл“
2. Входно/изходен договор Структура на данните, типове, задължителни/опционални полета, примерни стойности POST /register заявка {email: string, password: string}, отговор 201 или 400 с код за грешка
3. Поведение и логика Бизнес правила, гранични условия, преходи на състояния „Дължина на паролата 8-20 знака, поне една цифра; ако имейлът вече съществува, върни 409
4. Обработка на грешки Всички възможни изключения и съответни кодове/съобщения за грешка „Неуспешна връзка с база данни → върни 503, без да показваш стека“
5. Нефункционални изисквания Производителност (време за отговор < 200 ms), сигурност (параметризирани заявки), логове, наблюдаемост „Всички SQL трябва да се използват с предварително компилиране; записвай email, но не и password
6. Тестови сценарии (критично) Поне 3 типични входа + 2 гранични/изключителни входа, с очакван резултат Виж таблицата по-долу
7. Зависимости и ограничения Какви библиотеки, версии, променливи на средата „Python 3.10+, FastAPI, променлива на средата DB_URL

Пример за тестови сценарии (вградени в spec-а)

Сценарий Вход Очакван резултат
Нормална регистрация email: a@b.com, pwd: Pass1234 201, връща user_id
Паролата е твърде къса pwd: Ab1 400, код WEAK_PASSWORD
Имейлът вече съществува същия email 409, код EMAIL_EXISTS

Добрият spec първо трябва да напише тестовите сценарии, защото AI може директно да генерира unit тестове по тях и след това да ги провери автоматично.


II. Основни принципи за писане на Spec (вариант на SMART)

Принцип Обяснение Лош пример
Точност (Precise) Използвай конкретни числа, типове, булеви условия; избягвай „по възможност“, „обикновено“ ❌ „Паролата трябва да е достатъчно сигурна“ → ✅ „Паролата трябва да е поне 8 знака, с главна буква, малка буква и цифра“
Проверимост (Verifiable) Всяко изискване да може да се провери чрез автоматичен тест или ръчна проверка за успех/неуспех ❌ „Кодът трябва да е елегантен“ → ✅ „Цикломатична сложност на функцията ≤ 10, без повтарящи се блокове“
Недвусмисленост (Unambiguous) Един и същ термин да има еднакво значение в целия документ; при нужда давай речник ❌ „Ако потребителят не съществува, върни грешка“ → ✅ „Потребителят не съществува → върни 404 с {code: 'USER_NOT_FOUND'}
Пълнота (Complete) Покрий щастливия път, всички изключения и нефункционални изисквания ❌ Написани само успешни сценарии → ✅ Включи таймаут на базата данни, липса на права и т.н.
Атомарност (Atomic) Един spec описва само една функционална точка, която може да бъде доставена независимо (за да може AI да я изпълни наведнъж) ❌ С един spec за „цялата платежна система“ → ✅ Раздели на „генериране на платежно нареждане“, „проверка на подпис при обратно извикване“, „възстановяване на сума“

III. Spec Coding процес при сътрудничество с AI

  1. Човекът пише spec (в горепосочената структура, особено тестовите сценарии и подписите на функциите).
  2. Подава spec-а на AI наведнъж (без диалогово добавяне на изисквания, за да се избегне замърсяване от контекста).
  3. AI генерира код + unit тестове (AI трябва да създаде изпълними тестове според тестовите сценарии в spec-а).
  4. Изпълнява тестовете: ако всички минат, премини към следващата стъпка; ако не, промени spec-а или директно коригирай кода (тук може да има малък цикъл, но промените трябва да се записват).
  5. Ръчна проверка: провери дали не са въведени функционалности извън spec-а (scope creep), провери сигурност/производителност.
  6. Консолидация: запази spec документа и крайния код заедно в хранилището като постоянна документация.

Ключова практика: Кодификация на spec-а – използвай spec.md + test_spec.py, като тестовият файл е директно от примерите в spec-а. Така при последващи промени на кода просто пускаш тестовете, за да провериш дали spec-ът е нарушен.


IV. Какво носи добрият Spec (може да се използва като критерий за приемане)

  • Детерминираност: Един и същ spec, даден на различни AI (или различни хора), води до сходна реализация.
  • Тестваемост: След написването на кода веднага може автоматично да се потвърди 90% от коректността.
  • Поддържаемост: След половин година всеки, който погледне spec-а, ще разбере първоначалното проектно решение.
  • Ниски комуникационни разходи: При екипни дискусии се обсъжда само spec-ът, а не конкретни редове код.
  • Вградена сигурност/качество: Изискванията за сигурност (напр. параметризирани заявки) и граничните условия са записани в spec-а и AI трябва да ги спазва.

V. Пример за добър Spec (минимален вариант)

# Spec: API за регистрация на потребител

## Обхват
- Приема email, password
- Не изпраща потвърждаващ имейл, не проверява реалността на имейла

## Договор
POST /register
Content-Type: application/json
Заявка: { "email": string, "password": string }
Отговор 201: { "user_id": string }
Отговор 400: { "code": "INVALID_PASSWORD" | "INVALID_EMAIL" }
Отговор 409: { "code": "EMAIL_ALREADY_EXISTS" }

## Поведение
- email трябва да отговаря на основния формат RFC 5322 (a@b.c)
- password: дължина 8-20, поне една цифра и една главна буква
- Използвай bcrypt за криптиране, сол с цена 10
- Ако преди запис в базата данни се установи, че email вече съществува → 409

## Тестови сценарии (вход -> очакван статус код + полета в отговора)
| Входен email | password | Очакване |
|--------------|----------|----------|
| test@x.com | Pass1234  | 201, user_id съществува |
| test@x.com | pass      | 400, INVALID_PASSWORD |
| bad        | Pass1234  | 400, INVALID_EMAIL |
| (вече съществуващ имейл) | Pass1234 | 409, EMAIL_ALREADY_EXISTS |

## Нефункционални изисквания
- SQL трябва да използва параметризирани заявки (защита от инжекции)
- Логовете записват IP адреса на източника на регистрация, не записват парола
- 95% от заявките с време за отговор < 100 ms (без bcrypt)

## Зависимости
- Python 3.10+, FastAPI, bcrypt, asyncpg

Доброто Spec Coding = превръщане на „дизайнерските решения“ на човека в „тестови сценарии + типови подписи + поведенчески ограничения“ за машината, като AI отговаря само за попълването на реализацията, а човекът винаги контролира качеството и посоката.

评论

暂无已展示的评论。

发表评论(匿名)