Analisi SonarQube su BrewDay
Premessa
Per il nostro progetto abbiamo iniziato a fare analisi statiche del codice quando la maggior parte del progetto o comunque della sua struttura era già stata scritta. Non essendo un progetto molto grande si è rivelata una scelta vincente ma generalmente consigliamo di lanciare le prime analisi appena ci si rende conto di avere una prima bozza funzionante e significativa del proprio software.
É molto importante che l'analisi SonarQube non includa anche librerie che non sono state scritte direttamente dai contribuenti al progetto, poiché essendo appunto librerie non dovrebbero essere di nostra competenza. Mi riferisco in particolare ai cosìdetti "vendor" javascript, tipici di un qualsiasi software pensato per il web e pertanto anche del nostro.
In generale è importante definire quali sono le impostazioni con cui è necessario lanciare l'analisi, che nel nostro caso oltre all'esclusione dei vendor consistno anche nell'inclusione dei file .cshtml affinché siano analizzati come file HTML e l'esclusione dell'intero progetto dalla test coverage, in quanto attualmente i sorgenti di BrewDay non comprendono alcun progetto dedicato ai test.
I risultati
Tutte le analisi da noi effettuate con SonarQube sono pubblicamente disponibili all'indirizzo https://sonarcloud.io/dashboard?id=BrewDay.
Aggiornato il 03/02/2018
Problemi
La prima cosa che salta all'occhio è il Quality Gate Failed in rosso, che appare non appena si apre la pagina. Purtroppo l'ultima analisi è stata lanciata dopo una serie di aggiunte alle View che prevedevano in un modo o nell'altro la necessità di duplicare alcuni piccoli pezzi di codice. Questo porta di fatto a un peggioramento, seppur minimo, rispetto a quanto emerso nella precedente analisi e quindi ad un giudizio di Sonar espresso come Failed. Ciò in realtà credo sia assolutamente un falso positivo, anche a fronte delle sole 53 linee duplicate sulle 923 aggiunte rispetto alla precedente analisi.
É comunque ben evidente che il problema principale del nostro progetto è sostanzialmente solo il codice duplicato. Questo poiché molte View sono uguali tra loro a coppie, poiché per ogni Entità che fa parte del dominio è definita una View Create e una Edit. Questo è un problema di cui eravamo perfettamente a conoscenza, perfettamente risolvibile ma di cui abbiamo deciso di non occuparci immediatamente poiché si tratta di aggiungere un livello di complessità maggiore, che potrebbe generare confusione in persone nuove all'ambiente .NET MVC come Simone e Paolo. La risoluzione di questa "caduta di stile" è sicuramente in cima alla nostra classifica degli sviluppi futuri e a tal proposito abbiamo realizzato un esempio di come dovrebbero venire delle View ideali, che eliminino tutto quel codice duplicato. Tale esempio è visualizzabile nella parte degli Ingredienti, per la quale le pagine Edit e Create sono state collassate nella più mantenibile CreateOrEdit e per cui è stata anche eliminata la View Delete che aggiunge ulteriore duplicazione e ridondanza.
Aggiornamento 04/02/2018: Pur avendo rimosso le inutili View di Delete, SonarQube rileva ulteriori falsi positivi nelle ultime modifiche alle nostre View e pertanto (nonostante il codice duplicato sia passato dal 6.5% al 6%) il Quality Gate risulta ancora Failed. Siamo sconfortati da questo falso positivo.
Punti di forza
Tralasciando la duplicazione di codice, possiamo comunque affermare che i risultati ottenuti dall'analisi con SonarQube per l'ultima versione del software siano ottimi e dovuti ad un egregio refactoring eseguito di analisi in analisi (spesso svolte in locale), come evidenziato da questo grafico.
Siamo infatti partiti da una situazione in cui v'erano 1 bug e 33 code smell, per giungere ad un risultato di 0 bug e solamente 5 code smell, che abbiamo deciso di non risolvere in quanto molto particolari e per niente gravi rispetto al contesto in cui essi compaiono nel nostro progetto.
La maggior parte dei 33 Code Smell rilevati si trattavano di molti throw new Exception("Message"), che sono sconsigliati in favore delle creazione di eccezioni custom dedicate, da noi prontamente aggiunte.
C'è infine da aggiungere che SonarQube ha rilevato anche qualche Code Smell che in realtà non è davvero tale e abbiamo segnalato come falso positivo e comunque consultabili su https://sonarcloud.io/dashboard?id=BrewDay.