Oltre la tua mente cura il tuo corpo

Cura anche il tuo corpo oltre la tua mente. “Noi siamo quello che mangiamo” sentii una volta questa frase e sono d’accordo. A seguire dei consigli che consentito di sentirmi meglio e stare maggiormente in salute:

  • Fare attività sportiva almeno una volta a settimana, l’ideale sarebbe due o tre volte, ma se proprio non riesci, almeno una mattina nel weekend o una sera durante la settimana tienila libera per fare attività sportiva. Vi sono numerosi studi che attestano i benefici che derivano da una sana attività sportiva. Puoi fare nuoto, corsa, yoga, oppure un corso di ballo, la cosa più importante è che almeno una volta alla settimana tu riesca a fare attività sportiva.
  • Mangiare molta frutta, verdura e legumi. I benefici di una alimetazione vegetale sul nostro corpo è attestata anche essa da numerosi studi. Ti consiglio di leggere il libro di T. Colin Campbell, The China Study. Ricorda sempre che i mirilli hanno gradi proprietà antiossidanti e combattono i radicali liberi quindi effettuano una grande prevenzione per quanto riguarda l’invecchiamento cellulare, inoltre i mirtilli sono ricchi di fibre a aiutano quindi anche la digestione. Le noci invece sono ricche di Omega 3 che agiscono contro l’invecchiamento. Kiwi e arance sono fonti di Vitamina C. Semi di chia e Quinoa sono ricche di proteine e specialmente i semi di chia contengono molti Omega 3 ma anche fibre. Inoltre anche l’avena è ricca di fibre. I broccoli contengono flavonoidi che agiscono come antinfiammatori. Ed è un antinfiammatorio naturale. Gli spinaci sono ricchi di antiossidanti, come la luteina.
  • Quando ci si sveglia presto alla mattina (mi riferisco ai giorni lavorativi dal lunedì al venerdì)  si riescono a realizzare molte più cose all’interno della giornata. Ricordo il periodo in cui studiavo per la certificazione  Java, mi svegliavo alle 5.30 per tre o quattro mattine alla settimana, studiavo circa due ore e mezzo, poi colazione e poi al lavoro. Svegliarsi presto ti consente di aver maggior tempo per la tua realizzazione personale e professionale e ti consente di essere maggiormente soddisfatto di tre domande che mi faccio ogni sera prima di addormentarmi: ho amato abbastanza oggi? Ho sorriso abbastanza? Ho dato valore agli altri, creando “differenza” nella loro vita?
  • Studiare e leggere almeno 2 libri al mese. grazie agli ebook reader, ad esempio io uso Kindle posso portarmi i libri in formato elettronico, quindi i tempi passati in metropolitana o ad aspettare un bus oppure in paura pranzo posso essere utilizzati per aumentare la tua conoscenza in termini di tecnologia. Particolarmente utile anche la funzionalità “Text to Speech” del mio Kindle.
  • Meditare almeno una cinque volte a settimana. Praticare Mindfulness mi ha consentito di crescere come persona. Inerente alla meditazione ci sono molti pregiudizi, ma ti consiglio comunque di provarla almeno una volta se non lo hai mai fatto. La meditazione ti consente di vivere con maggior coraggio e amore, di migliorare le relazioni con il partner, i familiari, gli amici e di migliorare la tua produttività, poichè ti permette di notare maggiormente quando sei distratto dal tuo obbiettivo. Meditare permette di rilassare la mente, aiuta la riduzione della pressione del sangue e dormire in modo più profondo. “La meditazione è uno stato naturale dell’essere, uno stato che abbiamo perduto. E ritrovarlo è la gioia più grande della vita.” Osho
  • Cura il tuo bilancio personale e familiare. Per curare il tuo bilancio devi tracciare le tue spese. Se proverai a farlo in modo complicato forse riuscirai a farlo per qualche mese, se lo farai in modo semplice o meglio nel modo più semplice possibile per te allora ci sono buone possibilità che nei mesi continui a tracciare le tue spese. Il tracciamento delle spese consente di capire a fine mese, o meglio a inizio del mese successivo dove hai speso la maggior parte dei soldi e quanti soldi sei riuscito a risparmiare. Utilizza una applicazione anche gratuita per monitorare le tue spese, ci sono buone applicazioni per smartphone che ti consentono di inserire, modificare e quindi a fine mese tracciare le tue spese. A fine mese identifica:
    • la quota di spese necessarie effettuate
    • la quota di spese non necessarie effettuate
    • la quota di risparmio che utilizzerai per investire

    Dopo i primi mesi, prova ad aumentare leggermente, quasi in modo incrementale la quota di risparmio per investimenti, lo puoi fare ad esempio già a inizio mese dicendo: X sono di risparmio questo mese.

  • Sai cos è la zona di comfort? La zona di comfort la sentii per la prima volta da uno dei miei autori preferiti: Anthony Robbins. La zona di comfort è uno stato del comportamento di una persona nel quale si è “neutri”, ovvero senza “rischi”, di solito si utilizza un numero limitato dei comportamenti atti a garantire un comportamento abitudinario. Si esce dalla propria zona di comfort sperimentando nuovi comporamenti e nuove esperienze. Traslato nel mondo software ad esempio quando si inizia un nuovo progetto con una nuova tecnologia che fino al quel momento non si è ancora studiata, si esce appunto dalla propria zona di comfort. Uscire dalla propria zona di comfort consente all’individuo di crescere come persona.

 

Conclusione

Curare più aspetti della tua vita ti consente di vivere meglio ed essere più felice.

 

Alessandro Ceseno

PS: se hai domande scrivimi pure per mezzo della sezione contatti.

 

CRC Cards Extreme Programming

Le CRC Cards sono uno strumento di Design.

CRC sta per Class Responsibility Collaboration. Ogni Card ha principalmente tre aree. In alto vi è una sezione dedicata al nome della classe. Al di sotto vi sono le altre due aree, così suddivise: a sinistra l’area delle Responsabilità (della classe) e a destra l’area delle Collaborazioni.

Solitamente parto dalla descrizione del progetto o del problema. Devo avere una descrizione testuale. Inizio a leggere la descrizione testuale e i nomi, gli oggetti software sono candidati a diventare le classi, ovvero saranno scritti nelle CRC Cards nella sezione della classi. Le responsabiltà di ogni singola classe viene scritta nella sezione opportuna. E infine le Collaborazioni sono come interagiscono le classi in oggetto, ovvero ad esempio il nome dei metodi. Quindi nell’analisi testuale del problema accade spesso che:

  • i nomi sono i candidati a diventare classi

  • gli aggettivi sono i candidati a diventare attributi delle classi

  • i verbi sono i candidati a diventare i metodi delle classi

Mentre si esegue questo tipo di design ci si rende conto quali classi è meglio progettare e la poro interazione con le altre classi.

Le CRC Cards sono economiche (fogli o cartoncini di carta solitamente, indicativamente di 4 X 6 pollici), facili, semplici e leggibili. Inoltre le dimensioni ridotte permettono anche di semplificare il Design, in modo che non vengano riportate informazioni che sono dei dettagli.

Le CRC Cards inoltre consentono una progettazione ad oggetti ovvero permettono di imparare il meccanismo di come un design ad oggetti può/deve funzionare.

Le CRC vengono create o su una scrivania oppure su una lavagna e poi engono in fare di progettazione spostare, vengono create altre Cards oppure eliminate, riorganizzate oppure sostituite, in modo che le cards corrispondano agli scenari che si vogliono rappresentare. Il sistema che si viene a creare consente una rappresentazione Object Oriented e tale rappresentazione viene stimolata da questa stessa metodologia di design.

Inoltre una volta disposte graficamente solitamente si individuano anche le superclassi e le sottoclassi.

 

Alessandro Ceseno

PS: se hai domande scrivimi pure per mezzo della sezione contatti.

 

 

Software Craftsmanship

Software Craftsmanship è un approccio nello scrivere codice che mette in risalto le abilità, le qualità dello sviluppatore, il software non può essere semplicemente prodotto, non può essere considerato come un prodotto industriale, quindi non può essere prodotto industrialmente. Nel manifesto agile vi è scritto “individuals and interactions over processes and tools”.

Il manifesto Software Craftsmanship (http://manifesto.softwarecraftsmanship.org/) dice:

Not only working software, but also well-crafted software

Not only responding to change, but also steadily adding value

Not only individuals and interactions, but also a community of professionals

Not only customer collaboration, but also productive partnerships

Il movimento Software Craftsmanship mette in risalto le abilità dello sviluppatore usando una metafora tra lo sviluppatore software e l’apprendista artigiano, un apprendista che dopo anni di lavoro diventa un maestro.

Si, uno sviluppatore software che si può paragonare a un artigiano, un artigiano che dopo anni di lavoro, dedizione, cura nei dettagli, miglioramenti continui, amore verso il suo lavoro diventa un maestro nel proprio lavoro, nella propria arte.

Lo sviluppatore che raggiunge la maestria nel proprio lavoro riesce a raggiungere per mezzo dello studio continuo, ha del tempo che occupa per studiare nuovi metodi per migliorare il proprio lavoro e le proprie conoscenze.

Il Software Craftsman utlizza nel proprio lavoro le migliori metodologie e tecniche di sviluppo software come le pratiche dell’ eXtreme Programming: il Test Driven Development (TDD), Continuos Integration, Pair Programming, automatizza il più possibile, e altre pratiche.

Questo percorso di crescita viene effettuato essendo orgogliosi del proprio lavoro e un costante impegno personale verso l’eccellenza. Uno sviluppatore può disporre dei migliori pc, dei migliori laptop, delle migliori tecnologie, delle migliori librerie, dei migliori IDE, dei migliori strumenti, ma il software sarà un eccellente software solo se lo sviluppatore vedrà il software come un’ unica e vera “arte”.

 

Alessandro Ceseno

PS: se hai domande scrivimi pure per mezzo della sezione contatti.

 

Dedica mezzo giorno alla settimana ad esercitarti

Si, hai letto bene il titolo:

ti puoi esercitare e diventare più bravo dedicando mezzo giorno alla settimana ad esercitarti con un Kata, puoi effettuare sessioni da 20 minuti e ad ogni sessione dovrai rispettare uno dei seguenti punti:

  • Sviluppa non utilizzando il mouse
  • Sviluppa non parlando con il Pair (si assume che sviluppi in Pair Programming)
  • Scrivi solo metodi void
  • Non utilizzare l’ else
  • Se sei già diventato bravo a non utilizzare l’else allora non utilizzare l’if (conseguenzialmente, ovviamente non utilizzerai neanche l’else)
  • Ping Pong Programming
  • Sviluppa metodi/funzioni con al massimo 5 linee di codice
  • Utilizza solo le iterazioni basate sul test
  • Non utilizza i primitivi ma solo oggetti
  • Non utilizza gli array ma solo oggetti
  • Utilizza solo il refactoring automatico

L’obbiettivo è quello di aumentare il tuo talento.

Il Kata ha tempi ristretti, abbiamo ipotizzato 20 minuti, quindi tutte le persone che partecipano al Kata devono arrivare prima dell’inizio dello stesso già con un ambiente di sviluppo configurato e un framework configurato di test, funzionante ed eseguibile.
Il nome Kata deriva dal Karate dove si ripete un esercizio più volte con piccoli miglioramenti ogni volta. L’ obbiettivo di eseguire un Kata è quello di migliorare una propria modalità lavorativa per mezzo della ripetizione, della pratica, dell’esercizio. Non è importante finire l’esercizio, ma è importante seguire e mantenere le indicazioni ed i vincoli del Kata. E’ auspicabile che si lavori in pair programming affinchè si abbiano feedback dal proprio collega, inoltre le coppie di possono invertire e scambiarsi.

 

 

Alessandro Ceseno

PS: se hai domande scrivimi pure per mezzo della sezione contatti.

 

 

 

Checklist prima del commit

Finito di implementare la funzionalità, controlla la seguente lista prima di effettuare il commit del codice:

  • ha una build nell’IDE funzionante?
  • ha una master build da console funzionante?
  • i test unitari si eseguono senza errori?
  • effettua un update del codice dal server
  • risolvi eventuali conflitti con la mainline
  • riesegui la build
  • verifica che la build sia funzionante
  • verifica che tutti i tests siano senza errori
  • commit del codice scrivendo un commento identificativo

 

Alessandro Ceseno

PS: se hai domande scrivimi pure per mezzo della sezione contatti.

 

Extreme Programming

Extreme Programming

L’Extreme Programming (XProgramming) è una disciplina di sviluppo software che si basa su sui valori di semplicità, comunicazione, rispetto, feedback e coraggio.

L’eXtreme Programming (XP) è una opportunità per esplorare le tue reali capacità per trovare le tue reali capacità, per essere realmente te stesso.

Sviluppa utilizzando il TDD il più possibile, utilizza il Continuos Integration e automatizza il processo di sviluppo il più possibile. Il deployment dovrebbe esserci almeno una volta al giorno.

Migliora il design ogni volta che è possibile.

Dai il meglio di te stesso e realizza la miglior soluzione ogni volta che è possibile farlo, questo è Extreme ovvero utilizza il massimo delle tue potenzialità.

XP è modo di sviluppare software caratterizzato dallo sviluppo di ottime applicazioni che sono una conseguenza di tecniche di sviluppo software e di una comunicazione chiara.

XP ha seguenti caratteristiche.

Una filosofia di sviluppo software basata sui valori di comunicazione, feedback, semplicità e rispetto.

Una serie di pratiche che migliorano lo sviluppo del sofware, queste pratiche sono collegate e quindi una pratica migliora l’utilizzo dell’altra.

Una community che condivide questi valori e queste pratiche.

XP è anche un percorso di miglioramneto che avviene come persona e come professionista che si attua attraverso lo sviluppo software.

XP ha cicli di sviluppo corti caratterizzati da continui feedback.

Ha un approccio incrementale, il quale consente di far evolvere in progetto in base ai bisogni dei clienti e risponde ai cambiamenti e alle necessità che chiede il business dei clienti.

XP dipende dalla comunicazione orale dei componenti del team, dai tests, dall’interazione del codice con l’intero sistema, XP risponde al design che è in continua evoluzione.

Il desiderio di utilizzare tecniche e metodologie eccellenti è una caratteristica degli ambienti XP.

I valori di XP

XP ha i seguenti valori che guidano lo sviluppo:

comunicazione, semplicità, feedback, coraggio, rispetto.

Questi sono i valori di una organizzazione, di un team. Per mezzo dei valori ci si collega ai principi di XP.

I principi di XP

Umanità.

Sono le persone che sviluppano il software. Avere l’opportunità di aumentare le lore abilità e le loro conoscenze spesso è una grande forma di motivazione per le persone. Le pratiche XP spesso soddisfano sia il business sia i bisogni delle persone.

Economia.

Essere sicuri che ciò che si sviluppa ha un reale valore per il business e incontra le aspettative e gli obbiettivi dei clienti.

Reciproco vantaggio.

Si ha un approccio win win, ovvero tutte le attività dovrebbero soddisfare le persone coinvolte. Ad esempio lo scrivere test automatici consente sia allo sviluppatore, sia al team, sia ai futuri sviluppatori uno strumento per un miglior software.

Self-Similarity.

Questo principio consiste nel provare a copiare una struttura di una soluzione funzionante in un nuovo contesto con le corrette dimensioni, con le corrette semplici ed essenziali implementazioni. Un semplicissimo esempio iniziale è scrivere un test che non funziona e poi modificarlo in un test funzionante.

Miglioramento.

L’approccio è fare il meglio possibile oggi e domani cercare di migliorarlo, può essere il processo di sviluppo, il design, le user stories.

Lo sviluppo incrementale implica il disegn incrementale del software, quindi si ha una ridefinizione del design continua.

Inoltre la collaborazione è migliorata per mezzo del pair programming e continuos integration.

Diversità.

Sarebbe meglio che ogni team avesse persone con diverse abilità, attitudini ed esperienze, questo consente anche di trovare diversi modi per risolvere problemi e diverse implementazioni per risolvere problemi.

Riflessione.

I buoni team non lavorano soltanto ma pensano come possono lavorare meglio e perchè essi lavorano con una certa modalità. Analizzano anche perchè essi hanno successo oppure falliscono nelle cose che fanno. Se fanno errori, non nascondono gli errori perchè sono uno strumento per migliorarsi e per migliorare il team.

Flusso.

Le pratiche XP tendono a un flusso continuo delle attività. Si tende ad effettuare piccoli deploy incrementali ma più frequenti. Ad esempio una build effettuata ogni giorno è flow oriented.

Opportunità.

Si impara che i problemi sono una opportunità di cambiamento e di miglioramento.

Ridondanza.

Alcune pratiche sono ridondanti, ad esempio Pair Programming, Continuos Integration, sederti tutti insieme, daily deployment.

Fallimento.

Anche se effettui una implementazione o fai qualcosa che non funziona, c’è siduramente qualcosa che si può imparare da essa.

Qualità.

I progetti non non finiscono prima se la qualità è bassa e allo stesso tempo non vanno più lentamente se la qualità è alta.

Baby steps.

L’obbiettivo è quello di realizzare grossi cambiamenti per mezzi di piccoli cambiamenti.

Pratiche

“Sedersi insieme”.

La comunicazione, la coversazione è importante, quindi il sedersi attorno a un tavolo con tutto il team e con i clienti consente l’attivazione di più sensi rispetto a una comunicazione di sole emails.

“Tutta la squadra”.

Tutte le persone della squadra si supportano l’un l’altro, questo vale sia per il progetto sia per l’apprendimento, sia per lo studio di metodologie e tecniche.

“Informative Workspace”.

L’ open space del team deve essere informativo, ovvero devono esserci informazioni che consentono di trarre informazioni inerenti al progetto al quale si sta lavorando, ad esempio questa pratica si attua con le story cards sul muro.

Pair Programming.

Il pair programming è una pratica nella quale due perosne programmano insieme, effettuano design insieme, migliorano il codice insieme, testano il codice insieme, analizzano il codice insieme. Lo spazio personale deve essere rispettato da entrambi i pair.

Storie.

Si scrivono le story cards. Una volta scritte si prova a estimare il tempo necessario per l’implementazione della storia stessa (Ideal Engineering Time).

Utilizzare le story cards consente la descrizione del business in modo simile alla vita reale.

Weekly Cycle.

Pianificare il lavoro settimanalmente, una volta alla settimana, meglio di lunedì mattina. Durante il meeeting vedere cosa si è fatto la settimana precedente, che cosa si ha intenzione di fare nella settimana in corso per mezzo delle story cards. Convertire le story cards in tasks che verranno stimati dal team come tempistica di sviluppo.

Quarterly Cycle.

Ogni tre mesi riflettere sul progetto, sul team, sui progressi effettuati.

Ten minute build.

La build compresi i test automatici non dovrebbe essere più lunga di 10 minuti, è consigliato avere una master build di al massimo 2, 3 minuti.

Continuos integration.

Gli steps di integrazione non sono predittivi, ma se si integra in modo continuo si hanno molto meno i problemi di integrazione e la loro soluzione è molto più veloce.

Test First Programming.

Scrivi un test che fallisce prima di fare qualsiasi cambiamento di codice.

Questo consente di verificare il comportamento del sistema.

Design Incrementale.

Lavora ogni giorno per migliorare il design.

I team XP lavorano affinchè il costo del cambiamento delle features del software non sia oneroso. Questo si realizza tramite i test automatici, i miglioramento continuo del design e altre pratiche. Si effettuano piccoli steps per migliorare il design, ad esempio il TDD consente questo.

Inoltre il design senza duplicazione di codice è molto più facilmente migliorabile.

Quindi può esserci inizialmente un sistema piccolo che che cresce a seconda delle necessità in modo incrementale.

Conclusione.

Le pratiche menzionate sono basate su feedback, comunicazione e rispetto che facilitano la semplicità e il coraggio, i valori di XP.

Si ha un veramente un team XP quando queste pratiche vengono effettuate.

 

Bibliografia:

Extreme Programming Explained: Embrace Change
Kent Beck with Cynthia Andres Foreword by Erich Gamma

http://www.amazon.it/Extreme-Programming-Explained-Embrace-Change/dp/0321278658/

 

 

 

 

Alessandro Ceseno

PS: se hai domande scrivimi pure per mezzo della sezione contatti.

 

Collective Code Ownership

Ogni sviluppatore è responsabile del codice e dell’applicazione, questo si traduce con il fatto che a ogni sviluppatore è permessa la modifica di qualsiasi parte del codice.

Il Pair programming aiuta l’attuazione di questa pratica, poichè lavorando con diversi pair si ha la possibilità di vedere varie parti di codice, inoltre questa pratica velocizza il processo di sviluppo dell’applicazione, poichè se si verifica un bug, qualsiasi programmatore del team dovrebbe essere in grado di risolverlo.

Consentendo agli sviluppatori di modificare codice non da loro scritto, si potrebbe pensare che si possano introdurre altri bugs, ma in realtà questo non è così, poichè vi sono i tests di unità, ovvero prima e successivamente alla modifica vanno eseguiti e verificati i tests. Collective Ownership incoraggia ogni membro del team a contribuire con ogni nuova idea in ogni parte del progetto. Tutto il team è responsabile per il design del sistema. Quindi se tutto il team è responsabile per il design allora tutto il team è importante.

Questo si realizza sviluppando in TDD, ciascun sviluppatore scriverà test per il codice applicativo e tutto il codice di tutti gli sviluppatori viene rilasciato in un source code repository, anche i tests di unità vengono rilasciati ed eseguiti tutti. Inoltre se un bug viene risolto oppure cambia una funzionalità, il caso di utilizzo deve esserci in un nuovo test automatico. Ovviamente se si trova duplicazione di codice la si deve eliminare, se si trovano nomi non chiari o non identificativi li si devono correggere, se il design è migliorabile, lo si deve migliorare. Inoltre, per essere rilasciata una nuova versione del software, tutti i test automatici devono essere eseguiti con successo.

Questa pratica XP è molto più sicura che chiedere a una sola persona di effettuare una modifica o di risolvere un problema di un codice che ha scritto, questo perchè quella persona lasciare in futuro il team oppure non essere disponibile nel momento in cui si deve effettuare la modifica.

La Collective Code Ownership si realizza con:

  • Comunicazione nel Team

  • Aiutare gli altri

  • Chiedere aiuto

  • L’ utilizzo di un Coding Standard

  • Source code management system (ad esempio GIT o Subversion) che consente di rilevare anche eventuali conflitti di codice

  • Una suite per i test di unità

  • La pratica di Continuos Integration

 

Alessandro Ceseno

PS: se hai domande scrivimi pure per mezzo della sezione contatti.

 

Refactoring

Refactoring

Il refactoring consiste nel mantenere lo stesso comportamento del software (non si sviluppano nuove funzionalità) ma si migliora il design.

I vantaggi del refactoring:

  • Ristrutturazione del codice
  • Non aggiunge funzionalità, si ha lo stesso comportamento
  • Migliora il design dell’applicazione semplificando…
  • Semplifica il codice e il design
  • Attuato per mezzo di brevi steps

 

Alessandro Ceseno

PS: se hai domande scrivimi pure per mezzo della sezione contatti.

 

 

Coding Standard

Coding Standard

Premessa:

le convenzioni su come scrivere codice sono importanti sia per gli sviluppatori, sia per il team, sia per il progetto, per molte ragioni:

  • buona parte del codice scritto (indicativamente dal 70% al 90%) nella durata della “vita” del software dovrà essere mantenuto
  • è molto difficile che il software sia mantenuto per la sua intera vita da chi ha scritto la sua prima versione
  • le convenzioni aumentano la leggibilità del software, questo permette sia la risoluzione dei bugs più immediata, sia un aumento della velocità di comprensione della funzionalità
  • vuoi sviluppare un prodotto di qualità

A seguire una code convention per il linguaggio Java.

 

Strutturazione del codice

Un nuovo package Java deve essere creato per ciascun gruppo di funzionalità correlate, inoltre le directories devono essere create come la convenzione dei nomi dei packages in java.

Sarebbe auspicabile che si crei un file con nome-del-package.txt oppure .html nel quale venga riassunto brevemente lo scopo del package e le classi, metodi funzionalità più importanti.

Anche se Java consente di avere più classi nello stesso file, è consigliabile avere la seguente corrispondenza: un file, una classe, ovvero ciascuna classe deve essere in un file separato, a meno che non si è sicuri che quella classe non pubblica venga utilizzata solo per quella esigenza specifica in quel file da un’altra classe.

Scrivere in tutti i files:

  • il tag ‘$Id$’
  • una lista della storia del file che comprende:
    • la data
    • l’autore
    • le modifiche effettuate
  • se un file ha più di una classe scrivi un commento che indica il nome di tutte le classi presenti nel file e il loro scopo
  • dopo il commento scrivi il package, lascia una riga vuota e scrivi gli import

a seguire un esempio:

/**
* Copyright (C) 2014, Nome dell'azienda 
*
* $Id: MyExample.java ,v 1.1 2014/02/01 10:01 autore Exp $
* Data Autore Modifiche
* Gen 30 2014 autore Creato
* Gen 21 2014 autore Aggiunta di due nuovi metodi
*/

package demo;

import java.util.Random;

 

Per le classi e le interfacce scrivere i commenti come da convenzione:

/**
 * Questa parte è il commento
 * 
 */

Prima della classe dovrebbe esserci sempre un commento della classe stessa che descriva lo scopo ed eventualmente anche un esempio di utilizzo.

Utilizzare anche i seguenti tags:

/**
* ...
* @author
* @version
* @see nomedellaclasse#nomedelmetodo
*/

Ecco un esempio di un commento di una classe e il suo utilizzo:

/**
* Questa classe rappresenta un dipendente
* Un esempio di utilizzo: 
* <pre> 
* Dipendente dipendente = new Dipendente();
* dipendente.getSkills();
* </pre> 
* 
* @author Nome Cognome oppure <a href="mailto:nomecognome@azienda.it"> </a> 
* @version $Revision: 3.1 $ $Date: 2014/01/30 10:28:29 $
* @see Lavoratore
*
*/
class Dipendente extends Lavoratore
{...
}

 

E’ consigliabile mantenere il seguente ordine di scrittura nelle classi:

  • variabili della classe (public, protected, a livello di package, private)
  • costruttori pubblici
  • costruttori privati
  • metodi pubblici
  • metodi protected
  • metodi con visibilità defaul
  • metodi privati
  • inner class

 

a seguire una tabella riassuntiva per i modificatori di accesso java quale tipo di visibilità hanno:

Modificatore Class Package Subclass World
public Si Si Si Si
protected Si Si Si No
nessun modificatore Si Si No No
private Si No No No

 

 

Per la variabili della classe seguire il seguente ordine:

  • public
  • protected
  • nessun modificatore
  • private

la convenzione javadoc consente di descrivere lo scopo, l’utilizzo delle variabili di istanza e delle variabili static. Consente anche l’utilizzo dei tags HTML.

@see URL
@see stringa
// Rappresenta il prezzo dell'item 
public double price;

Per i metodi la convenzione javadoc prevede la descrizione dello scopo, delle precondizioni, degli effetti, degli algoritmi, di come si utilizzano i metodi. Anche per i metodi è consentito l’utilizzo dei tags HTML.

 

@param nomeDelParametro descrizione del parametro
@return descrizione del valore di ritorno
@throws nomeDellaEccezione descrizione di quando si verifica l'eccezione
@see stringa
@see nomeDellaClasse#nomeDelMetodo

Per i commenti multilinea usare

/* commento con più linee
*/

Per i commenti di una sola linea usare

// commento di una sola linea

 

Ricorda il “perchè” e il “che cosa”.

Spesso i commenti descrivono ad esempio che cosa fa un metodo ma é bene descrivere nel commento dove opportuno, anche il perchè è stato fatto, è stato sviluppato quel metodo o quella classe.

Se l’algoritmo è complesso è bene descrivere l’algoritmo nel commento.

Layout

Il layout prevede l’indentazione, la lunghezza massima di ogni linea di codice e l’utilizzo delle parentesi graffe.

Per l’indentazione non utilizzare il tab ma 4 spazi per l’indentazione (oppure configurare l’IDE affinchè il tab abbia 4 spazi).

Impostare nell’ IDE la lunghezza massima di caratteri pari a 75 caratteri, questo consente una migliore leggibilità del codice. Questo dovrebbe valere anche per i commenti.

Per l’utilizzo delle parentesi graffe, solitamente si hanno una delle due seguenti convenzioni. Utilizzare la parentesi graffa di apertura nella linea dove viene definita la classe o il metodo oppure utilizzare la parentesi graffa di apertura all’inizio della linea successiva della definizione della classe o del metodo. Se si adotta quest’ultima convenzione le parentesi graffe saranno verticalmente allineate.

class MyClass
{
    ...
    public double getSales() 
    {
	if (condizione)
        {
           ...
        } else
        {
           ...
        }	
    }    
    ...
}

lasciare una linea bianca tra i vari metodi (incrementa la leggibilità).

Dichiarare le variabili dei metodi all’inizio del metodo, ad eccezione per i cicli.

Spazi bianchi.

Utilizzare uno spazio bianco nei seguenti casi.

Dopo una parola chiave di Java lasciare uno spazio bianco, ad esempio:

while (condizione)
{
...
}

Non utilizzare uno spazio bianco tra il nome del metodo e l’apertura delle parentisi. Questo consente una immediata identificazione del metodo.

Inserire lo spazio bianco dopo la virgola dei paramteri del metodo.

 public double getSales(int a, int b, String c) 
 {
     ...	
 }

Tutti gli operatori (ad eccezione del “.”) devono essere separati da uno spazio bianco:

int y -= x + z;
y = (g + j) / (u - o + d);

Dopo che si effetua un cast, si lascia uno spazio bianco.

 public double getSales((Object) c) 
 {
     ...	
 }

 Mantenere la leggibilità di eventuali linee di codice lunghe.

Nel caso di linee di codice lunghe e poco leggibili, è un bene, con il fine di aumentarne la leggibilità, spezzare la linea in due o più linee. Ad esempio dopo la virgola puoi andare a capo, oppure dopo un operatore. Considera infine che spezzare il codice in più linee è meglio farlo con le parti di codice che abbiano un livello di parentesi più “alto”.

Inoltre, una volta scritto il codice su più linee, allinea le linee stesse affinchè siano “allineate”, ovvero affinchè le linee  inizino verticalmente nello stesso punto.

Ovvero, questo codice è preferibile

 
keyboard = keyboardTypeA * (keyboardTypeB + keyboardTypeC - keyboardTypeD)
         + (keyboardTypeU + keyboardTypeI - keyboardTypeL);

a questo codice:

 
keyboard = keyboardTypeA * (keyboardTypeB + keyboardTypeC
         - keyboardTypeD) + (keyboardTypeU + keyboardTypeI - keyboardTypeL;

 

 Convenzione dei nomi.

Per i packages:

  • adottare la convenzione java per il dominio (ad esempio i packages devono iniziare con it.nomeazienda. ecc.)
  • devono essere lowercase

Per le classi:

  • devono avere la prima lettera maiuscola
  • la classe pubblica di ciascun file deve corrispondere al nome del file

Per le costanti:

  • tutti i caratteri delle costanti devono essere maiuscoli
  • le parole delle costanti sono unite tramite underscore

 

public final int UNA_COSTANTE = 10;

Se sono private o protected scriverle con un underscore iniziale poi l’uppercase per il carattere iniziale di ogni parola.

private int _unaVariabile = 3;

Per le variabili locali scrivere il primo carattere lowercase ma le altre parole con il primo carattere maiuscolo

private int unAltraVariabile = 5;

Per i metodi scrivere il primo carattere lowercase ma le altre parole con il primo carattere maiuscolo

public double getSomeFruit() 
{
   ...	
}

Utilizza il new o il create per i metodi del design pattern factory.

Utilizza il to (ad esempio il toNomeOggetto) per i metodi che converto in un oggetto.

Utizza il get e il set per quei metodi che danno o settano un oggetto

AnObject getAnObject(){...}
void setAnObject(AnObject){...}

 Consigli.

Scrivere un main in una classe separata che utilizza la tua classe applicativa, quindi non mettere il main nella classe applicativa. Il nome della classe del main dovrebbe essere il nome della classe che si luove utilizzare con il postfisso Main, ad esempio MyClass la classe da utilizzare, e MyClassMain la classe che contiene il main.

Scrivere uno Unit test che utilizza la tua classe applicativa.

Nei tests devono esserci esempi di utilizzo delle classi, oltre che a testare le funzionalità, sarebbe auspicabile che ci siano degli esempi di utilizzo.

Non scrivere codice hard coding.

Scrivi degli esempi di utilizzo di classi, preferibilmente nelle classi di tests.

Razionalizza e semplifica.

Se nel design si pensa ad una astrazione della classe allora definire una interfaccia, scrivere invece una classe astratta quando un metodo può essere utilizzato da tutte le sottoclassi.

Le interfacce sono più flessibili delle classi, poichè le classi non supportano l’ereditarietà multipla.

Utilizza i Generics per il tuo codice, ti consente di avere codice più robusto e con meno bugs.

Come gestire le eccezioni.

Quando scrivi il blocco del catch scrivi anche un log con un messaggio oppure stampa lo stack trace.

Scrivere un messaggio significativo dell’evento, non utilizzare generiche espressioni.

Sii dettagliato nel log, ad esempio scrivendo l’id dell’item che va in eccezione, affichè si possa capire successivamente il caso d’uso.

try
{
   ...
} catch(Exception e) 
{
	e.printStackTrace();
}

 

try
{
    ...
} catch (TransactionException te) 
{
    logger.log(te.printStackTrace());
}

A seguire un buon esempio di gestione delle eccezioni.

try
{
   f = new File(path);
} catch (IOexception ioE) 
{
    String m = ClassLoader.message(FILE_NOT_FOUND, path)
    throw new FileException(ie, m);
} catch (CustomException cE) 
{
    logger.log(cE.getMessage());
}

La gestione delle eccezioni devono essere in tutti i metodi in cui c’è la possibilità in cui una eccezione si possa verificare.

Variabili.

Non dichiarare le variabili public se non le dichiari final static.

Questo perchè nell’ Object Oriented Programming il dichiarare una variabile publica “modifica” il modello ad oggetti, in questo caso sposta il potere decisionale al di fuori dell’oggetto, al di fuori della classe.

Inizializza sempre le variabili.

Scrivi minor static possibili, ad eccezione del caso in cui si necessiti di costanti static. Questo perchè le variabili static non sono OO (Object Oriented).

Inoltre si creano anche metodi più dipendenti dal contesto e con eventuali effetti collaterali, con la possibilità di avere problemi sulla sincronizzazione.

Utilizza final per le variabili il cui valore non deve mai essere cambiato.

Quando scrivi le variabili di istanza e metodi considera il principio della minima visibilità, ovvero variabili e metodi devono essere meno esposti possibili alle altre classi e package.

Per le variabili di istanza che necessitano di essere scritte al di fuori della classe utilizzare un metodo con il set iniziale, ad esempio setNomeVariabile.

Non scrivere lo stesso nome di variabile  per una superclasse e una sottoclasse, questo è un errore.

Dichiara una nuova variabile locale invece di utilizzarne un’altra che è stata concepita con un altro scopo.

Dichiarare una variabile locale non all’inizio del metodo solo per  i cicli.

Assegna null a qualsiasi array, lista, collezione di oggetti che per un lungo tempo non viene utilizzata (Ref. Garbage Collection).

Metodi.

Se possibile non scrivere troppi metodi in successione:

object.methodA().methodB().methodC().methodD();

poichè sia si potrebbe avere uno stato dell’oggetto che non è quello voluto, sia potrebbero esserci problemi di sincronizzazione.

Commenta le classi e i metodi thread safe, è molto utile capirne lo stato e la logica.

Sincronizza metodi piuttosto che blocchi, utilizza syncronized sui metodi piuttosto che nei blocchi, questo consente di aver un incapsulamento migliore.

Se fai l’override di hashcode allora fai anche l’override di equals.

Se fai l’override di equals allora fai anche l’override di hashcode.

 

A seguire i principali vantaggi del Coding Standard:

  • Ottimo quando si amministra e si automatizza il processo di build
  • Quando si ha integrazione di codice si ha un codice “collettivo” con lo stesso standard
  • Il codice è più facile da mantenere
  • Permette una miglior lettura del codice agli altri ma non solo a loro
  • Si ha lo stesso formato del codice sorgente e dei commenti, questo consente anche una miglior comprensione da parte di tutti gli sviluppatori del team
  • Facilita la comunicazione

 

 

Alessandro Ceseno

PS: se hai domande scrivimi pure per mezzo della sezione contatti.

 

Continuos Integration

Continuos Integration

Una pratica Agile che uso è la pratica del “Continuos Integration”, della integrazione continua. Le interazioni tra le persone avvengono abitualmente, ogni giorno e abitualmente ogni giorno il software cambia, perchè i requisiti cambiano, la tecnologia cambia, il design cambia, il business cambia, le persone del team cambiano, molte cose cambiano e componenti software vengono integrati.

Quando accade questo per mezzo della pratica agile di “Continuos Integration“, ciascuna integrazione del sistema, ciascuna integrazione del codice è verificata per mezzo di un processo di compilazione automatico, una build automatica che deve comprendere anche la verifica dei tests. Questo tipo di approccio consente di aver molti meno problemi nel momento in cui si rilascia in produzione.

Come è indicato nel nome Continuos Integration, l’integrazione non è una fase con limiti temporati definiti ma l’integrazione è continua nel senso che accompagna lo sviluppo del software, questo si realizza mediante questa pratica agile.

Essendo continua, nel caso di errori, nel caso di bugs si può facilmente e velocemente regredire a uno stato precedente funzionante.

Questa pratica agile si effettua per mezzo del controllo del repository del codice sorgente.

Continuos Integration è una delle pratiche che fanno parte dell’ eXtreme Programming.

Per realizzare Continuos Integration è necessario avere un Server dedicato all’integrazione (Continuos Integration Server).

I tools che attualmente utilizzo per Continuos Integration sono Jenkis o Hudson.

Implementazione del software e CI (Continuos Integration).

Lo sviluppatore ha una copia del codice sorgente sulla sua macchina (pc o laptop).

Tale “copia” del codice sorgente la si è ottenuta per mezzo di un Source Code Management System. Attualmente utilizzo Git, in passato ho utilizzato Subversion.

(A seguire una breve descrizione di come questi due diversi sistemi di versionamento funzionano.

Per avere sulla macchina locale il codice del progetto già esistente lo sviluppatore nel caso di Git avrà fatto un “clone”, nel caso di Subversion lo sviluppatore avrà fatto un “check out”. Per mandare le modifiche del proprio codice al server, lo sviluppatore nel caso di Git effettuerà un push (preceduto da un commit locale), lo sviluppatore nel caso di Subversion effettuerà un commit.

Un Source Code Management System ha il compito di gestire il codice sorgente in un repository su un Server. Il codice sorgente sul Server è principalmente in una directory chiamata mainline. Il codice sorgente sulla macchina locale è in una directory chiamata Working Directory, ovvero nella working directory si ha una Working Copy del codice sorgente.

Lo sviluppatore lavora sulla sua macchina in locale per sviluppare una nuova feature, o per modificarne una esistente, ecc.

Questa pratica agile ha come caratteristica il fatto che il codice sviluppato abbia dei tests automatici.

Io sviluppo in TDD, in Test Driven Development. Effettuata l’implementazione della feature/s effettuo la build sulla mia macchina locale, la build effettua operazioni di compilazione, di creazione di altre/nuove librerie software ed esegue i test automatici.

Effettuata la build e verificato che in locale i test automatici funzionano, allora si è a buon punto nel processo che consertirà il “commit” del codice sul Server (comando commit con Subversion, comando pull con Git).

Ora si aggiorna la propria copia in locale (comando Update in Subversion, comando pull in Git): questa fase consiste nell’aggiornare il codice in locale con il codice del Server (del repository), questo consente una nuova build nella macchina locale e una nuova esecuzione dei tests e se i tests sono senza errori allora si può effettuare un commit del codice sul server.

Nel caso invece di errori nella build o nei tests allora lo sviluppatore dovrà prima di committare il codice sul repository del Server effettuare un fix dei problemi e/o tests.

In Continuos Integrator vi è una macchina di integrazione, un Server di integrazione.

Questa macchina di integrazione deve avere accesso al repository del codice (assumiamo che sia la mainline del codice).

La macchina di integrazione effettua una nuova build, questa build viene eseguita con il codice sorgente del repository. Se questa build non ha errori ed è corretta (anche i tests devono essere senza errori ovviamente) allora solo in questo caso si può affermare che l’implementazione della feature è stata effettuata.

Questa build effettuata dalla macchina di integrazione è normalmente effettuata da un software, io utilizzo Jenkins oppure Hudson.

Può verificarsi il fatto che due o più sviluppatori effettuano un commit del codice sul server di versionamento quasi contemporaneamente, in questo caso il server di continuos integration avvertirà nel caso di errori della build o tests e quindi i problemi che potrebbero sorgere possono essere risolti velocemente e avere di nuovo una build funzionante.

Controlla i tempi:

il server di integrazione non dovrebbe avere una build non funzionante per più di 24/48 ore.

 

E’ stato descritto a un più alto livello possibile il concetto di Continuos Integration.

Continuos Integration viene attuato per mezzo anche delle seguenti pratiche.

Avere un solo repository del codice sorgente

(ovviamente l’Operation deve effettuare backups).

Si scrive il codice sorgente per effettuare la build del software. Il codice sorgente del team viene gestito con software che possono avere diversi nomi, ma che gestiscono fondamentalmente il codice sorgente, i nomi più comuni sono: Source Code Management Tool, Configuration management, version control system, revision control system, source control.

Il software di gestione del codice sorgente consente al team, e quindi al progetto la corretta gestione dei seguenti casi d’uso/eventi:

  • overwriting del codice: diversi sviluppatori possono lavorare in contemporanea sul progetto e non si ha overwriting di codice se non effettuato con consapevolezza.

  • history del source code: è possibile accedere alla storia del codice sorgente e visionare e quindi poi eventualmente modificare la storia dei files

  • scrivere le note di release del codice

  • avvertire quando il codice sorgente stesso è stato modificato

E’ buona norma prima dell’inizio del progetto accertarsi che tutti i componenti del team sappiano utilizzare il software di versionamento del codice (attualmente Git e Subversion sono i migliori).

E’ buona norma versionare tutto il progetto, quindi codice sorgente, files di properties, eventuali scripts come i database scripts, eventuali librerie aggiuntive, ecc. e non versionare il compilato, questo perchè ogni persona del team dovrebbe essere un grado di effettuare su una nuova macchina il check out del codice, ovvero prendere il codice sel server di versionamento e metterlo in una nuova macchina ed effettuare una corretta (e completa) build, quindi nel server di versionamento deve esserci tutto ciò che è necessario.

I sistemi di versionamento consentono anche di creare branches del codice, il consiglio è quello di crearli solo se è veramente necessario.

Automatizza la build

Automatizza tutto quello che può essere automatizzato. La build può effettuare diverse operazioni, come la compilazione dei sorgenti, la CRUD di directory,ecc. tutte queste operazioni sono automatizzabili e quindi si devono automatizzare, poichè è possibile commettere errori in procedure non automatizzate.

Qualsiasi persona del team come scritto precedentemente dovrebbe essere in grado di prendere il codice sorgente del server di versionamento e per mezzo di un solo comando effettuare una corretta build.

Spesso una build completa richiede tempo ma spesso si utilizza un process building che è in grado di controllare la data del sorgente e quindi se con la nuova build il sorgente deve essere di nuovo compilato oppure no, questo consente un notevole risparmio di tempo nel processo di build. Inoltre il file di build dovrebbe consentire diversi target a seconda delle necessità.

Lo sviluppo viene effettuato per mezzo di un IDE (Integrated Development Environment, Eclipse è il mio preferito per Java ad esempio), molto spesso la build effettuata per mezzo di un IDE non consente la visibilità su problemi che potrebbero esserci in una build fatta bene da console (ad esempio perchè alcuni files sono nel classpath dell’IDE e non nel classpath dello script di build,ecc.).

Quindi è molto importante avere sempre una build funzionante che è eseguibile dal Server.

Includi i tests nella tua build

La build può effettuare diverse operazioni, tipicamente compilazione di sorgenti, creazione di librerie, spostamento e creazioni di directories, ecc.

Può esserci una build senza errori, ma un approccio agile prevede che ci siano i tests unitari, ovvero nello script di build devono esserci i tests di unità e devono essere dalla build stessa eseguiti e non dare errori.

Se si è sviluppato in TDD (Test Driven Development) si hanno test di unità più efficienti ed efficaci poichè si sono stati scritti prima del codice applicativo.

In ogni caso anche se non si è sviluppato in TDD si dovrebbero avere dei tests automatici e sarebbe ideale che tutti i tests fossero eseguibili con un unico comando.

 

I commits devono essere consistenti e frequenti: piccole funzionalità implementate in modo incrementale.

L’integrazione consente anche agli altri membri del team una consapevolezza delle funzionalità implementate. E’ importante che i commits effettuati nel repository oltre che aver un corretto design, che abbiano una build e i tests funzionanti.

Di seguito il corretto flusso che gli sviluppatori dovrebbero seguire finito di implementare una funzionalità e prima dell’effettivo commit del codice:

  • chiedersi se si ha una build nell’IDE funzionante

  • chiedersi se si ha una master build da console funzionante

  • i test unitari si eseguono senza errori?

  • effettua un update del codice dal server

  • risolvi eventuali conflitti con la mainline

  • riesegui la build

  • verifica che la build sia funzionante

  • verifica che tutti i tests siano senza errori

  • commit del codice scrivendo un commeto identificativo della funzionalità implementata

I commits frequenti consentono anche nel caso di problemi o bugs una veloce soluzione.

Una buon approccio è effettuare il commit solo se si è implementata una funzionalità o una sotto funzionalità correttamente e consistente.

Inoltre frequenti commit aiutano gli sviluppatori a sviluppare semplici funzionalità. La Semplicity è una della caratteristiche dell’ eXtreme Programming (XP).

Questo consente anche una maggior sicurezza e conoscenza del software che si sta sviluppando.

 

Ciascun commit nel repository dovrebbe essere seguito da una nuova build sulla macchina di integrazione (Continuos Integration Server).

Come abbiamo detto precedentemente lo sviluppo è fatto su macchine locali, i commits sul repository su un’altra macchina (che abbiamo definito Server per comodità) sul quale c’è il repository (la mainlaine del codice). Ecco che la macchina di integrazione deve effettuare un checkout del codice dopo ogni singolo commit ed effettuare una nuova build e quindi verificare che la build sia corretta (ovviamente anche i test devono essere corretti). Avere una build funzionante di ambienti diversi consente di aver un maggior controllo e consapevolezza del codice.

E’ importante essere consapevoli che solo se la build della macchina di test viene creata senza errori allora solo in quel caso la funzionalità è da considerarsi implementata.

La build sul Server di integrazione può essere in due modi e uno è preferibile all’altro.

Un modo è che uno sviluppatore si colleghi in remoto sul server di integrazione ed effettuti il check out del progetto ed effettui la build manualmente.

Un altro modo che è quello consigliabile è utilizzare un software come Jenkis per l’integrazione, ovvero dopo ogni commit effettuerà un check out del progetto ed effettuerà una nuova build, e a seconda di come è stato configurato il software, il Server di integrazione avvertirà via email dello stato nella nuova build (se ha avuto successo oppure no). Alcuni preferisco configurarlo a seconda dell’opposto dell’ Hollywood principle. L’ Hollywood principle dice: “don’t call us, we’ll call you”, ovvero non chiamarci, ti chiameremo noi. Portato al concetto informatico di Continuos Integration, l’opposto consiste nel fatto che se la build non ha successo si avvertono gli utenti, o meglio, in questo caso gli utenti di un software di CI (ad esempio Jenkis) sono gli sviluppatori, si avvertono gli sviluppatori per mezzo di una email (ovviamente lo fa in automatico il software di integrazione, una volta configurato).

Alcuni configurano il server di integrazione per una sola build al giorno e magari notturna, anche se è meglio avere una integrazione continua che non averla, in realtà è meglio configurare una nuova build, quindi una nuova integrazione ogni volta che il codice della mainline è cambiato, questo è effettuare Continuos Integration.

Mantieni veloce la build.

Spesso si possono creare situazioni per la quale la master build necessità di tempo e qundi non è più una build veloce. Il consiglio è avere una build veloce. Questo consente agli svilluppatori stessi di non annoiarsi mentre eseguono la build e inoltre non si devo rifocalizzarsi sul codice, cosa che deve avvenire in caso di build lunga.

La master build non dovrebbe mai essere più lunga di 10 minuti, naturalmente è auspicabile che sia al massimo di due o tre minuti.

Nel caso di build lunghe e di commit frequenti e ravvicinati si potrebbero avere dei problemi, è importante conoscere bene anche il software di Continuos Integration.

Avere un ambiente di Test/Collaudo/Preproduzione (può essere chiamato in diversi modi) il più simile, meglio ancora se è il clone dell’ambiente di produzione.

In questo ambiente si dovrebbe avere qualsiasi tipo di problema che si ha nell’ambiente di produzione. Se i tuoi test hanno un diverso risultato in ambienti diversi allora non sono test scritti bene, i tests dovrebbero avere lo stesso risultato in ambienti diversi.

Si vede aver cura che sia la versione del database, sia la versione del sistema operativo sia la stessa dell’ ambiente di produzione, stesse librerie e stessa versione delle librerie software utilizzate e stesso hardware.

Per mezzo della virtualizzazione è abbastanza semplice effettuare cloni degli ambienti.

Semplicity.

Cerca di essere e mantenere il processo più semplice possibile.

Spesso le pensone sono focalizzate su cosa non funziona invece che su cosa funziona, lo sviluppo agile consente rapidi cambiamenti e questo vuol dire anche la possibilità di effettuare rapidi bug fixing.

Qualsiasi componente del team dovrebbe essere in grado di prendere l’ultima build ed eseguire l’applicazione, gli scopi possono essere molteplici.

La comunicazione è importante.

La comunicazione ha un ruolo importante in CI (Continuos Integration), quindi ogni componente del team dovrebbe essere in grado di visionare i cambiamenti effettuati sui server ed essere in grado di effettuare eventuali configurazioni.

Inoltre i software di Continuos Integration mettono a disposizione pagine web per mezzo delle quali può vedere mantenere monitorato lo stato delle varie build e dei vari logs, l’accesso allo stato delle build e dei logs è messo a disposizione ad ogni membro del team. Questo consente anche al team di aver maggior visibilità e conoscenza sulla build e sullo stato del software.

Il deployment deve essere automatizzato.

Continuos Integration prevede il trasferimento di files in macchine diverse, quindi si deve automatizzare questo processo e inoltre è importante che si abbia uno script di deploy che consenta a chiunque del team di effettuare il deploy in modo semplice, l’ideale sarebbe con un solo comando. Di conseguenza anche in produzione il rilascio può essere effettuato in modo semplice con un solo comando.

Il deployment automatico in CI consente in produzione una velocità di rilascio e una significativa riduzione di possibili errori.

Poichè l’ambiente di Test/Collaudo/Preproduzione dovrebbe essere il clone dell’ambiente si produzione, allora anche il rilascio in produzione dovrebbe essere simile a quello dell’ambiente di Test/Collaudo/Preproduzione.

Il processo di build automatizzato ed intervalli regolari permette di verificare se i cambiamenti di codice fanno fallire test che prima erano funzionanti, se i test hanno successo si “tagga” la versione del codice.

 

Conclusione: I vantaggi di CI (Continuos Integration)

Continuos Integration ha diversi vantaggi di:

  • ridurre gli errori

  • ridurre i rischi

  • permette una maggior confidenza e conoscenza del software a tutti i membri del team

  • i bugs sono molto più velocemente identificabili e risolvibili.
  • i bugs sono anche cumulativi, questo significa che più bugs si hanno e più e difficile risolvere quel bug specifico, poichè quel bug è dato dalla sommatoria di altri bugs ein questo caso anche gli sviluppatori psicologicamente sono meno disposti a risolvere quel bug che è dovuto ad altri bugs. CI consente di ridurre i bugs in modo significativo
  • si hanno deployment frequenti, con tutti i relativi benefici

  • si amministra e si automatizza il processo di build

  • si integra il lavoro del singolo nel lavoro del team

  • si hanno feedbacks sui cambiamenti di codice, ma anche report, documenti

  • si diminuiscono considerevolmente i problemi di integrazione

 

Alessandro Ceseno

PS: se hai domande scrivimi pure per mezzo della sezione contatti.