![]() |
Bibliografia minima |
| Copyright © 1999 dr. Cristiano Sadun - tutti i diritti riservati | |
Tuttavia, credo che un certo "nucleo" di libri, vecchi e nuovi siano realmente da conoscere se si vuole discutere (e usare) a ragion veduta l'OO a tutti i livelli, codifica, design, architettura e project management.
Naturalmente la lista che qui presento - essendo basata sostanzialmente sulla mia esperienza e formazione, sia ufficiale che informale, mancherà di qualche titolo che qualcun'altro potrebbe considerare assolutamente essenziale ed imperdibile. Nel caso, nessun problema: inviatemi una nota per email, e convincetemi che vale la pena rubare il tempo a qualcos'altro per leggerlo... e sarà fatto. La migliore lezione nel nostro campo è, a mio parere, che non si sa mai abbastanza. Nella bibliografia, una [A] rossa indica "articolo" e una [V] rossa indica "volume".
Cosa manca: non ci sono testi essenziali di linguaggi/metodologie/aree di ricerca con cui non sono entrato in contatto in profondità, in cui non potrei far altro che limitarmi a riprodurre titoli senza poter fare alcuna considerazione.
Io non so quale sia il testo-bibbia per COBOL, per esempio, dato che la mia esperienza con i sistemi legacy è stata perlopiù di downsizing e wrapping, quindi non lo troverete qui, anche se COBOL è stato per anni (ed è ancora) un linguaggio essenziale in ambito business/gestionale - leggi, laddove l'informatica paga economicamente in modo diretto ed abbondante. :)
Non c'è granchè, allo stesso modo, sul "management" vero e proprio, anche se la capacità di gestire task e budget è certamente parte del lavoro di qualunque project manager - quindi anche di chi gestisce la produzione di software. Nonostante abbia ormai una qualche esperienza nel campo, non ho una preparazione economica specifica, quindi potrei solo citare le mie fonti, senza riconoscere magari qualche testo invece "essenziale".
Andiamo a incominciare.
Programmazione e tecniche procedurali
L'object oriented programming (OOP) è stata la prima (e per anni l'unica) forma
di object orientation studiata ed applicata.
Si ritiene comunemente che Simula67 (avendo
il costrutto class) sia il primo linguaggio di programmazione con features
OO: l'OOP in quanto tale è quindi un'evoluzione della programmazione
procedurale alla Wirth - in cui viene reso possibile a livello di codice
l'"impacchettamento" di dati e funzioni/procedure che li manipolano in un'unica
entità (la classe/oggetto), maneggiabile appunto come un tutto unico, e in cui è
possibile nascondere esplicitamente dettagli implementativi.
È quindi impossibile capire l'OO senza comprendere i meccanismi di base della
programmazione procedurale: strutture di controllo, assenza di salti espliciti, nozione di
flusso di esecuzione, etc.
Inoltre, nonostante tutto l'OO del mondo, i metodi di una classe sono generalmente pezzi,
piccoli e sperabilmente ben definiti, di codice "procedurale", nel senso che
definisce una procedura od un algoritmo per fornire un certo servizio. Alcuni titoli sono
poi indispensabili per il semplice motivo che costituiscono una summa di algoritmi
e ricette essenziali per fare cose, invece che limitarsi a progettarle. :^)
Come un vero rocker non può non conoscere Elvis, un informatico non può non aver letto l'articolo che in un colpo solo introdusse l'idea di programmazione strutturata, bombardò in teoria e pratica la prassi di programmazione del tempo, e sparò la prima salva (come si legge sul jargon file) di una guerra conclusa non troppo tempo fa e i cui echi si sentono tuttora.
Se Dijkstra sparò la prima salva, Wirth bombardò (implicitamente) con cannonate. Questo titolo, esplorando vari algoritmi con esempi e discussioni di codifica, fornisce esempi pratici (anche se personalmente credo un po' datati) di programmazione procedurale e introduce Pascal.
Ok, ok, è vecchio, datato e conosciuto - ma c'è ancora chi non l'ha letto.. e dimostra che l'informatica è un mestiere serio, ma non necessariamente noioso. :^)
Questi libri sono come un set di cacciaviti - non sai mai quando potrebbero esserti utili - oltre a essere interessanti da leggere, nonostante una prima edizione di oltre trent'anni fa. E Knuth, oltre al rigore e alla chiarezza impressionanti, è un personaggio affascinante - tra l'altro ideatore di TEX e del literate programming.
"C" è un linguaggio di programmazione imprescindibile per chiunque voglia occuparsi seriamente di software in generale, non foss'altro che usarlo è necessario comprendere nozioni di base della programmazione e dell'architettura dei calcolatori. Se Pascal chiarisce la filosofia, C vi permette di metterla in pratica. Inoltre, tanto per fare due esempi, Unix e Windows sono perlopiù scritti in C, e C++, linguaggio cardine dell'informatica moderna, da C discende direttamente, adottandone sintassi e molte caratteristiche semantiche. Infine, questo libro è un esempio prezioso e raramente raggiunto da altri di come un manuale possa essere allo stesso tempo riferimento e tutorial, essere chiaro e accessibile ma non perdere nulla in rigore e precisione.
Se vi serve una FFT o lavorate con matrici o qualunque cosa di numerico, questo è il libro da cui partire!
Attenzione che, però, c'è chi indica che l'approccio del volume sia tale che, tra accuratezza e semplicità, la seconda sia spesso privilegiata; e indica diverse vie alternative. Trovate qui una discussione al riguardo.
Software Engineering
Cos'è il software engineering? Se l'idea di base è comprendere che la costruzione di
sofware poco più che banali è un processo che necessita di tecniche formali e semiformali
a causa della sua complessità, l'applicazione di questo principio passa da opportune teorie e
strumenti pratici concreti che tale costruzione permettano.
Come in ogni campo dell'informatica, l'evoluzione è ed è stata rapida e continua. E come in
ogni campo scientifico, tale evoluzione implica sia la comprensione degli errori del passato che
l'incapsulamento di teorie precedenti in nuovi apparati teorici più avanzati e - sperabilmente -
funzionali.
Essendo una disciplina sia teorica che concreta, lo stato dell'arte in s.e. dipende in modo molto forte
dal momento storico e dalle tecnologie/pratiche disponibili. La stessa "object orientation" dà luogo sia a pratiche di analisi, design e programmazione che a metodologie di software engineering.
Alcune pietre miliari esistono, comunque, e per quanto sopra non si può prescindere da certi apparati formali che, a mia opinione, devono far parte del bagaglio di chiunuque vada più là della programmazione di un DSP. E in certi casi, servono anche per quella.
Quasi trent'anni fa, Brooks gestì lo sviluppo di OS/360, sistema operativo "mostro" realizzato
per lo più in assembler dallo sforzo congiunto di centinaia di programmatori. Se le lezioni
allora imparate, ed esposte perfettamente in questo piccolo libro, fossero conosciute (anche vagamente)
ed applicate da sedicenti "project manager" tutt'oggi, probabilmente molti meno progetti
finirebbero in qualche forma di fallimento. La lezione principale è "non si può scambiare
tempo con programmatori" - e c'è molta gente in giro che ancora non l'ha capito.
Tra le tante, rimarcabile la frase (approx. tradotta) "e' interessante come gli ultimi studi sembrino
indicare un notevole aumento di produttività quando vengono applicate tecniche di
programmazione strutturata". Forse è l'unica frase datata.
Quest'articolo introduce il modello di sviluppo a cascata, che Boehm elaborerà successivamente elaborerà in quello a "spirale". Nonstante questo modello - specie se abbinato a tecniche OO - abbia notevoli svantaggi (essendo basato su impostazioni sostanzialmente non reali), è talvolta ancora oggi è l'unica forma di development management praticata; inoltre, rappresenta il primo tentativo vero e proprio di "ingenerizzazione" del software. Va quindi conosciuto, o sostiuito con un'equivalente introduzione al modello waterfall che si trova in quasi tutti i testi di sw-eng.
Introducendo i "punti funzione" dà un'idea di cosa una metrica del codice e introduce l'idea di valutazione di complessità del codice stesso. Come per l'articolo di Bohem, può essere sostituito da un'introduzione in un buon testo di sw. eng.
Software Design
Il software design sarebbe, effettivamente, una sottoarea del software engineering. Tuttavia, soprattutto in ottica object-oriented, è una parte talmente importante - e distinta dal management vero e proprio - che richiede, a mio parere, una sezione opportuna. Quando si parla di "object orientation" il più delle volte ci si riferisce all'OOA/D - la modellazione ed il disegno
di sistemi software in termini di classi, oggetti e loro relazioni.
Nonostante non risolva affatto tutti i problemi, l'object orientation, nelle sue varie incarnazioni, è la migliore disciplina di software engineering che al momento abbiamo a disposizione - e quella più "viva" e in evoluzione. Non per nulla questo sito è ad essa dedicato! ;-)
Volumi come quello di Wirth avrebbero potuto entrare in questa sezione, ma ho preferito concentrarmi qui sul design moderno, ad oggetti.
Booch è un guru riconosciuto del mondo OO, e le sue considerazioni e pubblicazioni hanno spesso anticipato o chiarito problemi e caratteristiche tipiche di questo mondo. Inoltre, insieme a Rumbaugh e Johnson, è l'ideatore "ufficiale" di UML, da cui non si può (e non si deve! :) prescindere per fare design a oggetti. La sua introduzione all'OOA/OOD resta a mio parere un classico.
Che dire di questo volume? È stato il primo ad introdurre ufficialmente l'idea di pattern, un passo essenziale nell'evoluzione dell'OO, ed è valido sia come introduzione che come riferimento per i numerosi pattern in esso descritti. Nonostante molte copie, è come la Settimana Enigmistica: inimitabile - e imperdibile.
L'uomo può essere vagamente antipatico :), ma la bontà di questo overview su concetti e tecniche OO è fuor di dubbio, soprattutto visto che Meyer è l'inventore di una buona parte di esse. Si può non essere d'accordo su tutto (ma questa è buona pratica - non è affatto detto che quanto sta "scritto in un libro" sia necessariamente condivisibile.. anche se qualche buona probabilità c'è, specie rispetto a quanto sta scritto in un sito WWW ;-), ma Meyer espone - oltre alle discussioni concrete - un buon esempio di come si possa efficacemente affrontare l'argomento OO. L'unica cosa da tenere presente: Meyer commercializza il suo linguaggio (Eiffel) ed il suo ambiente di sviluppo, e talvolta ciò gli fornisce (a mia personalissima opinione) una spinta molto forte ad evidenziare i difetti degli altri - specie se hanno maggiore successo commerciale. Ma le sue critiche hanno sempre un fondamento tecnico rigoroso, e non sono mai banali. Da leggere.
Chiunque si occupi di software engineering OO oggi, non puoò prescindere da UML, che raccoglie e uniforma le migliori caratteristiche delle metodologie (più precisamente, dei linguaggi per metodologie) emerse negli anni 90. UML è vasta e tuttora in evoluzione: questo volume ne costituisce un'introduzione eccellente e fotografa le caratteristiche d'uso più immediate e concrete. Inoltre lo stile di Fowler è informale e divertente, rendendolo anche piacevole da leggere. E non è poco..
Networks
A meno che non viviate chiusi nel centro EDP di una società assicurativa del Congo (con tutto il rispetto del caso, s'intende), sviluppare o gestire software oggi significa misurarsi, prima o poi, con reti di calcolatori. X/25, TCP, SNA o quant'altro si voglia usare, far parlare due calcolatori distanti una stanza o migliaia di chilometri è un'esigenza che accomuna segretarie, direttori generali e scienziati in laboratori di ricerca. Qui trovate i testi che reputo essenziali, se non come lettura generale, almeno come riferimento da avere sempre a portata di mano.
Ogni volta che il mondo delle reti avanza, l'inossidabile Andy avanza con lui, e produce un libro anche migliore del precedente. La seconda edizione era concentrata sul modello OSI (a sua volta "cliente" dell'IBM SNA) che pareva essere la promessa degli anni '80. Poi Internet uscì delle università, e sappiamo come è andata a finire. Le reti TCP dilagano, e questo volume si concentra su un modello più astratto e generale ma maggiormente riconducbile a IP. C'è veramente tutto - anche una concisa e ottima sezione sulla teoria del segnale, una discussione sui sitemi cellulari e su ATM - e il rigore e la chiarezza espositiva di Tanenbaum sono leggendarie.
Sempre di più "rete" (LAN o WAN o sottospecie a piacere) fa rima con TCP/IP. Certo, reti X/25 sono tutt'ora in uso - ed altri sistemi per reti locali sono ancora diffusi e operativi, ma ormai un'implementazione di TCP non si nega neanche al mainframe più antidiluviano (a meno della sicurezza, si intende ;-). E in effetti, TCP è efficiente, veloce da implementare e semplice da configurare, insomma ha parecchi vantaggi, non ultimo quello di supportare la rete di calcolatori più grande del mondo. Insomma è da conoscere, e questi volumi vi diranno tutto e di più.
Computer Science
Non si può lavorare nell'informatica senza avere un minima preparazione teorica; o meglio, si può ma i risultati sono spesso disastrosi. Data per scontata una certa preparazione matematica, logica e applicativa (di solito ottenuta con dei corsi di Fisica), per comprendere e usare al meglio la tecnologia è necessario avere almeno un'idea, se non una preparazione formale, delle teorie e dei sistemi concettuali che ci stanno dietro. Nel mare magnum dei libri e paper scientifici e di ricerca, presento qui quelli che, a mio parere, sono fondamentali. Una bibliografia completa da sola richiederebbe un volume, quindi per forza di cose molti articoli sono rappresentativi di intere aree teoriche (per esempio, Garey-Johnson per la complessità computazionale e l'NP-completezza), ma di solito sono punti di partenza - dalle loro bibliografie potrete trovare tutti gli approfondimenti del caso.
La teoria degli automi e dei linguaggi formale, e le idee sulla computabilità e le funzioni ricorsive possono sembrare esoteriche, ma sono essenziali per capire cosa si può o non si può chiedere ad un calcolatore, almeno in prima ipotesi. Nessuno vi chiederà mai di usare una macchina di Turing con il formalismo di Turing, ma anche solo avere un'idea di cosa è calcolabile e cosa no è decisamente utile. Questo volume dà un'introduzione accurata, rigorosa e ragionevolmente completa e leggibile.
Le idee sulla complessità sono uno strumento essenziale, anche se non tecnologico, per fare scelte efficaci nella costruzione del software. Costo computazionale in spazio e tempo, scelta di algoritmi, conseguenze di scelte di design possono essere valutate solo se si tiene presente che non tutto ciò che è teoricamente computabile lo è in concreto (e viceversa!). Questo volume si spinge oltre, presentando qualche livello delle gerarchie di complessità e la nozione di riducibilità polinomiale, evidenziando i punti assodati e quelli aperti, dando un catalogo di problemi la cui complessità è nota ed, infine, come si legge nella divertente introduzione - dandovi un ottimo motivo per non essere licenziati nel caso vi chiedano di fare l'impossibile. E soprattutto, mettendovi in grado di riconoscerlo.
Il "dragon book" fornisce rigorosamente la teoria di base per il parsing di linguaggi formali e le tecniche di compilazione, con esempi chiari e illustrativi. Anche se non è da leggere prima di addormentarsi, è ragionevolmente chiaro e leggibile.
È esplicitamente vietata la riproduzione con ogni mezzo, il mirroring e l'uso per scopi commerciali di questa pubblicazione completa o in parte, senza l'esplicito consenso scritto dell'autore.
La stampa e/o riproduzione e/o distribuzione su carta di tutto o parte di questo documento sono permesse a patto che tali copie non siano prodotte a scopo di profitto o ad uso commerciale, e che questa nota
siano interamente stampate e/o riprodotte e/o distribuite in modo chiaro e visibile insieme al testo.
© Copyright 1999 dr. Cristiano Sadun - tutti i diritti riservati