La qualità del codice che fa la differenza nella pratica


Lavoro nel team di cui faccio parte da quasi 3 anni.  Un tempo in cui lo stile di programmazione nel team si è evoluto migliorandosi.

Cosi quando c'è uno sviluppo da fare mi trovo a lavorare di volta in volta su codice di qualità differenti, questo mi ha permesso di vedere in pratica le diverse caratteristiche di qualità del codice e gli impatti che hanno sul mio lavoro: tempi, affidabilità, risultato finale.



In generale percepisco 4 diversi livelli crescenti di qualità del codice:

  1. Facilità di trovare dove fare la modifica

    Dipende in gran parte dalla attenzione con cui si sono scelti i nomi per i parametri,  metodi, le classi, i namespace e gli assembly e il modo in cui le classi sono raggruppate in namespace e i namespace raggruppati in assembly.

    Questo è descritto anche da un attributo di qualità standard detto 'Analizzabilità'
    E' la prima caratteristica del codice che avverto quando inizio a lavorarci.




  2. Facilità di capire come fare la modifica

    Dipende in gran parte da quanto lunghe sono le classi (se hanno 5-10 metodi invece che 20-60 e 2-4 field invece che 20-50) , da quanto solo lunghi i metodi (se sono di 5-20 righe invece che 100-1000 righe) e da quanto è complesso il codice nei metodi (se ha 1-4 if e for non nidificati invece che 10-30 nidificati 2 e più volte).

    E dipende da quanto ogni responsabilità è assegnata/implementata in una singola classe o poche classi correlate (dello stesso namespace) invece che essere sparsa in molte classi diverse e scorrelate; e da quanto l'implementazione è in un unico punto invece che essere duplicata in diverse parti.

    Nella terminologia del buon disegno OO questo si indica come disegno flessibile.
    Questo è descritto anche da un attributo di qualità standard detto 'Modificabilità'

    E' la seconda caratteristica del codice che avverto quando inizio ad abozzare e stimare l'implementazione.




  3. Velocità nel verificare l'impatto della modifica sulle altre funzionalità

    Dipende in gran parte da quanto ogni metodo fa una cosa sola (esegue una sola operazione invece di svolgere più compiti diversi legati dal solo fatto di dover essere eseguiti nello stesso momento, vedi Cohesion), da quanto ogni classe assolve a una singola responsabilità (vedi il Single Responsibility Principle) e da quante dipendenze ha il metodo e la classe (se dipende da 1-4 altri tipi astratti invece che 10-20 altri tipi in gran parte classi concrete).

    E dipende da quanto la visibilità usata per i metodi è la minima necessaria (private o internal invece che public), da quanto le variabili sono dichiarate nello scope più ridotto possibile (dentro un blocco di codice o a livello di metodo invece che a livello di classe) e di quanto le variabili statiche e globali sono state evitate.

    Nella terminologia del buon disegno OO questo si indica come disegno robusto oppure come basso accoppiamento.
    Questo è descritto anche da 2 attributi di qualità standard detti 'Stabilità' e 'Provabilità'

    E' la terza caratteristica del codice che avverto quando inizio a scrivere i test e a scrivere l'implementazione.




  4. Il codice esistente si evolve estendendolo invece che modificandolo

    Dipende in gran parte da quanto i concetti del dominio applicativo e del livello di implementazione sono rappresentati nelle classi del sistema (se concetti distinti sono rappresentati da classi distinte invece che essere implementati da una stessa classe) e da quanto i concetti più stabili sono stati rappresentati con tipi astratti (interfacce che permettono diverse implementazioni concrete) mentre quelli più passibili di cambiamento con tipi concreti (da cui devono dipendere poche classi).

    Nella terminologia del buon disegno OO questo si indica come disegno riusabile e alta coesione.
    Anche questo è descritto con l'attributo di qualità standard 'Modificabilità'.

    E' la quarta caratteristica del codice che avverto quando inizio a scrivere i test e a scrivere l'implementazione.


Un codice che ha le caratteristiche 1 e 2 e in parte la 3 lo considero buono e mi permette di fare un buon lavoro in poco tempo.

Un codice che ha completamente anche la caratteristica 3 lo considero ottimo.

Uno che ha anche la 4 lo considero straordinario!!!


  Tags :   | | |  |

Print | posted @ domenica 17 agosto 2008 1.01

Comments on this entry:

Gravatar # re: La qualità del codice che fa la differenza nella pratica
by Fabrizio Lapiello at 17/08/2008 1.31

sono pienamente d'accordo... complimenti per il post, molto interessante!
  
Gravatar # re: La qualità del codice che fa la differenza nella pratica
by Luca Minudel at 17/08/2008 12.54

grazie del tuo feedback !
  
Gravatar # re: La qualità del codice che fa la differenza nella pratica
by Antonio Ganci at 17/08/2008 13.28

E' da tanti anni ormai che scrivo codice cercando di ottenere le qualità che elenchi e l'unico modo efficace che ho trovato è stato l'uso del TDD insieme alle pratiche dello sviluppo agile.
Vorrei lanciare un domanda un pò provocatoria:
E' possibile scrivere un codice (ovviamente di un'applicazione Enterprise, non la classe che fa la media di n numeri) con quelle qualità senza usare il TDD?
Tu o chi leggerà questo commento, ha dei casi concreti da presentare?
  
Gravatar # re: La qualità del codice che fa la differenza nella pratica
by LudovicoVan at 17/08/2008 14.27

Antonio:

> Tu o chi leggerà questo commento, ha dei casi concreti da presentare?

Casi concreti? Pensi che prima del TDD non si facesse sviluppo enterprise?

BTW, a mio avviso il punto 4 della lista di Luca non e' affatto scontato. Sembra accattivante, ma nella pratica IMHO equivale appunto ad avere un codice prematuramente specializzato, non un codice flessibile.

Anyways, my 2c.

-LV
  
Gravatar # re: La qualità del codice che fa la differenza nella pratica
by Antonio Ganci at 17/08/2008 15.18

> Casi concreti? Pensi che prima del TDD non si facesse sviluppo enterprise?

Secondo te io penso questo? :-)
Certo che si faceva e si fa, ma la provocazione era inerente alla qualità del codice ottenuto...
  
Gravatar # re: La qualità del codice che fa la differenza nella pratica
by Luca Minudel at 17/08/2008 15.20

@Antonio

non conosco esempi da citare. personalmente non riuscirei a raggiungere la stessa qualità nenza la guida dei test



@LV

è vero, quello è il punto che mi fa pensare di più e su cui ne ho ancora da imparare.

mi è chiaro che se nel dominio (del problema o della soluzione) ho due concetti e nel codice sono mischiati insieme (nella stessa classe e negli stessi metodi della classe) prima o poi quel codice dovrò modificarlo => meglio tenerli separati

per quanto riguarda le dipendenze il TDD mi porta ad avere classi dipendenti a interfacce e lasciare la crezione delle classi concrete a factory

è in questo secondo punto che se dovessi scegliere i casi in cui farlo e no non saprei come scegliere senza cadere nel codice prematuramente specializzato


  
Gravatar # re: La qualità del codice che fa la differenza nella pratica
by LudovicoVan at 17/08/2008 16.02

@Antonio:

>> Pensi che prima del TDD non si facesse sviluppo enterprise?

> Certo che si faceva e si fa, ma la provocazione era inerente alla qualità del codice ottenuto...

Sicuro, ma l'obiezione resta: pensi che prima dell'"invenzione" del TDD fosse impossibile realizzare applicazioni enterprise di qualita'?

Non e' cosi', e, per *tanti* motivi, alcuni dei quali semplicente contigenti, penso che non ti sorprendera' sentire che a mio avviso vale proprio il contrario.

-LV
  
Gravatar # re: La qualità del codice che fa la differenza nella pratica
by LudovicoVan at 17/08/2008 16.10

@Luca:

> mi è chiaro che se nel dominio (del problema o della soluzione) ho due concetti e nel codice sono mischiati insieme (nella stessa classe e negli stessi metodi della classe) prima o poi quel codice dovrò modificarlo => meglio tenerli separati

Ma a mio avviso e' proprio qui il problema. I due dominii, concettuale e tecnico, non mappano 1-1. Non c'e' quella corrispondenza, ne' sul piano puramente teorico, ne' in pratica.

> per quanto riguarda le dipendenze il TDD mi porta ad avere classi dipendenti a interfacce e lasciare la crezione delle classi concrete a factory

Il TDD secondo me e' uno strumento con grandi pregi e grandi difetti. Il pregio e' che una linea guida semplice e sicura. Il difetto e' che e' come imparare una ricetta per evitare di imparare a cucinare.

> è in questo secondo punto che se dovessi scegliere i casi in cui farlo e no non saprei come scegliere senza cadere nel codice prematuramente specializzato

Perche', IMHO, ti poni il problema di "dove e quando", ma qui si parla di concetti e pratiche che valgono a prescindere. Forse nel codice prematuramente specializzato "ci cadi" proprio perche' ti poni il problema in *quei* termini?

-LV
  
Gravatar # re: La qualità del codice che fa la differenza nella pratica
by Antonio Ganci at 17/08/2008 16.17

> Sicuro, ma l'obiezione resta: pensi che prima dell'"invenzione" del TDD fosse impossibile realizzare applicazioni enterprise di qualita'?

Non lo penso, ma mi piacerebbe vederne una. Fino ad ora non ho avuto il piacere.

> Il TDD secondo me e' uno strumento con grandi pregi e grandi difetti. Il pregio e' che una linea guida semplice e sicura. Il difetto e' che e' come imparare una ricetta per evitare di imparare a cucinare.

Da questa frase però sembra che tu non l'abbia mai usato. Se non sai 'cucinare' lo abbandoni subito perchè non riusciresti a progredire nello sviluppo.

  
Gravatar # re: La qualità del codice che fa la differenza nella pratica
by LudovicoVan at 17/08/2008 16.23

Antonio:

> Da questa frase però sembra che tu non l'abbia mai usato.

Finiscono gli argomenti e cominciamo i complimenti?

-LV
  
Gravatar # re: La qualità del codice che fa la differenza nella pratica
by Antonio Ganci at 17/08/2008 16.34

> Finiscono gli argomenti e cominciamo i complimenti?

Non intendevo offenderti ;-)
> Il pregio e' che una linea guida semplice e sicura

Semplice a parole forse, ma nella pratica è tutt'altro che semplice.
Ho impiegato alcuni anni per padroneggiare la tecnica, ma ancora ora penso di avere molta strada da fare.

> Il difetto e' che e' come imparare una ricetta per evitare di imparare a cucinare.

Potresti argomentare? Così sembra un luogo comune.


  
Gravatar # re: La qualità del codice che fa la differenza nella pratica
by LudovicoVan at 17/08/2008 17.12

Antonio:

>> Finiscono gli argomenti e cominciamo i complimenti?
> Non intendevo offenderti ;-)

Ok ok, e' solo che di questi tempi conviene chiedere prima! :)

>> Il pregio e' che una linea guida semplice e sicura
> Semplice a parole forse, ma nella pratica è tutt'altro che semplice.

Certamente non e' "semplice" in assoluto. E' semplice rispetto all'ingegneria informatica classica.

Il fatto e' che bisogna gia' avere una visione di insieme del processo software per apprezzare queste differenze: l'impatto non e' mai solo sul codice; e' innanzitutto sull'impostazione e sul ciclo di vita dei progetti nel suo complesso, problematiche gestionali incluse.

>> Il difetto e' che e' come imparare una ricetta per evitare di imparare a cucinare.
> Potresti argomentare? Così sembra un luogo comune.

In altre parole direi: non si possono fare paragoni fra il pecorino del contadino amico di mia nonna e il pecorino del supermercato se uno il pecorino del contadino non lo ha mai annusato in vita sua.

(Come glielo spiego alla nuova generazione cosa e' un cannolicchio o un cavalluccio marino in Adriatico, per esempio...)

-LV
  
Gravatar # re: La qualità del codice che fa la differenza nella pratica
by LudovicoVan at 17/08/2008 17.14

Vabbe', l'esempio del cannolicchio lasciamolo da parte che' aggiunge solo confusione... ;)

-LV
  

Your comment:

Title:
Name:
Email:
Website:
 
Italic Underline Blockquote Hyperlink
 
 
Please add 5 and 3 and type the answer here: