AI serija intervjua 16: Kako bi trebao izgledati dobar spec coding?
Dobar Spec Coding (specifikacijski vođeno programiranje) u srži pretvara "nejasne ideje" u "precizne, provjerljive i izvršne ugovore". Nije samo pisanje dokumenta, već uspostavljanje nedvosmislenog jezika komunikacije između ljudi i AI-ja (ili među ljudima). U nastavku ću iz četiri dimenzije – struktura sadržaja specifikacije, principi pisanja, proces suradnje s AI-jem, provjera kvalitete – dati izgled dobrog spec-a.
1. Standardna struktura dokumenta specifikacije (na primjeru funkcionalnog modula)
| Poglavlje | Obavezni sadržaj | Primjer |
|---|---|---|
| 1. Cilj i opseg | Jednom rečenicom opisati što se radi, jasno navesti što se ne radi | "Implementirati API za registraciju korisnika, bez provjere e-pošte" |
| 2. Ulazno/izlazni ugovor | Struktura podataka, tipovi, obvezna/neobvezna 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, rubni uvjeti, stanja | "Dužina lozinke 8-20 znakova, mora sadržavati barem jedan broj; ako e-pošta već postoji, vrati 409" |
| 4. Obrada grešaka | Svi mogući iznimni scenariji i pripadajući kodovi/poruke greške | "Neuspjeh povezivanja s bazom → vrati 503, ne otkrivaj stog" |
| 5. Nefunkcionalni zahtjevi | Performanse (vrijeme odgovora < 200ms), sigurnost (parametrizirani upiti), zapisivanje, promatrivost | "Svi SQL upiti moraju koristiti pripremljene naredbe; bilježiti email, ali ne bilježiti password" |
| 6. Testni slučajevi (ključno) | Najmanje 3 tipična unosa + 2 rubna/iznimna unosa, s očekivanim izlazom | Vidi donju tablicu |
| 7. Ovisnosti i ograničenja | Koje biblioteke, verzije, varijable okruženja | "Python 3.10+, FastAPI, varijabla okruženja DB_URL" |
Primjer testnog slučaja (ugrađen u spec)
| Scenarij | Unos | Očekivani izlaz |
|---|---|---|
| Normalna registracija | email: a@b.com, pwd: Pass1234 |
201, vraća user_id |
| Lozinka prekratka | pwd: Ab1 |
400, kod greške WEAK_PASSWORD |
| E-pošta već postoji | Isti email | 409, kod greške EMAIL_EXISTS |
Dobar spec najprije mora napisati testne slučajeve jer AI može na temelju njih izravno generirati jedinične testove, a nakon završetka automatski provjeriti.
2. Ključna načela pisanja spec-a (SMART varijanta)
| Načelo | Objašnjenje | Protuprimjer |
|---|---|---|
| Precizno | Koristi konkretne brojeve, tipove, Booleove uvjete; izbjegavaj "što je više moguće", "obično" | ❌ "Lozinka mora biti dovoljno sigurna" → ✅ "Lozinka najmanje 8 znakova, sadrži veliko slovo, malo slovo i broj" |
| Provjerljivo | Svaki zahtjev može se automatskim testom ili ručnom provjerom ocijeniti kao prolaz/neuspjeh | ❌ "Kod treba biti elegantan" → ✅ "Ciklomatska složenost funkcije ≤ 10, bez dupliciranih blokova koda" |
| Nedvosmisleno | Isti pojam ima dosljedno značenje kroz cijeli tekst; po potrebi daj pojmovnik | ❌ "Ako korisnik ne postoji, vrati grešku" → ✅ "Korisnik ne postoji → vrati 404 i {code: 'USER_NOT_FOUND'}" |
| Potpuno | Pokriva sretni put, sve iznimne putove i nefunkcionalne zahtjeve | ❌ Napisan samo uspješni scenarij → ✅ Uključuje vremensko istek baze, nedovoljna ovlaštenja itd. |
| Atomarno | Jedan spec opisuje samo jednu neovisno isporučivu funkciju (olakšava AI-ju da je dovrši odjednom) | ❌ Koristiti jedan spec za "cijeli sustav plaćanja" → ✅ Podijeliti na "generiranje naloga za plaćanje", "provjera potpisa povratnog poziva", "povrat novca" |
3. Proces spec coding-a u suradnji s AI-jem
- Čovjek piše spec (gornja struktura, posebno testne slučajeve i potpise funkcija).
- Daj spec AI-ju u jednom dahu (nemoj dodavati zahtjeve u dijalogu, izbjegavaj 'vibe' kontaminaciju).
- AI ispisuje kod + jedinične testove (AI mora generirati izvršne testove prema testnim slučajevima u spec-u).
- Pokreni testove: ako svi prolaze, idi na sljedeći korak; ako ne prolaze, izmijeni spec ili izravno ispravi kod (u tom trenutku možeš ući u malu petlju, ali zabilježi promjene).
- Ručna provjera: provjeri jesu li uvedene funkcije izvan spec-a (scope creep), provjeri sigurnost/performanse.
- Učvrsti: predaj dokument spec-a i konačni kod zajedno u repozitorij kao trajnu dokumentaciju.
Ključna praksa: Kodificiraj spec – koristi
spec.md+test_spec.py, pri čemu testna datoteka izravno dolazi iz primjera u spec-u, tako da pri naknadnim izmjenama koda samo pokreneš testove i provjeriš je li spec narušen.
4. Učinci dobrog spec-a (mogu poslužiti kao kriteriji prihvaćanja)
- Određenost: isti spec dan različitim AI-jevima (ili različitim ljudima) dovodi do sličnih implementacija.
- Testabilnost: čim se napiše kod, može se odmah automatski provjeriti 90% točnosti.
- Održivost: nakon šest mjeseci svatko tko pogleda spec može razumjeti izvornu namjeru dizajna.
- Niski komunikacijski troškovi: tijekom rasprava u timu raspravlja se samo o spec-u, ne o konkretnim redovima koda.
- Ugrađena sigurnost/kvaliteta: sigurnosni zahtjevi (poput parametriziranih upita) i rubni uvjeti navedeni su 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 istinitost e-pošte
## 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 biti u skladu s osnovnim formatom RFC 5322 (a@b.c)
- password: duljina 8-20, mora sadržavati barem jedan broj i jedno veliko slovo
- Koristiti bcrypt za šifrirano pohranjivanje, salt cost 10
- Ako se otkrije da email već postoji prije pohrane u bazu → 409
## Testni slučajevi (unos -> očekivani statusni kod + polje odgovora)
| Unos email | password | Očekivanje |
|------------|----------|------|
| 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 |
## Nefunkcionalno
- SQL mora koristiti parametrizirane upite (zaštita od injekcije)
- Zapisivanje IP adrese registracije, ne zapisivati lozinku
- Vrijeme odgovora 95% zahtjeva < 100ms (bez bcrypt)
## Ovisnosti
- Python 3.10+, FastAPI, bcrypt, asyncpg
Dobar Spec Coding = zapisati ljudske "projektne odluke" kao strojne "testne slučajeve + tipne potpise + ograničenja ponašanja", tako da AI samo popunjava implementaciju, a čovjek uvijek kontrolira kvalitetu i smjer.
评论
暂无已展示的评论。
发表评论(匿名)