I Prefazione Un kit di sopravvivenza per il terzo millennio Questo libro è concepito per coloro che si ritengono esclusi da un mondo ad alta tecnologia e sono alla ricerca di un modo per entrarvi. Se qualche volta vi siete chiesti cosa si intende per classe Java, file server, Ethernet, World Wide Web, PGP, questo libro vi fornirà le risposte che cercate. Vi hanno detto che avete bisogno di un compilatore, ma per quale motivo? Cosa fa realmente un compilatore? Vi hanno chiesto di far comparire un’immagine su una pagina Web in seguito alla pressione del pulsante “sorpresa”; siete in grado di farlo? Il vostro computer va a 1 gigahertz: un miliardo di cosa al secondo? A proposito, ma che cos’è in realtà un computer? Oggi saper lavorare su un foglio di calcolo e fare clic su una pagina Web non è più sufficiente. Ci sono centinaia di milioni di computer connessi in rete; collegandoci a Internet possiamo entrare in comunicazione con persone e organizzazioni in qualsiasi parte del mondo; abbiamo quotidianamente a che fare con l’informatica nel lavoro, nello svago, nella vita privata. Dobbiamo imparare a conoscere queste tecnologie, a comprenderne l’intima logica di funzionamento, non semplicemente a utilizzarle passivamente. Qualcosa di più di un elenco di fatti Questo libro offre una presentazione generale dell’informatica organizzandola attorno al tema delle “grandi idee” di questa disciplina, ovvero le scoperte, i paradigmi, le soluzioni che per prime attraggono l’attenzione di chiunque si accosti all’argomento; è nostra convinzione che tali “grandi idee” forniscano un ideale percorso di apprendimento. Il libro inizia con una introduzione al World Wide Web, spostandosi poi verso la programmazione Java. L’idea è che se imparate a formattare in HTML le vostre pagine Web, e se sapete programmare l’elaboratore per fargli svolgere alcuni compiti che vi interessano, allora ne avrete veramente compreso il funzionamento. Una volta compresa la programmazione, avrete una notazione e un linguaggio che vi permetteranno di parlare del calcolo automatico e di esplorarne a fondo i meccanismi nascosti. Questa è la seconda area di interesse del libro: capire come funzionano l’hardware e il software che vi forniscono così tanti servizi. Cosa fanno in realtà il sistema operativo, il compilatore, il browser e i programmi applicativi nel momento in cui richiedete un ser- %LHUPDQQSGI xvi Prefazione vizio? Perché agiscono proprio in quel modo particolare? Cosa potremmo aspettarci in futuro? Alcuni capitoli di questo volume sono dedicati all’architettura degli elaboratori, ai meccanismi di compilazione, ai sistemi operativi, alla sicurezza, alle reti, con descrizioni dettagliate di cosa fanno e di come funzionano. La terza area di interesse prende in esame i limiti e le sfide che oggi l’informatica deve affrontare. Quali sono i paradigmi necessari alla comprensione dei problemi più difficili che ci troviamo ad affrontare? Quali problemi potremo risolvere negli anni a venire, anche se attualmente non sappiamo come? Quali problemi invece non sono risolvibili da un computer, né ora né, molto probabilmente, in futuro? Il libro nel suo insieme è stato pensato per fornire una panoramica complessiva sulla computer science, ossia sull’informatica intesa come disciplina scientifica, con un’enfasi sulla comprensione dei problemi più profondi della disciplina. Nel corpo e nella mente Il metodo di insegnamento adottato in questo libro richiede di fare, piuttosto che limitarsi a leggere e ripetere. L’idea è che se vi trovate a svolgere di persona i singoli passi per la creazione di un programma o se simulate a mano un processo, quel meccanismo, assieme alle idee a esso collegate, entrerà in voi, e ne acquisirete una padronanza non solo intellettuale, ma anche, per così dire, “fisica”. Nel libro, dunque, apprenderete i sistemi di database programmandone uno in Java; comprenderete l’architettura di un sistema leggendo e scrivendo codice in linguaggio assembly; capirete i meccanismi di compilazione effettuando a mano una compilazione di frammenti di programmi Java; comprenderete la non computabilità lavorando su prove di non computabilità e imparando a classificare autonomamente i problemi come computabili o non computabili. Questo è l’approccio didattico orientato ai problemi, che ha avuto così tanto successo nelle discipline scientifiche. Un corso di informatica Questo libro è insolito per due aspetti. Esso copre un insieme di argomenti molto vasto (dalla formattazione del testo in HTML alla complessità dei programmi e alla non computabilità) con una profondità relativamente elevata (per mettere gli studenti in grado di risolvere effettivamente problemi specifici nei vari ambiti). Come tale, esso può essere utilizzato in un corso introduttivo per studenti di informatica; gli studenti, in questo caso, possono iniziare il loro percorso formativo con una visione d’insieme della disciplina, andando poi a inserire ogni corso successivo in una collocazione già predisposta dal corso introduttivo. Il libro, tuttavia, può anche essere utilizzato nell’unico corso di informatica sostenuto da studenti di altre discipline; esso fornisce infatti una comprensione concettuale della tecnologia dell’informazione che persone con un buon livello di istru- %LHUPDQQSGI Prefazione xvii zione dovrebbero comunque possedere. Il testo supporta il modello di FITness (Fluency in Information Technology) descritto in un recente studio del National Research Council degli Stati Uniti (Snyder et al. 1999), coprendo gran parte dei concetti di informatica che lo studio ha indicato come indispensabili. Un migliaio di eroi Il volume è il risultato di quindici anni di esperienza nel corso “Great ideas in computer science” (le “grandi idee dell’informatica”) tenuto presso la Duke University e in altri istituti. L’elenco dei ringraziamenti include i molti assistenti e collaboratori che hanno insegnato usando l’approccio delle “great ideas”. (Si consulti, ad esempio, la descrizione di Biermann di questo approccio didattico, seguito presso varie università: “Computer Science for the Many,” Computer 27 (1994): 62–73.) I nostri assistenti e collaboratori hanno fornito un contributo fondamentale aiutandoci a sviluppare un approccio idoneo a introdurre Java, scrivendo molti degli appunti che si sono infine evoluti in questo libro e sviluppando gli esercizi di laboratorio per i nostri corsi. Contributi fondamentali sono stati quelli di Steve Myers, Eric Jewart, Steve Ruby e Greg Keim. Dobbiamo dei ringraziamenti speciali ai nostri colleghi di facoltà Owen Astrachan, Robert Duvall, Jeff Forbes e Gershon Kedem per averci fornito alcune critiche costruttive, conversazioni stimolanti e suggerimenti tecnici. Ben Allen ha preparato alcuni dei programmi Java presentati nel capitolo sulla simulazione. Carrie Liken ha creato alcune delle immagini presenti nel Capitolo 5. Un ringraziamento va anche a David e Jennifer Biermann, Alice M. Gordon, Karl, Lenore e M.K. Ramm, Jeifu Shi, Michael Fulkerson, Elina Kaplan, Denita Thomas, alle migliaia di studenti del corso alla Duke, al lungo elenco di persone che ci hanno aiutati per le prime edizioni, ai nostri redattori Deborah Cantor-Adams e Alice Cheyer e come sempre al nostro gentile editor esecutivo Robert Prior. %LHUPDQQSGI