← 返回列表

AI série rozhovorů 16: Jak by mělo vypadat dobré spec kódování?

Dobré Spec kódování (specifikace řízené programování) spočívá v přeměně „mlhavých nápadů“ na „přesné, ověřitelné a vykonatelné kontrakty“. Nejde jen o psaní dokumentu, ale o vytvoření jednoznačného komunikačního jazyka mezi člověkem a AI (nebo mezi lidmi). Níže uvedu, jak vypadá dobrá specifikace z hlediska obsahové struktury specifikace, principů psaní, procesu spolupráce s AI a ověřování kvality.


一、Standardní struktura dokumentu specifikace (na příkladu funkčního modulu)

Kapitola Povinný obsah Příklad
1. Cíl a rozsah Jednou větou popsat, co se dělá, a jasně uvést, co se nedělá „Implementovat API pro registraci uživatele, nezahrnuje ověření e-mailu“
2. Vstupní/výstupní kontrakt Datová struktura, typy, povinná/volitelná pole, příklady hodnot POST /register tělo požadavku {email: string, password: string}, odpověď 201 nebo 400 s chybovým kódem
3. Chování a logika Obchodní pravidla, okrajové podmínky, přechody stavů „Délka hesla 8-20 znaků, alespoň jedno číslo; pokud e-mail již existuje, vraťte 409
4. Zpracování chyb Všechny možné výjimky a odpovídající chybové kódy/zprávy „Selhání připojení k databázi → vraťte 503, nezveřejňujte stack trace“
5. Nefunkční požadavky Výkon (doba odezvy < 200 ms), bezpečnost (parametrizované dotazy), logování, pozorovatelnost „Všechny SQL dotazy musí používat předpřipravené příkazy; zaznamenávejte email, ale ne password
6. Testovací případy (klíčové) Alespoň 3 typické vstupy + 2 okrajové/výjimečné vstupy, uveďte očekávaný výstup viz tabulka níže
7. Závislosti a omezení Jaké knihovny, verze, proměnné prostředí „Python 3.10+, FastAPI, proměnná prostředí DB_URL

Testovací případy (vložené do specifikace)

Scénář Vstup Očekávaný výstup
Normální registrace email: a@b.com, pwd: Pass1234 201, vrátí user_id
Heslo příliš krátké pwd: Ab1 400, chybový kód WEAK_PASSWORD
E-mail již existuje stejný email 409, chybový kód EMAIL_EXISTS

Dobrá specifikace musí nejprve napsat testovací případy, protože AI na jejich základě může přímo generovat unit testy a po dokončení automaticky ověřit.


二、Hlavní principy psaní specifikace (varianta SMART)

Princip Vysvětlení Protipříklad
Přesný (Precise) Používejte konkrétní čísla, typy, booleovské podmínky, vyhněte se „pokud možno“, „obvykle“ ❌ „Heslo musí být dostatečně bezpečné“ → ✅ „Heslo alespoň 8 znaků, obsahuje velké písmeno, malé písmeno, číslo“
Ověřitelný (Verifiable) Každý požadavek musí být možné určit jako splněný/nesplněný automatickým testem nebo ruční kontrolou ❌ „Kód musí být elegantní“ → ✅ „Cyklická složitost funkce ≤ 10, žádné duplicitní bloky kódu“
Jednoznačný (Unambiguous) Stejný termín má konzistentní význam v celém textu, v případě potřeby uveďte slovník ❌ „Pokud uživatel neexistuje, vraťte chybu“ → ✅ „Uživatel neexistuje → vraťte 404 a {code: 'USER_NOT_FOUND'}
Úplný (Complete) Pokrývá happy path, všechny výjimečné cesty, nefunkční požadavky ❌ Napsán pouze úspěšný scénář → ✅ Zahrnuje timeout databáze, nedostatečná oprávnění atd.
Atomický (Atomic) Jedna specifikace popisuje pouze jeden nezávisle dodavatelný funkční bod (aby AI mohla dokončit najednou) ❌ Pomocí jedné specifikace napsat „celý platební systém“ → ✅ Rozdělit na „vytvoření platebního příkazu“, „ověření podpisu callbacku“, „vrácení peněz“

三、Proces Spec kódování při spolupráci s AI

  1. Člověk napíše specifikaci (výše uvedená struktura, zejména testovací případy a signatury funkcí).
  2. Specifikaci vložte AI najednou (nepřidávejte požadavky formou konverzace, abyste předešli „vibe pollution“).
  3. AI vygeneruje kód + unit testy (AI musí podle testovacích případů ve specifikaci vytvořit spustitelné testy).
  4. Spusťte testy: Pokud všechny projdou, pokračujte; pokud ne, upravte specifikaci nebo přímo opravte kód (v tomto okamžiku lze vstoupit do malého cyklu, ale změny je třeba zaznamenat).
  5. Ruční kontrola: Zkontrolujte, zda nebyly zavedeny funkce mimo specifikaci (scope creep), zkontrolujte bezpečnost/výkon.
  6. Uložte: Odešlete dokument specifikace a finální kód do úložiště jako trvalou dokumentaci.

Klíčová praxe: Specifikace jako kód — použijte spec.md + test_spec.py, kde testovací soubory přímo vycházejí z příkladů ve specifikaci, takže při pozdějších úpravách kódu stačí spustit testy k ověření, zda specifikace nebyla narušena.


四、Přínosy dobré specifikace (lze použít jako akceptační kritéria)

  • Determinismus: Stejná specifikace poskytnutá různým AI (nebo lidem) vede k podobným implementacím.
  • Testovatelnost: Po napsání kódu lze automaticky ověřit 90 % správnosti.
  • Udržovatelnost: Po půl roce kdokoli, kdo se podívá na specifikaci, pochopí původní záměr návrhu.
  • Nízké komunikační náklady: Během týmové diskuze se diskutuje pouze specifikace, ne konkrétní řádky kódu.
  • Bezpečnost/kvalita vestavěná: Bezpečnostní požadavky (např. parametrizované dotazy) a okrajové podmínky jsou uvedeny ve specifikaci, AI je musí dodržovat.

五、Příklad dobré specifikace (minimalistická verze)

# Spec: API pro registraci uživatele

## Rozsah
- Přijímá email, password
- Neodesílá ověřovací e-mail, nekontroluje pravost e-mailu

## Kontrakt
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\" }

## Chování
- email musí odpovídat základnímu formátu RFC 5322 (a@b.c)
- password: délka 8-20, alespoň jedno číslo a jedno velké písmeno
- Použijte bcrypt pro šifrované uložení, salt cost 10
- Pokud je email nalezen již před uložením do databáze → 409

## Testovací případy (vstup -> očekávaný stavový kód + pole odpovědi)
| Vstupní email | password | Očekávání |
|---------------|----------|-----------|
| test@x.com    | Pass1234 | 201, user_id existuje |
| test@x.com    | pass     | 400, INVALID_PASSWORD |
| bad           | Pass1234 | 400, INVALID_EMAIL |
| (již existující e-mail) | Pass1234 | 409, EMAIL_ALREADY_EXISTS |

## Nefunkční požadavky
- SQL musí používat parametrizované dotazy (ochrana proti injekci)
- Logování zaznamenává IP zdroje registrace, nezaznamenává heslo
- Doba odezvy 95 % požadavků < 100 ms (bez bcrypt)

## Závislosti
- Python 3.10+, FastAPI, bcrypt, asyncpg

Dobré Spec kódování = napsat „rozhodnutí o návrhu“ člověka jako „testovací případy + typové signatury + omezení chování“ pro stroj, což AI nechá pouze vyplnit implementaci, zatímco člověk vždy řídí kvalitu a směr.

评论

暂无已展示的评论。

发表评论(匿名)