Com\’è dura la professione!

9 febbraio 2009

In perfetta forma

Filed under: Programmazione,Vaneggiamenti — lbell @ 22:51
Tags:

Quando frequentavo le superiori, durante le lezioni di italiano mi era difficile accettare, nonostante gli sforzi degli insegnanti, che la forma di uno scritto potesse avere altrettanta importanza del suo contenuto.

Ora che lavoro nel campo dell’informatica, una disciplina il cui scopo è produrre risultati concreti sotto forma di programmi, strumenti che svolgono una precisa funzione, mi trovo ad apprezzare l’importanza della forma con cui si producono i programmi stessi. E non intendo la forma con cui si presenta il prodotto al cliente, ma quella che viene impiegata nel processo di produzione.
La forma, impersonata da regole, procedure e, appunto, formalismi come l’uso di UML, assume un’importanza in sé durante la stesura del software, anche se entra in gioco solamente come ausilio. Nella produzione di un programma la cura della forma, ironicamente, è indispensabile per la solidità del prodotto.
Il formalismo nell’informatica serve a definire come realizzare un programma e per meglio comprendere in che modo il programma assolve al suo scopo. L’uso di un formalismo si sposa con il vecchio trucco dell’informatica di risolvere i problemi introducendo un nuovo livello di astrazione (il quale a sua volta genera ulteriori problemi).
Il livello di astrazione più basso corrisponde all’utilizzo di un linguaggio di programmazione come strumento per impartire comandi al calcolatore. Si tratta di un linguaggio specialistico che ha molte analogie con il linguaggio comune, ma che è studiato per essere immune da tutte quelle ambiguità e doppi sensi di cui quest’ultimo è dotato e che ne costituiscono la ricchezza. Il linguaggio di programmazione viene utilizzato per fare in modo che il computer possa svolgere in modo del tutto controllato e prevedibile un determinato compito, come ad esempio aprire un cancello, tenere sotto controllo una centrale elettrica o pilotare un aereo. L’uso di un linguaggio in cui un ordine può essere interpretato con ambiguità in modi diversi, causando potenzialmente comportamenti imprevedibili, renderebbe la vita molto meno monotona agli utenti finali, ma forse un tantino più difficile.
Ogni linguaggio di programmazione, e ne esistono a decine, per dar vita ad un programma funzionante viene tradotto con varie modalità in linguaggio macchina, l’unico realmente compreso dal computer. Durante questa operazione quello che era un complesso insieme di idee descritto attraverso l’astrazione del linguaggio, si trova ricondotto a nulla più che una lunga sequenza di banali operazioni logico aritmetiche, e di spostamento di dati, nello stesso modo in cui un libro come “Moby Dick” si trova ricondotto al momento della sua stampa ad una semplice sequenza di lettere e di segni di interpunzione.
L’approccio riduzionistico al software, pur se formalmente corretto, non è certo in grado di restituire la ricchezza di intenti con cui è stato progettato il programma originale, se non al costo di impegno e fatica abissali. Tutti i programmi alla fine si riducono ad una ripetizione di sequenze di pochi tipi di istruzioni in linguaggio macchina, ma una sequenza di “move” o “jmp” ha poco a che vedere con la complessità dell’architettura dei programmi che da tali istruzioni sono costituiti come, ad esempio, un word processor. Dopo tutto quest’ultimo ha a che fare con concetti quali paragrafi, frasi, stili e capitoli. Risalendo nella scala delle astrazioni, una serie di sorgenti scritti in un linguaggio di programmazione non hanno l’espressività immediata di uno schema che descrive il funzionamento di un sistema. Partire a leggere un programma, direttamente dal codice macchina che pure lo costituisce e ne descrive il comportamento, è come esaminare con una lente d’ingrandimento un transatlantico centimetro per centimetro; possibile ma arduo.
Il substrato programmabile grazie al linguaggio macchina è il cuore di un sistema di calcolo, su di esso si costruiscono, mediante un’opera di astrazione, strati successivi di strutture per poter espandere la sua funzionalità. Ogni livello, nonostante sia collegato agli altri, vive di vita propria. Difficile immaginare che la teoria relazionale dei database, un sistema di telecomunicazioni ed un videogioco siano legati tutti dagli stessi codici di base, ma in effetti ciò che li differenzia è solo lo strato di astrazione o l’idea che li ha concepiti. Se si redigesse una statistica sulla base delle istruzioni effettive in linguaggio macchina che compongono tali programmi, probabilmente essi risulterebbero caratterizzati dalla stessa distribuzione.
Ciò che rende speciale l’informatica è il fatto che il calcolatore è uno strumento programmabile e non specializzato nell’eseguire un unico compito. L’hardware stesso di cui fisicamente è composto il calcolatore non esprime preferenze sul tipo di programmi che può far funzionare. Per la macchina un foglio elettronico od un browser internet sono la stessa cosa. Anche le informazioni sono memorizzate in modo da essere indipendenti dalla particolare locazione di memoria ove sono memorizzate e nulla garantisce che la volta successiva che un programma viene lanciato i suoi dati si trovino esattamente nelle stesse locazioni fisiche. La programmabilità della macchina permette l’elaborazione continua di nuovi concetti.
I formalismi sono uno strumento che, sfruttando questa possibilità di plasmare l’informazione, permette l’introduzione di successivi livelli di astrazione e ci permette di concentrarci sul modo migliore di risolvere un problema piuttosto che sui dettagli della modalità di soluzione problema stesso. La forma porta all’astrazione e quindi alla comprensione; per una delle solite strane contraddizioni di questo mondo capita di riuscire a risolvere un problema più facilmente quando ci si allontana da esso.
Nel caso che un livello di astrazione non ci soddisfi appieno, possiamo costruirne un altro sulle basi del precedente in modo da estenderlo e colmare eventuali lacune; cosa allora impedisce una ricorsione infinita? Nel mondo reale le risorse disponibili (tempo, programmatori e ovviamente denaro) sono limitate e quelle impiegate per curare il formalismo vengono sottratte alla soluzione concreta del problema, formando una naturale forza d’attrito che smorza il regresso all’infinito di Zenone.
In matematica, di cui l’informatica è figlia, si possono costruire diversi formalismi che estendendo quelli precedenti permettono di dimostrare proposizioni non decidibili nel formalismo precedente. Nell’informatica, più prosaicamente, attraverso l’uso del formalismo si cerca di aumentare la comprensione delle idee che stanno alla base dell’architettura di un programma. Tra i vari livelli di astrazione si instaura un feedback, dato che la modifica effettuata ad un livello del formalismo si propaga agli altri attraverso le modalità proprie di ogni livello, realizzando uno di quegli anelli di retroazione tanto cari a Hofstadter.
Purtroppo in informatica il formalismo si è spesso trasformato in un mito: l’idea che nella produzione di software basti seguire pedissequamente un formalismo di moda, Agile Programming, UML ecc…, per produrre un programma funzionante e affidabile indipendentemente dalla difficoltà del contenuto o dal suo contesto, è diventata una tentazione irresistibile, ed assomiglia al mito tutto italiano secondo il quale per risolvere un problema basta solamente emanare una legge.

http://it.wikipedia.org/wiki/G%C3%B6del,_Escher,_Bach_-_Un%27eterna_ghirlanda_brillante

http://it.wikipedia.org/wiki/Anelli_nell%27io

http://it.wikipedia.org/wiki/Macchina_di_Turing

http://it.wikipedia.org/wiki/Paradossi_di_Zenone

http://it.wikipedia.org/wiki/Entscheidungsproblem

http://it.wikipedia.org/wiki/Argomento_diagonale_di_Cantor

1 commento »

  1. Finalmente un post degno dei tuoi migliori momenti di riflessione. Molto ben scritto.

    Commento di Andrea — 17 febbraio 2009 @ 10:21 | Rispondi


RSS feed for comments on this post. TrackBack URI

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Blog su WordPress.com.

%d blogger cliccano Mi Piace per questo: