← 返回列表

AI sorozat interjú 16: Milyen legyen egy jó specifikációvezérelt kódolás?

Egy jó Specifikációvezérelt kódolás (Spec Coding) lényege, hogy a „homályos ötleteket” „pontos, ellenőrizhető és végrehajtható szerződésekké” alakítsa. Nem csupán dokumentumot írni, hanem egy félreérthetetlen kommunikációs nyelvet létrehozni ember és AI (vagy ember és ember) között. Az alábbiakban a specifikáció tartalmi struktúrája, írási alapelvei, az AI-val való együttműködés folyamata és minőségellenőrzése szempontjából mutatom be, milyen egy jó spec.


I. A specifikációs dokumentum szabványos struktúrája (példa egy funkció modulra)

Fejezet Kötelező tartalom Példa
1. Cél és hatókör Egy mondatban elmondani, mit csinál, és egyértelműen meghatározni, mit nem csinál „Felhasználói regisztrációs API megvalósítása, e-mail megerősítés nélkül”
2. Bemeneti/kimeneti szerződés Adatstruktúra, típus, kötelező/opcionális mezők, példaértékek POST /register kérés törzs {email: string, password: string}, válasz 201 vagy 400 hibakóddal
3. Viselkedés és logika Üzleti szabályok, határesetek, állapotátmenetek „Jelszó hossza 8-20 karakter, legalább egy számot tartalmazzon; ha az e-mail már létezik, adjon vissza 409-et”
4. Hibakezelés Minden lehetséges kivételes forgatókönyv és a megfelelő hibakód/üzenet „Adatbázis-kapcsolat meghiúsul → 503 visszaadása, verem nem mutatása”
5. Nem funkcionális követelmények Teljesítmény (válaszidő < 200ms), biztonság (paraméterezett lekérdezések), naplózás, megfigyelhetőség „Minden SQL előre lefordított utasításokat használjon; naplózni az email-t, de a jelszót nem”
6. Tesztesetek (kulcsfontosságú) Legalább 3 tipikus bemenet + 2 határ/kivételes bemenet, várt kimenettel Lásd az alábbi táblázatot
7. Függőségek és megszorítások Milyen könyvtárakat, verziókat, környezeti változókat használ „Python 3.10+, FastAPI, környezeti változó DB_URL

Példa tesztesetek (a spec-ben beágyazva)

Forgatókönyv Bemenet Várt kimenet
Normál regisztráció email: a@b.com, jelszó: Pass1234 201, user_id visszaadása
Túl rövid jelszó jelszó: Ab1 400, hibakód WEAK_PASSWORD
E-mail már létezik ugyanaz az email 409, hibakód EMAIL_EXISTS

A jó spec először a teszteseteket írja meg, mert az AI ezek alapján közvetlenül generálhat egységteszteket, amelyek automatikusan ellenőrzik a kódot.


II. A specifikáció írásának alapelvei (SMART változat)

Alapelv Magyarázat Ellenpélda
Pontos (Precise) Konkrét számokat, típusokat, logikai feltételeket használjon; kerülje a „lehetőség szerint”, „általában” kifejezéseket ❌ „A jelszó legyen elég biztonságos” → ✅ „A jelszó legalább 8 karakter, tartalmazzon nagybetűt, kisbetűt és számot”
Ellenőrizhető (Verifiable) Minden követelmény automatikus teszttel vagy manuális ellenőrzéssel eldönthető, hogy sikeres-e ❌ „A kód legyen elegáns” → ✅ „A ciklomatikus komplexitás ≤ 10, ne legyen ismétlődő kódblokk”
Félreérthetetlen (Unambiguous) Ugyanaz a kifejezés az egész szövegben ugyanazt jelentse; szükség esetén glosszáriumot adjon ❌ „Ha a felhasználó nem létezik, adjon vissza hibát” → ✅ „Felhasználó nem létezik → 404 és {code: 'USER_NOT_FOUND'} visszaadása”
Teljes (Complete) Fedje le a happy path-ot, minden kivételes utat és nem funkcionális követelményeket ❌ Csak a sikeres forgatókönyvet írja le → ✅ Tartalmazza az adatbázis-időtúllépést, hiányzó jogosultságokat stb.
Atomi (Atomic) Egy specifikáció csak egy önállóan szállítható funkciópontot írjon le (hogy az AI egyszerre befejezhesse) ❌ Egy spec-ben leírni „a teljes fizetési rendszert” → ✅ Felbontani: „fizetési megbízás generálása”, „visszahívás aláírás-ellenőrzése”, „visszatérítés”

III. Specifikációvezérelt kódolás folyamata AI-val együttműködve

  1. Ember írja a spec-et (a fenti struktúra, különösen a tesztesetek és függvényaláírások).
  2. A spec-et egyszerre adja be az AI-nak (ne beszélgetés formájában adjon hozzá követelményeket, hogy elkerülje a vibe szennyeződést).
  3. AI kimenet: kód + egységtesztek (az AI köteles a spec-ben szereplő tesztesetek alapján végrehajtható teszteket generálni).
  4. Tesztek futtatása: ha minden sikeres, továbblépés; ha nem, módosítani kell a spec-et vagy közvetlenül javítani a kódot (ekkor kisebb ciklusba lehet lépni, de a változtatásokat rögzíteni kell).
  5. Emberi felülvizsgálat: ellenőrizni, hogy nem került-e be a spec-en kívüli funkció (scope creep), valamint a biztonságot/teljesítményt.
  6. Rögzítés: a spec dokumentumot és a végleges kódot együtt beadni a tárolóba, mint állandó dokumentációt.

Kulcsfontosságú gyakorlat: Spec kódosítása – használjon spec.md-t és test_spec.py-t, ahol a tesztfájl közvetlenül a spec-ben lévő példákból származik. Így később a kód módosításakor csak a teszteket kell futtatni, hogy ellenőrizze, a spec sértetlen-e.


IV. Egy jó spec által elért hatások (elfogadási kritériumként)

  • Determináltság: ugyanaz a spec különböző AI-oknak (vagy embereknek) hasonló megvalósítást eredményez.
  • Tesztelhetőség: a kód megírása után azonnal automatikusan ellenőrizhető a 90%-os helyesség.
  • Karbantarthatóság: fél év múlva bárki, aki megnézi a spec-et, megérti az eredeti tervezési szándékot.
  • Alacsony kommunikációs költség: a csapat csak a spec-ről beszél, nem a konkrét kódsorokról.
  • Beépített biztonság/minőség: a biztonsági követelmények (pl. paraméterezett lekérdezések) és határesetek a spec-ben szerepelnek, az AI köteles betartani.

V. Példa egy jó spec-re (minimalista)

# Spec: Felhasználói regisztrációs API

## Hatókör
- Email és jelszó fogadása
- Nem küld megerősítő e-mailt, nem ellenőrzi az e-mail valódiságát

## Szerződés
POST /register
Content-Type: application/json
Kérés: { "email": string, "password": string }
Válasz 201: { "user_id": string }
Válasz 400: { "code": "INVALID_PASSWORD" | "INVALID_EMAIL" }
Válasz 409: { "code": "EMAIL_ALREADY_EXISTS" }

## Viselkedés
- Az email-nek meg kell felelnie az RFC 5322 alapformátumnak (a@b.c)
- Jelszó: hossz 8-20, legalább egy számot és egy nagybetűt tartalmazzon
- Bcrypt-tel titkosítva tárolni, só költség 10
- Ha az adatbázisba mentés előtt kiderül, hogy az email már létezik → 409

## Tesztesetek (bemenet -> várt állapotkód+válaszmező)
| Bemenet email | Jelszó | Várt |
|------------|----------|------|
| test@x.com | Pass1234  | 201, user_id létezik |
| test@x.com | pass      | 400, INVALID_PASSWORD |
| bad        | Pass1234  | 400, INVALID_EMAIL |
| (már létező email) | Pass1234 | 409, EMAIL_ALREADY_EXISTS |

## Nem funkcionális
- Az SQL-nek paraméterezett lekérdezéseket kell használnia (SQL injection ellen)
- Naplózni a regisztráció forrás IP-jét, a jelszót nem
- Válaszidő: a kérések 95%-a < 100ms (bcrypt nélkül)

## Függőségek
- Python 3.10+, FastAPI, bcrypt, asyncpg

Jó Spec Coding = az ember „tervezési döntéseit” a gép „teszteseteivé + típus aláírásává + viselkedési megszorításává” alakítani, így az AI csak a megvalósítással foglalkozik, miközben az ember mindvégig ellenőrzi a minőséget és az irányt.

评论

暂无已展示的评论。

发表评论(匿名)