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.
| Osa | Aeg | Fookus |
|---|---|---|
| 1. Mis on LLM tegelikult | 30 min | Token-ennustaja, stateless API, tokenid/kontekst/hind, tool calling |
| paus | 10 min | |
| 2. Harness ja viis sammast | 55 min | AGENTS.md, tools+MCP, skills, hooks, kontekstihaldus, subagents |
| paus | 10 min | |
| 3. Spec-driven + praktika | 85 min | Miks 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õiste | Mis see on | Miks see loeb |
|---|---|---|
| Kontekstiaken | Max sisend + väljund tokenites | 200k/1M Opus, 1M Gemini, 8k vana GPT-3.5 |
| Input price | € per miljon sisendtokenit | Sina maksad iga kord, kui saadad terve vestluse uuesti |
| Output price | € per miljon väljundtokenit | Tavaliselt 3–5× kallim kui input |
Hinnavõrdlus, aprill 2026:
| Mudel | Input | Output | Tüü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:
| Harness | Kust pärit | Mudelid | Eripära |
|---|---|---|---|
| Claude Code | Anthropic | Claude perekond | Kõige küpsem: skills, hooks, subagents sisseehitatud |
| opencode | SST (avatud lähtekood) | Kõik (Opus, GPT, Gemini, lokaalsed) | Multi-provider, granulaarsed õigused, AGENTS.md |
| OpenAI Codex | OpenAI | GPT perekond | Terminal + VS Code; AGENTS.md standard |
| Aider | Paul Gauthier | Kõik | Git-keskne, iga muudatus = commit |
| Kilo Code | Kilo | Kõik | VS 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:
| Harness | Fail |
|---|---|
| Claude Code | CLAUDE.md |
| opencode | opencode.json > instructions (viited failidele) |
| OpenAI Codex | AGENTS.md (de facto standard) |
| Cursor | .cursorrules / .cursor/rules/*.mdc |
| Aider | .aider.conf.yml + convention files |
Mida siia kirjutada:
| Oluline | Mitte 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 reeglid | Coding 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 tool | 1000–1400 tokenit iga turn'i juures | 0 (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
bashtool-kutset kontrolli, kas käsk polerm -rfvõigit push --force - on-stop: session lõppedes käivita
git statusja 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:
-
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.
-
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:
- Avatud lähtekood — näed, mis toimub. Saad fork'ida, kui vaja.
- Mudeli-agnostiline — sama konfiguratsioon Opus'e, GPT-5.4 ja Gemini'ga. Ei ole lock-in.
- Granulaarsed õigused —
git status *on OK,git push *küsib kinnitust. Vanemarendajale oluline. - AGENTS.md — sama fail, mida Codex loeb. Portatiivne harness'ide vahel.
- 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:
- Spec-first — kirjuta spec, genereeri kood, kustuta spec. Kood on allikas. (Ühekordne ülesanne.)
- Spec-anchored — kirjuta spec, hoia see alles, paranda koos koodiga. (Enamik päris-kasutust.)
- 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.
| OpenSpec | Spec-Kit | BMAD | |
|---|---|---|---|
| Parim | Olemasolev koodibaas (brownfield) | Uus projekt (greenfield) | Suur ettevõtte projekt |
| Setup-aeg | 5 min | 30 min | Pikk |
| Keerukus | Madal | Keskmine | Multi-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äsk | Mida teeb | Millal |
|---|---|---|
/opsx:propose <kirjeldus> | Loob muudatuse + planeerimise artefaktid | Vaikne default |
/opsx:apply <spec-name> | Implementeerib proposal'i | Kui artefaktid on reviewitud |
/opsx:archive <spec-name> | Lõpetab muudatuse | Pä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>/:
| Fail | Sisu | Peamine lugeja |
|---|---|---|
proposal.md | Miks seda muudatust vaja on? Mis muutub? Mida mõjutab? | Stakeholder, PR reviewer |
spec.md | Käitumisleping. Requirements (MUST/SHOULD/MAY) + Scenarios (Given/When/Then) | Tester, AI, järgmine arendaja |
design.md | Tehnilised otsused + rationales + risks + non-goals | Siin on vanemarendaja lisaväärtus |
tasks.md | Checklist implementeerijale | AI 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
- LLM on token-ennustaja. Stateless. Mälu on klient-poole probleem. Kontekstiaken = ressurss, mida pead haldama.
- Harness = silmus LLM + tööriistad. Viis sammast: projekti instruktsioonid, tools+MCP, skills, hooks, kontekstihaldus+subagents.
- 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.
- Cost routing. Haiku/Deepseek lihtsale, Sonnet keskmisele, Opus keerulisele planeerimisele. Vaata 26-tools.md detailsemalt.
- 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.
- 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
- opencode — tänase loengu demo-harness
- opencode docs — agents, commands, config, CLI
- opencode GitHub
- Claude Code — Anthropicu CLI agent
- OpenAI Codex — OpenAI CLI agent
- Aider — git-keskne CLI agent
- Kilo Code — VS Code plugin
Spec-driven raamistikud
- OpenSpec — tänase loengu demo-raamistik (brownfield)
- OpenSpec Workflows
- Spec-Kit — GitHub spec-driven toolkit (greenfield)
- BMAD Method — ettevõtte multi-agent raamistik
- Martin Fowler / Birgitta Böckeler: Spec-Driven Development Tools
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
- Agentic Software Development kursus — kõik 40+ loengut
- Loeng 01 — intro — LLM põhitõed
- Loeng 02 — token — tokenization, context window, KV cache
- Loeng 23 — OpenSpec — detailne OpenSpec workflow, tänase praktika allikas
- Loeng 26 — Tools — tool calling mehaanika ja token economics
- Loeng 27 — MCP — Model Context Protocol detailid
- Loeng 28 — Skills — skills vs MCP
- Loeng 29 — Misc — hooks, projekti instruktsioonid, context management
- Loeng 30 — Agents — subagents, opencode detailid
- Seminar 92 — eelmine praktiline seminar, laiem auditoorium
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
- Kursuse koduleht: taltech.ee/vanemarendajaks