← 返回列表

AI-sarjan haastattelu 16: Millainen on hyvä spec-koodaus?

Hyvä Spec-koodaus (spesifikaatiovetoinen ohjelmointi) muuttaa "epämääräiset ajatukset" täsmällisiksi, todennettaviksi ja toteutettaviksi sopimuksiksi. Se ei ole vain dokumentti, vaan joukko yksiselitteisiä viestintävälineitä ihmisen ja AI:n (tai ihmisten) välillä. Alla käsittelen neljää ulottuvuutta: spesifikaation sisältörakenne, kirjoitusperiaatteet, AI-yhteistyöprosessi ja laadunvarmistus, ja annan kuvan hyvästä specistä.


1. Spesifikaatiodokumentin standardirakenne (esimerkkinä toimintomoduuli)

Luku Pakollinen sisältö Esimerkki
1. Tavoite ja laajuus Yksi lause siitä, mitä tehdään, ja selkeästi mitä ei tehdä "Toteutetaan käyttäjien rekisteröinnin API, ei sisällä sähköpostin vahvistusta"
2. Syöte/tuloste -sopimus Tietorakenne, tyypit, pakolliset/valinnaiset kentät, esimerkkiarvot POST /register -pyyntörunko {email: string, password: string}, vastaus 201 tai 400 virhekoodilla
3. Käyttäytyminen ja logiikka Liiketoimintasäännöt, raja-arvot, tilasiirtymät "Salasanan pituus 8-20 merkkiä, vähintään yksi numero; jos sähköposti on jo olemassa, palauta 409"
4. Virheiden käsittely Kaikki mahdolliset poikkeustilanteet ja niitä vastaavat virhekoodit/viestit "Tietokantayhteys epäonnistuu → palauta 503, älä paljasta pinoa"
5. Ei-toiminnalliset vaatimukset Suorituskyky (vastausaika < 200 ms), turvallisuus (parametrisoidut kyselyt), lokit, havaittavuus "Kaikki SQL:t on esikäännettävä; kirjaa email mutta älä password"
6. Testitapaukset (kriittinen) Vähintään 3 tyypillistä syötettä + 2 raja/poikkeussyötettä, odotettu tulos Katso alla oleva taulukko
7. Riippuvuudet ja rajoitteet Mitä kirjastoja, versioita, ympäristömuuttujia käytetään "Python 3.10+, FastAPI, ympäristömuuttuja DB_URL"

Esimerkki testitapauksista (sisällytettynä spec:iin)

Skenaario Syöte Odotettu tulos
Normaali rekisteröinti email: a@b.com, salasana: Pass1234 201, palauttaa user_id
Salasana liian lyhyt salasana: Ab1 400, virhekoodi WEAK_PASSWORD
Sähköposti jo olemassa sama email 409, virhekoodi EMAIL_EXISTS

Hyvä spec kirjoitetaan ensin testitapauksineen, koska AI voi niiden perusteella luoda suoraan yksikkötestit ja automaattisesti varmistaa ne.


2. Specin kirjoittamisen perusperiaatteet (SMART-muunnelma)

Periaate Selitys Vastaesimerkki
Täsmällinen (Precise) Käytä konkreettisia lukuja, tyyppejä, loogisia ehtoja; vältä "mahdollisimman", "yleensä" ❌ "Salasanan on oltava riittävän turvallinen" → ✅ "Salasanassa vähintään 8 merkkiä, sisältää ison kirjaimen, pienen kirjaimen ja numeron"
Todennettava (Verifiable) Jokainen vaatimus voidaan tarkistaa automaattisesti tai manuaalisesti hyväksytyksi/hylätyksi ❌ "Koodin on oltava tyylikästä" → ✅ "Funktion syklomaattinen kompleksisuus ≤ 10, ei toistuvia koodilohkoja"
Yksiselitteinen (Unambiguous) Sama termi tarkoittaa samaa koko tekstissä; tarvittaessa määrittele sanasto ❌ "Jos käyttäjää ei ole, palauta virhe" → ✅ "Käyttäjää ei ole → palauta 404 ja {code: 'USER_NOT_FOUND'}"
Täydellinen (Complete) Kattaa onnellisen polun, kaikki poikkeuspolut ja ei-toiminnalliset vaatimukset ❌ Vain onnistuneet skenaariot → ✅ Sisältää tietokannan aikakatkaisun, oikeuksien puutteen jne.
Atomi (Atomic) Yksi spec kuvaa vain yhtä itsenäisesti toimitettavaa toimintoa (jotta AI voi tehdä sen kerralla) ❌ Yksi spec "koko maksujärjestelmälle" → ✅ Jaetaan "maksutapahtuman luonti", "takaisinkutsun allekirjoituksen tarkistus", "hyvitys"

3. Spec-koodausprosessi AI:n kanssa yhteistyössä

  1. Ihminen kirjoittaa specin (yllä oleva rakenne, erityisesti testitapaukset ja funktioiden allekirjoitukset).
  2. Spec syötetään AI:lle kerralla (ei keskustelumuotoisia lisäyksiä, jotta vältetään "vibe"-saastuminen).
  3. AI tuottaa koodin + yksikkötestit (AI:n on noudatettava specin testitapauksia ja luotava suoritettavia testejä).
  4. Testien ajaminen: Jos kaikki menevät läpi, siirry seuraavaan vaiheeseen; jos eivät, muuta spec:iä tai korjaa koodi suoraan (pieni silmukka on sallittu, mutta muutokset kirjattava).
  5. Ihmisen tarkistus: Tarkistetaan, onko lisätty specin ulkopuolisia toimintoja (scope creep), tarkistetaan turvallisuus ja suorituskyky.
  6. Vakiointi: Spec-dokumentti ja lopullinen koodi tallennetaan yhdessä repositorioon pysyväksi dokumentaatioksi.

Keskeinen käytäntö: Specin koodaus — käytä spec.md + test_spec.py, jossa testitiedosto tulee suoraan specin esimerkeistä, jotta myöhemmät koodimuutokset voidaan validoida ajamalla testit.


4. Hyvän specin tuottamat hyödyt (voi käyttää hyväksymiskriteereinä)

  • Determinismi: Sama spec tuottaa eri AI:lle (tai eri henkilöille) samankaltaiset toteutukset.
  • Testattavuus: Koodin valmistuttua voidaan automaattisesti todentaa 90 % oikeellisuudesta.
  • Ylläpidettävyys: Puolen vuoden päästä kuka tahansa näkee specistä alkuperäiset suunnittelupäätökset.
  • Pienet viestintäkustannukset: Tiimikeskustelussa käsitellään vain spec:iä, ei yksittäisiä koodirivejä.
  • Sisäänrakennettu turvallisuus/laatu: Turvallisuusvaatimukset (kuten parametrisoidut kyselyt) ja raja-arvot kirjoitetaan spec:iin, AI:n on noudatettava niitä.

5. Esimerkki hyvästä specistä (minimiversio)

# Spec: Käyttäjärekisteröinnin API

## Laajuus
- Vastaanottaa email ja salasana
- Ei lähetä vahvistussähköpostia, ei tarkista sähköpostin oikeellisuutta

## Sopimus
POST /register
Content-Type: application/json
Pyyntö: { "email": string, "password": string }
Vastaus 201: { "user_id": string }
Vastaus 400: { "code": "INVALID_PASSWORD" | "INVALID_EMAIL" }
Vastaus 409: { "code": "EMAIL_ALREADY_EXISTS" }

## Käyttäytyminen
- email on oltava RFC 5322 -perusmuodossa (a@b.c)
- salasana: pituus 8-20, vähintään yksi numero ja yksi iso kirjain
- Käytä bcrypt-salausta, suolakustannus 10
- Jos ennen tietokantaan tallentamista havaitaan, että email on jo olemassa → 409

## Testitapaukset (syöte -> odotettu tilakoodi + vastauskenttä)
| Syöte email | salasana | Odotettu |
|-------------|----------|----------|
| test@x.com  | Pass1234 | 201, user_id on olemassa |
| test@x.com  | pass     | 400, INVALID_PASSWORD |
| bad         | Pass1234 | 400, INVALID_EMAIL |
| (jo olemassa oleva email) | Pass1234 | 409, EMAIL_ALREADY_EXISTS |

## Ei-toiminnalliset vaatimukset
- SQL on käytettävä parametrisoituja kyselyitä (injektion estämiseksi)
- Lokitetaan rekisteröinnin lähde-IP, ei salasanaa
- Vastausaika 95 %:ssa pyynnöistä < 100 ms (ilman bcryptiä)

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

Hyvä Spec-koodaus = ihmisen "suunnittelupäätökset" muutetaan koneen "testitapauksiksi + tyyppiallekirjoituksiksi + käyttäytymisrajoituksiksi", jolloin AI vastaa vain toteutuksen täyttämisestä, ja ihminen hallitsee laatua ja suuntaa.

评论

暂无已展示的评论。

发表评论(匿名)