← 返回列表

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

  1. Čovjek piše spec (gornja struktura, posebno testne slučajeve i potpise funkcija).
  2. Daj spec AI-ju u jednom dahu (nemoj dodavati zahtjeve u dijalogu, izbjegavaj 'vibe' kontaminaciju).
  3. AI ispisuje kod + jedinične testove (AI mora generirati izvršne testove prema testnim slučajevima u spec-u).
  4. 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).
  5. Ručna provjera: provjeri jesu li uvedene funkcije izvan spec-a (scope creep), provjeri sigurnost/performanse.
  6. 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.

评论

暂无已展示的评论。

发表评论(匿名)