dicembre 21, 2025
14 min di lettura

Domande per il Colloquio di Senior Full Stack Developer: Guida Completa

interview
career-advice
job-search
Domande per il Colloquio di Senior Full Stack Developer: Guida Completa
Milad Bonakdar

Milad Bonakdar

Autore

Padroneggia lo sviluppo full stack con domande essenziali per il colloquio, che coprono framework frontend, architettura backend, database, progettazione di sistemi e pratiche DevOps per sviluppatori senior.


Introduzione

Lo sviluppo full stack si è evoluto in una disciplina completa che richiede competenze in frontend, backend, database e infrastruttura. Ci si aspetta che gli sviluppatori full stack senior progettino sistemi scalabili, prendano decisioni tecnologiche informate e colmino il divario tra i diversi livelli delle applicazioni moderne.

Questa guida tratta le domande essenziali per i colloqui per sviluppatori Full Stack Senior, che spaziano dai framework frontend, all'architettura backend, alla progettazione del sistema, ai database e alle pratiche DevOps. Ogni domanda include risposte dettagliate, valutazione della rarità e valutazioni della difficoltà per aiutarti a prepararti in modo efficace.


Sviluppo Frontend (6 Domande)

1. Spiega il Virtual DOM di React e l'algoritmo di Reconciliation.

Risposta: Il Virtual DOM è una rappresentazione JavaScript leggera del DOM effettivo. React lo utilizza per ottimizzare gli aggiornamenti.

  • Processo: Quando lo stato cambia, React crea un nuovo albero Virtual DOM e lo confronta con quello precedente (diffing).
  • Reconciliation: L'algoritmo di React identifica l'insieme minimo di modifiche necessarie e aggiorna solo quelle parti del DOM reale.
  • Ottimizzazione chiave: L'utilizzo di key props aiuta React a identificare quali elementi sono stati modificati, aggiunti o rimossi negli elenchi, rendendo la reconciliation più efficiente.
  • Architettura Fiber: React moderno utilizza Fiber, che consente di suddividere il lavoro di rendering in blocchi e di dare la priorità agli aggiornamenti.

Rarità: Molto Comune Difficoltà: Media


2. Cosa sono gli Hook di React e perché sono stati introdotti?

Risposta: Gli Hook sono funzioni che consentono di utilizzare lo stato e altre funzionalità di React nei componenti funzionali.

  • Motivazione: Prima degli Hook, la logica stateful richiedeva componenti di classe. Gli Hook consentono di riutilizzare la logica stateful senza modificare la gerarchia dei componenti.
  • Hook comuni:
    • useState: Gestisce lo stato locale
    • useEffect: Gestisce gli effetti collaterali (data fetching, sottoscrizioni)
    • useContext: Accede ai valori di contesto
    • useMemo/useCallback: Ottimizzazione delle prestazioni
  • Hook personalizzati: È possibile creare hook personalizzati per estrarre e riutilizzare la logica dei componenti.

Rarità: Molto Comune Difficoltà: Facile


3. Come si ottimizzano le prestazioni di un'applicazione React?

Risposta: Diverse strategie possono migliorare le prestazioni di React:

  1. Code Splitting: Utilizzare React.lazy() e Suspense per caricare i componenti su richiesta.
  2. Memoization: Utilizzare React.memo() per i componenti, useMemo() per i calcoli costosi, useCallback() per i riferimenti alle funzioni.
  3. Virtual Lists: Per elenchi lunghi, utilizzare librerie come react-window o react-virtualized.
  4. Evitare le funzioni inline: Nei metodi di rendering, in quanto creano nuovi riferimenti a ogni rendering.
  5. Profiler: Utilizzare React DevTools Profiler per identificare i colli di bottiglia.
  6. State Management: Mantenere lo stato il più locale possibile, utilizzare il contesto con saggezza.

Rarità: Comune Difficoltà: Media


4. Spiega la differenza tra Server-Side Rendering (SSR) e Client-Side Rendering (CSR).

Risposta:

  • CSR: JavaScript viene eseguito nel browser per eseguire il rendering della pagina. L'HTML iniziale è minimo. Navigazione successiva veloce ma caricamento iniziale più lento e SEO scadente.
  • SSR: Il server genera HTML completo per ogni richiesta. SEO migliore e paint iniziale più veloce, ma navigazione successiva più lenta e carico del server più elevato.
  • Approcci ibridi:
    • Static Site Generation (SSG): Pre-renderizza le pagine in fase di build (Next.js, Gatsby).
    • Incremental Static Regeneration (ISR): Aggiorna le pagine statiche dopo la distribuzione senza una ricostruzione completa.

Rarità: Comune Difficoltà: Media


5. Qual è la differenza tra localStorage, sessionStorage e Cookies?

Risposta:

  • localStorage: Memorizza i dati senza scadenza. Limite di ~5-10 MB. Non viene inviato automaticamente al server.
  • sessionStorage: Come localStorage ma viene cancellato quando si chiude la scheda/il browser.
  • Cookies: Piccoli dati (~4KB) inviati con ogni richiesta HTTP. È possibile impostare la scadenza. Utilizzato per i token di autenticazione.
  • Sicurezza: I cookie possono essere HttpOnly (non accessibili tramite JS) e Secure (solo HTTPS). Utilizzare per i dati sensibili.

Rarità: Comune Difficoltà: Facile


6. Come funziona CSS-in-JS e quali sono i suoi compromessi?

Risposta: Le librerie CSS-in-JS (styled-components, Emotion) consentono di scrivere CSS direttamente in JavaScript.

  • Vantaggi:
    • Stili con ambito (nessun inquinamento dello spazio dei nomi globale)
    • Stili dinamici basati su props
    • Prefissaggio automatico del vendor
    • Eliminazione del codice morto
  • Compromessi:
    • Overhead di runtime (stili generati in fase di runtime)
    • Dimensioni del bundle maggiori
    • Curva di apprendimento
  • Alternative: CSS Modules, Tailwind CSS, CSS tradizionale con metodologia BEM.

Rarità: Media Difficoltà: Media


Sviluppo Backend (6 Domande)

7. Spiega l'Event Loop in Node.js.

Risposta: Node.js è single-threaded ma gestisce la concorrenza attraverso l'event loop.

  • Fasi:
    1. Timers: Esegue i callback setTimeout e setInterval
    2. Pending callbacks: Callback I/O differiti all'iterazione successiva
    3. Poll: Recupera nuovi eventi I/O, esegue i callback I/O
    4. Check: Callback setImmediate
    5. Close callbacks: Eventi di chiusura del socket
  • I/O non bloccante: Quando vengono avviate operazioni I/O, Node.js le delega al kernel del sistema e continua a eseguire altro codice.
console.log('1');
setTimeout(() => console.log('2'), 0);
Promise.resolve().then(() => console.log('3'));
console.log('4');
// Output: 1, 4, 3, 2

Rarità: Molto Comune Difficoltà: Difficile


8. Cos'è Middleware in Express.js?

Risposta: Le funzioni middleware hanno accesso alla richiesta, alla risposta e alla funzione middleware successiva nel ciclo richiesta-risposta dell'applicazione.

  • Tipi:
    • Application-level: app.use()
    • Router-level: router.use()
    • Error-handling: Ha 4 parametri (err, req, res, next)
    • Built-in: express.json(), express.static()
    • Third-party: cors, helmet, morgan
  • L'ordine è importante: Il middleware viene eseguito nell'ordine in cui è definito.
app.use((req, res, next) => {
  console.log('Time:', Date.now());
  next();
});

Rarità: Molto Comune Difficoltà: Facile


9. Come gestisci l'autenticazione in un'API REST?

Risposta: Esistono diversi approcci:

  • JWT (Stateless):
    • Il server genera un token firmato contenente le informazioni sull'utente
    • Il client memorizza il token (localStorage/cookie) e lo invia con ogni richiesta
    • Il server verifica la firma
    • Pro: Scalabile, nessuna memorizzazione della sessione lato server
    • Contro: Difficile da revocare, payload più grande
  • Session-based (Stateful):
    • Il server crea una sessione, la memorizza in DB/Redis
    • Il client riceve l'ID di sessione nel cookie
    • Pro: Facile da revocare
    • Contro: Richiede archiviazione lato server
  • OAuth 2.0: Per l'autenticazione di terze parti
  • Best Practice: Utilizzare token di aggiornamento per l'accesso a lungo termine, token di accesso a breve termine.

Rarità: Molto Comune Difficoltà: Media


10. Spiega le transazioni del database e le proprietà ACID.

Risposta: Una transazione è una sequenza di operazioni eseguite come una singola unità logica di lavoro.

  • ACID:
    • Atomicity: Tutte le operazioni hanno successo o tutte falliscono (tutto o niente)
    • Consistency: Il database passa da uno stato valido a un altro
    • Isolation: Le transazioni simultanee non interferiscono tra loro
    • Durability: Le transazioni confermate persistono anche dopo un guasto del sistema
  • Isolation Levels: Read Uncommitted, Read Committed, Repeatable Read, Serializable (compromesso tra coerenza e prestazioni).

Rarità: Comune Difficoltà: Media


11. Qual è la differenza tra i database SQL e NoSQL?

Risposta:

  • SQL (Relazionale):
    • Schema strutturato, tabelle con righe/colonne
    • Conforme a ACID
    • Scalabilità verticale (server più grande)
    • Esempi: PostgreSQL, MySQL
    • Caso d'uso: Query complesse, transazioni, dati strutturati
  • NoSQL:
    • Schema flessibile, documento/chiave-valore/grafo/famiglia di colonne
    • BASE (Eventually consistent)
    • Scalabilità orizzontale (più server)
    • Esempi: MongoDB, Redis, Cassandra
    • Caso d'uso: Sviluppo rapido, scala massiccia, dati non strutturati

Rarità: Comune Difficoltà: Facile


12. Come si prevengono gli attacchi SQL Injection?

Risposta: SQL Injection si verifica quando l'input dell'utente viene concatenato direttamente nelle query SQL.

  • Prevenzione:
    1. Parameterized Queries/Prepared Statements: Utilizzare segnaposto per l'input dell'utente
    2. ORM: Librerie come Sequelize, TypeORM gestiscono automaticamente l'escaping
    3. Input Validation: Inserire nella whitelist i caratteri consentiti
    4. Least Privilege: L'utente del database deve avere le autorizzazioni minime
    5. Stored Procedures: Può fornire un ulteriore livello
// Bad
const query = `SELECT * FROM users WHERE id = ${userId}`;

// Good
const query = 'SELECT * FROM users WHERE id = ?';
db.execute(query, [userId]);

Rarità: Molto Comune Difficoltà: Facile


Progettazione del sistema e architettura (6 domande)

13. Come progetteresti un sistema di notifica scalabile?

Risposta: Un sistema di notifica deve gestire più canali (e-mail, SMS, push) su larga scala.

Loading diagram...
  • Componenti:
    • API Service: Riceve le richieste di notifica
    • Message Queue: RabbitMQ/Kafka per l'elaborazione asincrona
    • Workers: Servizi separati per ogni canale
    • Database: Memorizza la cronologia delle notifiche, le preferenze dell'utente
    • Rate Limiting: Prevenire lo spam
  • Considerazioni:
    • Logica di ripetizione per i guasti
    • Code di priorità per le notifiche urgenti
    • Gestione dei modelli
    • Preferenze dell'utente (opt-out)

Rarità: Comune Difficoltà: Difficile


14. Spiega l'architettura dei microservizi e le sue sfide.

Risposta: I microservizi scompongono un'applicazione in servizi piccoli e indipendenti.

  • Vantaggi:
    • Distribuzione e scalabilità indipendenti
    • Diversità tecnologica
    • Isolamento dei guasti
    • Autonomia del team
  • Sfide:
    • Transazioni distribuite: Difficile mantenere la coerenza tra i servizi
    • Network Latency: Overhead di comunicazione tra servizi
    • Monitoring: Necessità di tracciamento distribuito (Jaeger, Zipkin)
    • Data Management: Ogni servizio possiede il proprio database
    • Testing: L'integration testing è complesso
  • Patterns: API Gateway, Service Mesh, Circuit Breaker, Saga pattern per le transazioni.

Rarità: Molto Comune Difficoltà: Difficile


15. Cos'è la Caching e quali sono le strategie di caching comuni?

Risposta: La caching memorizza i dati a cui si accede frequentemente in un'archiviazione veloce per ridurre la latenza.

  • Livelli:
    • Cache del browser
    • CDN (CloudFlare, Akamai)
    • Cache dell'applicazione (Redis, Memcached)
    • Cache delle query del database
  • Strategie:
    • Cache-Aside: L'app controlla prima la cache, carica dal DB in caso di mancata corrispondenza
    • Write-Through: Scrivi contemporaneamente nella cache e nel DB
    • Write-Behind: Scrivi nella cache, scrivi in modo asincrono nel DB
    • Read-Through: La cache carica automaticamente i dati dal DB
  • Eviction Policies: LRU (Least Recently Used), LFU (Least Frequently Used), TTL (Time To Live).

Rarità: Molto Comune Difficoltà: Media


16. Come garantisci il versioning dell'API?

Risposta: Il versioning dell'API consente la compatibilità con le versioni precedenti quando si apportano modifiche.

  • Strategie:
    • URI Versioning: /api/v1/users, /api/v2/users
    • Header Versioning: Accept: application/vnd.api.v1+json
    • Query Parameter: /api/users?version=1
  • Best Practices:
    • Avvisi di deprecazione
    • Mantenere almeno 2 versioni
    • Guide di migrazione chiare
    • Versioning semantico
  • Alternativa GraphQL: Evoluzione dello schema senza versioning (campi deprecati).

Rarità: Comune Difficoltà: Media


17. Spiega il teorema CAP.

Risposta: Nei sistemi distribuiti, puoi garantire solo 2 su 3:

  • Consistency: Tutti i nodi vedono gli stessi dati contemporaneamente
  • Availability: Ogni richiesta riceve una risposta (successo/fallimento)
  • Partition Tolerance: Il sistema continua a funzionare nonostante i guasti di rete
  • Realtà: Le partizioni di rete si verificheranno, quindi devi scegliere tra CP (Consistency) o AP (Availability).
  • Esempi:
    • CP: MongoDB, HBase (sacrificare la disponibilità durante la partizione)
    • AP: Cassandra, DynamoDB (eventuale coerenza)

Rarità: Comune Difficoltà: Difficile


18. Cos'è il Load Balancing e quali algoritmi vengono utilizzati?

Risposta: Il bilanciamento del carico distribuisce il traffico su più server.

  • Algoritmi:
    • Round Robin: Distribuzione sequenziale
    • Least Connections: Invia al server con il minor numero di connessioni attive
    • IP Hash: Hach client IP per determinare il server (persistenza della sessione)
    • Weighted Round Robin: I server con maggiore capacità ricevono più richieste
  • Tipi:
    • Layer 4 (Transport): Basato su IP/Port, più veloce
    • Layer 7 (Application): Basato sul contenuto (URL, intestazioni), più intelligente
  • Strumenti: Nginx, HAProxy, AWS ELB, Google Cloud Load Balancer.

Rarità: Comune Difficoltà: Media


DevOps e Cloud (4 domande)

19. Spiega Docker e i vantaggi della containerizzazione.

Risposta: Docker confeziona le applicazioni con le loro dipendenze in container.

  • Vantaggi:
    • Consistency: Stesso ambiente in dev/staging/prod
    • Isolation: Ogni container è isolato
    • Lightweight: Condividi il kernel del sistema operativo host (vs VM)
    • Fast startup: Secondi anziché minuti per le VM
    • Portability: Esegui ovunque sia installato Docker
  • Componenti:
    • Image: Template di sola lettura
    • Container: Istanza in esecuzione di un'immagine
    • Dockerfile: Istruzioni per costruire un'immagine
    • Registry: Docker Hub, registri privati

Rarità: Molto Comune Difficoltà: Facile


20. Cos'è CI/CD e perché è importante?

Risposta:

  • Continuous Integration: Gli sviluppatori uniscono il codice frequentemente, i test automatizzati vengono eseguiti su ogni commit
  • Continuous Deployment: Distribuisci automaticamente in produzione dopo aver superato i test
  • Vantaggi:
    • Feedback più rapido
    • Problemi di integrazione ridotti
    • Codice di qualità superiore
    • Time to market più veloce
  • Strumenti: Jenkins, GitLab CI, GitHub Actions, CircleCI
  • Pipeline Stages: Build → Test → Deploy
  • Best Practices: Test automatizzati, feature flags, meccanismi di rollback.

Rarità: Molto Comune Difficoltà: Facile


21. Come monitori e debugghi le applicazioni di produzione?

Risposta: Un monitoraggio completo è fondamentale per i sistemi di produzione.

  • Logging:
    • Structured logging (formato JSON)
    • Centralized logging (ELK Stack, Splunk)
    • Log levels (ERROR, WARN, INFO, DEBUG)
  • Metrics:
    • Application metrics (tempo di risposta, throughput)
    • Infrastructure metrics (CPU, memoria, disco)
    • Strumenti: Prometheus, Grafana, DataDog
  • Tracing:
    • Distributed tracing per microservizi
    • Strumenti: Jaeger, Zipkin, AWS X-Ray
  • Alerting: PagerDuty, Opsgenie per problemi critici
  • Error Tracking: Sentry, Rollbar per il monitoraggio delle eccezioni.

Rarità: Comune Difficoltà: Media


22. Cos'è Infrastructure as Code (IaC)?

Risposta: IaC gestisce l'infrastruttura tramite codice anziché processi manuali.

  • Vantaggi:
    • Controllo della versione per l'infrastruttura
    • Ambienti riproducibili
    • Provisioning più veloce
    • Errore umano ridotto
  • Strumenti:
    • Terraform: Cloud-agnostic, dichiarativo
    • CloudFormation: Specifico per AWS
    • Ansible: Gestione della configurazione
    • Pulumi: Utilizza linguaggi di programmazione
  • Best Practices:
    • Memorizza nel controllo della versione
    • Componenti modulari e riutilizzabili
    • Ambienti separati (dev/staging/prod)
    • Test automatizzati dell'infrastruttura.

Rarità: Media Difficoltà: Media


Testing e Best Practices (3 domande)

23. Spiega la piramide dei test.

Risposta: La piramide dei test rappresenta la distribuzione ideale dei diversi tipi di test.

Loading diagram...
  • Unit Tests: Testa singole funzioni/componenti in isolamento. Veloci, molti di loro.
  • Integration Tests: Testa come i componenti lavorano insieme. Velocità media, numero moderato.
  • E2E Tests: Testa interi flussi utente. Lenti, costosi, pochi di loro.
  • Rationale: Più unit test perché sono veloci e individuano i bug in anticipo. Meno test E2E perché sono lenti e fragili.

Rarità: Comune Difficoltà: Facile


24. Quali sono i principi SOLID?

Risposta: SOLID è un acronimo per cinque principi di progettazione:

  • S - Single Responsibility: Una classe dovrebbe avere un solo motivo per cambiare
  • O - Open/Closed: Aperto all'estensione, chiuso alla modifica
  • L - Liskov Substitution: I sottotipi devono essere sostituibili ai loro tipi base
  • I - Interface Segregation: Molte interfacce specifiche sono meglio di una generale
  • D - Dependency Inversion: Dipende dalle astrazioni, non dalle concretizzazioni
  • Vantaggi: Codice più manutenibile, testabile e flessibile.

Rarità: Comune Difficoltà: Media


25. Come gestisci gli errori in JavaScript asincrono?

Risposta: Esistono diversi pattern per la gestione degli errori asincroni:

  • Promises:
fetch('/api/data')
  .then(response => response.json())
  .catch(error => console.error('Error:', error));
  • Async/Await:
try {
  const response = await fetch('/api/data');
  const data = await response.json();
} catch (error) {
  console.error('Error:', error);
}
  • Global Error Handlers:
    • window.addEventListener('unhandledrejection', ...) per i promise rejection non gestiti
    • Express error middleware per il backend
  • Best Practice: Gestisci sempre gli errori, utilizza una gestione centralizzata degli errori, registra correttamente gli errori.

Rarità: Molto Comune Difficoltà: Facile


Newsletter subscription

Consigli di carriera settimanali che funzionano davvero

Ricevi le ultime idee direttamente nella tua casella di posta

Crea un Curriculum che Ti Faccia Assumere il 60% Più Velocemente

In pochi minuti, crea un curriculum personalizzato e compatibile con ATS che ha dimostrato di ottenere 6 volte più colloqui.

Crea un curriculum migliore

Condividi questo post

Vieni Assunto il 50% Più Velocemente

Le persone in cerca di lavoro che utilizzano curriculum professionali migliorati dall'IA trovano ruoli in una media di 5 settimane rispetto alle 10 standard. Smetti di aspettare e inizia a fare colloqui.