Codice e società/Introduzione: Codice e società

Da Wikisource.
Introduzione

../ ../Capitolo 1 IncludiIntestazione 07 giugno 2013 75% Tesi universitarie

Codice e società Capitolo 1

In questa tesi si cercherà di dimostrare l'importanza sociale del codice libero, riconducibile per molti aspetti a ciò che è conosciuto come open source e software libero. Tale argomento necessità di essere introdotto adeguatamente, in modo che possa risultare più agevole la comprensione di ciò che si va argomentando. Per capire cos'è il software dobbiamo capire cos'è il codice che vi sottende, dobbiamo dire cosa intendiamo per libero, e siccome questa espressione della tecnologia implica anche l'apertura del codice (open source), dobbiamo spiegare cosa intendiamo per apertura (open) e cosa intendiamo per sorgente (source).

Di converso dobbiamo spiegare cosa intendiamo per chiusura. Questo breve ma importante preliminare sarà orientato a rendere accessibile questa materia anche ai meno esperti di informatica rinunciando pertanto al rigore ingegneristico. L'intento è di focalizzarne l'importanza sociale di questa espressione della tecnologia informatica, cioè la sua accezione libera ed aperta.

Cos'è il codice?

Ci sono macchine in grado di eseguire delle operazioni che vengono loro richieste. Cioè sono in grado di interpretare delle istruzioni, che banalmente chiamiamo input, e farvi corrispondere un'azione. Queste azioni sono la stampa a video di caratteri alfabetici, piuttosto che elementi geometrici o immagini, avvitare dei bulloni, tagliare delle lastre di marmo, tornire dei pezzi di ferro e via dicendo. Queste istruzioni devono essere fornite alla macchina in modo corretto, o meglio, adeguato da un essere umano. Questa adeguatezza richiede un addestramento, più o meno lungo a seconda del livello in cui si pone l'istruzione. Se l'istruzione è rivolta ad un'operazione complessa basteranno poche ore di formazione, se invece questa istruzione è elementare allora saranno necessari anni di addestramento teorico e pratico.

Questo accade in quanto un'istruzione elementare deve essere inserita coerentemente assieme a molte altre istruzioni elementari in modo che il tutto acquisti un senso operazionale. Ad esempio potremmo chiedere a qualcuno (o a qualcosa) di fare una torta, magari indicando anche il tipo di torta che vogliamo, oppure potremmo indicargli, come in una ricetta, passo per passo tutte le operazioni che devono essere fatte: procurarsi le uova, lo zucchero, la farina e via dicendo.

Quindi se vogliamo ottenere una torta attraverso dei micro-comandi l'operazione sarà molto più complessa. Si pensi poi che anche le operazioni più elementari che riguardano il confezionamento di una torta possono essere ulteriormente semplificate: prendi l'uovo con una mano, sbattilo sul bordo di una terrina, infila i due pollici nella frattura che si è creata nel guscio, aprilo facendone cadere il contenuto dentro la terrina stessa, e via dicendo. In questo modo complichiamo in generale ancor più la comunicazione tra chi impartisce delle istruzioni e chi, o cosa, deve eseguirle.

La complessità è data dalla quantità di istruzioni necessarie, ma anche dalla sequenza logica di tale operazioni. Non possiamo miscelare farina e uova dopo averli messi in forno, sarebbe un disastro. La sola istruzione: “confeziona una torta” non corre alcun rischio di non essere sequenzialmente corretta rispetto a se stessa. Più sono le istruzioni e più aumenta, in modo geometrico, la possibilità di commettere errori.

Sta di fatto che questi diversi modi (livelli) di dare istruzioni coesistono, cioè è possibile premere un tasto che sottende all'istruzione “confeziona un dato numero di torte” perché a priori qualcuno ha micro-istruito (programmato) quel dispositivo. I livelli di programmazione in realtà sono più di due.

Così come le istruzioni, anche gli effetti o risultati (output) possono essere posti su più livelli: “rompere le uova” sarà ad un livello di maggior dettaglio rispetto a “confezionare una torta”. A livello micro (che gli informatici chiamano basso) il processo è più complesso perché aumentano le istruzioni ed aumenta il rischio di invertire la sequenza delle operazioni, ma la complessità aumenta anche perché aumenta il grado di astrazione: è meno immediato il senso che ha “rompere delle uova” rispetto al senso che ha “confezionare una torta”.

Nel campo dell'informatica le cose stanno più o meno così: i livelli che compongono il mio portatile sono principalmente l'hardware con le sue micro-istruzioni cablate nei circuiti logici (cioè istruzione e componente elettronico coincidono, ad una particolare istruzione corrisponde esattamente un pezzo materiale del circuito), raggruppate in istruzioni (linguaggio assembly), a sua volta raggruppate in comandi (sistema operativo), a sua volta raggruppate in programmi applicativi che solitamente corrispondono a settori di attività, come ad esempio il disegno tecnico, piuttosto che la videoscrittura e via dicendo. In sintesi nel campo informatico i livelli dal più basso al più alto sono: linguaggio macchina, linguaggio assembly, sistema operativo, applicativo o programma.

Tanto più ci spostiamo verso verso l'hardware (il ferro in gergo informatico), tanto più il codice organizzato in insiemi di senso compiuto di istruzioni (programmi) diviene complesso, difficile da comprendere e da produrre, ma prezioso perché consente di rendere utilizzabile lo strumento (hardware). Se si dovesse scrivere un programma ogniqualvolta volessimo scrivere una lettera i costi supererebbero i vantaggi. Ma se quel codice viene scritto per più persone, e può essere usato più volte, allora risulta molto conveniente scrivere programmi.

Questo è il codice! Ma come accade che il codice possa essere aperto piuttosto che chiuso?

Il concetto di chiusura è lo stesso del black box. Qualcosa che spesso diamo per assodato funzioni come meglio non potrebbe allo stato attuale delle conoscenze. Qualcosa di cui non ci preoccupiamo e se anche lo facessimo non avremmo, nella maggior parte dei casi, le competenze per intervenire; a volte pur avendo le competenze non ne avremmo il tempo o la volontà. È una macchina opaca che accetta un segnale, o degli ingredienti, e ci restituisce un risultato.

Cosa accada tra quella macro-istruzione e il risultato non ci deve interessare. Tanto quanto ciò che accade dentro quella scatola nera è inaccessibile (opaco) tanto più il codice è chiuso1. È possibile che quel codice sia accessibile ma non sia comprensibile, in questo senso ci troviamo di fronte ad una chiusura cognitiva del codice, a fronte di un'apertura solo tecnica.

È importante ai nostri scopi spiegare questa chiusura tecnica: la chiusura tecnica del codice si raggiunge quando il codice diviene comprensibile solo dalle macchine. La chiusura è quindi un concetto progressivo di livelli. La chiusura implica un carattere selettivo e progressivo: man mano che ci spostiamo verso la disgregazione in istruzioni più piccole, progressivamente escludiamo i meno esperti, fino arrivare al linguaggio macchina, dove anche gli umani più esperti si arrendono e ci si affida completamente alle macchine.

Perché il codice viene chiuso, cioè reso comprensibile solo alle macchine?

Questo avviene principalmente perché il codice comprensibile solo dalle macchine è più efficiente del codice comprensibile sia dalle macchine che dal programmatore. In secondo luogo questo nasconde la tecnologia che altrimenti potrebbe essere appropriata da altri. Il processo di produzione del software si conclude proprio con la chiusura del codice, che tecnicamente si chiama compilazione e ciò viene fatto con altri strumenti software, o programmi che si chiamano compilatori.

Per software intendiamo quindi l'insieme di istruzioni riunite e organizzate in un unico contesto applicativo. Quindi per software si intende ugualmente codice ma in un'accezione più specificatamente orientata ad una situazione o un contesto operativo (applicativo): scrivere, disegnare, fare la contabilità, navigare in rete e via dicendo.

I compilatori sono per l'appunto strumenti, a loro volta software che traducono il codice tecnico, espresso in un linguaggio di programmazione, che per quanto tecnico è pur sempre umano, in linguaggio macchina incomprensibile agli uomini. In realtà ciò che accade è che le istruzioni che si trovano a livello macchina sono talmente parcellizzate che un uomo ci metterebbe anni per interpretare una tale massa di micro-istruzioni, mentre un micro-computer le interpreta in qualche frazione di secondo. La chiusura per così dire è giocata sulla velocità dovuta all'estrema specializzazione del computer rispetto alle normali doti cognitive umane. Il codice può essere aperto quando non viene compilato, o pur essendo compilato per motivi tecnici, assieme al codice compilato, e quindi chiuso, viene fornite anche il codice sorgente, cioè il codice aperto. Il codice sorgente è quindi sinonimo di codice aperto, ma più specificatamente è il programma prima di essere compilato, cioè tradotto in linguaggio macchina. Chi lo detiene può in questo modo modificarlo se ne ha le competenze e quindi ricompilarlo nuovamente.

… e il codice libero?

Il cosiddetto software libero ha una sua accezione storica e ideologica ben consolidata e istituzionalizzata che verrà spiegata più avanti. Per noi il termine codice libero assume il significato di codice non chiuso, codice umano intelligibile, che si diffonde nella rete, che viene continuamente scambiato, adattato e modificato. Per gli scopi di questa tesi il termine “libero” assume un significato autopoietico (Luhmann, 1990)2e non ideologico o filosofico.

Questa sua velocità e mutabilità implica che sia anche aperto. Quella assunta da questi tesi è una posizione ideale che può essere fraintesa a maggior ragione per il fatto che il sofwtare libero in senso istituzionale coincide spesso con il codice libero in senso autopietico. Ma non sempre, il che significa che ai fini sociali la prospettiva cibernetica è più ampia. Ad esempio un algoritmo (un insieme di istruzioni volte a creare un comando a livello più elevato), estrapolato da un contesto applicativo (o semplicemente anche da una discussione tra programmatori in un forum tematico), diffuso nella rete, senza implicazioni etiche o normative, e quindi incluso in un altro contesto applicativo è, ai nostri fini, codice libero (in senso autopoietico), ma non software libero in senso istituzionale.

Perché è socialmente rilevante il codice aperto?

Se il codice posto ad un livello che non sia quello delle macchine, ma nemmeno quello dell'utente finale (colui che non modificherà ulteriormente il software e si limiterà ad utilizzarlo) riguarda in modo elitario gli esperti programmatori quale potrebbe mai essere la sua importanza sociale? Il fatto sta che dando per acquisita l'importanza di internet, ed in particolare del web, il codice libero, è ciò che più di ogni altra cosa, nello spazio virtuale, rappresenta degli artefatti.

Il fatto di poter produrre artefatti attraverso il web senza limitarsi semplicemente a collocarli nella rete, e il fatto che tali artefatti abbiano spesso a che fare con il funzionamento stesso del Web nel suo complesso, fa diventare il codice libero ciò che rende ulteriormente, e profondamente sociale, uno spazio dove non ci si scambiano solamente delle idee, delle informazioni, degli ordini, delle immagini o dei soldi, e non è solo il riflesso o l'estensione di relazioni già esperite in compresenza.

Il codice libero rappresenta in quanto tale una dimensione economica e produttiva dello spazio sociale virtuale, le cui relazioni sono in grado di sostenersi totalmente nel Web. Il codice libero in qualche misura consente lo spazio virtuale e ne accentua ulteriormente il carattere sociale.

Anche il software compilato e chiuso, le immagini e i testi scambiati attraverso operazioni di upload e download (caricamento e scaricamento) caratterizzano in quanto artefatti la dimensione sociale del Web, ma in misura minore, in quanto non vengono prodotti nel Web ma solo collocati nel Web. La differenza sta nel fatto che il processo di produzione di software a partire da codice libero (che circola liberamente nella rete) è strutturato nel web, e che, almeno potenzialmente, chiunque può partecipare e contribuire a modificare il software che ne deriva.

Questa produzione assume peculiarità proprie e modelli di business non immediatamente riconducibili a tipologie industriali classiche. Purtuttavia non vengono meno le caratteristiche della modernità razionale, dell'individualismo e dell'industrialismo che ci consentiranno di dimostrare che tale fenomeno ha solo in parte, e in modo non peculiare, le caratteristiche della post-modernità.

Nel prosieguo di questa tesi si cercherà di dimostrare la rilevanza sociale del codice libero da un lato, ma nel contempo si evidenzierà come i contesti siano sfumati, come nel codice libero non siano nettamente distinguibili i suoi confini, come il codice libero implichi in parte il codice chiuso e viceversa, e come, in definitiva, non sussista una rete esclusiva del codice libero slegato dal software proprietario, dal software libero e dallo stesso codice chiuso che chiameremo, da qui in avanti, proprietario.

Note

  1. Si noti come l'informatica spesso inverta i concetti: ciò che nel gergo informatico è trasparente è ciò che non si vede e quando si opera a livello basso si fanno cose complesse.
  2. I suoi elementi muoiono e nascono in continuazione. Quelli che nascono possono differire da quelli che nascono e quindi il software si trasforma in continuazione. Il sistema di volta in volta alcuni elementi piuttosto che altri. Alcuni trasmetteranno le loro caratteristiche perché grazie alla loro maggiore persistenza avranno più possibilità di replicarsi.