CODE-REVIEW · TEAM · PROCESS · EMBEDDED

Come Gestisco le Code Review nei Team Firmware (E Perché La Maggior Parte Sono una Perdita di Tempo)

2026-06-29 · Davide Carrese

Ho passato tre anni su un progetto dove ogni pull request passava attraverso esattamente due revisori, un periodo di attesa obbligatorio di 24 ore, e una checklist di quarantasette voci. Il codice era ancora pieno di bug. Il modulo safety-critical aveva una race condition che è sopravvissuta a quattordici revisioni. Lo sviluppatore junior passava più tempo ad aspettare approvazioni che a scrivere codice. E il team odiava il processo così tanto che la gente ha iniziato a fare commit in batch alla fine degli sprint solo per evitare l'overhead.

Quell'esperienza mi ha insegnato qualcosa di scomodo: la maggior parte dei processi di code review sono progettati per far sentire i manager al sicuro, non per migliorare il codice. I rituali — revisori obbligatori, numero minimo di commenti, gate di approvazione — creano l'illusione della qualità consumando enormi quantità di tempo di engineering.

Negli anni successivi, ho spogliato il processo, l'ho ricostruito dai principi fondamentali e l'ho testato su quattro diversi team firmware. Ecco cosa è sopravvissuto.

Il Primo Principio: Le Review Trovano Bug Diversi Dai Test

L'errore più grande che vedo nei team firmware è trattare la code review come un sostituto del testing, o il testing come un sostituto della review. Trovano cose diverse:

Cosa trovano i testCosa trova la review
Errori logici, violazioni di timing, casi limite nell'esecuzioneAPI fraintese, assunzioni sbagliate sul comportamento dell'hardware
Valori di registro e maschere di bitfield erratiConfigurazione di registro che funziona ma non è quello che il datasheet raccomanda per il caso d'uso
Corruzione della catena di descrittori DMA sotto caricoLayout del buffer DMA che sarà un incubo di manutenzione tra sei mesi
Stack overflow da catene di chiamate profondeQualificatori volatile mancanti su variabili condivise tra ISR e main loop

Ho visto team investire in elaborati banchi di test hardware-in-the-loop mentre la loro code review consisteva in un singolo commento "LGTM" dalla persona più junior del team. E ho visto team con review obbligatorie a due persone su ogni commit in un test harness interno, mentre il bootloader che andava su diecimila dispositivi riceveva un timbro di gomma perché "era già stato revisionato in fase di prototipo."

La soluzione è semplice: abbina la profondità della review al profilo di rischio del codice, e non confondere mai il completamento del processo con la garanzia di qualità.

Il Modello a Tre Livelli

Uso tre livelli di review, applicati in base alla criticità del codice:

LivelloQuandoChiProfondità
Livello 1 — OcchiataStrumenti interni, test harness, script di build, documentazioneUna persona, qualsiasi anzianità (anche auto-merge dopo 2 ore)Controlla errori evidenti e naming. Nessun commento di stile.
Livello 2 — StandardLogica applicativa, implementazioni di protocolli, nuovi driver di perifericheUna persona con conoscenza del dominio, entro 24 oreCorrettezza, design delle API, assunzioni di concorrenza, sanità a livello di registro. Stile solo se influisce sulla leggibilità.
Livello 3 — ApprofonditaBootloader, moduli safety-critical, sequenze di power management, configurazioni watchdogDue persone: un esperto del dominio, un architetto/senior che non ha lavorato al moduloRiga per riga se necessario. Analizza ogni transizione di stato, ogni percorso di errore, ogni assunzione di timing. Documenta l'esito della review nel commit message.

Il punto chiave: la maggior parte del codice firmware è Livello 2. Trattare tutto il codice come Livello 3 esaurisce i revisori e rallenta il team. Trattare il codice del bootloader come Livello 1 è così che i dispositivi si brickano in campo.

Comunico questo modello a livelli esplicitamente all'inizio di ogni incarico — nel contratto o nel kick-off del progetto. Il cliente paga per le review di Livello 3 sui moduli critici e Livello 2 sul resto. Tutti sanno dove è tracciata la linea, e nessuno discute su "perché questa modifica ha bisogno di due revisori."

Gli Anti-Pattern Che Vieto dal Giorno Uno

Questi quattro pattern distruggono il valore delle code review nei team firmware. Li segnalo nella prima riunione di team:

1. Commenti di stile travestiti da problemi di correttezza.
"Per favore rinomina i2c_transfer() in i2c_transfer_data() perché trasferisce anche il byte dell'indirizzo." — Questa è una preferenza di stile vestita da pignoleria. Se la funzione funziona, è documentata e ha un contratto chiaro, lascia perdere. I dibattiti di stile nelle review sono il più grande spreco di tempo, e frustrano sproporzionatamente gli sviluppatori junior. Usa un formatter (clang-format), impostalo in CI, e passa oltre.

2. Il commento "Io l'avrei fatto diversamente."
Se l'approccio è corretto, abbastanza performante e sicuro, la preferenza per un'implementazione alternativa non è actionable. Il revisore dovrebbe chiedersi "questo approccio ha un problema di correttezza?" non "lo avrei scritto in questo modo?"

3. Revisori obbligatori N + 1.
La modalità di fallimento più comune: un progetto richiede due revisori, quindi ogni PR aspetta due persone. Nel frattempo, il revisore più competente ha già approvato, e il secondo revisore è una formalità che scorre veloce e clicca Approva. La review aggiunge zero valore ma raddoppia la latenza. La soluzione: un revisore con la giusta conoscenza del dominio vale più di due revisori casuali.

4. Revisionare codice generato o di configurazione.
Codice di inizializzazione generato da STM32CubeMX, linker script copiati dall'esempio SDK, header di configurazione CMSIS — perché degli umani stanno revisionando queste cose? Se l'output di CubeMX compila e l'hardware si avvia, la review è teatro. Concentra il tempo dei revisori sulla logica che l'ingegnere ha effettivamente scritto.

La Checklist Specifica per l'Embedded

Oltre ai principi generali di code review, il codice firmware ha modalità di fallimento che le review di software puro non incontrano mai. Ecco le cose specifiche che controllo in ogni review di Livello 3:

L'Infrastruttura Che Rende le Review Veloce

Nessuna quantità di ottimizzazione del processo risolverà un workflow di review dove il revisore deve fare checkout del branch, compilare, flashare ed eseguire manualmente per capire la modifica. È qui che la maggior parte dei team dovrebbe investire prima di ritoccare la politica di review:

Cosa Ha Funzionato per Me

Quattro cose hanno fatto la differenza più grande nei team che ho guidato:

Checklist Pratica

Fonti

📬 Commenti / discussione

Preferisci email: comments@carrese.eu — includi l'URL dell'articolo così posso seguire. Per correzioni o domande più approfondite, di solito rispondo entro 48 ore.