Pattern di prompting per un'architettura software più pulita e meno riscritture
Impara pattern di prompting comprovati che guidano l'AI verso requisiti più chiari, design modulari e codice testabile—riducendo refactor e cicli di riscrittura.

Come appare un’“architettura più pulita” nel lavoro assistito da AI
Per “architettura più pulita” in questo post non intendiamo un framework particolare o un diagramma perfetto. Significa poter spiegare il sistema semplicemente, modificarlo senza rompere parti non correlate e verificare il comportamento senza test eroici.
Una definizione pratica: chiarezza, modularità, testabilità
Chiarezza significa che lo scopo e la forma del sistema sono evidenti da una breve descrizione: cosa fa, chi lo usa, quali dati gestisce e cosa non deve mai fare. Nel lavoro assistito da AI, chiarezza significa anche che il modello può riformulare i requisiti in modo che tu li possa approvare.
Modularità significa confini di responsabilità netti. Ogni modulo ha un compito, input/output e minima conoscenza degli interni degli altri moduli. Quando l’AI genera codice, la modularità evita che le regole di business si disperdano tra controller, UI e accesso ai dati.
Testabilità significa che l’architettura rende economico il “provare che funziona”. Le regole di business si possono testare senza un sistema completamente avviato, e i test di integrazione si concentrano su pochi contratti invece che su ogni percorso di codice.
Perché avvengono le riscritture (e perché l’AI può amplificarle)
Le riscritture di solito non sono causate da “codice brutto”: sono causate da vincoli mancanti, scope vaghi e assunzioni nascoste. Esempi:
- Una funzionalità è costruita per un tipo di utente, poi si scopre che ci sono tre ruoli con permessi diversi.
- Requisiti di performance, audit logging o retention dati emergono tardi.
- Un’API esterna si comporta diversamente dal previsto, costringendo cambiamenti ovunque.
L’AI può accelerare questa modalità di fallimento producendo output convincenti in fretta, il che rende facile costruire su fondamenta instabili.
Cosa aspettarsi dai pattern in questa guida
I pattern che seguono sono template da adattare, non prompt magici. Il loro scopo reale è forzare le conversazioni giuste fin da subito: chiarire vincoli, confrontare opzioni, documentare assunzioni e definire contratti. Se salti quel pensiero, il modello riempirà volentieri i vuoti—e ne pagherai il prezzo più avanti.
Dove si inseriscono questi pattern nel tuo workflow
Li userai lungo tutto il ciclo di delivery:
- Pianificazione: stringere requisiti e criteri di successo
- Design: scegliere confini, flussi dati e contratti
- Coding: mantenere le responsabilità separate mentre l’implementazione cresce
- Review: intercettare rischi e disallineamenti prima che diventino riscritture
Se usi un workflow vibe-coding (dove il sistema è generato e iterato via chat), questi checkpoint contano ancora di più. Per esempio, in Koder.ai puoi eseguire un loop in “planning mode” per chiudere requisiti e contratti prima di generare codice React/Go/PostgreSQL, poi usare snapshot/rollback per iterare in sicurezza quando cambiano le assunzioni—senza trasformare ogni cambiamento in una riscrittura.
Come usare i prompting pattern senza creare più lavoro
I pattern di prompting sono più utili quando riducono il churn decisionale. Il trucco è usarli come checkpoint brevi e ripetibili—prima di codare, mentre progetti e durante la review—così l’AI produce artefatti riutilizzabili, non testo extra da setacciare.
Quando usare i pattern
Prima di codare: esegui un loop di “allineamento” per confermare obiettivi, utenti, vincoli e metriche di successo.
Durante il design: usa pattern che forzino trade-off espliciti (es. alternative, rischi, confini dati) prima di iniziare a implementare.
Durante la review: usa un prompt in stile checklist per individuare gap (casi limite, monitoring, sicurezza, performance) mentre i cambiamenti sono ancora economici.
Raccogli prima gli input (mantienilo leggero)
Otterrai output migliori con un piccolo pacchetto di input coerente:
- Obiettivi: cosa significa “finito” (obiettivi di latenza, risultati UX, limiti di costo)
- Utenti: ruoli, workflow chiave e punti di dolore principali
- Vincoli: stack tecnologico, scadenze, requisiti di compliance/sicurezza
- Dati & integrazioni: sorgenti, ownership, API, dipendenze di terze parti
Se non sai qualcosa, dillo esplicitamente e chiedi all’AI di elencare le assunzioni.
Chiedi formati di output riutilizzabili
Invece di “spiegare il design”, richiedi artefatti da incollare in documenti o ticket:
- Un decision log (opzioni → pro/contro → scelta → perché)
- Una tabella di componenti con responsabilità e confini
- Una checklist per affidabilità e test
- Una semplice descrizione del diagramma (es., testo Mermaid) che puoi renderizzare dopo
Itera in piccoli loop con criteri di accettazione
Fai loop da 10–15 minuti: prompt → scorrimento rapido → stringi. Includi sempre criteri di accettazione (cosa deve essere vero perché il design sia accettabile), poi chiedi all’AI di autoverificarsi rispetto a essi. Questo evita ridisegni infiniti e rende i pattern veloci da applicare.
Pattern 1: Chiarire i requisiti prima di qualsiasi design
La maggior parte delle “riscritture architetturali” non è causata da diagrammi sbagliati—deriva dal costruire la cosa giusta per il problema sbagliato (o incompleto). Quando usi un LLM presto, non chiedere prima l’architettura. Fallo esporre l’ambiguità.
La mossa di prompting: trasformare l’incertezza in una checklist
Usa il modello come un analista dei requisiti. Il tuo obiettivo è una spec breve e prioritaria che puoi confermare prima che qualcuno progetti componenti, scelga DB o si impegni su API.
Ecco un template da copia-incollare che puoi riutilizzare:
You are my requirements analyst. Before proposing any architecture, do this:
1) Ask 10–15 clarifying questions about missing requirements and assumptions.
- Group questions by: users, workflows, data, integrations, security/compliance, scale, operations.
2) Produce a prioritized scope list:
- Must-have
- Nice-to-have
- Explicitly out-of-scope
3) List constraints I must confirm:
- Performance (latency/throughput targets)
- Cost limits
- Security/privacy
- Compliance (e.g., SOC2, HIPAA, GDPR)
- Timeline and team size
4) End with: “Restate the final spec in exactly 10 bullets for confirmation.”
Context:
- Product idea:
- Target users:
- Success metrics:
- Existing systems (if any):
Cosa cercare nell’output
Vuoi domande che forzino decisioni (non generiche “dimmi di più”), più una lista must-have che si possa effettivamente completare nei tempi previsti.
Tratta il riassunto in “10 bullet” come un contratto: incollalo nel ticket/PRD, ottieni un rapido sì/no dagli stakeholder e poi vai avanti col design. Questo passo previene la causa più comune di refactor tardivi: costruire funzionalità non davvero necessarie.
Pattern 2: Prima i journey utente, poi le scelte tecniche
Se inizi dagli strumenti (“Dovremmo usare event sourcing?”) spesso finisci per progettare per l’architettura invece che per l’utente. Un percorso più veloce verso una struttura pulita è far descrivere all’AI prima i journey utente in linguaggio semplice, e solo dopo tradurli in componenti, dati e API.
Un semplice template journey-first
Usalo come punto di partenza copia-incolla:
- Ruoli: user / admin / system
- Azioni chiave: cosa prova a fare ogni ruolo
- Casi limite: cosa può andare storto (input non valido, permessi mancanti, completamento parziale)
Poi chiedi:
-
“Descrivi il flusso passo-passo per ogni azione in linguaggio semplice.”
-
“Fornisci un semplice diagramma di stati o una lista di stati (es., Draft → Submitted → Approved → Archived).”
-
“Elenca gli scenari non-happy-path: timeout, retry, richieste duplicate, cancellazioni e input non validi.”
Trasformare i journey in decisioni (senza saltare avanti)
Quando i flussi sono chiari, chiedi all’AI di mapparli sulle scelte tecniche:
- Dove serve validazione vs regole di business?
- Quali step richiedono idempotenza (retry sicuri)?
- Quali dati devono essere persistiti, quali possono essere derivati e cosa richiede una traccia di audit?
Solo dopo puoi richiedere uno schizzo architetturale (servizi/moduli, confini e responsabilità) collegato direttamente ai passaggi del flusso.
Convertire i flow in criteri di accettazione testabili
Concludi facendo convertire all’AI ogni journey in criteri di accettazione testabili:
- “Given/When/Then per ogni step e per i casi di errore.”
- “Cosa deve restituire o mostrare il sistema?”
- “Cosa deve essere loggato e cosa deve scatenare un retry vs un errore rivolto all’utente?”
Questo riduce le riscritture perché l’architettura cresce dal comportamento dell’utente, non da supposizioni tecnologiche.
Pattern 3: Registro delle assunzioni per evitare riscritture a sorpresa
La maggior parte del rework architetturale non è causata da “design sbagliato”—è causata da assunzioni nascoste che si rivelano errate. Quando chiedi a un LLM un’architettura, spesso colma i vuoti con supposizioni plausibili. Un registro delle assunzioni rende quelle supposizioni visibili presto, quando i cambiamenti sono economici.
Cosa chiedere al modello
Il tuo obiettivo è forzare una separazione pulita tra fatti che hai fornito e assunzioni che ha inventato.
Usa questo pattern di prompt:
Template prompt “Before proposing any solution: list your assumptions. Mark each as validated (explicitly stated by me) or unknown (you inferred it). For each unknown assumption, propose a fast way to validate it (question to ask, metric to check, or quick experiment). Then design based only on validated assumptions, and call out where unknowns could change the design.”
Un formato riutilizzabile per l’assumption log
Tienilo breve così la gente lo usa davvero:
- Assumption: …
- Status: validated / unknown
- Why it matters: quale decisione influenza
- How to validate: domanda, controllo o spike
- If wrong, likely change: cosa riprogetteresti
Trigger “What would change your answer?”
Aggiungi una riga che costringa il modello a dire i suoi tipping point:
- “List 5 triggers: what would change your answer? (es., volume utenti, obiettivi di latenza, bisogni di compliance, regole di retention).”
Questo pattern trasforma l’architettura in una serie di decisioni condizionali. Non ottieni solo un diagramma—ottieni una mappa di cosa confermare prima di impegnarti.
Pattern 4: Confronta più architetture prima di sceglierne una
Gli strumenti AI sono bravi a proporre un singolo design “migliore”—ma spesso è solo la prima opzione plausibile. Un’architettura più pulita emerge quando forzi un confronto precoce, mentre i cambiamenti sono economici.
Il template di prompt principale
Usa un prompt che richieda più architetture e una tabella strutturata dei trade-off:
Propose 2–3 viable architectures for this project.
Compare them in a table with criteria: complexity, reliability, time-to-ship, scalability, cost.
Then recommend one option for our constraints and explain why it wins.
Finally, list “what we are NOT building” in this iteration to keep scope stable.
Context:
- Users and key journeys:
- Constraints (team size, deadlines, budget, compliance):
- Expected load and growth:
- Current systems we must integrate with:
Perché questo riduce le riscritture
Un confronto costringe il modello (e te) a far emergere assunzioni nascoste: dove vive lo state, come comunicano i servizi, cosa dev’essere sincrono e cosa può essere rimandato.
La tabella dei criteri è importante perché impedisce che dibattiti come “microservices vs monolite” siano solo basati su opinioni. Ancorano la decisione a ciò che conta davvero: spedire velocemente, ridurre l’overhead operativo o migliorare l’affidabilità.
Richiedi raccomandazione e confine
Non accettare “dipende”. Chiedi una raccomandazione chiara e i vincoli specifici che ottimizza.
Insisti anche su “cosa NON costruiamo”. Esempi: “No multi-region failover”, “No plugin system”, “No notifiche real-time”. Questo impedisce all’architettura di espandersi silenziosamente per supportare feature non confermate—e previene riscritture a causa di scope cambiati in seguito.
Pattern 5: Prompt per confini modulari e responsabilità
La maggior parte delle riscritture avviene perché i confini sono vaghi: tutto “tocca tutto” e un piccolo cambiamento riverbera in tutto il codebase. Questo pattern usa prompt che forzano una proprietà chiara dei moduli prima di discutere framework o diagrammi di classi.
L’idea centrale
Chiedi all’AI di definire moduli e responsabilità, più cosa non appartiene a ciascun modulo. Poi richiedi interfacce (input/output) e regole di dipendenza, non un piano di build o dettagli di implementazione.
Template copia-incolla
Usalo quando stai schizzando una nuova feature o rifattorizzando un'area disordinata:
- Context: <one paragraph about the product/feature>
- Goal: Propose a modular architecture with 4–8 modules.
-
List modules with:
- Purpose (1 sentence)
- Responsibilities (3–5 bullets)
- Non-responsibilities (“does NOT handle…”) (2–3 bullets)
-
For each module, define interfaces only:
- Inputs (events/requests/data)
- Outputs (responses/events/side effects)
- Public API surface (function names or endpoints ok; no internal classes)
-
Dependency rules:
- Allowed dependencies (A → B)
- Forbidden dependencies (A ↛ C) with reasoning
- Where shared types live (and what must never be shared)
-
Future change test: Given these likely changes: <list 3>, show which single module should absorb each change and why.
Come dev’essere un buon output
Punta a moduli che puoi descrivere a un collega in meno di un minuto. Se l’AI propone un modulo “Utils” o mette regole di business nei controller, spingi indietro: “Sposta le decisioni in un modulo di dominio e tieni sottili gli adattatori.”
Quando hai finito, hai confini che reggono ai nuovi requisiti—perché i cambiamenti hanno una casa chiara e le regole di dipendenza prevengono l'accoppiamento accidentale.
Pattern 6: Dati & contratti API prima (evita rework di integrazione)
Il rework di integrazione spesso non è causato da “codice cattivo”—ma da contratti poco chiari. Se il modello dei dati e le forme API vengono decise tardi, ogni team (o modulo) colma i vuoti in modo diverso e passi la sprint successiva a riconciliare supposizioni discordanti.
Inizia richiedendo contratti prima di parlare di framework, database o microservizi. Un contratto chiaro diventa il riferimento condiviso che mantiene allineati UI, backend e pipeline dati.
Il prompt contract-first
Usa questo prompt iniziale con l’assistente AI:
- Template: “Describe the data model, ownership, and lifecycle for each entity”
Poi segui subito con:
- Chiedi contratti API con esempi (request, response, error shapes)
- Aggiungi versioning ed aspettative di backward-compatibility
- Richiedi regole di validazione e casi limite per campo
Come dev’essere un buon output
Vogliamo artefatti concreti, non prosa. Per esempio:
- Entity:
Subscription- Owner: Billing service
- Lifecycle: created on checkout → active → past_due → canceled (soft-delete after 90 days)
- Source of truth: billing DB; other services cache read-only copies
E uno schizzo API:
POST /v1/subscriptions
{
"customer_id": "cus_123",
"plan_id": "pro_monthly",
"start_date": "2026-01-01"
}
201 Created
{
"id": "sub_456",
"status": "active",
"current_period_end": "2026-02-01"
}
422 Unprocessable Entity
{
"error": {
"code": "VALIDATION_ERROR",
"message": "start_date must be today or later",
"fields": {"start_date": "in_past"}
}
}
Regole di versioning e compatibilità
Fai esprimere all’AI regole tipo: “Campi additivi sono permessi senza bump di versione; i rinomini richiedono /v2; i client devono ignorare campi sconosciuti.” Questo passaggio singolo previene breaking change silenziosi—e le riscritture che ne seguono.
Pattern 7: Modalità di fallimento e checklist di affidabilità
Le architetture vengono riscritte quando il design per il “happy path” incontra traffico reale, dipendenze flaky e comportamenti utente imprevisti. Questo pattern rende l’affidabilità un output esplicito del design, non una corsa post-lancio.
Template copia-incolla
Usalo con la descrizione architetturale scelta:
List failure modes; propose mitigations; define observability signals.
Per ogni failure mode:
- What triggers it?
- User impact (cosa vede l'utente)
- Mitigation (design + operativo)
- Retries, idempotency, rate limits, timeouts considerations
- Observability: logs/metrics/traces + soglie alert
Cosa far coprire al modello (non negoziabile)
Concentra la risposta nominando le interfacce che possono fallire: API esterne, database, code, provider auth e job background. Poi richiedi decisioni concrete:
- Retries: quando riprovare, quante volte, strategia di backoff e quali errori sono retryable.
- Idempotency: chiavi idempotenza, finestre di dedup, cosa è sicuro rieseguire.
- Rate limits: limiti per user/IP/service, messaggistica client e protezione server.
- Timeouts: per dipendenza, budget di richiesta complessivo e propagazione di cancellazione.
Checklist di affidabilità in output
Concludi il prompt con: “Return a simple checklist we can review in 2 minutes.” Una buona checklist include: timeouts su dipendenze impostati, retry limitati, idempotenza per create/charge, backpressure/rate limiting, path di degradazione elegante.
Observability legata alle azioni utente
Richiedi eventi intorno a momenti utente (non solo internals): “user_signed_up”, “checkout_submitted”, “payment_confirmed”, “report_generated”. Per ognuno chiedi:
- Campi log (user_id, request_id, idempotency_key)
- Metriche (success rate, latency p95/p99, retry count)
- Trace (spans per chiamata a dipendenze)
Questo trasforma l’affidabilità in un artefatto di design che puoi validare prima che esista codice.
Pattern 8: Pianificazione della slice MVP per ridurre l’over-building
Un modo comune in cui il design assistito da AI crea riscritture è incoraggiare architetture “complete” troppo presto. La soluzione è semplice: forza il piano a partire dalla più piccola slice utilizzabile—quella che consegna valore, verifica il design e lascia le opzioni future aperte.
Il template di prompt
Usalo quando senti che la soluzione si sta espandendo più dei requisiti:
Template: “Propose the smallest usable slice; define success metrics; list follow-ups.”
Chiedi al modello di rispondere con:
- MVP slice: cosa include per spedire qualcosa di reale
- Success metrics: come capire se ha funzionato (lato utente + tecnico)
- Follow-ups: cosa può aspettare senza bloccare l’apprendimento
Pretendi una roadmap a fasi (MVP → v1 → v2)
Aggiungi: “Give a phased roadmap: MVP → v1 → v2, and explain what risk each phase reduces.” Questo mantiene le idee future visibili senza forzarle nella prima release.
Esempi di outcome desiderati:
- MVP valida il workflow core con un percorso end-to-end sottile.
- v1 rinforza l’affidabilità, aggiunge usabilità “must-have”.
- v2 amplia la copertura (più integrazioni, ruoli avanzati, ottimizzazioni).
Richiedi esclusioni esplicite per evitare scope creep
La linea più potente in questo pattern è: “List what is explicitly out of scope for MVP.” Le esclusioni proteggono le decisioni architetturali dalla complessità prematura.
Buone esclusioni:
- “No multi-region failover in MVP (registrare incidenti; pianificare per v2).”
- “No plugin system yet (mantieni i confini puliti; spedisci moduli fissi).”
- “Solo un provider di pagamento; astrarre più tardi se serve.”
Trasforma il piano in ticket con dipendenze
Infine: “Convert the MVP into tickets, each with acceptance criteria and dependencies.” Questo forza chiarezza e fa emergere accoppiamenti nascosti.
Una buona scomposizione contempla tipicamente:
- Un percorso end-to-end “happy path” sottile
- Modello dati minimo + contratto API
- Gestione errori di base e logging
- Un punto di integrazione (se necessario) con fallback stubbed
Se vuoi, fai uscire l’AI nel formato del tuo team (es., campi stile Jira) e mantieni le fasi successive in backlog separati.
Pattern 9: Prompt test-first che modellano design migliori
Un modo semplice per evitare che l’architettura derivi è forzare la chiarezza attraverso i test prima di chiedere un design. Quando chiedi a un LLM di partire dai test di accettazione, deve nominare i comportamenti, input, output e casi limite. Questo espone requisiti mancanti e spinge l’implementazione verso confini modulari puliti.
Template copia-incolla
Usalo come “gate” ogni volta che stai per progettare un componente:
- Template: “Write acceptance tests first; then propose implementation. You must: (1) list assumptions, (2) name unit vs integration tests, (3) define test data and mocks vs real dependencies, (4) include a definition of done.”
Chiedi confini di test che corrispondano ai moduli
Segui con: “Group the tests by module responsibility (API layer, domain logic, persistence, external integrations). For each group, specify what is mocked and what is real.”
Questo spinge l’LLM lontano da design intrecciati in cui tutto tocca tutto. Se non può spiegare dove iniziano i test di integrazione, probabilmente l’architettura non è ancora chiara.
Strategia dati per test: evitare suite fragili
Richiedi: “Propose a test data plan: fixtures vs factories, how to generate edge cases, and how to keep tests deterministic. List which dependencies can use in-memory fakes and which require a real service in CI.”
Spesso scoprirai che una feature “semplice” richiede in realtà un contratto, un dataset seed o ID stabili—meglio scoprirlo ora che durante una riscrittura.
Definition of done (per farla spedire)
Termina con una checklist leggera:
- Test passanti (unit + integrazione) e copertura significativa dei casi di errore
- Documentazione minima: uso, config e breve nota di troubleshooting
- Monitoring/alert per i failure mode chiave
- Piano di rollout (feature flag, passi di migration, rollback)
Pattern 10: Prompt per review del design per intercettare problemi presto
Le review di design non dovrebbero avvenire solo dopo che il codice esiste. Con l’AI puoi eseguire una “pre-mortem review” sulla bozza di architettura (anche solo qualche paragrafo e un diagramma in parole) e ottenere una lista concreta di debolezze prima che diventino riscritture.
Il template principale per la review
Inizia con un ruolo di reviewer diretto e richiedi specificità:
Prompt: “Act as a reviewer; list risks, inconsistencies, and missing details in this design. Be concrete. If you can’t evaluate something, say what information is missing.”
Incolla il tuo sommario di design, i vincoli (budget, timeline, competenze del team) e qualsiasi requisito non funzionale (latenza, disponibilità, compliance).
Trasforma il feedback in una punch list azionabile
Le review falliscono quando il feedback è vago. Chiedi una serie di fix prioritaria:
Prompt: “Give me a prioritized punch list. For each item: severity (Blocker/High/Medium/Low), why it matters, suggested fix, and the smallest validation step.”
Questo produce attività pronte per decisione invece di creare un dibattito.
Quantifica il rischio di riscrittura
Una leva utile è un punteggio semplice:
Prompt: “Assign a rewrite risk score from 1–10. Explain the top 3 drivers. What would reduce the score by 2 points with minimal effort?”
Non cerchi precisione, ma vuoi che emergano le assunzioni più a rischio di riscrittura.
Concludi con un “diff plan”
Infine, limita l’espansione dello scope:
Prompt: “Provide a diff plan: minimal changes needed to reach the target design. List what stays the same, what changes, and any breaking impacts.”
Ripetendo questo pattern a ogni iterazione, la tua architettura evolve con piccoli passi reversibili—e i problemi grossi vengono intercettati presto.
Un pack di prompt copia-incolla e un workflow semplice
Usa questo pack come workflow leggero da ripetere su ogni feature. L’idea è concatenare i prompt così ogni step produce un artefatto che il step successivo può riutilizzare—riducendo la perdita di contesto e le riscritture a sorpresa.
Il workflow in 6 step (concatena questi pattern)
- Requisiti (chiarire + vincoli)
- Opzioni architetturali (confronta 2–3 approcci)
- Confini (moduli + responsabilità)
- Contratti (dati + API)
- Test (test-first acceptance + unit chiave)
- Review (failure modes + checklist di design)
In pratica, i team spesso implementano questa catena come una “ricetta per la feature”. Se costruisci con Koder.ai, la stessa struttura si mappa bene a un processo di build guidato dalla chat: cattura gli artefatti in un posto, genera la prima slice funzionante, poi iterala con snapshot così gli esperimenti restano reversibili. Quando l’MVP è pronto, puoi esportare il codice sorgente o distribuire/ospitare con un dominio custom—utile quando vuoi la velocità della delivery assistita dall’AI senza bloccarti in un solo ambiente.
Prompt pack copia-incolla (con guardrail)
SYSTEM (optional)
You are a software architecture assistant. Be practical and concise.
Guardrail: When you make a recommendation, cite the specific lines from *my input* you relied on by quoting them verbatim under “Input citations”. Do not cite external sources or general industry claims.
If something is unknown, ask targeted questions.
1) REQUIREMENTS CLARIFIER
Context: <product/system overview>
Feature: <feature name>
My notes: <paste bullets, tickets, constraints>
Task:
- Produce: (a) clarified requirements, (b) non-goals, (c) constraints, (d) open questions.
- Include “Input citations” quoting the exact parts of my notes you used.
2) ARCHITECTURE OPTIONS
Using the clarified requirements above, propose 3 architecture options.
For each: tradeoffs, complexity, risks, and when to choose it.
End with a recommendation + “Input citations”.
3) MODULAR BOUNDARIES
Chosen option: <option name>
Define modules/components and their responsibilities.
- What each module owns (and does NOT own)
- Key interfaces between modules
- “Input citations”
4) DATA & API CONTRACTS
For each interface, define a contract:
- Request/response schema (or events)
- Validation rules
- Versioning strategy
- Error shapes
- “Input citations”
5) TEST-FIRST ACCEPTANCE
Write:
- Acceptance criteria (Given/When/Then)
- 5–10 critical tests (unit/integration)
- What to mock vs not mock
- “Input citations”
6) RELIABILITY + DESIGN REVIEW
Create:
- Failure modes list (timeouts, partial failure, bad data, retries)
- Observability plan (logs/metrics/traces)
- Review checklist tailored to this feature
- “Input citations”
Se vuoi un compagno più approfondito, vedi /blog/prompting-for-code-reviews. Se stai valutando tool o rollout di team, /pricing è un passo pratico successivo.
Domande frequenti
Cosa significa “architettura più pulita” in questa guida?
"Architettura più pulita" qui significa che puoi:
- Spiegare il sistema con semplicità (scopo, utenti, dati, cosa non deve fare).
- Modificare una parte senza rompere quelle non correlate (confini chiari).
- Verificare il comportamento a basso costo (regole di business testabili senza tutto il sistema).
Nel lavoro assistito da AI significa anche che il modello può riformulare i requisiti in modo da poterci dare il tuo ok.
Perché lo sviluppo assistito da AI può portare a più riscritture?
L'AI può produrre codice e design convincenti molto rapidamente, il che rende facile costruire sopra fondamenta fragili come vincoli mancanti e assunzioni nascoste. Questa velocità può amplificare i trigger di riscrittura, per esempio:
- scoprire ruoli/permessi aggiuntivi in ritardo
- aggiungere requisiti di performance/audit/retention dopo l'implementazione
- capire che un'API esterna si comporta diversamente dal previsto
La soluzione non è "usare meno AI", ma usare prompt che mettano in luce vincoli, contratti e assunzioni fin da subito.
Quando dovrei usare questi pattern di prompting nel mio workflow?
Usa i pattern come checkpoint brevi che producono artefatti riutilizzabili (non solo prose extra):
- Prima di codare: un loop di allineamento (obiettivi, utenti, vincoli, metriche di successo).
- Durante il design: forzare trade-off espliciti (alternative, rischi, confini).
- Durante la review: eseguire un prompt checklist (casi limite, affidabilità, sicurezza, performance).
Mantieni le iterazioni a 10–15 minuti: prompt → scorrimento rapido → affinamento → autoverifica contro i criteri di accettazione.
Quali input dovrei raccogliere prima di chiedere a un LLM dell'architettura?
Porta un piccolo pacchetto di input coerente:
- Obiettivi: cosa significa “finito” (latenza, risultato UX, limiti di costo)
- Utenti: ruoli + flussi chiave
- Vincoli: stack, scadenze, compliance/sicurezza
- Dati & integrazioni: sorgenti, responsabili, API, terze parti
Se qualcosa è sconosciuto, dillo e chiedi al modello di elencare le assunzioni esplicitamente invece di indovinare al posto tuo.
Quali output riutilizzabili dovrei richiedere invece di “spiegare il design”?
Chiedi artefatti che puoi incollare in documenti, ticket e PR:
- un log di decisione (opzioni → pro/contro → scelta → perché)
- una tabella componenti/moduli (responsabilità, confini)
- una checklist per affidabilità/test
- una descrizione diagramma (es. testo Mermaid)
Questo rende l'output dell'AI azionabile e riduce il lavoro di riconciliazione dovuto alla perdita di contesto.
Come chiarisco i requisiti con l'AI prima di fare qualsiasi architettura?
Usa il modello come un intervistatore dei requisiti. Fallo:
- porre 10–15 domande chiarificatrici raggruppate per utenti, workflow, dati, integrazioni, sicurezza/compliance, scala, operazioni
- produrre una lista di scope prioritaria (must-have / nice-to-have / out-of-scope)
- elencare i vincoli da confermare (performance, costi, sicurezza, compliance, timeline)
- ristatare la spec finale in esattamente 10 punti per la conferma
Tratta quei 10 punti come un contratto da validare con gli stakeholder prima di partire col design.
Perché “user journeys first” porta a decisioni architetturali migliori?
Inizia da ruoli e azioni, quindi chiedi:
- flussi passo-passo in linguaggio semplice
- una lista di stati (es. Draft → Submitted → Approved)
- scenari non-happy-path (timeout, retry, duplicati, cancellazioni, input non validi)
Solo quando i flussi sono chiari, mappali a decisioni come dove finisce la validazione e dove stanno le regole di business, dove serve idempotenza e cosa va memorizzato vs derivato. Poi converti i flussi in criteri di accettazione testabili Given/When/Then.
Cos'è un assumption log e come previene riscritture a sorpresa?
Perché gli LLM tendono a colmare i vuoti con supposizioni plausibili a meno che tu non separi chiaramente:
- i fatti che hai fornito
- le assunzioni che ha inferito il modello
Richiedi un registro delle assunzioni che segni ogni voce come validata o sconosciuta, più:
- perché conta (quale decisione influenza)
- come validarla velocemente (domanda/controllo/spike)
- cosa cambierebbe se fosse sbagliata
Aggiungi trigger del tipo “cosa cambierebbe la tua risposta?” (es. volume, latenza, compliance, retention) per rendere il design condizionale e meno soggetto a riscritture.
Come confronto più architetture senza trasformarlo in un dibattito infinito?
Forza il modello a proporre 2–3 architetture e confrontale in una tabella (complessità, affidabilità, tempo per spedire, scalabilità, costo). Poi richiedi:
- una raccomandazione chiara legata ai tuoi vincoli
- una lista esplicita di “cosa NON stiamo costruendo” in questa iterazione
Questo evita che la prima opzione plausibile diventi lo standard e riduce l'espansione di scope silente (causa comune di riscritture).
Come prevengono le riscritture di integrazione i contratti Dati & API prima?
L'approccio contract-first riduce i rifacimenti di integrazione rendendo esplicite le forme dati e le regole di compatibilità.
Chiedi per:
- proprietà dell'entità + lifecycle + sorgente di verità
- esempi di request/response e forme di errore standard
- regole di validazione a livello di campo + casi limite
- regole di versioning (es. campi additivi ok; rinominare richiede
/v2; i client ignorano campi non riconosciuti)
Quando UI, backend e integrazioni condividono lo stesso artefatto di contratto, si passa meno tempo a riconciliare supposizioni discordanti.