← 返回列表

AI serija intervju 16: Kako treba da izgleda dobro spec kodiranje?

Dobro Spec kodiranje (specifikacijom vođeno programiranje) suštinski pretvara „nejasne ideje“ u „precizne, proverljive i izvršive ugovore“. Nije samo pisanje dokumenta, već uspostavljanje nedvosmislene komunikacije između ljudi i AI (ili među ljudima). U nastavku ću dati prikaz dobrog spec-a iz četiri dimenzije: struktura sadržaja specifikacije, principi pisanja, tok saradnje sa AI, provera kvaliteta.


1. Standardna struktura specifikacije (na primeru funkcionalnog modula)

Poglavlje Obavezni sadržaj Primer
1. Cilj i opseg Jedna rečenica šta se radi, jasno šta se ne radi „Implementirati API za registraciju korisnika, bez verifikacije e-pošte“
2. Ulaz/izlaz ugovor Struktura podataka, tip, obavezna/opciona polja, primer vrednosti POST /register telo zahteva {email: string, password: string}, odgovor 201 ili 400 sa kodom greške
3. Ponašanje i logika Poslovna pravila, granični uslovi, prelazi stanja „Dužina lozinke 8-20 karaktera, najmanje jedan broj; ako email već postoji vrati 409
4. Obrada grešaka Svi mogući izuzetni scenariji i odgovarajući kodovi/poruke grešaka „Neuspešna konekcija sa bazom → vrati 503, ne izlagati stek“
5. Nefunkcionalni zahtevi Performanse (vreme odgovora < 200ms), sigurnost (parametrizovani upiti), evidentiranje, mogućnost praćenja „Svi SQL upiti moraju koristiti prekompajlirane; evidentirati email ali ne i password
6. Test slučajevi (ključno) Najmanje 3 tipična unosa + 2 granična/izuzetna unosa, dati očekivani izlaz Pogledati tabelu ispod
7. Zavisnosti i ograničenja Koje biblioteke se koriste, verzije, promenljive okruženja „Python 3.10+, FastAPI, promenljiva okruženja DB_URL

Primer test slučajeva (ugrađen u spec)

Scenarija Ulaz Očekivani izlaz
Normalna registracija email: a@b.com, lozinka: Pass1234 201, vratiti user_id
Prekratka lozinka lozinka: Ab1 400, kod greške WEAK_PASSWORD
Email već postoji isti email kao gore 409, kod greške EMAIL_EXISTS

Dobar Spec prvo piše test slučajeve, jer AI na osnovu njih može direktno da generiše jedinične testove, a nakon implementacije automatski da ih proveri.


2. Osnovni principi pisanja Spec-a (SMART varijanta)

Princip Objašnjenje Anti-primer
Precizan (Precise) Koristiti konkretne brojeve, tipove, bool uslove; izbegavati „koliko je moguće“, „obično“ ❌ „Lozinka treba da bude dovoljno sigurna“ → ✅ „Lozinka najmanje 8 karaktera, sadrži veliko slovo, malo slovo i broj“
Proverljiv (Verifiable) Svaki zahtev se može automatskim testom ili ručnom proverom oceniti kao ispunjen/neispunjen ❌ „Kod treba da bude elegantan“ → ✅ „Ciklomatska složenost funkcije ≤ 10, bez dupliranih blokova koda“
Nedvosmislen (Unambiguous) Isti termin ima konzistentno značenje kroz ceo tekst; po potrebi dati rečnik ❌ „Ako korisnik ne postoji, vrati grešku“ → ✅ „Korisnik ne postoji → vrati 404 i {code: 'USER_NOT_FOUND'}
Potpun (Complete) Pokriva srećan put, sve izuzetne puteve i nefunkcionalne zahteve ❌ Samo napisan uspešni scenario → ✅ Uključuje timeout baze, nedovoljne privilegije itd.
Atomiziran (Atomic) Jedan spec opisuje samo jednu funkcionalnost koja se može samostalno isporučiti (olakšava AI da završi odjednom) ❌ Koristiti jedan spec za „celokupan sistem plaćanja“ → ✅ Razdvojiti na „generisanje naloga za plaćanje“, „verifikaciju potpisa povratnog poziva“, „povraćaj novca“

3. Spec kodiranje u saradnji sa AI

  1. Čovek piše spec (gornja struktura, posebno dobro napisati test slučajeve i potpise funkcija).
  2. Spec se daje AI u jednom dahu (ne dodavati zahteve kroz dijalog, izbegavati „vibe“ kontaminaciju).
  3. AI izlazni kod + jedinični testovi (AI mora da generiše izvršive testove prema test slučajevima iz spec-a).
  4. Pokrenuti testove: Ako svi prođu, preći na sledeći korak; ako ne prođu, izmeniti spec ili direktno ispraviti kod (tada se može ući u mali ciklus, ali promene se beleže).
  5. Pregled od strane čoveka: Proveriti da li postoji funkcionalnost van spec-a (scope creep), proveriti sigurnost/performanse.
  6. Fiksiranje: Spec dokument i finalni kod zajedno se postavljaju u repozitorijum kao trajna dokumentacija.

Ključna praksa: Spec kao kod – koristiti spec.md + test_spec.py, pri čemu test fajl direktno dolazi iz primera u spec-u, tako da naknadna izmena koda samo zahteva pokretanje testova kako bi se proverilo da li je spec narušen.


4. Efekti dobrog Spec-a (mogu poslužiti kao kriterijumi prihvatanja)

  • Determinističnost: Isti spec dat različitim AI ili različitim ljudima daje slične implementacije.
  • Testabilnost: Nakon pisanja koda, odmah se automatski može proveriti 90% tačnosti.
  • Održivost: Posle pola godine bilo ko može pogledati spec i razumeti prvobitne dizajnerske namere.
  • Niska komunikaciona cena: U timskim diskusijama razmatra se samo spec, ne i konkretni redovi koda.
  • Ugrađena sigurnost/kvalitet: Sigurnosni zahtevi (npr. parametrizovani upiti) i granični uslovi su zapisani u spec-u, AI se mora pridržavati.

5. Primer dobrog Spec-a (minimalna verzija)

# Spec: API za registraciju korisnika

## Opseg
- Prima email, password
- Ne šalje verifikacioni email, ne proverava stvarnost email-a

## Ugovor
POST /register
Content-Type: application/json
Zahtev: { "email": string, "password": string }
Odgovor 201: { "user_id": string }
Odgovor 400: { "code": "INVALID_PASSWORD" | "INVALID_EMAIL" }
Odgovor 409: { "code": "EMAIL_ALREADY_EXISTS" }

## Ponašanje
- email mora zadovoljavati osnovni RFC 5322 format (a@b.c)
- password: dužina 8-20, najmanje jedan broj i jedno veliko slovo
- Čuvati šifrovano sa bcrypt, sol cost 10
- Ako se pre čuvanja u bazi otkrije da email već postoji → 409

## Test slučajevi (ulaz -> očekivani status kod + polje odgovora)
| Ulaaz email | password | Očekivano |
|-------------|----------|-----------|
| test@x.com | Pass1234  | 201, user_id postoji |
| test@x.com | pass      | 400, INVALID_PASSWORD |
| bad        | Pass1234  | 400, INVALID_EMAIL |
| (već postojeći email) | Pass1234 | 409, EMAIL_ALREADY_EXISTS |

## Nefunkcionalni
- SQL mora koristiti parametrizovane upite (sprečiti injekciju)
- Evidentirati IP izvor registracije, ne evidentirati lozinku
- Vreme odgovora 95% zahteva < 100ms (bez bcrypt)

## Zavisnosti
- Python 3.10+, FastAPI, bcrypt, asyncpg

Dobro Spec kodiranje = pretvaranje ljudskih „dizajnerskih odluka“ u mašinske „test slučajeve + tipizirane potpise + ograničenja ponašanja“, tako da AI samo popunjava implementaciju, dok čovek uvek kontroliše kvalitet i smer.

评论

暂无已展示的评论。

发表评论(匿名)