Ho provveduto a pubblicare su Lulu.com il libro nel quale sono raccolte le considerazioni, e i post scritti in questo blog sulla programmazione C++. Il libro è disponibile al seguente collegamento ipertestuale:
http://www.lulu.com/spotlight/MaxShire
In formato Ebook con immagini.
In questo blog si parla di programmazione con il linguaggio C++, i post cercheranno di essere molto esplicativi sull'argomento trattato.
sabato 8 febbraio 2014
lunedì 13 gennaio 2014
Efficienza
Alcune persone ritengono
che le ottimizzazioni premature per un sistema sono la radice di ogni
male. Al contrario, l'efficienza deve essere tenuta a mente durante
gli sforzi di progettazione ed implementazione. Comunque non
significa che il progettista deve preoccuparsi delle micro
efficienze, ma deve considerare l'efficienza di primo ordine. La
migliore strategia per produrre efficienza è la pulizia e una
progettazione semplice. Solo questo tipo di progettazione può
rimanere relativamente stabile durante il ciclo di vita del progetto,
e serve da base alla calibrazione delle performance. Evitare il
gigantismo che si nota nei progetti di grandi dimensioni è
essenziale. Troppo spesso le persone aggiungono delle funzioni “solo
in caso che”, e finiscono per duplicare o quadruplicare le
dimensioni del programma, ed il tempo di esecuzione ne soffre. La
cosa peggiore è che sistemi troppo elaborati, sono difficili da
analizzare, e diventa difficile distinguere le componenti evitabili
da quelle inevitabili. Quindi l'analisi di base e l'ottimizzazione
viene scoraggiata. L'ottimizzazione deve essere il risultato delle
analisi e delle misure delle performance, non una modifica a caso del
codice. Specialmente per sistemi di grandi dimensioni le intuizioni
del programmatore o del progettista non fanno da guida per
l'efficienza del sistema. E' importante evitare costruzioni
inefficienti di per sé, e attenzione nell'ottimizzare un livello
accettabile di performance. Similarmente, è importante minimizzare
l'uso di costrutti e programmi non portabili, in quanto condannano il
programma ad essere eseguito su vecchi (meno potenti e/o più
costosi) computer.
sabato 4 gennaio 2014
Manutenzione del software
La parola “manutenzione” è fuorviante in quanto
suggerisce un'analogia con l'hardware; ma il software non ha bisogno
di essere lubrificato, né vi sono parti in movimento che si usurano,
o vi sono crepe nelle quali l'acqua possa accumularsi, e fare
ruggine. Il software può essere copiato esattamente, ed inviato a
lunga distanza con un costo quasi nullo.
Le attività che sono note come manutenzione del
software sono in realtà
ri-progettazioni e re-implementazioni che avvengono durante il normale
ciclo di sviluppo. Quando la flessibilità, l'estensione e la
portabilità sono enfatizzate durante la progettazione, le sorgenti
tradizionali dei problemi di manutenzione sono coinvolti
direttamente.
Come i test, la
manutenzione non deve essere ritardata o separata dallo sviluppo
principale del sistema. In particola, è importante avere una certa
continuità nel gruppo di persone coinvolte nel progetto. Non è
facile trasferire la manutenzione ad un gruppo di persone nuove che
non hanno avuto collegamenti con i progettisti e gli sviluppatori
originali. Quando sono necessari cambiamenti di grandi dimensioni, ci
deve essere enfasi nel trasferire le conoscenze e la comprensione
della struttura del sistema attuale alle nuove persone coinvolte. Se
la “squadra manutenzione” si domanda quale sia l'architettura del
sistema e vien lasciata da sola a domandarsi come debbano essere
fatte le modifiche e la loro implementazione, la struttura si
deteriora rapidamente sotto il peso delle nuove patch
locali. La documentazione tipicamente deve includere i dettagli
necessari per aiutare le nuove persone a comprendere le idee ed i
principi chiave.
martedì 31 dicembre 2013
Testing
Un programma che non è stato testato non funziona.
L'ideale di progettare e verificare un programma funzionante in prima
battuta non è ottenuto per la maggior parte dei programmi. Dobbiamo
puntare verso l'ideale, ma non dobbiamo pensare che queste verifiche
siano semplici.
“Come testare?” - E' una domanda alla quale non
si può dare una risposta generale; “Quando testare?”, invece ha
una risposta semplice, presto ed il più spesso possibile. Le
strategie di prova possono essere generate come parte della
progettazione e degli sforzi d'implementazione, o sviluppate in modo
parallelo ad essi. Ritardare un testing serio sino al termine
dell'implementazione è una prescrizione data per consegne ritardate
e rilasci incompleti.
Quando è possibile il sistema deve essere
progettato specificatamente per essere facile da verificare; in
particolare i meccanismi di test possono essere inclusi all'interno
del sistema stesso. A volte non viene realizzato a causa della paura
di creare costi eccessivi ed una ridondanza non necessaria del codice
quando si tratta di fare test di consistenza di grandi strutture
dati. Questa paura è mal riposta, in quanto l'eccesso di codice
necessario per i test, può essere rimosso prima della consegna del
sistema. I commenti sono qualcosa di utile in questo caso. Più
importanti di una serie di test è l'idea che la struttura di un
sistema debba avere una possibilità ragionevole per convincere noi
stessi e i nostri clienti che possiamo eliminare gli errori
attraverso un controllo statico, una analisi statica e le verifiche.
Quando una strategia per una tolleranza all'errore viene sviluppata,
una strategia di test può essere sviluppata come complementare e
vicina al relativo aspetto del sistema completo. Se la fase di
testing viene scartata durante la progettazione, durante i test,
quindi poco prima della consegna, potrebbero risultare problemi di
manutenzione. L'interfaccia tra le classi e le loro dipendenza sono
un buon punto per iniziare a lavorare sulla strategia di test.
Determinare quanto verificare è di solito
difficile. Comunque, poche verifiche sono un problema più comune
rispetto all'eccesso; esattamente quante risorse debbano essere
allocate per i test confrontandoli con la progettazione e
l'implementazione dipende dalla natura del sistema. Comunque come
regola di massima, si suggerisce di allocare più risorse all'inizio
dello sviluppo del sistema per verificarlo. I test inoltre devono
essere focalizzati sui problemi che hanno conseguenze disastrose e
che occorrono con frequenza.
lunedì 30 dicembre 2013
Uso dei modelli
Quando si scrive un
articolo, è necessario trovare un modello adatto da seguire.
Piuttosto che cercare di trovare articoli che trattano lo stesso
argomento. Bisogna trovare una struttura adatta all'argomento
trattato. In questo modo è possibile modificare il testo in modo da aggiungere frasi, informazioni e dettagli in modo logico, senza dover
alterare la struttura di tutto l'articolo. L'uso di sistemi già
esistenti per realizzare nuovi progetti è la norma piuttosto che
l'eccezione in tutte le forme di costruzione creativa. Quando è
possibile, la progettazione e la programmazione devono essere basate
su lavori precedenti. I limiti di questa libertà consente al
programmatore di basare la propria attenzione solo su pochi argomenti
alla volta. Iniziare un progetto principale, “dalla bozza su
carta” può essere divertente. Comunque spesso una descrizione più
attenta di questo fenomeno è “ubriacante” e il risultato conduce
a progetti alternativi lasciati a metà. Avere un modello non è una
costrizione e non richiede che il modello sia seguito fedelmente;
libera semplicemente il designer dal considerare un aspetto del
progetto alla volta.
L'uso dei modelli è
inevitabile, in quanto il progetto verrà sintetizzato
dall'esperienza di tutti i progettisti. Avere un modello esplicito
rende la scelta di un modello una decisione cosciente, fa assunzioni
esplicite, definisce un vocabolario comune, fornisce una struttura
iniziale per il progetto, e aumenta la probabilità dei progettisti
di ottenere un comune approccio. Naturalmente la scelta del modello
iniziale è un passo importante in fase di progettazione e spesso può
essere fatto solo dopo una ricerca di modelli potenziali e attenta
valutazione delle alternative. Inoltre in molti casi è adattabile
solo dopo una comprensione delle modifiche necessarie per adattarlo
alle idee particolari della nuova applicazione.
La progettazione del
software è complessa, bisogna cercare maggior aiuto possibile. Non
bisogna rifiutare l'uso di modelli con sdegno liquidandoli come
“imitazioni”. L'imitazione è una forma di appiattimento, ma
l'uso di modelli provenienti da precedenti lavori è d'ispirazione,
nei confini definiti dalla legge del copyright, è una tecnica
innovativa che funziona in tutte le arre di lavoro. Alcuni
definiscono questo uso di modelli come “riuso del progetto”.
E' una buona idea per il
progettista conoscere tutte le soluzioni popolari esistenti per una
cerca applicazione. Come programmatore si preferisce le soluzioni che
abbiano del codice associato ad esse come esempio concreto. Le
persone che usano delle soluzioni standard spesso usano un
vocabolario specializzato per comunicare tra loro stesse.
Sfortunatamente
questo può diventare un linguaggio privato che tende ad escludere
degli estranei dalla comprensione; è essenziale assicurare una
comunicazione adatta tra le persone coinvolte nelle diverse parti del
progetto, e anche con la comunità dei progettisti e programmatori
nell'insieme. Ogni sistema di grandi dimensioni che ha successo è la
ri-progettazione di un sistema di minori dimensioni. Non esistono
eccezioni a questa regola. L'esempio più prossimo che si possa fare
è quello di sistemi che hanno fallito e sono rimasti impanatati per
anni con grandi costi, poi eventualmente sono diventati successi
negli anni successivi alla loro data di completamento. Questi
progetti casualmente e spesso inavvertitamente, hanno dapprima
costruito una rete di sistemi non funzionanti, quindi sono stati
trasformati in un sistema funzionante, e finalmente la
ri-progettazione ha raggiunto gli scopi iniziali. Questo implica che è
una follia progettare grandi sistemi direttamente dalla bozza.
Maggiori sono le dimensioni del sistema da costruire, maggiore
importanza avrà il modello con il quale si lavora. E per sistemi di
grandi dimensioni, il solo modello accettabile deve essere un sistema
più piccolo ma funzionante e simile ad esso.
giovedì 29 agosto 2013
Il ciclo di Sviluppo
Sviluppare un sistema è un'attività iterativa. Il
suo ciclo principale è formato da ripetuti passi attraverso la
sequenza:
- Esaminare il problema;
- Creare un progetto generale;
- Trovare componenti standard (e personalizzarli per il progetto);
- Creare nuovi componenti standard (personalizzarli per il progetto);
- Costruire il progetto.
L'analogia da usare, è la linea di assemblaggio di
un'auto. Per il progetto in generale, deve esistere il design della
nuova auto da creare. Poi si passa alle caratteristiche da fornire
alla nuova auto definendone le proprietà nel dettaglio. Decidere
quali proprietà sono volute, o fornire una linea guida di quali
proprietà si vuole ottenere. Se ben realizzata questo tipo di lavoro
viene svolto da una sola persona illuminata, e spesso viene chiamata
vision. E' abbastanza comune
per progetti privi di obbiettivi chiari di fallire per l'una o
l'altra ragione. Il primo passo da considerare è quali componenti
sono disponibili nell'inventario aziendale, o acquistabili da
fornitore. I componenti trovati devono quindi trovare posto nella
realizzazione della nuova auto, ma posso anche non essere del tutto
adatti. Tuttavia si può pensare che “al successivo lancio”, i
componenti saranno stati modificati per adattarsi all'auto. Ad
esempio si può trovare un motore delle dimensioni adatte, ma che sia
di potenza minorata. Il fornitore del motore potrebbe aggiungere una
turbina per compensare alla potenza mancante, ma ciò non deve
influenzare il disegno di base del motore.Nel caso dello
sviluppo del software le classi polimorfiche e i templates sono
utilizzati come componenti personalizzabili. Tuttavia non è facile
creare estensioni arbitrarie a queste classi senza previsione o
cooperazione da parte del gestore di queste classi. Da notare che
questo modello di sviluppo funziona solo quando si ragiona a lungo
termine; se il vostro orizzonte riguarda solo il prossimo rilascio
del software, la creazione e la manutenzione delle componenti
standard non ha senso. Questo tipo di organizzazione riguarda
compagnie la cui vita abbia la durata di molti progetti, le cui
dimensioni richiedano l'investimento in questa attrezzatura extra
(per la progettazione, programmazione, gestione dei progetti) e
formazione ( di programmatori, progettisti e manager). Si tratta di
una struttura base di una fabbrica di software. Inoltre i componenti
standard non possono essere considerati come universali.
Puntare all'universalità in un progetto iniziale è la ricetta
sicura per il fallimento; uno dei motivi per la creazione del ciclo
di sviluppo è quello di ottenere esperienza.
giovedì 22 agosto 2013
Il processo di Sviluppo
Lo sviluppo del software è un processo iterativo ed
incrementale. Ogni passo del processo è rivisto ripetutamente
durante lo sviluppo, ed ogni revisione rifinisce il prodotto finale.
In generale, il processo non ha un inizio ed una fine. Quando si
progetta e implementa un sistema, si comincia da una base formata da
librerie, progetti e applicazioni scritte da altri. Quando si finisce
si lascia il grosso della progettazione e del codice ad altri per
essere rifinito, e portato su altri sistemi. Naturalmente ogni
progetto specifico ha un inizio e un termine, ciò è importante per
definirne l'obiettivo e le dimensioni nel tempo. Comunque la pretesa
di cominciare da zero può causare seri problemi. Inoltre la pretesa
di una data di consegna inderogabile causa seri problemi ai propri
successori. Il processo di sviluppo è formato da tre livelli:
- Analisi, definire l'obiettivo del problema da risolvere
- Progettazione, creare una struttura generale del sistema
- Implementazione, scrivere e verificare il codice
Si ricordi la natura iterativa di questo processo,
in quanto i tre livelli non sono in ordine: Da notare che alcuni
aspetti maggiori del programma di sviluppo non sono in livelli
separati perché si tratta di processi pemeabili tra loro.
- Sperimentazione
- Verifica con test
- Analisi della progettazione ed implementazione
- Documentazione
- Gestione
La “gestione” del software è quella che ha
maggiori iterazioni nel processo di sviluppo; è importante che
analisi, progettazione ed implementazione non siano troppo staccate
tra loro nel programma di sviluppo, e le persone coinvolte
condividano le proprie conoscenze e comunichino effettivamente. In
progetti di grandi dimensioni, spesso non accade. Gli individui si
spostano da un livello all'altro durante il progetto, il solo modo di
trasferire queste informazioni è la testa delle persone. Tuttavia le
compagnie tendono a creare delle barriere tra i progettisti di
maggiore calibro come protezione dal licenziamento, e per esempio,
coloro che sono semplici programmatori. Le persono dovrebbero essere
incoraggiate a condividere le informazioni tra loro, attraverso una
etichetta con un grado di formalità appropriato.
Iscriviti a:
Post (Atom)