← 返回列表

AI serija intervjua 16: Kako bi trebao izgledati dobar spec coding?

Dobar Spec Coding (specifikacijsko programiranje) ima za cilj pretvoriti "nejasne ideje" u "precizan, provjerljiv i izvršiv ugovor". Ne radi se samo o pisanju dokumenta, već o uspostavljanju nedvosmislenog komunikacijskog jezika između ljudi i AI-ja (ili među ljudima). U nastavku ću opisati kako izgleda dobar spec kroz četiri dimenzije: struktura sadržaja specifikacije, principi pisanja, proces saradnje s AI-jem i provjera kvaliteta.


1. Standardna struktura dokumenta specifikacije (na primjeru funkcionalnog modula)

Poglavlje Obavezni sadržaj Primjer
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. Ulazni/izlazni ugovor Struktura podataka, tipovi, obavezna/opcionalna polja, primjeri vrijednosti POST /register tijelo zahtjeva {email: string, password: string}, odgovor 201 ili 400 s kodom greške
3. Ponašanje i logika Poslovna pravila, granični uvjeti, prijelazi stanja "Dužina lozinke 8-20 znakova, najmanje jedan broj; ako email već postoji, vrati 409"
4. Obrada grešaka Svi mogući izuzetni scenariji i odgovarajući kodovi/poruke greške "Neuspješno povezivanje s bazom → vrati 503, ne otkrivaj stek"
5. Nefunkcionalni zahtjevi Performanse (vrijeme odgovora < 200ms), sigurnost (parametrizirani upiti), evidentiranje, mogućnost praćenja "Svi SQL upiti moraju koristiti prekompajlirane izraze; evidentiraj email, ali ne i password"
6. Testni slučajevi (ključno) Najmanje 3 tipična unosa + 2 granična/izuzetna unosa, s očekivanim izlazom Vidi tabelu ispod
7. Zavisnosti i ograničenja Koje biblioteke, verzije, varijable okruženja "Python 3.10+, FastAPI, varijabla okruženja DB_URL"

Primjer testnih slučajeva (ugrađeno u spec)

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

Dobar spec prvo piše testne slučajeve, jer AI može na osnovu njih direktno generirati jedinične testove, a nakon završetka automatski ih provjeriti.


2. Ključni principi pisanja spec-a (SMART varijanta)

Princip Objašnjenje Protuprimjer
Precizan (Precise) Koristi konkretne brojeve, tipove, logičke uslove; izbjegavaj "što je više moguće", "obično" ❌ "Lozinka treba biti dovoljno sigurna" → ✅ "Lozinka najmanje 8 znakova, sadrži veliko slovo, malo slovo i broj"
Provjerljiv (Verifiable) Svaki zahtjev može se automatskim testom ili ručnom provjerom ocijeniti kao prolaz/neuspjeh ❌ "Kod treba biti elegantan" → ✅ "Ciklomatska kompleksnost funkcije ≤ 10, nema dupliciranih blokova koda"
Nedvosmislen (Unambiguous) Isti termin ima konzistentno značenje kroz cijeli tekst; po potrebi dati rječnik pojmova ❌ "Ako korisnik ne postoji, vrati grešku" → ✅ "Korisnik ne postoji → vrati 404 i {code: 'USER_NOT_FOUND'}"
Potpun (Complete) Pokriva sretni put, sve izuzetne puteve, nefunkcionalne zahtjeve ❌ Samo uspješni scenariji → ✅ Uključuje vremensko istek baze, nedovoljna ovlaštenja itd.
Atomski (Atomic) Jedan spec opisuje samo jednu nezavisno isporučivu funkcionalnost (olakšava AI-ju da završi odjednom) ❌ Jedan spec za "cijeli sistem plaćanja" → ✅ Razbijeno na "generiranje naloga za plaćanje", "provjera potpisa pri povratnom pozivu", "povrat novca"

3. Proces Spec Codinga u saradnji s AI-jem

  1. Čovjek piše spec (gornja struktura, posebno testne slučajeve i potpise funkcija).
  2. Učitaj spec AI-ju odjednom (ne dodavati zahtjeve kroz dijalog kako bi se izbjegla kontaminacija vibracijom).
  3. AI daje kod + jedinične testove (AI mora generirati izvršive testove prema testnim slučajevima iz spec-a).
  4. Pokreni testove: ako svi prođu, idi na sljedeći korak; ako ne prođu, izmijeni spec ili direktno ispravi kod (u tom slučaju može se ući u mali ciklus, ali promjene treba zabilježiti).
  5. Ručna provjera: provjeri da li je uvedena funkcionalnost izvan spec-a (scope creep), provjeri sigurnost/performanse.
  6. Učvrsti: pošalji dokument spec-a i konačni kod zajedno u repozitorij kao trajnu dokumentaciju.

Ključna praksa: Spec kao kod – koristi spec.md + test_spec.py, gdje testna datoteka dolazi direktno iz primjera u spec-u, tako da naknadne izmjene koda samo pokretanjem testova potvrđuju da spec nije narušen.


4. Efekti dobrog spec-a (mogu poslužiti kao kriteriji prihvatanja)

  • Određenost: Isti spec dat različitim AI-jevima (ili različitim ljudima) daje slične implementacije.
  • Testabilnost: Po završetku koda može se odmah automatski potvrditi 90% ispravnosti.
  • Održivost: Nakon šest mjeseci bilo ko ko pogleda spec može razumjeti originalne dizajnerske odluke.
  • Niski troškovi komunikacije: Tokom timskih diskusija raspravlja se samo o spec-u, ne o konkretnim linijama koda.
  • Ugrađena sigurnost/kvalitet: Sigurnosni zahtjevi (poput parametriziranih upita) i granični uvjeti su navedeni u spec-u, AI ih se mora pridržavati.

5. Primjer dobrog spec-a (minimalna verzija)

# Spec: API za registraciju korisnika

## Opseg
- Prima email, password
- Ne šalje verifikacijski email, ne provjerava stvarnost emaila

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

## Ponašanje
- email mora odgovarati osnovnom formatu RFC 5322 (a@b.c)
- password: dužina 8-20, najmanje jedan broj i jedno veliko slovo
- Koristi bcrypt za šifrirano pohranjivanje, cijena soli 10
- Ako se prije pohranjivanja u bazu otkrije da email već postoji → 409

## Testni slučajevi (ulaz -> očekivani statusni kod + polja odgovora)
| Ulazni email | Lozinka | Očekivano |
|--------------|---------|-----------|
| test@x.com   | Pass1234 | 201, user_id postoji |
| test@x.com   | pass     | 400, INVALID_PASSWORD |
| bad          | Pass1234 | 400, INVALID_EMAIL |
| (email koji već postoji) | Pass1234 | 409, EMAIL_ALREADY_EXISTS |

## Nefunkcionalni zahtjevi
- SQL upiti moraju koristiti parametrizirane upite (zaštita od injekcija)
- Evidentiranje: zabilježi IP izvor registracije, ne bilježi lozinku
- Vrijeme odgovora: 95% zahtjeva < 100ms (bez bcrypt-a)

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

Dobar Spec Coding = pretvoriti ljudske "dizajnerske odluke" u mašinske "testne slučajeve + tipski potpis + ograničenja ponašanja", tako da AI samo popunjava implementaciju, dok čovjek uvijek kontrolira kvalitet i smjer.

评论

暂无已展示的评论。

发表评论(匿名)