Skip to main content

93 - Noorem-tarkvaraarendajast vanemarendajaks — agendid ja spec-driven arendus

TalTech "Vanemarendajaks" kursuse külalisloeng, 2026.
Andres Käver — courses.taltech.akaver.com
Kursuse koduleht: taltech.ee/vanemarendajaks


Kuidas see loeng on üles ehitatud

Kolm tundi, kolmes osas. LLM-i põhitõed tihedalt (30 min), siis peamine osa — mis on agendi harness ja viis sammast, mida iga vanemarendaja peab tundma (55 min). Viimane tund on praktiline: spec-driven arendus OpenSpec-iga ja päris käed-külge opencode + Claude Opus-iga.

OsaAegFookus
1. Mis on LLM tegelikult30 minToken-ennustaja, stateless API, tokenid/kontekst/hind, tool calling
paus10 min
2. Harness ja viis sammast55 minAGENTS.md, tools+MCP, skills, hooks, kontekstihaldus, subagents
paus10 min
3. Spec-driven + praktika85 minMiks spec, OpenSpec workflow, 60 min käed-külge

Eeldus: sa oled kirjutanud koodi aastaid, kasutanud ChatGPT-d või Claude'i ja lihtsad küsimused on sulle lahendatud probleem. See loeng on selle jaoks, kui tahad AI-d päriselt oma arendustöösse integreerida — mitte chat-window'is, vaid terminalis, kus agent loeb, kirjutab, testib ja commit'ib ise.


1. Mis on LLM tegelikult

1.1 Järgmise tokeni ennustaja

LLM pole maagia. See on närvivõrk, mis on treenitud ühte ülesannet täitma: ennusta järgmist tokenit. Kõik muu — chat, code generation, agentic töö — on kihid selle peal.

Kui sa annad sisendiks "Pealinn Eestis on", siis mudel tagastab tõenäosusjaotuse järgmise tokeni üle: Tallinn 94%, Helsinki 2%, Riia 1%, jne. Valib ühe (sampling'u reeglite järgi), lisab sisendisse, kordab.

Miks see vanemarendajale oluline on:

  • Mudel ei "mõtle" — ta genereerib tokeneid. "Reasoning" mudelid genereerivad lihtsalt rohkem tokeneid enne vastust (chain-of-thought on tokeniseeritud mõtlemine).
  • Mudel ei mäleta mitte midagi eelmisest päringust. API on stateless. Iga konteksti, mida sa soovid säilitada, pead sa ise tagasi saatma iga päringuga.
  • Halb vastus = halb kontekst. Enne kui süüdistad mudelit, küsi: mis oli täpselt sellel hetkel sisendis?

1.2 Stateless API — lihtsaim võimalik pilt

Kogu LLM API on üks endpoint: POST /v1/messages. Sisendisse läheb JSON:

{
"model": "claude-opus-4-7",
"messages": [
{"role": "user", "content": "Kirjuta Pythonis fibonacci funktsioon"}
],
"max_tokens": 1024
}

Väljastusena saad tagasi teksti. See on kõik. Chat-interface, VS Code plugin, Claude Code, opencode — kõik on kihid, mis lõpuks kutsuvad sama API-d.

Kui "chat" on stateless, kuidas see mäletab eelmist sõnumit? Ta ei mäleta. Iga sõnum API-le sisaldab kogu eelnevat vestlust uuesti. "Mälu" on klient-poole probleem, mitte mudeli oma.

1.3 Tokenid, kontekst, hind

Token pole sõna. See on sõna osa. "Vanemarendajaks" = umbes 6 tokenit. "tokenization" = 2 tokenit. Eesti keel on kallim — Inglise keelega võrreldes ~1.5× rohkem tokeneid sama info kohta (tokenizer on peamiselt treenitud Inglise keele peal).

Kolm numbrit, mida pead teadma:

MõisteMis see onMiks see loeb
KontekstiakenMax sisend + väljund tokenites200k/1M Opus, 1M Gemini, 8k vana GPT-3.5
Input price€ per miljon sisendtokenitSina maksad iga kord, kui saadad terve vestluse uuesti
Output price€ per miljon väljundtokenitTavaliselt 3–5× kallim kui input

Hinnavõrdlus, aprill 2026:

MudelInputOutputTüüpiline "kirjuta väike skript"
Claude Opus~$5/MTok~$25/MTok€0.50–5.00
Claude Sonnet~$3/MTok~$15/MTok€0.10–1.00
Kimi K2 turbo~$1.15/MTok~$8/MTok€0.05–0.50
Deepseek 3.2~$0.25/MTok~$0.38/MTok€0.01–0.10

Reaalne tagajärg: kui sul on 100k tokenit suur projekt ja sa saadad igale päringule kogu koodibaasi kaasa, siis sa maksad selle 100k tokeni iga päringu juures uuesti. Harness-id nagu opencode või Claude Code lahendavad seda KV cache'iga (cache hit = kuni 10× odavam) ja targa koodibaasi indekseerimisega. Kontekstitaju on raha.

1.4 Tool calling — sild harness'ini

Siin läheb huvitavaks. Mudel ei saa ise faili lugeda, internet'ist otsida ega shell-käsku käivitada. Aga ta saab paluda kellelegi teiselt, et see seda teeks.

Tool calling on leping. Sa ütled mudelile "sul on olemas järgnevad tööriistad" koos JSON schema'ga. Mudel, kui vajab, genereerib väljundiks JSON'i: {"tool": "read_file", "path": "/etc/hosts"}. Sinu kood (harness) näeb seda, käivitab tööriista, saadab vastuse tagasi mudelile järgmises päringus.

See silmus on agendi süda:

kasutaja sisend → mudel genereerib tool call → harness käivitab tööriista

mudel genereerib vastuse ← harness saadab tulemuse tagasi ← tulemus

Kui sa võtad sellest ühe asja kaasa: agent = "LLM + tsükkel + mõned tööriistad". Kogu harness-maailm järgib sellist ühist põhimõtet.


2. Agendi harness ja viis sammast

2.1 Mis on harness

Agendi harness on CLI või IDE tööriist, mis mässib LLM-i silmusesse. Claude Code, opencode, OpenAI Codex, forgecode, Cursor, Aider, Kilo Code. Kõik teevad sama asja: loevad sinu promptid, saadavad need mudelile, võtavad tagasi tool-call'id, käivitavad need, saadavad tulemuse mudelile, kordavad kuni töö tehtud.

Erinevus pole mudel. Claude Code kasutab Claude perekonda. opencode võib kasutada kõiki mudeleid (Opus, GPT, Gemini, lokaalsed). Erinevus on infrastruktuur silmuse ümber: millised tööriistad on sisseehitatud, kuidas konteksti hallatakse, kuidas õigusi kontrollitakse, milline on konfiguratsioon.

Lühike võrdlus:

HarnessKust päritMudelidEripära
Claude CodeAnthropicClaude perekondKõige küpsem: skills, hooks, subagents sisseehitatud
opencodeSST (avatud lähtekood)Kõik (Opus, GPT, Gemini, lokaalsed)Multi-provider, granulaarsed õigused, AGENTS.md
OpenAI CodexOpenAIGPT perekondTerminal + VS Code; AGENTS.md standard
AiderPaul GauthierKõikGit-keskne, iga muudatus = commit
Kilo CodeKiloKõikVS Code plugin, plan/act modes

Tänase loengu praktika jaoks: opencode + Claude Opus. Miks opencode — avatud lähtekood, mudeli-agnostiline, ei ole vendor lock-in. Miks Opus — parim kättesaadav mudel agentic tööks aprillis 2026. Aga workflow on sama, kui kasutad Claude Code'i või Codex'it.

2.2 Sammas 1 — projekti instruktsioonid

Iga harness loeb käivitumisel projekti juurest instruktsioonifaili, mis läheb system prompt'i osaks ja on mudelil olemas iga päringu juures:

HarnessFail
Claude CodeCLAUDE.md
opencodeopencode.json > instructions (viited failidele)
OpenAI CodexAGENTS.md (de facto standard)
Cursor.cursorrules / .cursor/rules/*.mdc
Aider.aider.conf.yml + convention files

Mida siia kirjutada:

OlulineMitte oluline
Projekti-spetsiifilised konventsioonidÜldine programmeerimise tarkus
Gotchas ("EF Core on NoTracking mode'is, pead Update() kutsuma")"Kirjuta kvaliteetset koodi"
Konkreetsed käsud (dotnet build, npm run test:unit)Pikad intro paragraafid
Arhitektuuri layering reeglidCoding style, mille lint saab kinni püüda

Näide opencode.json-st:

{
"$schema": "https://opencode.ai/config.json",
"instructions": [
"AGENTS.md",
"docs/ARCHITECTURE.md"
],
"model": "anthropic/claude-opus-4-7"
}

Kaskaad: user-tasand (~/.config/opencode/config.json) → projekti tasand (opencode.json). Claude Code'l on lisaks kausta-tasand, opencode-l pole.

Praktiline soovitus: alusta tühjast failist. Lisa rida ainult siis, kui AI teeb vea — iga viga parandab AGENTS.md üks rida. Ära kirjuta 300-realist CLAUDE.md'd spekulatiivselt. Parim on fail, mis kasvab reaalsusest, mitte kujutlusest.

SMIT on avaldanud oma Cursor-reeglid ja AGENTS.md-d avatud lähtekoodis: github.com/e-gov/cursor-prompts — vaata seal näiteid Spring Boot ja Nuxt projektide kohta.

2.3 Sammas 2 — tools + MCP

Tool calling on see, mille kohta juba 1.4 osas rääkisime. Iga harness pakub vaikimisi ~5–15 tööriista: read_file, edit, bash, glob, grep, web_search, jne. Mõnikord lisab ka todo_list, plan_mode, subagent.

Token economics: iga tööriista definitsioon läheb iga päringuga mudelile kaasa. 20 tööriista = ~5000–10 000 tokenit enne seda, kui sa üldse midagi küsid. Opus'e hinnaga teeb see €0.025–0.05 per päring, ainult tööriistade deklareerimise eest.

MCP (Model Context Protocol) on Anthropicu välja pakutud avatud standard väliste tööriistade ühendamiseks harness'iga. MCP server = ühendus ühele tööriistakomplektile (PostgreSQL, GitHub, Slack, Linear, Notion, jne). Mudel näeb neid samamoodi nagu sisseehitatud tööriistu.

Harness ←→ MCP server ←→ väline API / andmebaas / fail

LLM

Vanemarendaja reegel: mitte iga MCP server pole väärt oma tokenihinda. 20 MCP tööriista = 20k tokenit per turn, ka siis kui sa neid ei kasuta. Luba ainult need, mida sessiooni jaoks vajad. opencode-s saab seda sessiooni-tasemel teha. Anthropic lisas hiljuti tool_search mustri, kus tööriistade schema laaditakse ainult vajadusel — progressive disclosure on kontekstibilanss.

Kui tahad süvitsi, vaata 27-mcp.md — seal on detailne schema-economics ja tool_search pattern.

2.4 Sammas 3 — skills

Skills (Claude Code'i termin, aga kontsept on laiem) on taaskasutatavad instruktsioonipaketid, mis on eraldi projekti instruktsioonidest. Skill = kaust + SKILL.md + optional references (täiendavad failid, skriptid).

Erinevus MCP-st on token economics:

Discovery (iga turn)Activation (ainult kui kasutad)
MCP tool1000–1400 tokenit iga turn'i juures0 (juba laetud)
Skill~100 tokenit (ainult nimi + kirjeldus)500–5000 tokenit (laeme ainult siis, kui mudel valib)

See on progressive disclosure — näita metadata odavalt, lae sisu ainult siis kui vaja.

Kuhu skills sobivad:

  • Korduvad tööprotsessid ("code-review checklist", "migration playbook", "incident response")
  • Gotchas, mis kehtivad ainult teatud olukorras
  • Projekti domeeni-spetsiifilised workflow'd

Claude Code'l on see sisseehitatud (.claude/skills/). opencode-s saab sama efekti commands-iga (.opencode/commands/) — sarnane idee, väiksem tseremoonia. Laiemalt: 28-skills.md.

2.5 Sammas 4 — hooks

Hook on deterministlik shell-käsk, mille harness ise käivitab ilma mudelit kaasamata. Näiteks:

  • pre-tool-edit: enne kui agent faili muudab, käivita git stash
  • post-tool-edit: pärast kui fail muutus, käivita eslint --fix
  • pre-bash: enne bash tool-kutset kontrolli, kas käsk pole rm -rf või git push --force
  • on-stop: session lõppedes käivita git status ja näita kasutajale kokkuvõte

Hooks pole mudeli mure. Harness käivitab neid ise. See on turvalisuse ja automatiseerimise kiht — teeb agendi vähem ohtlikuks (pre-bash blokeerib destruktiivsed käsud), efektiivsemaks (auto-lint vähendab edasi-tagasi käiku) ja kasutajasõbralikumaks (auto-teavitus, kui jooksev task lõppes).

Claude Code'l on ~/.claude/settings.json > hooks väli. opencode lahendab osa sellest permissions süsteemiga, mis on granulaarsem. Sügavam vaade: 29-misc.md.

2.6 Sammas 5 — kontekstihaldus + subagents

Kontekstiaken on ressurss. Kui see lõppeb, hakkab mudel unustama vestluse algust, kuidas funktsioon oli defineeritud, miks sa algselt seda tegid. Agentic töö puhul juhtub see kiiresti — iga tool call lisab tokeneid.

Tüüpiline overhead vestluse algul:

  • System prompt + harness-i sisseehitatud tools: ~15k tokenit
  • Projekti instruktsioonid (CLAUDE.md / AGENTS.md): 2–10k
  • MCP tools (kui lubatud): 5–20k
  • Skills metadata: 1–3k
  • Vaikimisi overhead: 20–40k tokenit enne esimest kasutaja sõnumit

Siis hakkab vestlus kasvama — iga file-read on 200–2000 tokenit, iga bash-output võib-olla veel rohkem.

Kaks lahendust:

  1. Compaction — kui aken täis saab (~80%), harness summeerib vestluse ja alustab värske kontekstiga, kus algus on 2-leheküljeline summary. Claude Code teeb seda automaatselt. opencode pakub session-switching'ut.

  2. Subagents — delegeeri lärmakas uurimustöö (test output, faili-otsingud, dokumentatsiooni lugemine) lapsagendile, kellel on oma kontekstiaken. Laps teeb töö, tagastab vanemale ainult summary (100–500 tokenit). Vanema kontekst jääb puhas.

Vanem-agent (sinu peamine vestlus)
↓ delegates
"otsi koodibaasist kõik auth endpoint'id"

Laps-agent (värske kontekstiaken)
- loeb 20 faili (50k tokenit)
- tagastab nimekirja (300 tokenit)

Vanema kontekstiaken kasvab 300 tokeni võrra, mitte 50k võrra.

Subagents on olemas opencode'is (mode: subagent), Claude Code'is ja Codex'is. Viies valimatu sammas, kui hakkad suuremate projektide peal töötama. Täpsem: 30-agents.md.

2.7 Miks opencode täna

Tänase loengu praktika jaoks:

  1. Avatud lähtekood — näed, mis toimub. Saad fork'ida, kui vaja.
  2. Mudeli-agnostiline — sama konfiguratsioon Opus'e, GPT-5.4 ja Gemini'ga. Ei ole lock-in.
  3. Granulaarsed õigusedgit status * on OK, git push * küsib kinnitust. Vanemarendajale oluline.
  4. AGENTS.md — sama fail, mida Codex loeb. Portatiivne harness'ide vahel.
  5. https://opencode.ai/

Väike näide õiguste konfiguratsioonist opencode.json-s:

{
"permissions": {
"bash": {
"git status *": "allow",
"git diff *": "allow",
"git push *": "ask",
"rm *": "deny"
},
"edit": "allow"
}
}

See kolm väärtust — allow / ask / deny — kataloogib kõik. Sinu kohustus vanemarendajana on teada, mida sa lubad. Vaikimisi "lubame kõik" on sama, mis vaikimisi "deletime andmebaasi".

Luba kõike (ohtlik):

{
"$schema": "https://opencode.ai/config.json",
"permission": {
"*": {
"*": "allow"
}
}
}

Ühendumine LLM proxyga:

  • /connect
  • url: https://ai-proxy.cm.itcollege.ee/azure-anthropic
  • mudeli valik: /model

Kaks reziimi - plan, code (shift-tab vahetamiseks).


3. Spec-driven arendus + praktika

3.1 Miks spec-driven

Tavaline arendaja voog:

idee → kood → (hiljem) dokumentatsioon

Probleem: dokumentatsioon on alati tahma. AI agent, mis palutakse "refaktoorida see service", teeb seda selle põhjal, mida oletab et sa tahad — kood on ainus allikas, mis tal on.

Spec-driven voog:

idee → spec → plaan → kood

Spec on source of truth. Kood on spec'ist tulenev artefakt. Kui spec ja kood lähevad lahku — spec võidab, kood regenereeritakse (või parandatakse).

See pole teooria. Martin Fowler ja Birgitta Böckeler kirjutasid sellest 2025 — kui agent teeb mitte-triviaalseid muudatusi, on spec see dokument, mis hoiab kõiki (inimest + AI + järgmist arendajat) samas plaanis.

Kolm praktilist taset:

  1. Spec-first — kirjuta spec, genereeri kood, kustuta spec. Kood on allikas. (Ühekordne ülesanne.)
  2. Spec-anchored — kirjuta spec, hoia see alles, paranda koos koodiga. (Enamik päris-kasutust.)
  3. Spec-as-source — ainult spec-i redigeeritakse, kood regenereeritakse alati. (Aspiratsiooniline, täna ei tööta hästi.)

3.2 OpenSpec workflow

OpenSpec on kolmest peamisest spec-driven raamistikust kõige lihtsam.

OpenSpecSpec-KitBMAD
ParimOlemasolev koodibaas (brownfield)Uus projekt (greenfield)Suur ettevõtte projekt
Setup-aeg5 min30 minPikk
KeerukusMadalKeskmineMulti-agent

Enamik meist töötab brownfield-iga. Sellepärast OpenSpec.

Install:

npm install -g @fission-ai/openspec@latest
cd my-project
openspec init # IDE suletud!

See tekitab openspec/ kausta ja openspec/config.yaml faili, kuhu kirjutad projekti tech stack'i, code style'i ja gotchas'id.

Kolm peamist käsku (kasutad oma harness'is slash-käsuna):

KäskMida teebMillal
/opsx:propose <kirjeldus>Loob muudatuse + planeerimise artefaktidVaikne default
/opsx:apply <spec-name>Implementeerib proposal'iKui artefaktid on reviewitud
/opsx:archive <spec-name>Lõpetab muudatusePärast merge'i

opsx:new, opsx:ff - sama mis opsx:propose.

Täiendav: /opsx:explore mõtlemiseks enne proposal'i tegemist.

Täielik dokumentatsioon: OpenSpec Workflows.

3.3 Neli artefakti

Iga muudatus genereerib neli faili kausta openspec/changes/<change-name>/:

FailSisuPeamine lugeja
proposal.mdMiks seda muudatust vaja on? Mis muutub? Mida mõjutab?Stakeholder, PR reviewer
spec.mdKäitumisleping. Requirements (MUST/SHOULD/MAY) + Scenarios (Given/When/Then)Tester, AI, järgmine arendaja
design.mdTehnilised otsused + rationales + risks + non-goalsSiin on vanemarendaja lisaväärtus
tasks.mdChecklist implementeerijaleAI või juunior

Spec pole implementatsiooniplaan. Spec on käitumisleping — sisend, väljund, veaolukorrad, välised piirangud. spec.md ei tohi nimetada UserService.cs-i ega IdentityValidator-it — need on design'i tasand.

Näide spec-i requirement'ist:

### Requirement: Auto-assign user role on external registration

The system SHALL automatically assign the "user" role to any new user
account created through Microsoft authentication.

#### Scenario: New user registers via Microsoft auth

- **WHEN** a user authenticates with Microsoft for the first time
and completes account creation
- **THEN** the system creates a new user account AND assigns the "user"
role to that account

Miks MUST/SHALL/SHOULD/MAY: RFC 2119 keel. Mudel (ja inimene) teab täpselt, mis on kohustuslik vs soovitatav vs optsionaalne. Vähendab interpretatsiooniruumi. Given/When/Then on Gherkin süntaks — sama, mida Cucumber/SpecFlow kasutab.

Kiire test: kui implementatsioon võib muutuda ilma, et väline käitumine muutuks, siis see ei kuulu spec'i.

Diskussioonipunkt: spec-driven arendus ei tee AI-d paremaks. See teeb sind paremaks lepingute kirjutamisel. Ja lepingute kirjutamine on see, mis eraldab juuniori vanemarendajast.

3.4 Praktika.....

3.5 Kokkuvõte: mida vanemarendajaks kaasa võtta

  1. LLM on token-ennustaja. Stateless. Mälu on klient-poole probleem. Kontekstiaken = ressurss, mida pead haldama.
  2. Harness = silmus LLM + tööriistad. Viis sammast: projekti instruktsioonid, tools+MCP, skills, hooks, kontekstihaldus+subagents.
  3. Vali harness teadlikult. opencode / Claude Code / Codex on täna peaaegu vahetatavad. MCP ja AGENTS.md on ühine standard. Ära lukusta end Cursor'isse või Windsurf'isse ilma põhjenduseta.
  4. Cost routing. Haiku/Deepseek lihtsale, Sonnet keskmisele, Opus keerulisele planeerimisele. Vaata 26-tools.md detailsemalt.
  5. Spec-driven on vanemarendaja supervõim. Spec on leping. Design on sinu otsuste ajalugu. AI kirjutab koodi, aga sina kirjutad spec-i ja design-i.
  6. Valideeri alati. AI-kood on confidently wrong. "Kompileerub" ≠ "õige". "Testid lähevad läbi" ≠ "piisavalt teste". Loe koodi, eriti matemaatikat. METR uuring (2025) — kogenud arendajad arvasid end 20% kiiremaks, tegelikkus oli 19% aeglasemad. Taju ja tegelikkus ei kattu.

Üks reegel kaasa: Sa ei saa olla vanemarendaja, kui sa ei oska kirjutada head spec-i. AI-aeg on spec-aeg.


Viited ja lingid

Harness-id

Spec-driven raamistikud

AGENTS.md näited

  • e-gov/cursor-prompts — SMIT-i Cursor-reeglid ja AGENTS.md Java Spring Boot ja Nuxt projektide jaoks (MIT)

Kursuse materjalid — süvitsi minemiseks

Benchmarkid ja uuringud

  • swe-rebench.com — mudelite jõudluse ja hinna võrdlus
  • Becker et al. (2025). Measuring the Impact of Early-2025 AI on Experienced Open-Source Developer Productivity. arXiv:2507.09089.
  • Bastani et al. (2025). Generative AI without guardrails can harm learning. PNAS, 122(26).

Kursus