← 返回列表

Интервју од AI серија 16: Како треба да изгледа доброто spec coding?

Доброто Spec Coding (спецификациско кодирање) суштински го претвора „нејасната идеја“ во „точен, проверлив и извршен договор“. Тоа не е само пишување документ, туку воспоставување јазик за комуникација без двосмисленост помеѓу човек и AI (или помеѓу луѓе). Подолу ќе го опишам изгледот на добра spec од четири димензии: структура на содржината, принципи на пишување, процес на соработка со AI и проверка на квалитет.


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

Поглавје Задолжителна содржина Пример
1. Цел и опсег Една реченица што опишува што се прави, јасно што не се прави „Имплементирај API за регистрација на корисник, без потврда преку е-пошта“
2. Договор за влез/излез Структура на податоци, тип, задолжителни/опционални полиња, пример вредности POST /register барање {email: string, password: string}, одговор 201 или 400 со код за грешка
3. Однесување и логика Бизнис правила, гранични услови, промена на состојба „Лозинката да има 8-20 знаци, да содржи барем една цифра; ако е-поштата веќе постои врати 409
4. Обработка на грешки Сите можни исклучоци и соодветни кодови/пораки „Неуспешно поврзување со база → врати 503, не прикажувај стек“
5. Нефункционални барања Перформанси (време на одговор < 200ms), безбедност (параметризирани пребарувања), логирање, набљудуваност „Сите 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 може директно да генерира единични тестови врз основа на нив, а потоа автоматски да верификува.


2. Клучни принципи за пишување Spec (варијанта SMART)

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

3. Процес на Spec Coding при соработка со AI

  1. Човек пишува spec (гореспомената структура, особено тест случаи и потпис на функции).
  2. Еднократно внеси го spec-от на AI (не додавај барања во дијалог, избегнувај vibe контаминација).
  3. AI генерира код + единични тестови (AI мора да генерира извршливи тестови според тест случаите во spec-от).
  4. Изврши ги тестовите: ако сите поминат, оди на следниот чекор; ако не, промени го spec-от или директно поправи го кодот (тогаш може да влезеш во мал циклус, но запиши ги промените).
  5. Преглед од човек: провери дали има функционалности надвор од spec-от (scope creep), провери безбедност/перформанси.
  6. Фиксирај: поднеси ги spec документот и финалниот код заедно во складиштето како траен документ.

Клучна практика: Spec како код – користи spec.md + test_spec.py, каде тест датотеката директно доаѓа од примерите во spec-от, така што при подоцнежни промени на кодот само треба да ги извршиш тестовите за да потврдиш дали spec-от е нарушен.


4. Ефекти од добрата Spec (може да послужат како критериуми за прифаќање)

  • Детерминистичност: Истиот spec даден на различни AI (или луѓе) произведува слични имплементации.
  • Тестливост: Штом кодот е напишан, веднаш автоматски се верификува 90% од точноста.
  • Одржливост: По шест месеци секој што го гледа spec-от може да ја разбере првичната намера.
  • Ниска комуникациска цена: Во тимска дискусија се дискутира само spec-от, а не конкретни линии код.
  • Вградена безбедност/квалитет: Безбедносните барања (како параметризирани пребарувања) и граничните услови се наведени во spec-от, AI мора да ги почитува.

5. Пример на добра 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 |
| (веќе постоечки email) | Pass1234 | 409, EMAIL_ALREADY_EXISTS |

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

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

Доброто Spec Coding = претворање на „дизајнерските одлуки на човекот“ во „тест случаи + типски потписи + ограничувања на однесување“ за машината, оставајќи AI само да ја пополнува имплементацијата, додека човекот секогаш го контролира квалитетот и насоката.

评论

暂无已展示的评论。

发表评论(匿名)