MODELLI E METODI PER LA QUALITÀ DEL SOFTWARE Gruppo: MMS Progetto: Traccar Realizzato da Montemurro Andrea 681902 ITPS Corso B andrea.montemurro97@gmail.com Moramarco Francesco 676253 ITPS-Corso B francesco.moramarco98@gmail.com Soprano Francesco 683676 ITPS Corso B kekkosoprano251098@gmail.com 2 Descrizione del progetto Traccar è un sistema di tracciamento GPS che consente di monitorare più di 1500 modelli di tracker GPS con più di 170 protocolli differenti, è open source ed è possibile installarlo su un server privato. Traccar include un'interfaccia-web based con interfaccia sia desktop che mobile-friendly, protetta da credenziali di accesso, e tramite la quale è possibile configurare e visionare in diretta la posizione dei tracker gps sulla mappa o è possibile consultarne la cronologia. Sono inoltre disponibili anche client per dispositivi Android ed iOS che permettono di accedere facilmente ed in mobilità al server. Al di fuori della posizione in tempo reale, è anche possibile visionare lo storico dei percorsi, la velocità di marcia, il senso di marcia e tante altre informazioni. Il software Traccar fornisce inoltre notifiche web ed SMS per diversi tipi di allarmi, come eccesso di velocità, mancanza di carburante, violazione del perimetro di geofencing, forti vibrazioni indicative di possibile incidente o tentativo di furto. È possibile utilizzare tracker GPS di diversi marchi, dai modelli low-cost cinesi ai modelli professionali ed è possibile gestire un'ampia varietà di sensori ed informazioni aggiuntive fornite dall'unità GPS. Non vi e limite al numero di tracker GPS che si possono gestire e controllare contemporaneamente. In base alla tipologia di tracker GPS che si decide di usare il sistema può assolvere a diversi compiti: • controllo delle proprie autovetture • controllo della flotta di qualsiasi azienda • controllo di persone anziane e bambini • controllo degli animali domestici È possibile infatti utilizzare qualsiasi tipologia di tracker GPS: • tracker GPS magnetici con la batteria • tracker GPS che si installano facilmente nella porta OBD delle autovetture • tracker GPS che si montano sulle centraline 3 • tracker GPS che si nascondono nei tubolari di motociclette, biciclette, biciclette elettriche • tracker GPS piccolissimi che si possono indossare come collane e collarini È anche possibile controllare il GPS di un qualsiasi smartphone in modo da controllarne gli spostamenti. Tutto questo in totale sicurezza, senza dover cedere a terzi dati così sensibili e senza dover pagare abbonamenti mensili. Tutto sotto il proprio controllo. Un sistema di geolocalizzazione realizzato con un server Linux e Traccar permette di usufruire della migliore tecnologia per il tracciamento in tutta sicurezza e senza dover rinunciare alla propria privacy cedendo a terzi uno dei dati più privati, la nostra posizione. Un sistema così fatto non ha limiti di scalabilità e di compatibilità. È possibile installare il server ovunque si voglia, in un'abitazione o in un ufficio. È possibile creare un account per chiunque si voglia, per tutti i componenti della propria famiglia, per i propri collaboratori, per i propri dipendenti, per i propri amici. Ognuno può accedere solo ed esclusivamente al proprio account utilizzando le proprie credenziali. È possibile associare ad ogni account uno o più tracker GPS. In questo modo c'è chi può controllare e visionare solo il proprio tracker GPS e c'è chi può controllare e visionare tutti i tracker GPS. È possibile accedere al proprio account da qualsiasi parte del mondo, basta una semplice connessione internet. È possibile utilizzare quanti tracker GPS si vogliono. È possibile utilizzare tracker GPS di diverse tipologie e di diverse marche. Link al progetto GitHub: https://github.com/traccar/traccar 4 Report iniziale Figura 1 Prima analisi sonarqube Figura 2 Risultato test maven iniziale La prima analisi svolta mediante il tool Sonarqube ha evidenziato le seguenti problematiche: n. 58 Bugs, di cui: o n. 25 di severity minor o n. 27 di severity major o n. 6 di severity blocker n. 3 vulnerabilities, di cui: o n. 1 minor o n. 2 blocker 5 n. 2560 code smells, di cui: o n. 48 blocker o n. 446 critical o n. 589 major o n. 1465 minor o n. 12 info L’effort stimato da Sonarqube con questa prima analisi è di 64 giorni di debito, calcolati in 8 ore lavorative l’uno, per un totale 512 ore. ACTION PLAN 1 Il target prefissato da raggiungere per completare l’action plan è il seguente: • Bugs A (0) • Vulnerabilities A (0) • Technical Debt 7 d La scelta è stata di creare un unico action plan, scandendo le issues da risolvere per tipologia , nel rispettivo ordine: 1. Bugs 2. Vulnerabilities 3. Code Smells L’esecuzione del piano risolutivo è stata avviata il giorno 22 dicembre 2019 e conclusosi il giorno 9 gennaio 2020. Di seguito l’elenco completo delle issue che compongono l’action plan 1. MMS - Segnalazioni # Tracker Stato Priorità Autore Oggetto Assegnato a Aggiornato Inizio Scadenza Segnalazioni correlate % completato 36563 To-Do Closed Immediate Andrea Montemurro S2095 Resources should be closed Andrea Montemurro 2020-01-09 17:18 2019-12-22 2019-12-23 100 36522 To-Do Closed High Andrea Montemurro S2142 "InterruptedException" should not be ignored Andrea Montemurro 2020-01-09 17:21 2019-12-22 2019-12-24 100 36521 To-Do Closed High Francesco Moramarco S2259 Null pointers should not be dereferenced Francesco Moramarco 2020-01-09 17:26 2019-12-22 2019-12-25 100 36518 To-Do Closed Normal Francesco Pio Soprano S2184 Math operands should be cast before assignment Francesco Pio Soprano 2020-01-10 11:09 2019-12-22 2019-12-22 100 36517 To-Do In Progress Immediate Francesco Pio Soprano Action Plan 1 Francesco Pio Soprano 2020-01-10 13:27 2019-12-22 2020-01-11 100 36585 To-Do Closed Immediate Andrea Montemurro S2068 Credentials should not be hard-coded Andrea Montemurro 2020-01-09 17:19 2019-12-23 2019-12-23 100 36584 To-Do Closed High Andrea Montemurro S2583 Conditionally executed blocks should be reachable Andrea Montemurro 2020-01-09 17:22 2019-12-23 2019-12-23 100 36578 To-Do Closed High Francesco Pio Soprano S1192 String literals should not be duplicated Francesco Pio Soprano 2020-01-09 17:29 2019-12-23 2019-12-27 100 36577 To-Do Closed Normal Francesco Moramarco S1148 Throwable.printStackTrace(...) should not be called Francesco Moramarco 2020-01-09 17:23 2019-12-23 2019-12-24 100 36576 To-Do Closed High Francesco Moramarco S1862 Related "if/else if" statements should not have the same condition Francesco Moramarco 2020-01-09 17:24 2019-12-23 2019-12-24 100 36575 To-Do Closed High Francesco Moramarco S2111 "BigDecimal(double)" should not be used Francesco Moramarco 2020-01-09 17:25 2019-12-23 2019-12-24 100 36665 To-Do Closed High Andrea Montemurro S00112 Generic exceptions should never be thrown Andrea Montemurro 2020-01-10 13:13 2019-12-26 2019-12-27 100 37753 To-Do Closed High Andrea Montemurro S3027 String function use should be optimized for single characters Andrea Montemurro 2020-01-09 17:33 2019-12-27 2019-12-28 100 37747 To-Do Closed Normal Andrea Montemurro S1659 Multiple variables should not be declared on the same line Andrea Montemurro 2020-01-10 13:19 2019-12-27 2019-12-28 100 37689 To-Do Closed Normal Francesco Moramarco CallToDeprecatedMethod "@Deprecated" code should not be used Francesco Moramarco 2020-01-09 17:48 2019-12-27 2020-01-04 100 37625 To-Do Closed Urgent Francesco Moramarco S2178 Short-circuit logic should be used in boolean contexts Francesco Moramarco 2019-12-27 18:50 2019-12-27 2019-12-29 100 37619 To-Do Closed High Francesco Pio Soprano S3776 Cognitive Complexity of methods should not be too high Francesco Pio Soprano 2020-01-10 13:06 2019-12-27 2020-01-08 100 37599 To-Do Closed High Francesco Moramarco S1149 Synchronized classes Vector, Hashtable, Stack and StringBuffer should not be used Francesco Moramarco 2019-12-27 18:49 2019-12-27 2019-12-29 100 6 # Tracker Stato Priorità Autore Oggetto Assegnato a Aggiornato Inizio Scadenza Segnalazioni correlate % completato 37552 To-Do Closed High Andrea Montemurro S3457 Printf-style format strings should be used correctly Andrea Montemurro 2020-01-10 13:13 2019-12-27 2019-12-28 100 37477 To-Do Closed Normal Francesco Moramarco S00116 Field names should comply with a naming convention Francesco Moramarco 2020-01-03 12:45 2019-12-27 2020-01-05 100 41028 To-Do Rejected High Francesco Moramarco S2629 "Preconditions" and logging arguments should not require evaluation Francesco Pio Soprano 2020-01-10 13:09 2019-12-28 2020-01-09 100 37881 To-Do Closed Low Francesco Pio Soprano S1301 "switch" statements should have at least 3 "case" clauses Francesco Pio Soprano 2019-12-28 19:46 2019-12-28 2019-12-28 100 37880 To-Do Closed Normal Francesco Pio Soprano LabelsShouldNotBeUsedCheck Francesco Pio Soprano 2019-12-28 19:15 2019-12-28 2019-12-28 100 37879 To-Do Closed Low Francesco Pio Soprano S1450 Private fields only used as local variables in methods should become local variables Francesco Pio Soprano 2020-01-09 17:39 2019-12-28 2019-12-28 100 37878 To-Do Closed Normal Francesco Pio Soprano HiddenFieldCheck Local variables should not shadow class fields Francesco Pio Soprano 2020-01-10 13:21 2019-12-28 2019-12-28 100 37877 To-Do Closed High Andrea Montemurro S2629 "Preconditions" and logging arguments should not require evaluation Andrea Montemurro 2020-01-10 13:09 2019-12-28 2020-01-09 100 37871 To-Do Closed Normal Francesco Pio Soprano S1168 Empty arrays and collections should be returned instead of null Francesco Pio Soprano 2019-12-28 18:15 2019-12-28 2019-12-29 100 37868 To-Do Closed High Francesco Pio Soprano S2447 Null should not be returned from a "Boolean" method Francesco Pio Soprano 2020-01-09 17:37 2019-12-28 2019-12-28 100 37822 To-Do Closed Urgent Francesco Pio Soprano S128 Switch cases should end with an unconditional "break" statement Francesco Pio Soprano 2020-01-09 17:35 2019-12-28 100 37757 To-Do Closed Normal Andrea Montemurro HiddenFieldCheck Local variables should not shadow class fields Andrea Montemurro 2020-01-10 13:21 2019-12-28 2019-12-28 100 37892 To-Do Closed Low Francesco Pio Soprano S1488 Local variables should not be declared and then immediately returned or thrown Francesco Pio Soprano 2020-01-07 18:21 2019-12-29 2019-12-29 100 37891 To-Do Closed High Francesco Pio Soprano S1066 Collapsible "if" statements should be merged Francesco Pio Soprano 2020-01-09 17:44 2019-12-29 2019-12-29 100 37890 To-Do Closed Normal Francesco Pio Soprano S3972 Conditionals should start on new lines Francesco Pio Soprano 2020-01-09 17:43 2019-12-29 2019-12-29 100 37888 To-Do Closed High Andrea Montemurro S3415 Assertion arguments should be passed in the correct order Andrea Montemurro 2020-01-09 17:43 2019-12-29 2019-12-29 100 37883 To-Do Closed Urgent Andrea Montemurro S1186 Methods should not be empty Andrea Montemurro 2020-01-10 13:27 2019-12-29 2019-12-29 100 37913 To-Do Closed High Francesco Moramarco S1068 Unused "private" fields should be removed Francesco Moramarco 2020-01-09 17:45 2019-12-30 2019-12-30 100 38899 To-Do Closed High Andrea Montemurro S1172 Unused method parameters should be removed Andrea Montemurro 2020-01-09 17:45 2020-01-01 2020-01-01 100 7 # Tracker Stato Priorità Autore Oggetto Assegnato a Aggiornato Inizio Scadenza Segnalazioni correlate % completato 38933 To-Do Closed Normal Andrea Montemurro S1604 Anonymous inner classes containing only one method should become lambdas Andrea Montemurro 2020-01-09 17:47 2020-01-02 2020-01-02 100 38932 To-Do Closed Normal Andrea Montemurro S1610 Abstract classes without fields should be converted to interfaces Andrea Montemurro 2020-01-09 17:46 2020-01-02 2020-01-02 100 39453 To-Do Closed Normal Francesco Pio Soprano S1479 "switch" statements should not have too many "case" clauses Francesco Pio Soprano 2020-01-04 19:38 2020-01-04 2020-01-04 100 39424 To-Do Closed Low Francesco Pio Soprano S3878 Arrays should not be created for varargs parameters Francesco Pio Soprano 2020-01-09 17:52 2020-01-04 2020-01-04 100 39370 To-Do Closed Normal Francesco Pio Soprano S2589 Boolean expressions should not be gratuitous Francesco Pio Soprano 2020-01-10 13:24 2020-01-04 2020-01-04 100 39712 To-Do Closed High Francesco Pio Soprano SwitchLastCaseIsDefaultCheck statements should have "default" clauses Francesco Pio Soprano 2020-01-09 17:59 2020-01-05 2020-01-05 100 39709 To-Do Closed Normal Francesco Pio Soprano S1854 Dead stores should be removed Francesco Pio Soprano 2020-01-10 13:16 2020-01-05 2020-01-05 100 39703 To-Do Closed Normal Francesco Pio Soprano S1700 A field should not duplicate the name of its containing class Francesco Pio Soprano 2020-01-05 17:46 2020-01-05 2020-01-05 100 39699 To-Do Closed Low Francesco Pio Soprano S1602 Lamdbas containing only one statement should not nest this statement in a block Francesco Pio Soprano 2020-01-09 17:57 2020-01-05 2020-01-05 100 39557 To-Do Closed Low Francesco Pio Soprano S1126 Return of boolean expressions should not be wrapped into an "if-then-else" statement Francesco Pio Soprano 2020-01-05 11:50 2020-01-05 2020-01-05 100 39510 To-Do Closed Normal Francesco Pio Soprano ForLoopCounterChangedCheck "for" loop stop conditions should be invariant Francesco Pio Soprano 2020-01-09 17:56 2020-01-05 2020-01-05 100 39499 To-Do Closed Low Francesco Pio Soprano UselessImportCheck Useless imports should be removed Francesco Pio Soprano 2020-01-10 13:18 2020-01-05 2020-01-05 100 37959 To-Do Closed Low Francesco Moramarco UselessImportCheck Useless imports should be removed Francesco Moramarco 2020-01-10 13:18 2020-01-05 2020-01-05 100 37821 To-Do Closed Normal Andrea Montemurro S1854 Dead stores should be removed Andrea Montemurro 2020-01-10 13:16 2020-01-05 2020-01-05 100 40379 To-Do Closed High Francesco Moramarco MaximumInheritanceDepth Inheritance tree of classes should not be too deep 2020-01-10 13:01 2020-01-07 2020-01-09 100 40378 To-Do Closed High Francesco Moramarco S1607 Tests should not be ignored Francesco Moramarco 2020-01-09 10:30 2020-01-07 2020-01-09 100 40377 To-Do Closed High Francesco Moramarco S1479 "switch" statements should not have too many "case" clauses Francesco Pio Soprano 2020-01-09 18:05 2020-01-07 2020-01-09 100 40376 To-Do Closed High Francesco Moramarco S2975 "clone" should not be overridden Francesco Pio Soprano 2020-01-09 18:03 2020-01-07 2020-01-09 100 8 # Tracker Stato Priorità Autore Oggetto Assegnato a Aggiornato Inizio Scadenza Segnalazioni correlate % completato 40375 To-Do Closed High Francesco Moramarco S2925 "Thread.sleep" should not be used in tests Francesco Pio Soprano 2020-01-07 22:34 2020-01-07 2020-01-09 100 40374 To-Do Closed High Francesco Moramarco S2274 "Object.wait(...)" and "Condition.await(...)" should be called inside a "while" loop Francesco Moramarco 2020-01-08 12:33 2020-01-07 2020-01-09 100 40373 To-Do Closed Normal Francesco Moramarco S3824 "Map.get" and value test should be replaced with single method call Francesco Pio Soprano 2020-01-09 18:04 2020-01-07 2020-01-09 100 40372 To-Do Closed High Francesco Moramarco S2187 TestCases should contain tests Francesco Moramarco 2020-01-09 18:06 2020-01-07 2020-01-09 100 40371 To-Do Closed Low Francesco Moramarco S135 Loops should not contain more than a single "break" or "continue" statement Francesco Moramarco 2020-01-07 21:03 2020-01-07 2020-01-09 100 40370 To-Do Closed Low Francesco Moramarco S1125 Boolean literals should not be redundant Francesco Moramarco 2020-01-07 19:14 2020-01-07 2020-01-07 100 40369 To-Do Closed High Francesco Moramarco S1452 Generic wildcard types should not be used in return parameters Francesco Moramarco 2020-01-09 18:02 2020-01-07 2020-01-07 100 40368 To-Do Closed Low Francesco Pio Soprano S1319 Declarations should use Java collection interfaces such as "List" rather than specific implementation classes such as "LinkedList" Francesco Pio Soprano 2020-01-09 18:02 2020-01-07 2020-01-07 100 40367 To-Do Closed High Francesco Moramarco S1161 "@Override" should be used on overriding and implementing methods Francesco Moramarco 2020-01-07 18:29 2020-01-07 2020-01-07 100 39963 To-Do Closed High Andrea Montemurro DuplicatedBlocks Source files should not have any duplicated blocks Andrea Montemurro 2020-01-09 18:05 2020-01-07 2020-01-11 100 39962 To-Do Closed High Andrea Montemurro CommentedOutCodeLine Sections of code should not be commented out Andrea Montemurro 2020-01-09 17:59 2020-01-07 2020-01-07 100 41031 To-Do Closed High Francesco Moramarco S2681 Multiline blocks should be enclosed in curly braces Francesco Pio Soprano 2020-01-09 14:25 2020-01-09 2020-01-09 100 41019 To-Do Closed Low Francesco Pio Soprano RedundantThrowsDeclarationCheck "throws" declarations should not be superfluous Francesco Pio Soprano 2020-01-10 13:10 2020-01-09 2020-01-09 100 41017 To-Do Closed High Francesco Moramarco S00107 Methods should not have too many parameters Andrea Montemurro 2020-01-09 16:46 2020-01-09 2020-01-09 100 41014 To-Do Closed Low Francesco Pio Soprano S1182 Classes that override "clone" should be "Cloneable" and call "super.clone()" Francesco Pio Soprano 2020-01-09 18:09 2020-01-09 2020-01-09 100 41012 To-Do Closed Low Francesco Moramarco S1481 Unused local variables should be removed Francesco Moramarco 2020-01-09 12:23 2020-01-09 2020-01-09 100 40996 To-Do Closed High Francesco Pio Soprano S3973 A conditionally executed single line should be denoted by indentation Francesco Pio Soprano 2020-01-09 18:08 2020-01-09 2020-01-09 100 9 # Tracker Stato Priorità Autore Oggetto Assegnato a Aggiornato Inizio Scadenza Segnalazioni correlate % completato 40987 To-Do Closed High Francesco Pio Soprano S2129 Constructors should not be used to instantiate "String", "BigInteger", "BigDecimal" and primitive-wrapper classes Francesco Pio Soprano 2020-01-09 18:07 2020-01-09 2020-01-09 100 40984 To-Do Closed Low Francesco Moramarco S3626 Jump statements should not be redundant Andrea Montemurro 2020-01-09 18:12 2020-01-09 2020-01-09 100 40981 To-Do Closed Low Francesco Moramarco S1199 Nested code blocks should not be used Andrea Montemurro 2020-01-09 18:13 2020-01-09 2020-01-09 100 40979 To-Do Closed Low Francesco Pio Soprano S00100 Method names should comply with a naming convention Francesco Pio Soprano 2020-01-09 11:47 2020-01-09 2020-01-09 100 40973 To-Do Closed Urgent Francesco Pio Soprano S1845 Methods and field names should not be the same or differ only by capitalization Francesco Pio Soprano 2020-01-09 18:07 2020-01-09 2020-01-09 100 37887 To-Do Closed Low Andrea Montemurro RedundantThrowsDeclarationCheck "throws" declarations should not be superfluous Andrea Montemurro 2020-01-10 13:10 2020-01-09 2020-01-09 100 Powered by TCPDF (www.tcpdf.org) 10 11 Figura 3 Gantt di pianificazione (unità di misura in giorni) 12 La correzione di tutti i bugs e vulnerabilities è stata il completata il giorno 24 dicembre 2019. Contestualmente, è stata avviata la correzione dei code smells Figura 4 Situazione piano risolutivo del 26/12/2019 Dall’analisi di Sonarcloud si evince una notevole differenza in termini di Technical Debt: 64 giorni Sonarqube contro i 37 giorni di Sonarcloud. Figura 5 Analisi Sonarcloud 13 Le differenze rilevate da Sonarqube sono dovute alle issues relative al file OmnicommMessageOuterClass.java , non rilevate da Sonacloud. Questo file non è modificabile ed è rigenerato automaticamente dal buffer compiler OmnicommMessage.proto , come si evince nei commenti presenti nel file. Questo ci ha portato a rivalutare il nostro piano d’esecuzione. Abbiamo così segnato come won’t fix 1592 code smells , riducendo l’effort di 26 giorni (208 ore lavorative). Figura 6 Situazione piano risolutivo dopo l'esclusione del file OmnicommMessageOuterClass.java Successivamente, alcuni code smells sono stati segnati come falsi positivi . Essi sono i seguenti: • n.12 S00112 - Generic exceptions should never be thrown o L’eccezione è già correttamente gestita • n. 3 S2447 - Null should not be returned from a "Boolean" method o Il controllo sul valore null è già gestito dove il metodo è Invocato • n. 1 S1191 - Classes from "sun.*" packages should not be used o Non siamo riusciti a trovare classi nelle Api Java che svolgessero le stesse funzionalità Sono stati invece segnalati come won’t fix i seguenti code smells: • n. 2 S3776 - Cognitive Complexity of methods should not be too high o Non è stato possibile diminuire ulteriormente la complessità 14 • n.13 MaximumInerithanceDepth - Inheritance tree of classes should not be too deep o Data la struttura complessa del progetto non è possibile modificare la gerarchia delle classi Inoltre, si è persa la tracciabilità dei seguenti code smells rilevati durante la prima analisi: 1. S1141 - Try-catch blocks should not be nested 2. S1871 - Two branches in a conditional structure should not have exactly the same implementation 3. MissingDeprecatedCheck - Deprecated elements should have both the annotation and the Javadoc tag 4. S1133 - Deprecated code should be removed Alcuni di essi potrebbero essere stati fixati durante la risoluzione di altre issue in qualche modo collegate. Ad esempio, la issue S1133 potrebbe essere stata involontariamente risolta durante la risoluzione della issue CallToDeprecatedMethod, dove contestualmente alle modifiche necessarie a richiamare metodi non deprecati, i metodi deprecati siano stati eliminati. Di altri invece, potrebbe esserne stata persa la tracciabilità a causa dei malfunzionanti della piattaforma Redmine o della mancata comunicazione tra i membri del team e creazione della relativa issue sulla piattaforma. 15 Grafici tempi di effort Figura 7 Istogramma con effort pianificato e effettivo per Bugs Figura 8 Delta effort pianificato/effettivo per Bugs Dagli istogrammi si può notare come la risoluzione dei bugs rientra nei tempi stimati da SonarQube, eccetto per l’ issue “S2095 Resources should be closed” , per il quale si è impiegato quasi 3 ore in più del tempo previsto. 16 Figura 9 Istogramma con effort pianificato e effettivo per Vulnerabilities Figura 10 Delta effort pianificato/effettivo per Vulnerabilities Entrambe le vulnerabilities sono state eliminate in anticipo rispetto ai tempi previsti, con un guadagno totale di circa 2 ore. 17 Figura 11 Istogramma con effort pianificato e effettivo per Code Smells 18 Figura 12 Delta effort pianificato/effettivo per Code Smells 19 In generale anche i code smells sono stati risolti entro i tempi prestabiliti (anche con molto anticipo) ad eccezione di 3: 1. S1172 - Unused method parameters should be removed 2. S3776 - Cognitive Complexity of methods should not be too high 3. S00112 - Generic exceptions should never be thrown Bisogna notare che i grafici mostrano solo i problemi su cui si è realmente lavorato modificando il sorgente, quindi sono escluse tutte le issues risolte come falsi positivi e won’t fix. La correzione di tutte le issues che compongono l’action plan, e di conseguenza del piano esecutivo, è terminata il 9 gennaio 2020. Durante tale processo, si sono verificati casi in cui il metodo risolutivo applicato ha portato alla generazione di altri bug (uno solo ed in unica occasione) e code smells. I nuovi code smells e bugs non hanno particolarmente influenzato il piano esecutivo, per cui sono stati inglobati all’interno dello stesso action plan 1. Per questo motivo sulla piattaforma Redmine sono presenti delle issue “doppioni” (con lo stesso oggetto), che sono state registrate come sotto attività della prima issue registrata con lo stesso squid. Per semplicità, alcune delle issues risolte come false positive e won’t fix non state caricate sulla piattaforma Redmine, in quanto il tempo effettivo di risoluzione sarebbe stato pari a 0 e i sorgenti non modificati. Ciò avrebbe potuto provocare delle anomalie tra la stima di effort e l’effettivo tempo di esecuzione. La risoluzione di molti code smells è stata agevolata dall’utilizzo dell’IDE IntelliJ IDEA, il quale fornisce ottimi suggerimenti per la risoluzione delle tematiche più generali, come ad esempio la convenzione Java per i nomi di metodi e variabili. Di particolare aiuto sono state le possibilità di refactor e rename a disposizione. Il refactor, mediante la funzione di extract method è stato ampiamente utilizzato per la risoluzione delle issues relative alla complessità cognitiva. In linea generale, ciascun membro del team ha scelto l’issue da risolvere senza particolari prerogative o criteri, ma semplicemente rispettando il criterio di tipologia definito all’inizio dell’action plan. Scelta la issue, si sono poi seguiti i seguenti passi: 1. Notifica ai membri del gruppo dell’issue scelta 2. Creazione della segnalazione su redmine, con oggetto contenete lo squid e il nome dell’issue e completa di informazioni relative a: data di inizio, data di scadenza, tempo stimato (fornito da Sonarqube), attività principale, priorità, membro del team a cui è 20 assegnato e descrizione contenente l’elenco dei file in cui è presente tale problematica. 3. Modifica del/dei sorgente/i relativi 4. Verifica dell’attuata correzione mediante: a. Maven test b. Analisi con sonarqube 5. Commit del/dei sorgente/i modificato/i, specificando il tag relativo all’issue risolta e il tempo impiegato ( @references # IDISSUE @ ore h minuti m ) 6. Chiusura della issue su Redmine 7. Notifica ai membri del gruppo dell’avvenuta correzione Si è resa necessaria un’unica operazione di revert su un file ( Tk103FrameDecoder.java ) il 04/01/2020, relativo all’issue Cognitive Complexity of methods should not be too high (S3776) in quanto la modifica effettuata portava al fallimento di alcuni test di regressione.