Blogg
Här finns tekniska artiklar, presentationer och nyheter om arkitektur och systemutveckling. Håll dig uppdaterad, följ oss på LinkedIn
Här finns tekniska artiklar, presentationer och nyheter om arkitektur och systemutveckling. Håll dig uppdaterad, följ oss på LinkedIn
På Callista har vi varje år ett antal bootcamps, en slags träningsläger där vi tar chansen att träna på saker vi tycker verkar intressanta. Det handlar inte så mycket om att bygga muskler och kondition, mer om att bygga kompetens och självförtroende kring intressant teknologi, arbetssätt, prylar eller vad som helst egentligen.
Vid fikapauserna på höstens bootcamp hamnade jag i spännande diskussioner om MCP-lösningar för hårdvaruövervakning, specialtränade språkmodeller för systemkonfiguration, och WebAuthn/passkeys för modern autentisering. Mitt eget fokus låg på spec-driven utveckling med AI-assistenter, ett arbetssätt där vi beskriver vad vi vill uppnå istället för hur det ska kodas.
Målet? Att köra igenom ett helt utvecklingsflöde från kravinsamling till färdig implementation, med hjälp av strukturerade specifikationer och Claude Code som AI-assistent.
Spec-driven utveckling (spec-driven development, SDD) handlar om att flytta fokus från att berätta hur något ska kodas till att beskriva vad vi vill uppnå. Inom systemutveckling är detta verkligen inget nytt, att arbeta strukturerat med olika metoder har funnits med oss länge. Här undersöker jag hur en strukturerad process kan hjälpa till i integrationen med en AI-assistent.
Istället för att detaljstyra en AI-assistent med specifika implementationsdetaljer, ger vi den en strukturerad specifikation som beskriver kraven. Lite som skillnaden mellan att säga “laga en god middag med pasta” och att ge någon ett strukturerat recept med tydliga instruktioner att följa.
Specifikationerna är levande dokument som fångar upp olika aspekter av systemutvecklingen, vilket en AI-assistent sedan kan bryta ner i mindre steg och implementera. Det kan vara allt från funktionella krav (vad systemet ska göra), till agent-instruktioner (hur AI-assistenten ska bete sig), eller arbetsflöden (hur processen ska drivas och hur olika delar ska samverka).
Traditionell AI-assisterad utveckling kan bli kaotisk:
Med spec-driven utveckling får du:
Det finns flera verktyg som implementerar spec-driven utveckling på olika sätt, några av dem jag stött på är:
I denna blog valde jag att utgå från ett lite förenklat scenario baserat på ett redan befintligt projekt med specifikationer som jag modifierat något för att passa mitt behov, jag valde inte att dyka ner i någon av de verktyg som nämns ovan. Att bygga sitt eget ger djupare förståelse för vad som fungerar.
I det exempel-projekt jag utgick från finns flera olika typer av specifikationer med olika syften:
När det gäller format är Markdown populärt, troligen för att det är lätt att läsa både för människa och AI-assistent.
Dessa dokument beskriver själva systemet som ska byggas, inte processen att bygga det. De genereras av arbetsflödet och utgör sedan grunden för implementationen.
Beskriver begränsningar och beteenderegler för AI-assistenten:
CLAUDE.md - Instruktioner och riktlinjer för hur AI-assistenten ska bete sig i projektetsettings.local.json - Definierar tillåtna/förbjudna operationer (säkerhetspolicyer)Dessa filer styr hur utvecklingsprocessen går till och hur AI-assistenten samordnar arbetet:
requirements.md - Fångar affärskrav, användningsfall och funktionella kravdesign.md - Beskriver teknisk arkitektur, API-design och säkerhetsövervägandentasks.md - Bryter ner arbetet i konkreta uppgifter med tidsuppskattningar och beroendenHär är ett exempel från tasks.md som visar hur vi instruerar Claude att skapa en lista med uppgifter:
---
allowed-tools: Bash(cat:*), Bash(test:*), Write
description: Create implementation task list
---
## Context
Current spec: !`cat spec/.current-spec 2>/dev/null`
Design approved: !`test -f spec/$(cat spec/.current-spec)/.design-approved && echo "Yes" || echo "No"`
## Your Task
1. Verify design is approved
2. Create tasks.md with:
- Overview with time estimates
- Phase breakdown (Foundation, Core, Testing, Deployment)
- Detailed task list with checkboxes
- Task dependencies
- Risk mitigation tasks
3. Each task should be specific and actionable
4. Use markdown checkboxes: `- [ ] Task description`
Organize tasks to enable incremental development and testing.
Interaktiva kommandon som utvecklaren använder för att styra arbetsflödet:
new.md - Skapar en ny spec-struktur med rätt ID-numreringapprove.md - Godkänner en fas innan man går vidare till nästaimplement.md - Startar implementation baserat på godkända tasksupdate-task.md - Markerar uppgifter som klara och uppdaterar framstegreview.md - Granskar nuvarande fas och ger feedback innan godkännandeswitch.md - Byter mellan olika specifikationer i projektetHär är ett exempel från new.md som instruerar Claude att skapa en ny specifikation med numrering:
---
allowed-tools: Bash(mkdir:*), Bash(echo:*), Bash(date:*), Bash(ls:*)
description: Create a new feature specification
argument-hint: <feature-name>
---
## Current Spec Status
!`ls -la spec/ 2>/dev/null | grep "^d" | wc -l | xargs -I {} echo "Total specs: {}"`
## Your Task
Create a new specification directory for the feature: $ARGUMENTS
1. Determine the next ID number (format: 001, 002, etc.)
2. Create directory: `spec/[ID]-$ARGUMENTS/`
3. Update `spec/.current-spec` with the new spec directory name ([ID]-$ARGUMENTS)
4. Create a README.md in the new directory with:
- Feature name
- Creation date
- Initial status checklist
5. Inform the user about next steps
Use the Bash tool to create directories and files as needed.
Varje kommando har regler som ska säkerställa att föregående fas är godkänd innan man går vidare, vilket ger en strukturerad process.
Exempel på ett komplett arbetsflöde:
/spec:new todo-list-api
/spec:requirements
/spec:review
/spec:approve requirements
/spec:design
/spec:review
/spec:approve design
/spec:tasks
/spec:approve tasks
/spec:implement
/spec:update-task "Initialize project repository"
/spec:update-task "Set up development environment"
Resultat av arbetsflödet:
Under /spec/001-todo-list-api/ skapas specifikationsfilerna som utgör grunden för hela implementationen:
requirements.md - Kravspecifikation med prioriterade user storiesdesign.md - Teknisk design med arkitektur och säkerhetsaspektertasks.md - Detaljerad uppgiftslista med tidsuppskattningarREADME.md - Översikt och status för specifikationen.requirements-approved, .design-approved, .tasks-approved - Godkännandemarkör som säkerställer att varje fas är granskadUnder /apps/todo-app/ genereras den färdiga applikationen och dokumentation.
Ett exempel på hur en del av den genererade designdokumentationen kan se ut:
# Todo List API - Technical Design Specification
**Feature ID:** 001-todo-list-api
**Document Type:** Technical Design
**Creation Date:** 2025-11-13
**Status:** Draft
**Version:** 1.0
---
## Table of Contents
1. [Architecture Overview](#architecture-overview)
2. [Technology Stack](#technology-stack)
3. [System Architecture](#system-architecture)
4. [Data Model & Schema](#data-model--schema)
5. [API Design](#api-design)
6. [Authentication & Authorization](#authentication--authorization)
7. [Security Considerations](#security-considerations)
8. [Performance Considerations](#performance-considerations)
9. [Deployment Architecture](#deployment-architecture)
10. [Technical Risks & Mitigations](#technical-risks--mitigations)
---
Ett exempel på hur en del av den genererade kravspecifikationen kan se ut:
# Requirements Specification: Todo List App
**Creation Date:** 2025-11-13
**Status:** Draft
**Last Updated:** 2025-11-13
---
## 1. Feature Overview
The Todo List App is a task management application that enables users to create, organize, and track tasks. It provides a simple, intuitive interface for managing personal or professional todo items with status tracking and basic prioritization.
---
## 2. User Stories & Acceptance Criteria
### US-001: Create a new todo item
**As a** user
**I want to** add a new task to my todo list
**So that** I can track tasks I need to complete
**Acceptance Criteria:**
- User can enter task title/description in a text field
- User can submit the task via button or Enter key
- New task appears at the top or bottom of the list
- Empty tasks cannot be submitted
- Task title supports up to 200 characters
Efter att ha lagt ner några timmar på att finslipa processen och sedan några timmar till på att generera den första applikationen, har jag några konkreta insikter att dela med mig av.
De ursprungliga specifikationerna justerades lite för att fungera efter mina krav:
Säkerhetsaspekter i design-fasen
Jag lade till explicita riktlinjer i design.md för att säkerställa att säkerhetsöverväganden adresseras tidigt:
- Authentication and authorization
- Data protection and encryption
- Input validation and sanitization
- OWASP Top 10 vulnerabilities mitigation
- Secure configuration management
Begränsningar för AI-assistenten För att försöka undvika oönskade ändringar lade jag till tydliga regler om vad Claude inte får göra:
.claude/ eller .vscode/.gitignore eller LICENSE i projektets rotspec/ och applikationskatalogenTrots detta så envisades Claude ibland att ändra i filer på fel ställen.
Efter cirka 2-4 timmar totalt, varav ca hälften på finputsning av processen och ca hälften på att generera applikationen, fick jag en genererad lösning från min AI-assistent:
Vad som genererades automatiskt:
En oväntat positiv effekt var hur detaljerade men ändå lättlästa specifikationerna blev:
Spec-driven utveckling med AI är inte en “magic bullet”, du behöver fortfarande teknisk kompetens. AI-assistenten genererar en grund att stå på, men:
Baserat på mina erfarenheter, några konkreta tips:
Spec-driven utveckling med AI-assistenter befinner sig i en spännande fas där mycket experimenteras och utforskas. Efter att ha byggt min egen lösning har jag både sett potential och identifierat tydliga begränsningar, vilket gör det extra intressant att fortsätta följa utvecklingen.
Fördelar:
Utmaningar:
Min bedömning just nu är att arbetssättet passar bra för:
Är du nyfiken på att testa själv? Kolla in exempel-projekt på GitHub