8 min

Come le convenzioni dei framework riducono la necessità di documentazione

Le convenzioni del framework rendono le app più facili da capire senza documenti lunghi. Scopri cosa coprono le convenzioni, dove falliscono e come documentare solo le eccezioni.

Come le convenzioni dei framework riducono la necessità di documentazione

Cosa significa quando le convenzioni sostituiscono la documentazione

Le convenzioni di un framework sono i “modi predefiniti di fare le cose” che un framework incoraggia silenziosamente — o addirittura si aspetta. Invece di far inventare a ogni team il proprio layout di cartelle, schema di naming o flusso richiesta/risposta, il framework fornisce un pattern condiviso. Se lo segui, altri sviluppatori possono prevedere dove stanno le cose e come si comportano senza bisogno di una lunga spiegazione.

Perché i team scrivono documentazione

La maggior parte della documentazione non nasce perché a qualcuno piaccia scriverla. Esiste per risolvere alcuni problemi ricorrenti:

  • Onboarding: aiutare i nuovi sviluppatori a capire da dove cominciare e come è organizzato il progetto
  • Coerenza: evitare che ognuno risolva lo stesso problema in modi diversi
  • Registrare decisioni: catturare perché è stata scelta una certa soluzione (spesso dopo compromessi)

Le convenzioni affrontano soprattutto i primi due punti. Quando “dove mettere X” e “come chiamare Y” sono già decisi dal framework, c’è meno da spiegare e meno da discutere.

Le convenzioni riducono la documentazione—non la cancellano

“Le convenzioni sostituiscono la documentazione” non significa che un progetto rimanga senza documenti. Significa che una grande parte delle linee guida di base passa dalla prosa a una struttura prevedibile. Invece di leggere una pagina wiki per capire dove vanno i controller, lo si deduce perché il framework li aspetta in un certo posto (e strumenti, generatori ed esempi lo rinforzano).

Il risultato è meno documentazione sulle ovvietà e più attenzione a documentare ciò che è davvero specifico del progetto: regole di business, scelte architetturali insolite ed eccezioni intenzionali.

Cosa otterrai da questo articolo

Questo articolo è pensato per sviluppatori, tech lead e team orientati al prodotto che vogliono codebase più chiare e onboarding più rapido senza mantenere un sito di documentazione vasto.

Imparerai come le convenzioni dei framework creano una “documentazione implicita”, quali aspetti tendono a standardizzare, dove le convenzioni smettono di aiutare e cosa merita ancora documentazione esplicita — così la chiarezza aumenta anche quando i documenti diminuiscono.

Perché le convenzioni funzionano: default condivisi meglio di lunghe spiegazioni

“Convention over configuration” significa che un framework prende decisioni sensate per te — purché tu segua le regole concordate. Invece di scrivere (e leggere) pagine di istruzioni di setup, i team si affidano a default condivisi che tutti riconoscono.

Un’analogia semplice

Pensalo come guidare in un paese dove tutti sono d’accordo a guidare sulla destra, fermarsi ai semafori rossi e seguire i segnali standard.

Potresti scrivere un manuale dettagliato per ogni incrocio (“Se vedi un ottagono rosso, fermati; se il semaforo è verde, vai…”), ma non è necessario — perché la convenzione è già nota e applicata in modo coerente.

Le convenzioni del framework funzionano allo stesso modo: trasformano il “come facciamo le cose qui” in un comportamento prevedibile.

I default eliminano la necessità di spiegare ogni passo

Quando un framework ha dei default, non devi documentare ogni piccola decisione. Il framework (e il tuo team) può presumere pattern come:

  • dove vanno i file (controller in una cartella, template in un’altra)
  • come si chiamano le cose (un modello User mappa a dati users)
  • come sono collegate le funzionalità comuni (routing, validazione, impostazioni di ambiente)

Questa base condivisa riduce la documentazione da “ecco ogni passo per impostare X” a “seguiamo i default del framework, salvo diversa indicazione.” Riduce anche il carico mentale durante l’onboarding: i nuovi sviluppatori possono indovinare correttamente più spesso, perché il codice corrisponde a ciò che hanno visto in altri progetti.

Il compromesso: meno flessibilità, più coerenza

Le convenzioni non sono gratis. Lo svantaggio è che a volte rinunci a strutture di cartelle insolite, naming personalizzati o workflow molto su misura.

Il vantaggio è la coerenza: meno dibattiti, meno sorprese, meno regole “tribali” che solo i veterani ricordano. I team vanno più veloci perché passano meno tempo a spiegare e più tempo a costruire.

Le convenzioni funzionano meglio quando sono ampiamente condivise

Una convenzione salva documentazione solo se le persone la conoscono già — o possono impararla una volta e riutilizzarla ovunque.

Per questo i framework popolari sono potenti: le convenzioni sono insegnate, usate e ripetute in molti codebase. Quando il tuo progetto si attiene a quei default condivisi, il codice diventa comprensibile di default, con molte meno spiegazioni scritte richieste.

Le 5 aree che le convenzioni dei framework di solito standardizzano

Le convenzioni sono scorciatoie condivise. Standardizzano le domande che ogni nuovo collega si pone il primo giorno: “Dove va questo?” e “Come lo chiamiamo?” Quando le risposte sono prevedibili, puoi sostituire pagine di documentazione con pochi default coerenti.

1) Struttura di cartelle e file

La maggior parte dei framework promuove una struttura di progetto riconoscibile: un posto per l’interfaccia, uno per le route, uno per l’accesso ai dati, uno per i test. Questa coerenza è importante perché le persone non devono leggere una guida per trovare “la parte che renderizza una pagina” rispetto a “la parte che parla con il database”.

Le migliori convenzioni fanno sembrare le attività comuni come memoria muscolare: aggiungi una nuova schermata e sai già in quale cartella metterla.

2) Convenzioni di naming

Le regole di naming riducono la necessità di spiegazioni tipo “I nostri controller stanno in X e devono essere collegati in Y.” I nomi implicano ruoli.

Esempi comuni:

  • pagine/componenti chiamati in base a ciò che renderizzano (e con casing prevedibile)
  • test nominati in base all’unità che coprono
  • file chiamati per corrispondere alle esportazioni (così la ricerca funziona come previsto)

3) Routing e URL

Molti framework web mappano i file alle route (o rendono le route facili da dedurre). Se puoi indovinare l’URL dal nome del file — o viceversa — non ti serve un manuale di routing per ogni feature.

La convenzione definisce anche aspettative su route dinamiche, route annidate e gestione dei 404, quindi “come aggiungiamo un nuovo endpoint?” ha una risposta standard.

4) Pattern di accesso ai dati

Le convenzioni spesso definiscono dove vive il “codice dati”: modelli, repository, servizi, migrazioni, file di schema. Anche se la tua app è piccola, avere una casa concordata per l’accesso ai dati evita chiamate al database sparse nell’UI.

5) Script e comandi comuni

Comandi standard (run, test, build, lint, format) eliminano ambiguità. Un nuovo sviluppatore non dovrebbe aver bisogno di una pagina wiki per capire come avviare il progetto — npm test (o l’equivalente) dovrebbe essere la mossa ovvia.

Quando queste cinque aree sono coerenti, il codebase risponde da sé alle domande “come facciamo le cose qui?”.

Come le convenzioni trasformano il repository in una mappa

Una wiki che spiega “come funziona tutto” cerca di descrivere l’intero sistema in prosa. Spesso resta utile all’inizio, poi diventa obsoleta quando cartelle si spostano, nomi cambiano e arrivano nuove feature. Le convenzioni capovolgono l’idea: invece di leggere una lunga spiegazione, leggi la struttura.

Posti prevedibili rendono l’orientamento facile

Quando un framework (e il tuo team) concordano dove stanno le cose, il repository diventa navigabile come una griglia cittadina.

Se sai che i componenti UI stanno in components/, le view a livello di pagina in pages/ e gli handler API in api/, smetti di chiederti “dov’è X?” perché la prima ipotesi è quasi sempre giusta. Anche quando non lo è, la ricerca è più mirata: non è dappertutto — è in uno di pochi posti previsti.

I nomi come indicazioni

Le convenzioni fanno sì che nomi di file e simboli abbiano significato. Un nuovo arrivato può inferire il comportamento da posizione e nome:

  • un file chiamato user.controller probabilmente gestisce la logica delle richieste
  • una classe UserService probabilmente contiene regole di business
  • una cartella migrations/ probabilmente contiene cambiamenti al DB ordinati ed eseguiti una sola volta

Questa inferenza riduce le domande “spiegami l’architettura” in quesiti più piccoli e documentabili (“Questo servizio può chiamare il DB direttamente?”), che sono molto più facili da descrivere.

I template mantengono la mappa coerente

Il modo più veloce per rinforzare la mappa è lo scaffolding. Starter template e generatori creano nuove feature nella forma “giusta” di default — cartelle, nomi dei file, wiring boilerplate e spesso test.

Questo è importante perché le convenzioni aiutano solo se vengono applicate con coerenza. Un template è un guardrail: spinge ogni nuova route, componente o modulo nella struttura prevista, mantenendo il repository leggibile senza aggiungere altre pagine wiki.

Se mantenete scaffold interni, fate riferimento ad essi da una breve pagina di onboarding (per esempio, /docs/getting-started) e lasciate all’albero delle cartelle il resto del lavoro.

Esempi reali di “documentazione implicita”

Aggiungi funzionalità nello stesso modo
Aggiungi route, schermate e layer di dati tramite chat restando all'interno delle tue convenzioni.

Le convenzioni dei framework spesso funzionano come istruzioni preziose e silenziose. Invece di scrivere una pagina che spiega “dove vanno le cose” o “come collegare questo”, il framework prende già la decisione — e il team impara a leggere la struttura.

Ruby on Rails: “mettilo qui e funziona”

Rails è famoso per la convenzione rispetto alla configurazione. Un esempio semplice: se crei un controller chiamato OrdersController, Rails presume che ci sia una cartella di view corrispondente in app/views/orders/.

Questa singola convenzione può sostituire una parte della documentazione che altrimenti spiegherebbe:

  • dove mettere i template HTML
  • come un URL trova l’azione del controller giusta
  • come il controller seleziona il template corrispondente

Risultato: i nuovi colleghi possono aggiungere una pagina seguendo il pattern delle cartelle senza chiedersi “dove va questo file?”.

Django: struttura prevedibile per lavori comuni

Django incoraggia una struttura consistente per le “app”. Quando qualcuno vede un’app Django, si aspetta di trovare models.py per le forme dei dati, views.py per la gestione delle richieste e templates/ per l’HTML.

Si potrebbe scrivere una guida lunga che descrive l’anatomia del progetto, ma i default di Django la insegnano già. Quando un collega vuole cambiare l’aspetto di una pagina, sa di cercare in templates/. Quando deve modificare i dati persistenti, inizia da models.py.

Risultato: correzioni più rapide, meno tempo passato a cercare, meno messaggi “quale file controlla questo?”.

Next.js: routing senza manuale di routing

Next.js riduce la documentazione rendendo il routing una riflessione diretta della struttura delle cartelle. Crea un file in app/about/page.tsx (o pages/about.tsx nelle versioni precedenti) e ottieni automaticamente la pagina /about.

Questo elimina la necessità di documentare:

  • come registrare le route
  • come nominare le route in modo coerente
  • come aggiungere una nuova pagina senza rompere la navigazione

Risultato: l’onboarding è più semplice — le persone possono scoprire la forma del sito scansionando le directory.

Stesso principio, ecosistemi diversi

Rails, Django e Next.js sembrano diversi, ma il principio è identico: default condivisi trasformano la struttura del progetto in istruzioni. Quando tutti hanno fiducia nelle stesse convenzioni, il codebase risponde a molte domande “come lo facciamo qui?” senza che serva un documento da mantenere.

Quando le convenzioni si rompono (e ritorna la confusione)

Le convenzioni del framework sembrano “invisibili” quando funzionano. Puoi indovinare dove stanno i file, come si chiamano e come scorre una richiesta nell’app. La confusione ritorna quando un codebase si allontana da quei default condivisi.

Segnali che le convenzioni si stanno erodendo

Appaiono alcuni pattern:

  • troppe cartelle custom che non corrispondono alla struttura tipica del framework (per esempio, nuove directory top-level create per ogni feature senza regole chiare)
  • naming incoerente: una parte usa UserService, un’altra UsersManager, un’altra user_service
  • pattern ad-hoc che cambiano da schermata a schermata o da endpoint a endpoint (“l’abbiamo gestito diversamente qui perché…”) senza una linea guida stabile

Nessuno di questi è automaticamente sbagliato — ma significa che un nuovo collega non può più affidarsi alla “mappa” del framework.

Come “una sola eccezione” diventa molte

La maggior parte delle rotture delle convenzioni parte da un’ottimizzazione locale ragionevole: “Questa feature è speciale, la mettiamo qui” o “Questo naming legge meglio.” Il problema è che le eccezioni sono contagiose. Una volta che la prima eccezione viene pubblicata, il prossimo sviluppatore la prende come precedente:

  • una seconda feature copia la cartella custom perché è già lì
  • una terza la adatta leggermente, perché la seconda non si adattava perfettamente
  • presto hai tre modi “accettabili” per fare la stessa cosa

A quel punto, la convenzione smette di essere una convenzione — diventa sapere tribale.

Il vero costo: tempo, errori e riunioni

Quando le convenzioni si confondono, l’onboarding rallenta perché le persone non prevedono dove cercare. Le attività quotidiane richiedono più tempo (“Quale di queste cartelle è quella reale?”), gli errori aumentano (collegare il modulo sbagliato, usare il pattern sbagliato, duplicare logica). I team compensano pianificando più sync, scrivendo spiegazioni più lunghe nelle PR e aggiungendo “doc rapidi” che poi diventano obsoleti.

Una regola semplice per mantenere la chiarezza

Personalizza solo quando hai una ragione chiara — e lascia una nota scritta.

Quella nota può essere leggera: un commento vicino alla struttura insolita o una breve voce in /docs/decisions che spiega cosa è cambiato, perché valeva la pena e quale approccio standard seguire in futuro.

Cosa devi ancora documentare: le eccezioni

Le convenzioni del framework possono eliminare pagine di spiegazioni, ma non eliminano la responsabilità. Le parti che richiedono ancora documentazione sono quelle in cui il tuo progetto differisce intenzionalmente da ciò che la maggior parte degli sviluppatori si aspetterebbe.

Documenta decisioni, non le basi

Evita di rispiegare il comportamento standard del framework. Piuttosto, cattura le decisioni che influenzano il lavoro quotidiano:

  • cosa hai scelto (e cosa no)
  • cosa è cambiato (e quando)
  • perché è cambiato (compromessi, vincoli, fix dettati da incidenti)

Esempio: “Usiamo cartelle per feature sotto /src/features invece delle cartelle a strati (/src/components, /src/services) perché la proprietà mappa ai team e riduce l’accoppiamento tra team.” Questa singola frase previene settimane di deriva lenta.

Lascia brevi “Note di eccezione” vicino al codice

Quando un’eccezione è importante localmente, metti la nota localmente. Un piccolo README.md dentro una cartella, o un breve commento in cima a un file, spesso batte una wiki centrale che nessuno consulta.

Buoni candidati:

  • una directory che infrange la struttura usuale per una ragione
  • un modulo che deve essere inizializzato in un ordine non standard
  • una regola di naming che sembra “sbagliata” a meno di conoscere il vincolo

Mantieni queste note corte e operative: cosa è diverso, perché è diverso e cosa fare dopo.

Crea una piccola pagina “Regole del progetto”

Avere una singola pagina leggera (spesso in /docs/project-rules.md o nel README alla radice) che elenchi solo 5–10 scelte chiave su cui le persone inciampano:

  • convenzioni di naming che differiscono dai default del framework
  • la struttura del progetto attesa (solo dove devia)
  • il tuo “golden path” per aggiungere una nuova feature o endpoint

Non è un manuale completo — solo un insieme condiviso di guardrail.

Quickstart: come eseguire e testare

Anche con le convenzioni, l’onboarding si blocca quando le persone non riescono a far partire l’app. Aggiungi una breve sezione “Come eseguire/testare” che corrisponda ai comandi standard e alla tua configurazione reale.

Se il comando convenzionale è npm test ma il tuo progetto richiede npm run test:unit, documentalo esplicitamente.

Mantieni la documentazione aggiornata tramite le code review

La documentazione resta accurata quando è considerata parte della modifica. Nelle review, chiedi: “Questo ha introdotto una nuova eccezione?” Se sì, richiedi la nota corrispondente (README locale, Regole del Progetto o quickstart) nella stessa pull request.

Far rispettare le convenzioni con automazione invece di più documenti

Decidi le convenzioni in anticipo
Usa la modalità di pianificazione per concordare struttura ed eccezioni prima che venga scritto codice.

Se le convenzioni sono i “default condivisi” del tuo codebase, l’automazione è ciò che le rende reali. Invece di chiedere a ogni sviluppatore di ricordare regole da una pagina wiki, rendi le regole eseguibili — così il progetto si fa rispettare da sé.

Controlli automatici che mantengono la coerenza

Un buon set up intercetta la deriva presto e in modo silenzioso:

  • Formatting: auto-format al salvataggio e in CI (es. Prettier, gofmt, black) così i dibattiti sullo stile spariscono.
  • Regole lint: prevengono errori comuni e fanno rispettare naming o pattern (es. regole per React hooks, import inutilizzati, “no default export” se questo è il vostro standard).
  • Naming e struttura dei test: imporre pattern come *.spec.ts, la forma describe/it o asserzioni richieste così i test siano leggibili e coerenti.
  • Confini di cartelle: bloccare import che violano l’architettura prevista (es. “le feature non possono importare altre feature”, o “l’UI non può importare codice server”). Strumenti come regole ESLint, restrizioni di percorso TypeScript o script custom possono farlo.

Questi controlli sostituiscono paragrafi del tipo “per favore ricordati di…” con un semplice risultato: il codice o rispetta la convenzione o no.

Fallire presto: trovare problemi prima del merge

L’automazione brilla perché fallisce presto:

  • i problemi vengono trovati durante lo sviluppo locale o in una pull request, non settimane dopo
  • i reviewer passano meno tempo a sorvegliare lo stile e più tempo sulla logica di prodotto
  • i nuovi arrivati imparano le convenzioni vedendo errori e correzioni chiari e coerenti

Mantieni le regole minimali — e allineate al framework

I migliori set di regole sono piccoli e noiosi. Parti dai default del framework, poi aggiungi solo ciò che protegge la chiarezza (naming, struttura e confini). Ogni regola in più è un’altra cosa da capire, quindi tratta le nuove check come codice: aggiungile quando risolvono un problema ricorrente e rimuovile quando smettono di aiutare.

I test come documentazione vivente (quando scritti per esseri umani)

Quando un codebase segue le convenzioni del framework, i test possono fare più che “dimostrare che funziona”. Possono spiegare cosa il sistema dovrebbe fare, in linguaggio chiaro, accanto all’implementazione.

Scrivi test che leggano come una storia

Una regola utile: un test dovrebbe descrivere un comportamento end-to-end. Se qualcuno può scorrere il nome del test e capire la promessa che il sistema fa, hai ridotto la necessità di documentazione separata.

I test utili tendono a seguire un ritmo semplice:

  • Arrange: imposta uno stato iniziale realistico
  • Act: esegui una sola azione
  • Assert: verifica l’esito che conta

Meglio ancora se il nome rispecchia l’intento dell’utente:

  • signing_in_with_valid_credentials_redirects_to_dashboard
  • checkout_fails_when_shipping_address_is_missing

Questi nomi sono “documentazione” difficile da dimenticare — perché i test che falliscono costringono la conversazione.

Usa test di accettazione per i flussi utente

I test di accettazione documentano come si comporta il prodotto dal punto di vista dell’utente.

Esempi di comportamenti che questi test possono descrivere:

  • un utente si registra, conferma l’email e arriva alla pagina di benvenuto
  • un admin crea un codice sconto e questo si applica al checkout

Questi test rispondono alla domanda “Cosa succede quando faccio X?” — spesso la prima cosa che un nuovo collega vuole sapere.

Usa unit test per edge case e regole

I unit test eccellono quando devi documentare regole “piccole ma importanti”:

  • comportamento di arrotondamento
  • regole di validazione
  • controlli di permessi
  • casi limite complessi (fusi orari, limiti, stati vuoti)

Sono particolarmente utili quando la regola non è ovvia dalle convenzioni del framework.

Mantieni fixture e dati di esempio piccoli e significativi

I dati di esempio possono essere documentazione vivente. Una piccola fixture ben nominata (es. user_with_expired_subscription) insegna il dominio più velocemente di un paragrafo in una wiki.

La chiave è la moderazione: mantieni le fixture minime, leggibili e legate a un’unica idea, così rimangono esempi affidabili invece di un secondo sistema da mantenere.

Starter template: il modo più veloce per diffondere le convenzioni

Distribuisci senza documentazione aggiuntiva
Spedisci un ambiente coerente con hosting e deployment integrati quando sei pronto.

Gli starter template (e i generatori che li alimentano) sono il modo più rapido per trasformare il “come facciamo le cose qui” in qualcosa che la gente segua davvero. Invece di chiedere a ogni membro del team di ricordare cartelle, script e tooling giusti, incorpori quelle decisioni in un repo che parte corretto.

Template, generatori e starter kit: velocità diverse, stesso obiettivo

  • Template ti danno una base copiabile (es. “nuovo servizio”, “nuova app frontend”).
  • Generatori (CLI) possono fare poche domande e poi creare file, nomi e wiring coerenti.
  • Starter kit includono non solo la struttura del codice, ma anche CI, linting, testing e default di deployment.

Tutti e tre riducono il “debito di documentazione” perché la convenzione è codificata nel punto di partenza, non scritta in una wiki che deriva.

In pratica, qui strumenti come Koder.ai possono aiutare: quando generi una nuova app React, un backend Go, uno schema PostgreSQL o un client Flutter da un workflow guidato in chat, puoi mantenere il team su un singolo “golden path” facendo in modo che l’output predefinito rispetti le tue convenzioni (e poi esportando il codice sorgente nel tuo repo).

Standardizza l’setup così “non tutti i repository sono diversi”

La maggior parte della confusione durante l’onboarding non riguarda la logica di business — riguarda dove stanno le cose e come far partire il progetto. Un buon template rende le attività comuni identiche tra i repo: stessi script, stessi nomi di cartelle, stessi comandi di check, stesse aspettative sulle PR.

Se non fai altro, allinea:

  • cartelle prevedibili (es. /src, /test, /docs per le eccezioni)
  • un modo unico per eseguire, testare e lintare tramite script di package
  • una pipeline CI di default che esegue quegli script automaticamente

Una checklist leggera per un “nuovo progetto”

Tienila abbastanza piccola da non essere saltata:

  1. Struttura di cartelle e regole di naming
  2. Setup in un comando (es. install + dev)
  3. Script test, lint e format
  4. CI che gira su ogni PR
  5. README di base: scopo, prerequisiti e i 3–5 comandi necessari

Non fossilizzare: il template può diventare il problema

Il rischio più grande è copiare un vecchio template “perché ha funzionato l’anno scorso.” Dipendenze obsolete, script legacy o pattern abbandonati si propagano rapidamente quando sono in uno starter.

Tratta i template come prodotti: versionali, revisionai periodicamente e aggiornali quando le convenzioni cambiano. (Se la tua piattaforma supporta snapshot e rollback — Koder.ai lo fa — usali per iterare in sicurezza sugli starter senza rompere la baseline di tutti.)

Una checklist pratica per ridurre i documenti senza perdere chiarezza

Ridurre la documentazione non significa lasciare le persone a indovinare. Significa rendere il “percorso felice” così coerente che la maggior parte delle domande si risponde da sola, e solo le parti veramente insolite vanno scritte.

1) Fai un rapido self-audit (trova l’attrito reale)

Cerca i punti in cui le persone fanno ripetutamente le stesse domande in Slack, commenti PR, standup o sessioni di onboarding. Alcuni spunti:

  • “Dove dovrebbe vivere questo file?”
  • “Come chiamiamo questa cosa?”
  • “Come aggiungo una nuova pagina/job/endpoint?”
  • “Perché questo funziona diversamente in questo modulo?”

Se senti la stessa domanda due volte, probabilmente non serve più prosa — serve una convenzione.

2) Scegli: adotta il default del framework o documenta una deviazione deliberata

Per ogni domanda ripetuta, decidi:

  • Stiamo lottando contro il framework: torna ai default del framework (routing, layout cartelle, naming, gestione errori). I default sono già “documentati” dall’ecosistema.
  • Abbiamo una buona ragione per differire: mantieni la deviazione, ma rendila esplicita e facile da trovare.

Una regola utile: se una deviazione non risparmia tempo reale o non previene rischi concreti, probabilmente non vale la confusione continua.

3) Crea una piccola pagina “Conventions & Exceptions”

Mantieni una singola pagina breve (es. /docs/conventions) che elenchi:

  • le 5–10 convenzioni che tutti devono assumere
  • il piccolo insieme di eccezioni (con la ragione e un esempio)

Limitati a ciò che serve nella prima settimana. Se la pagina cresce, è spesso segno che dovresti semplificare il codebase invece.

4) Stabilire una cadenza: rivedi le convenzioni ogni trimestre

Le app evolvono. Pianifica una revisione trimestrale leggera:

  • quali nuovi pattern sono apparsi?
  • quali eccezioni sono diventate “normali” (e dovrebbero diventare convenzioni)?
  • quali convenzioni vengono ignorate (e perché)?

Conclusione

Preferisci i default del framework quando possibile e documenta solo ciò che differisce — in modo chiaro, breve e in un unico posto.

Domande frequenti

Cosa significa realmente “le convenzioni del framework sostituiscono la documentazione”?

Le convenzioni del framework sono i pattern predefiniti che il framework si aspetta tu segua: struttura delle cartelle, convenzioni di naming, routing, accesso ai dati e comandi comuni. Se li rispetti, altri sviluppatori possono dedurre dove stanno le cose e come funzionano senza leggere documentazione specifica del progetto.

Perché i team scrivono così tanta documentazione?

Perché è difficile mantenere la documentazione testuale aggiornata man mano che il codice cambia. La documentazione serve principalmente a:

  • aiutare i nuovi arrivati a orientarsi
  • mantenere la coerenza nel lavoro del team
  • registrare decisioni importanti e compromessi

Le convenzioni coprono i primi due punti rendendo la struttura prevedibile.

Le convenzioni significano che possiamo smettere completamente di scrivere documentazione?

No. Le convenzioni riducono la documentazione sulle cose ovvie (dove vanno i file, come sono collegati i route), ma resta necessario documentare ciò che è specifico del progetto: regole di business, deviazioni intenzionali e decisioni chiave. Pensalo come “meno documentazione, più documentazione di valore”.

Che cosa tipicamente normalizzano le convenzioni?

Standardizzano le domande ricorrenti del primo giorno:

  • Dove vive questo codice? (cartelle e struttura file)
  • Come lo chiamiamo? (naming)
  • Come scorre una richiesta? (pattern routing/controller)
  • Dove va la logica dati? (models/services/migrations)
  • Come si esegue/testa/builda? (script e comandi)

Quando questi aspetti sono prevedibili, il repository è quasi autoesplicativo.

In che modo le convenzioni trasformano il codice in “documentazione implicita”?

Quando il codice segue un pattern noto, l’albero delle directory e i nomi dei file funzionano come segnali. Un nuovo arrivato può navigare per aspettativa (es. “i template stanno in templates/”, “le migrazioni sono in migrations/”) invece di leggere una lunga pagina architetturale che potrebbe essere obsoleta.

In che modo gli starter template e i generatori riducono il debito di documentazione?

Codificano le convenzioni nelle impostazioni predefinite così le persone non devono ricordarle a memoria. Buoni scaffold generano:

  • le cartelle e i nomi corretti
  • gli wiring attesi (route, registrazioni, import)
  • test e script di base

Questo evita la deriva e mantiene la “mappa” coerente tra le feature.

Quali sono i segnali che le convenzioni stanno cedendo?

Lo noterai quando gli sviluppatori non riescono più a prevedere dove mettere le cose o come chiamarle. Segnali comuni:

  • molte cartelle top-level custom senza regole chiare
  • naming incoerente (UserService vs UsersManager vs user_service)
  • molti pattern ad-hoc (“l’abbiamo fatto diverso qui…”) senza linea guida stabile

A quel punto il team compensa con spiegazioni in chat, PR più lunghe e documenti rapidi che diventano obsoleti.

Come dovremmo gestire le eccezioni alle convenzioni del framework?

Personalizza solo se c’è un reale vantaggio, poi lascia una nota leggera che spieghi la deviazione:

  • un breve README.md nella cartella insolita
  • un commento vicino alla configurazione “strana”
  • una voce in /docs/decisions o simile

Cattura cosa è cambiato, perché, e quale dovrebbe essere l’approccio standard in futuro.

Quale documentazione vale ancora la pena scrivere anche con forti convenzioni?

Inizia con una base pratica e piccola:

  • Quickstart: comandi esatti per eseguire/testare/lintare (soprattutto se diversi dai default)
  • Regole del progetto: 5–10 convenzioni e solo le deviazioni dai default del framework
  • Registro decisioni: note brevi per i compromessi che influenzano il lavoro futuro

Mantienilo snello e richiedi aggiornamenti durante la code review quando una modifica introduce una nuova eccezione.

Come può l’automazione far rispettare le convenzioni così da scrivere meno documenti “ricordati di…”?

Usa l’automazione per rendere le convenzioni eseguibili:

  • formatter (eseguiti localmente e in CI)
  • regole lint per naming e pattern
  • convenzioni di test e naming dei test
  • confini di import (per evitare dipendenze non desiderate)

Quando i controlli falliscono in sviluppo locale o nelle PR, gli sviluppatori imparano subito le regole e i reviewer passano meno tempo a far rispettare lo stile.

Related posts