La cattedrale e il bazaar
La cattedrale e e il bazaar
di Eric S. Raymond
Original Date: 1998/11/22 04:01:20
Traduzione di Alessandro Forghieri
$Date: 1999/07/14 14:27:03 $
In questo articolo, esaminerò l'anatomia di un progetto
open-source di
successo (fetchmail), che è stato deliberatamente condotto come un
esperimento per mettere alla prova alcune sorprendenti teorie
sull'ingegneria del software che sono suggerite dalla storia di Linux.
Questo articolo discute tali teorie in termini di due modelli di
sviluppo fondamentalmente diversi: il modello 'a cattedrale' tipico
della maggior parte del mondo commerciale, e il modello 'a bazaar'
del modo Linux. Mostrerò che questi modelli derivano da
interpretazioni antitetiche di quella che è la natura del debugging
(correzione di errori) . La tesi che cercherò di dimostrare, partendo
dall'esperienza Linux, è espressa dalla frase ``Se ci sono abbastanza
occhi, tutti i bachi (errori) sono facili''. Questo suggerirà
interessanti
paragoni con sistemi ad autocorrezione costituiti da agenti "egoisti";
concluderò esplorando le possibili conseguenze di queste circostanze
nel mondo dello sviluppo del software.
Contenuti
1 La cattedrale e il Bazaar
2 La posta deve arrivare
3 L'importanza di avere utenti
4 Rilascia presto, rilascia spesso
5 Quando una rosa non è (più) una rosa?
6 Popclient diviene Fetchmail
7 Fetchmail cresce
8 Altre lezioni imparate da Fetchmail
9 Condizioni necessarie per lo stile Bazaar
10 L'ambiente sociale del software Open-source
11 Ringraziamenti
12 Altre letture
13 Epilogo: Netscape entra nel Bazaar!
14 Versioni e modifiche
1 La cattedrale e il bazaar
Linux è sovversivo. Chi avrebbe pensato, anche solo cinque anni fa,
che un sistema operativo serio potesse scaturire, come per magia,
dagli sforzi a tempo perso di molte migliaia di programmatori
dispersi per il pianeta e collegati solo dal tenue collante di
Internet?
È certo che io non ci pensavo assolutamente. Nel momento in
cui
Linux è comparso sui miei radar, nel 1993, avevo lavorato per una
decina anni su Unix e nello sviluppo open-source, ed ero stato uno
dei primi a dare il mio contributo a GNU alla metà degli anni
80. Avevo già rilasciato una buona quantità di
software open-source
in rete, come autore o coautore di diversi programmi (nethack, Emacs
VC e GUD, xlife, e qualche altro) che sono ancora usati oggi. E,
perciò, credevo di sapere come funzionavano le cose.
Linux sovvertì gran parte di quello che credevo di sapere. Per lungo
tempo a avevo praticato il Vangelo Unix sugli strumenti piccoli, la
prototipazione rapida e programmazione evolutiva. Nello stesso tempo
pensavo che esistesse un livello di complessità oltre il quale era
obbligatorio passare ad un modello centralizzato: pensavo che il
software più importante (sistemi operativi o programmi di una certa
mole, come ad esempio Emacs) dovessero essere costruiti come lo
furono le cattedrali, con arte sopraffina da maghi isolati o da
piccoli gruppi di adepti in splendido isolamento, senza che neppure
una beta fosse rilasciata prima che arrivasse il momento.
Il modo di sviluppare di Linus Torvalds - rilasciare presto e spesso,
delegare il più possibile, essere aperti fin quasi alla promiscuità
- era per me sorprendente. Non c'era nulla dell'atmosfera della
cattedrale: piuttosto, la comunità di Linux assomigliava ad un
grande, assordante bazaar di piani di lavoro e approcci differenti
(ben rappresentati dai siti di archiviazione di Linux, che accettano
contributi da chiunque). Mi sembrava che l'unico modo in cui un
sistema stabile e coerente poteva emergere da questo agitato bazaar
fosse una successione di miracoli.
Fu perciò con grande meraviglia che constatai che questo bazaar,
apparentemente, funzionava, e bene: man mano che mi familiarizzavo
col luogo, non solo lavoravo a progetti individuali, ma cercavo di
capire come mai il mondo di Linux, invece di disintegrarsi nel caos,
sembrasse procedere da un successo all'altro a velocità ignote ai
costruttori di cattedrali.
Verso la metà del 1996 cominciavo a pensare di essermene fatto
un'idea, e il caso mi diede il perfetto strumento per mettere la mia
teoria alla prova, sotto forma di un progetto open-source che decisi
di condurre secondo lo stile bazaar.
La storia di tale progetto, e del su successo, è l'argomento del
resto di questo articolo,e la userò per proporre modelli di
sviluppo open-source. Non tutto quello che dirò l'ho imparato nel
mondo Linux, ma, come vedremo, nel mondo di Linux esse vengono messe
a buon frutto in modo singolarmente efficace.
Spero che questo esempio possa aiutarvi a capire cosa ha reso la
comunità di Linux una tale sorgente di ottimo software, e, magari,
darvi qualche idea su come migliorare la vostra produttività.
2 La posta deve arrivare
Era dal 1993 che gestivo la parte tecnica di un piccolo Internet
Service Provider (Chester County InterLink - CCIL) di West Chester,
in Pennsylvania. (Io fui uno dei membri fondatori di CCIL, nonché
l'autore del nostro software di messaggeria elettronica, che potete
provare collegandovi via telnet a locke.ccil.org
, e che oggi supporta circa tremila utenti
su trenta linee.) Questo lavoro mi consentiva - anzi, mi imponeva -
di essere in rete 24 ore al giorno attraverso la linea dedicata a
56K di CCIL.
Così, mi ero abituato ad avere un servizio di posta Internet
praticamente istantaneo. Per motivi che non vale la pena spiegare,
era difficile ottenere un buon collegamento SLIP tra la mia macchina
di casa (snark.thyrsus.com) e CCIL. Quando alla fine riuscii ad
ottenerlo, scoprii che collegarmi in telnet per leggere la posta era
piuttosto noioso: avevo bisogno di qualcosa che scaricasse tutta la
mia posta su snark in modo da poterla leggere e gestire localmente.
Il semplice forward contemplato da sendmail non avrebbe funzionato,
perché la mia macchina è spesso scollegata e non ha un
indirizzo IP
statico: quello che ci voleva era un programma che utilizzasse il
mio collegamento SLIP e trasferisse la mia posta permettendo poi la
consegna locale. Sapevo bene che esistevano programmi del genere, i
quali normalmente usavano un semplice protocollo applicativo detto
POP (Post Office Protocol); e infatti nel sistema operativo (BSD/OS)
in uso al CCIL c'era un bellissimo server POP3.
Ora mi serviva un client POP3, e sulla rete ne trovai uno già pronto
(tre o quattro, per la verità). per un po', usai pop-perl, al quale
però mancava la capacità - apparentemente ovvia - di modificare
l'intestazione dei messaggi in modo da rendere possibile rispondere
correttamente.
Il problema era il seguente: supponiamo che Joe - su locke - mi invii un
messaggio, che io recupero da snark. Se l'intestazione del messaggio
non viene modificata, al momento di rispondere il mio programma di
posta cercherà di mandarlo a un tale `Joe', utente di snark, che in
realtà non esiste. Aggiungere a mano `@ccil.org' a tutti gli
indirizzi divenne rapidamente una gran seccatura.
Questo era un compito adatto ad un computer: ma nessuno dei client
POP che avevo trovato sapeva come occuparsene. E questa è una prima
lezione da imparare:
1. Ogni buon prodotto software parte per soddisfare una qualche
necessità del programmatore.
Forse questo è ovvio (almeno quanto il proverbio ``La necessità è la
madre dell'invenzione''), tuttavia la gran parte dei programmatori
passano la loro giornata lavorando su prodotti di cui non hanno
bisogno e che non amano. Nel mondo di Linux, questo non succede -- e
questo spiega come mai la qualità media del software prodotto in
questo ambiente sia così elevata.
Pensate forse che a questo punto mi sia furiosamente lanciato a
scrivere un client POP3 nuovo di zecca? Ma neanche per idea! Mi misi
ad esaminare i programmi che già avevo chiedendomi ``qual'è
il più
vicino ai miei bisogni?'' Questo perché:
2. I buoni programmatori sanno cosa scrivere, i grandi programmatori
sanno cosa riscrivere (e riusare)
Anche se non pretendo di essere uno dei grandi programmatori, cerco
sempre di imitarli: e una delle caratteristiche dei grandi è la
pigrizia costruttiva. Essi sanno che non sono gli sforzi, ma i
risultati quelli che vengono ricompensati, e che è quasi sempre
meglio partirei da una buona soluzione parziale che dal nulla.
Ad esempio,
Linus Torvalds
non cercò di scrivere Linux da zero: cominciò a riutilizzare
codice
ed idee che aveva trovato in Minix, un minuscolo sistema operativo,
simile a Unix, che funzionava sui 386. Alla fine tutto il codice
Minix sparì o fu totalmente riscritto, ma, finché c'era,
costituiva
l'impalcatura di ciò che sarebbe poi divenuto Linux.
Era nello stesso spirito che io andavo in cerca ci un programma per
POP che fosse scritta abbastanza bene da poter diventare una base di
sviluppo.
La tradizione di condivisione dei sorgenti del mondo Unix è sempre
stata benefica per il riutilizzo di codice (questo è il motivo per
cui, nonostante alcune serie riserve sul sistema operativo, Unix fu
scelto come piattaforma per il progetto GNU). Il mondo Linux ha
portato questo concetto al suo ultimo limite tecnologico: ci sono
terabyte di codice sorgente disponibile per Linux. Per questo motivo,
il tempo dedicato a cercare una soluzione quasi-sufficiente scritta
da qualcun altro ha spesso più successo nel mondo Linux che altrove.
E fu quello che accadde a me. Alla fine della mia seconda ricerca, mi
ritrovai con nove candidati -- fetchpop, PopTart, get-mail, gwpop,
pimp, pop-perl, popc, popmail e upop. Il primo a soddisfarmi fu
`fetchpop', di Seung-Hong Oh. Gli appiccicai il mio codice di
aggiustamento dell'intestazione, oltre ad altri miglioramenti che
l'autore recepì nella release 1.9.
Poche settimane dopo, però, inciampai nel codice di `popclient', un
programma di Carl Harris, e scoprii di avere un problema. Fetchpop
aveva alcune buone idee originali (come la modalità daemon), ma
gestiva solo POP3 ed aveva alcune aree di dilettantismo (Seung-Ho
era un programmatore brillante, ma inesperto, ed entrambi i tratti
sono evidenti dal suo codice). Il codice di Carl era migliore,
professionale e solido, ma gli mancavano molte caratteristiche
importanti e di complessa implementazione (incluse quelle che avevo
aggiunto io).
Che fare? Passando a popclient, avrei perso il codice che avevo già
scritto in cambio di una miglior base di sviluppo.
Un buon motivo per cambiare era costituito dal supporto di
protocolli multipli. POP3 è il protocollo più usato in questo campo,
ma non l'unico. Fetchpop e gli altri concorrenti non gestivano POP2,
RPOP, o APOP, e io già stavo pensando di aggiungere IMAP
http://www.imap.org (Internet
Message Access Protocol, il più
recente e potente protocollo post-office) per mio divertimento.
Avevo anche un'altra ragione per fare il cambio, una ragione teorica
che avevo imparato prima di Linux:
3. Metti nei tuoi piani un vicolo cieco: ce ne sarà comunque uno.
(Fred Brooks, `Il Mitico Mese-Uomo', Capitolo 11)
In altre parole, spesso non si ha una buona comprensione del
problema, fino a che non si è provato a risolverlo almeno una
volta: la seconda volta forse si avrà una comprensione sufficiente
per farlo correttamente.Perciò si dovrebbe essere sempre preparati a
ripartire almeno una volta.
Così mi dissi, bene, cambiare fetchpop è stato il mio primo
tentativo. E cambiai.
Quando mandai le prime patch di popclient a Carl Harris (25 Giugno
1996) scoprii che in pratica egli aveva già perso il suo interesse
in popclient qualche tempo prima. Il codice era polveroso, con
qualche baco qua e là. Avevo molti cambiamenti da fare, e non ci
volle molto prima che decidessimo che la cosa più logica era che io
diventassi il custode del programma.
Senza che me ne accorgessi, il progetto si era ingrandito: non stavo
più parlando di fare alcune correzioni ad un client POP, ma ero
diventato il responsabile di un client POP, e molte delle idee che
avevo lo avrebbero probabilmente cambiato in maniera sostanziale.
In una cultura del software che incoraggia la condivisione, è
abbastanza naturale che i progetti evolvano in questo modo. Questo
ero il mio modo di praticare la seguente regola:
4. Se hai l'atteggiamento giusto, i problemi interessanti ti
troveranno.
Ma l'atteggiamento di Carl Harris era ancora più importante, perché
aveva perfettamente capito che:
5. Quando un programma non t'interessa più, hai il dovere di
lasciarlo ad un erede competente.
Senza neanche bisogno di discutere, io e Carl sapevamo che il nostro
obiettivo comune era raggiungere la miglior soluzione
possibile. L'unica domanda a cui rispondere era se io fossi la
persona adatta per raggiungerla, e, non appena dimostrai che lo ero,
Carl mi passò il testimone con grazia e velocità.
Spero di saper
fare lo stesso quando toccherà a me.
3 L'importanza di avere utenti.
Così ereditai popclient, e - cosa altrettanto importante - i suoi
utenti. Avere degli utenti è una cosa meravigliosa,
non solo perché
essi sono la dimostrazione che si sta soddisfacendo una necessità e
che si sta facendo facendo qualcosa di utile, ma anche perché,
trattati appropriatamente, possono diventare dei co-sviluppatori.
Una forza tradizionale di Unix, che Linux ha enfatizzato, è che molti
utenti sono anche ``hacker'': e,poiché il codice sorgente è
disponibile, essi sono effettivamente in condizione di vedere e trovare
migliorie, e possono essere incredibilmente utili nell'abbreviare il
tempo di ricerca e correzione degli errori (debugging). Con un po' di
incoraggiamento, troveranno problemi, daranno suggerimenti e aiuteranno
a correggere il codice più velocemente di quanto possa mai fare una
persona da sola.
6. Trattare i tuoi utenti come sviluppatori è il modo meno difficile
per avere un rapido perfezionamento ed un buon debugging.
È facile sottovalutare la potenzialità di questo fenomeno: e infatti,
quasi tutti, nel mondo open source, ne abbiamo sottovaluto l'impatto
al crescere del numero degli utenti e nonostante la crescita della
complessità, almeno finché non è arrivato Linus Torvalds.
Penso che il trucco (hack) più ispirato e gravido di conseguenze di
Linus non sia stata la creazione del kernel di Linux in sé, quanto
piuttosto l'invenzione del modello di sviluppo di Linux. Quando ho
espresso questa opinione in sua presenza, egli ha sorriso ed ha
ripetuto con modestia qualcosa che spesso aveva già detto:
-Fondamentalmente sono una persona pigra che preferisce prendersi il
merito di cose fatte da altri.-. Pigro come una volpe o, come avrebbe
detto Robert Heinlein: -Troppo pigro per fallire.-.
Un precursore del metodo e del successo di Linux fu lo sviluppo della
``GNU Emacs Lisp library'' e degli archivi di codice Emacs Lisp. In
contrasto con lo ``stile cattedrale'' seguito nel corso dello sviluppo
del nucleo di Emacs in C (e di molti altri programmi della FSF)
l'evoluzione del codice Lisp delle librerie fu fluida e guidata in gran
parte dagli utenti. Idee e prototipi erano spesso riscritti tre o
quattro volte prima di giungere ad una forma stabile e
definitiva e molto spesso si stabilivano, tramite Internet,
collaborazioni ``a distanza'' come è la norma del mondo Linux.
In effetti, la mia opera più diffusa, prima di fetchmail, era
probabilmente la modalità VC di Emacs , una collaborazione in stile
Linux via email con altre tre persone, delle quali, fin ad oggi, ne ho
conosciuto personalmente solo una (Richard Stallman, l'autore di Emacs
e fondatore della FSF) ho poi conosciuto in questi giorni. Il modo VC
mode è un'interfaccia per SCCS, RCS e CVS, che, permette di effettuare
operazioni di controllo di versione e revisione dall'interno di Emacs.
Il suo antenato era una piccola e primitiva modalità SCCS (sccs.el)
scritta da qualcun altro, e il lo sviluppo di VC fu possibile perché,
diversamente dallo stesso Emacs, il codice Lisp di Emacs poteva
attraversare molto velocemente diversi cicli di release / test /
correzione.
4 Rilascia presto, rilascia spesso
Il fare release precoci e frequenti è una parte cruciale del modello
di sviluppo di Linux. La maggior parte degli sviluppatori, me
compreso, di solito pensavano che questa fosse una cattiva idea per
tutti i progetti non banali, perché le versioni premature sono sempre
versioni bacate e bisogna evitare di esaurire la pazienza degli
utenti.
Questa convinzione ha rinforzato il generale prevalere degli stili di
sviluppo a Cattedrale. Dato l'obiettivo prevalente di far vedere agli
utenti meno bachi possibili e lavorare come pazzi per fare le
correzioni tra una release e l'altra, le nuove versioni venivano
rilasciate come minimo ogni sei mesi (o anche più raramente). Il
nucleo C di Emacs fu sviluppato in questo modo, mentre la libreria
Lisp non lo fu, perché c'erano archivi Lisp attivi fuori dal controllo
della FSF, dove si potevano trovare delle novità e delle versioni di
codice sviluppate indipendentemente dal ciclo di release ufficiale di
Emacs.
Il più importante tra questi archivi, l' Ohio State Elisp Archive,
anticipava nello spirito e in parecchie caratteristiche i grandi
archivi Linux di oggi. Ma pochi di noi si stavano realmente rendendo
conto di ciò che stavano facendo o del significato che l'esistenza di
un archivio del genere aveva per il modello di sviluppo a Cattedrale
adottato dalla FSF. Quando, Attorno al 1992, feci un serio tentativo
di integrare formalmente molto del codice dell'Ohio Archive
nell'Official Emacs Lisp Library, mi trovai di fronte a problemi
"politici" e la conseguenza fu un notevole insuccesso.
Ma un anno dopo, quando Linux cominciò a farsi conoscere, fu chiaro
che stavamo assistendo alla crescita di qualcosa di diverso e molto
vigoroso: la politica di sviluppo aperto di Torvalds era il vero
antagonista del modello a Cattedrale. Gli archivi Sunsite e TSX-11
stavano esplodendo,erano state diffuse diverse distribuzioni e tutto
questo era guidato da una frequenza mai vista nel rilascio di
nuove versioni del sistema base.
Linus stava trattando i suoi utenti e co-sviluppatori nel modo più
efficace possibile:
7. Rilascia presto, rilascia spesso e ascolta i tuoi utenti.
La scoperta di Torvalds non stava tanto nel concetto, che, in una
forma simile, era già da parecchio tempo nella tradizione di Unix,
quanto, piuttosto, nell'adeguarne l'intensità al livello di
complessità di ciò che si stava sviluppando.
Nei primi tempi (attorno
al 1991) non era una insolito, per lui, rilasciare una nuova versione
del kernel più di una volta al giorno! Supportando la sua
base di co-sviluppatori e usando Internet - più di quanto chiunque
altro avesse mai fatto - per avere collaborazioni, riusciva a fare sì
che questo approccio avesse successo.
Ma come funzionava, in realtà, ed era qualcosa che si poteva ripetere,
o si trattava di un ``unicum', dipendente dalla particolare genialità
di Linus Torvalds?
Io pensavo di no. Ovviamente Torvalds è un hacker fantastico
(dopotutto, quanti di noi sarebbero capaci di concepire l'intera
creazione del kernel di un sistema operativo di qualità commerciale?)
ma, di per sé e dal punto di vista dei concetti, Linux non
rappresentava un imponente balzo in avanti. Linus non è, o almeno non
ancora, un genio innovativo della progettazione come lo sono Richard
Stallman o James Gosling (di NeWS e Java): piuttosto Linus mi sembra
essere un genio dell' ingegneria del software, con un sesto senso
nell'evitare bachi e vicoli ciechi nello sviluppo e una vera arte per
trovare con il minimo sforzo la strada più semplice. Infatti l'intero
progetto Linux trasuda queste qualità e rispecchia l'approccio
concettuale essenzialmente conservatore e minimalista del suo
creatore.
E allora, se un rapido ciclo di release e l'uso di Internet non sono
fattori casuali, ma parti fondamentali del disegno concettuale di
Linus, riassunte nella filosofia del minimo sforzo, qual era il
``prodotto'' che questo metodo massimizzava? Cosa usciva dagli ingranaggi?
In questa forma, la domanda si risponde da sola. Linus stimolava - e
premiava - continuamente i suoi utenti hacker: li stimolava con la
prospettiva di essere protagonisti di una parte dello sviluppo, e li
premiava con la quantificazione rapida, addirittura giornaliera, dei
miglioramenti indotti al loro lavoro.
Linus stava esplicitamente incitando a massimizzare il numero di
ore/uomo impiegate nel debuggare e sviluppare, anche al possibile
rischio di introdurre instabilità nel codice e di esasperare la base
di utenza nel caso in cui grave baco si fosse rivelato
intrattabile. Penso che Linus stava agendo nella consapevolezza di un
principio del genere:
8. Se hai una quantità sufficiente di sperimentatori beta e di
sviluppatori, quasi tutti i problemi saranno individuati
velocemente e la soluzione sarà evidente almeno per qualcuno
O, in parole povere, quella che io chiamo la legge di Linus: ``Molte
pupille rendono tutti i bachi facili da trovare''
La versione iniziale diceva che ``la soluzione di ogni problema
diverrà ovvia per qualcuno'', ma Linus obbiettò
che colui che capisce
a e risolve il problema non è quasi mai la stessa persona che lo ha
trovato e individuato. "Qualcuno trova il problema", diceva, "e
qualcun altro lo capisce. E voglio sottolineare che, secondo me, la
cosa più difficile è il trovare." La cosa importante, comunque,
è che
entrambe le cose tendono ad accadere velocemente.
Io penso che questa sia la differenza fondamentale tra gli stili ``a
Cattedrale'' e ``a Bazaar'': per il costruttore di Cattedrali, bachi
e problemi di sviluppo sono fenomeni insidiosi, impegnativi e
profondi che richiedono mesi di minuziosi esami di gruppo, finché non
si sia raggiunta la certezza che essi siano stati tutti eliminati.
Da qui i lunghi intervalli tra le release e le inevitabili delusioni
che derivano dallo scoprire che le tanto agognate release non sono
perfette.
Il punto di vista del Bazaar, invece, è che i bachi sono generalmente
fenomeni superficiali o almeno, che divengono superficiali, docili e
rapidi da trattare, quando esposti a migliaia di ansiosi
co-sviluppatori che si accaniscono su ogni nuova release. Perciò si
rilascia spesso per ricevere più correzioni e, come benefico effetto
collaterale non si ha molto da perdere quando scappa l'occasionale
``cappella''.
Tutto qui, non c'è altro. Se la legge di Linus è falsa,
ogni sistema
complesso quanto il kernel di Linux dovrebbe ad un certo punto
collassare sotto il peso di fenomeni imprevisti e sconosciuti o di
gravi bachi, ma se, invece, la legge di Linus è vera, allora è
sufficiente spiegare l'assenza di bachi gravi in Linux.
E forse non ci si dovrebbe sorprendere più di tanto. Già da alcuni
anni i sociologi avevano osservato che l'opinione media di un
campione di esperti (o di persone di equivalente ignoranza)
costituisce una predizione molto più accurata che non l'opinione di
un esperto scelto a caso (il cosiddetto ``effetto Delfi''). Si
direbbe che Linus abbia dimostrato che questo effetto si applica bene
al debuggare un sistema operativo; l'effetto Delfi riesce a domare la
complessità dello sviluppo persino al livelli di complessità
di un
kernel per sistema operativo.
Sono debitore a Jeff Dutky per aver indicato che
la legge di Linus può essere riformulata come "il debugging è
parallelizzabile". Jeff osserva che, sebbene il debuggare richieda
ai debuggatori di comunicare con alcuni sviluppatori coordinati, esso
non richiede però significanti costi di coordinamento e manageriali,
che in genere costituiscono problematiche aggiuntive per gli
sviluppatori.
In pratica, la perdita - teorica - di efficienza dovuta dalla
duplicazione del lavoro dei debugger non sembra essere un problema nel
mondo Linux: un effetto della politica delle release precoci e
frequenti è quello di minimizzare simili duplicazioni propagando
rapidamente le informazioni sulle correzioni già effettuate.
Brooks (l'autore di ``The Mythical Man-Month'' ) ha fatto
un'osservazione che è apparentata a quella di Jeff: "Il costo totale
di manutenzione per un programma ampiamente usato è tipicamente il
40% o più dei costi di sviluppo. Sorprendentemente questo costo è
fortemente influenzato dal numero degli utenti. Più utenti trovano
più bachi.'' (enfasi aggiunta).
Più utenti trovano più bachi perché aggiungendo utenti si aggiungono
modi diversi di sollecitare il programma. Questo effetto è
amplificato quando gli utenti sono co-sviluppatori. Ognuno affronta
la descrizione di un baco con una propria impostazione e un set di
strumenti personale, il che gli permette di avere una differente
visuale del problema. L'effetto Delfi dipende da queste piccole
variazioni: nello specifico contesto del debugging la variazione
tende anche a ridurre la duplicazione dello sforzo.
Così, anche se aggiungendo beta tester potremmo non ridurre la
complessità di quello che gli sviluppatori sia il più grave baco del
momento, incrementiamo la probabilità che gli strumenti di qualcuno
si scontrino con il problema, e che il baco sarà individuato da
qualcuno che sappia vederne la banalità.
Anche Linus, comunque, cerca di proteggersi dai capricci del caso, e
per evitare le conseguenze avverse di bachi gravi, le versioni del
kernel di Linux sono numerate in modo che i potenziali utenti possano
scegliere tra il far girare l'ultima versione (definita "stabile") o
correre sul filo del rasoio e rischiare di incorrere nei bachi pur di
disporre di nuove caratteristiche. Questa tattica non è ancora
formalmente imitata dalla maggior parte degli sviluppatori di Linux,
ma forse dovrebbe; il fatto di poter scegliere rende tutto il
processo molto più attraente.
5 Quando una rosa non è (più) una rosa?
Dopo aver studiato il comportamento di Linus, e dotato di una
personale teoria che ne spiegava il successo, decisi di mettere la mia
teoria alla prova sul mio nuovo progetto - per quanto più semplice e
meno ambizioso.
Il mio primo passo fu quello di riorganizzare semplificare di molto
popclient. L'implementazione di Carl Harris era solida, ma esibiva
quel sovrappiù di complessità che è comune
a molti programmatori C,
che trattano il codice come la parte centrale e le strutture dati
come un strumento di supporto, e di conseguenza, il codice era bello,
ma il progetto ad hoc dell strutture dati era decisamente brutto
(almeno agli occhi di questo vecchio Lisp hacker).
Oltre al miglioramento del codice e delle strutture dati, il lavoro
di riscrittura aveva l'obiettivo di far evolvere il programma in
qualcosa di cui avessi una completa comprensione. Essere responsabili
della manutenzione di un programma che non si capisce è una brutta
esperienza.
Per il primo mese o giù di lì, mi limitai a seguire le implicazioni
del progetto di Carl. Il primo serio cambiamento che feci fu di
aggiungere il supporto IMAP, e lo feci riorganizzando i protocolli in
un driver generico e tre tabelle di metodi: una per POP2, una per POP3
ed una per IMAP. Questo cambiamento, ed altri che lo precedettero
illustrano un principio generale che è bene i programmatori tengano a
mente, specialmente nei linguaggi come il C che non fanno uso del
dynamic typing:
9 È meglio avere dati intelligenti e codice stupido che non viceversa.
Brooks, capitolo 9: "Mostrami il tuo codice, nascondi le tue
strutture dati e continuerò ad essere confuso. Mostrami le tue
strutture dati e normalmente non avrò
bisogno del tuo codice: sarà
ovvio."
In effetti nella citazione originale si parlava di ``diagrammi di
flusso'' e ``tabelle'', ma, considerato che sono passati trent'anni,
il concetto è quasi lo stesso.
A questo punto (primi di settembre 1996, circa sei settimane dopo il
giorno 0) cominciai a pensare che un cambiamento di nome poteva
essere accettabile, dopo tutto il programma non era già più
Popclient. Tuttavia esitavo, perché finora non avevo inserito niente
di veramente nuovo nel progetto: la mia versione di Popclient doveva
ancora sviluppare una sua identità.
Questo cambiò radicalmente quando Fetchmail
imparò come rispedire la
posta presa alla porta SMTP, e a questo arriverò tra un momento ma
prima vorrei chiarire un altro punto.
Poco fa, ho detto che cominciai ad utilizzare questo progetto per
sperimentare la mia teoria su ciò che Linus Torvalds aveva fatto di
giusto, e i miei lettori potrebbero chiedermi in che modo lo feci.
Feci così:
1. Emettevo release presto e spesso (mai meno di una ogni dieci
giorni e durante i periodi di sviluppo intenso anche una volta al
giorno).
2. Aumentavo la mia beta list aggiungendovi tutti quelli che mi
contattavano a proposito di Fetchmail.
3. Inviavo annunci amichevoli alla beta list quando rilasciavo,
incoraggiando la gente a partecipare.
4. Ascoltavo i miei beta tester, li consultavo sulle decisioni del
progetto e li ringraziavo quando inviavano patch o riscontri vari.
Il vantaggio che trassi da questi semplici accorgimenti fu immediato:
fin dal principio del progetto ottenevo dei rapporti sui bachi di una
qualità che da fare invidia a molti sviluppatori, spesso con buone
correzioni allegate. Ricevevo critiche intelligenti, incoraggiamenti,
buoni suggerimenti su migliorie da aggiungere, e tutto questo mi
portò a formulare il seguente principio:
10. Se tratti i tuoi beta tester come la tua migliore risorsa,
risponderanno diventando la tua migliore risorsa.
Una importante misura del successo di Fetchmail è la dimensione del
progetto beta list, gli amici di Fetchmail, che, nel momento in cui
scrivo, conta 249 membri e se ne stanno aggiungendo 2 o 3 alla
settimana.
In effetti, secondo quanto ho riscontrato alla fine del Maggio 1997, la
lista sta cominciando a perdere iscritti, dall'alto del suo apice di
300, e per una ragione interessante: diverse persone mi hanno chiesto di
cancellare la loro iscrizione perché Fetchmail sta lavorando nel modo
a loro necessario e non hanno più bisogno di vedere il traffico della
lista. Forse questa è una fase del normale ciclo di vita di un
progetto maturo nello stile Bazaar.
6 Popclient diventa Fetchmail
Il punto di svolta del progetto si verificò quando Harry Hochheiser
mi mandò una bozza di codice per inoltrare posta alla porta SMTP
della macchina client: immediatamente capii che un'implementazione
affidabile di questa funzione avrebbe reso tutti gli altri metodi di
consegna.
Per diverse settimane avevo lavorato su fetchmail in maniera
incrementale, con la sensazione che il progetto dell'interfaccia fosse
efficiente, ma scomodo: inelegante e con troppe opzioni che
``sporgevano'' da tutte le parti. L'opzione che permetteva di
scaricare la posta direttamente in una casella o sullo standard
output mi infastidiva particolarmente senza che riuscissi a spiegarlo
razionalmente.
Quando iniziai a pensare all' inoltro a SMTP mi accorsi che
popclient tentava di fare troppe cose: era stato progettato per
essere sia un agente di trasporto (MTA) sia un agente di consegna
(MDA): inserendo l'inoltro SMTP, si poteva sbarazzare della parte MDA
e concentrarsi sulla parte MTA, lasciando la consegna ai programmi di
consegna locale come fa sendmail.
Perché preoccuparsi delle complicazioni insite nel configurare un
agente di consegna locale, o di effettuare il lock-and-append di una
casella quando la porta 25 è standard su quasi tutte le piattaforme
TCP/IP? E soprattutto in questo caso, quando la posta che viene
inoltrata avrà tutto l'aspetto di un normale messaggio SMTP,
essenzialmente quello di cui abbiamo bisogno.
Si possono imparare diverse lezioni da questo episodio: innanzitutto,
l'inoltro via SMTP fu il guadagno maggiore che ottenni dal mio
tentativo di imitazione del metodo di Linus - un utente mi passò
un'ottima idea, e io mi limitai a comprenderne le conseguenze.
11. La cosa migliore, oltre ad avere buone idee, è saper riconoscere
le buone idee dei propri utenti. A volte è meglio la seconda
della prima.
È abbastanza interessante osservare che, se si è completamente e
umilmente sinceri riguardo ai contributi degli altri, tutti vi
tratteranno come se, in realtà, tutta l'invenzione sia un parto della
vostra mente e che vi stiate comportando con educata modestia. Come
sappiamo, per Linus ha funzionato proprio in questo modo.
(Quando lessi questo articolo alla Perl Conference - Agosto 1997 -
Larry Wall era seduto in prima fila. Mentre leggevo il paragrafo
precedente, egli si mise a declamare, nello stile dei revival religiosi
``Diglielo, diglielo fratello!'', mentre il pubblico, che sapeva
quanto la ricetta avesse funzionato anche per l'autore di Perl,
scoppiava a ridere)
Dopo alcune settimane che lavoravo sul progetto nello stesso spirito,
cominciai a ricevere lodi di questo tipo non solo dai miei utenti, ma
anche da persone a cui era arrivata la voce e di cui ho conservato i
messaggi.
Forse me li andrò a guardare quando comincerò a chiedermi
se la mia vita sia valsa a qualcosa :-).
Ci sono altre due lezioni di tipo più tecnico e che si applicano a
tutti i tipi di progetto:
12. Spesso le soluzioni più innovative e radicali derivano dalla
comprensione che la propria rappresentazione del problema era
sbagliata.
Avevo cercato di risolvere il problema sbagliato, e avevo continuato
a sviluppare popclient sotto forma di un agente misto MDA/MTA,
preoccupandomi dei più bizzarri congegni di consegna locale, quando
invece il progetto di fetchmail andava ripensato sotto forma di un
MTA puro, come parte del normale processo della consegna SMTP della
posta Internet.
Quando ci si trova in un vicolo cieco ed è difficile pensare a cosa
succederà dopo la prossima patch, spesso
significa che è il momento
di pensare se si è fatta la domanda giusta, piuttosto che non se si
ha la risposta: forse bisogna riesaminare il problema.
E il mio problema era stato riesaminato: chiaramente le cose da fare
erano 1) inserire l'inoltro SMTP nel driver generico e 2) renderlo il
modo standard per 3) disfarsi, ad un certo punto, di tutti gli altri
meccanismi di consegna locale, specialmente quello su file e quello
su standard output.
Esitai per un bel po' prima di intraprendere il terzo passo, per
paura di alienarmi gli utenti di popclient che si erano affidati agli
altri meccanismi di consegna: in teoria, questi avrebbero potuto
utilizzare i file .forward dei loro agenti non-sendmail ed ottenere
gli stessi risultati, ma in pratica la transizione sarebbe stata
complicata.
Quando però mi decisi, i benefici furono immensi: le parti più
disordinate nel codice del driver sparirono, la configurazione si
semplificò immensamente - non era più necessario rovistare nel
sistema alla ricerca degli agenti di consegna e della posizione delle
caselle, o preoccuparsi se il sistema operativo supportasse il file
locking.
In più, era sparito l'unico meccanismo tramite il quale era possibile
perdere la posta: prima se si cercava di consegnare ad un file quando
il disco era pieno, la posta era perduta, cosa che non può succedere
con l'inoltro SMTP, perché l'agente SMTP non darà l'OK per la
consegna a meno ce la posta non possa essere consegnata o, perlomeno,
accodata per essere consegnata più tardi.In più le prestazioni
migliorarono (anche se troppo poco per essere immediatamente
evidente) e, particolare non trascurabile, il manuale si semplificò
di molto.
In seguito, fui costretto a reinserire la consegna tramite un MDA
specificato dall'utente per risolvere alcune oscure situazioni in
presenza di SLIP dinamico, ma trovai una maniera assai più semplice
per farlo.
La morale è che non bisogna mai
esitare a sbarazzarsi di capacità
obsolete quando ci si può permettere di farlo senza perdita di
efficacia. Come disse Antoine de Saint-Exupery (che fu un aviatore e
un progettista d'aerei quando non scriveva classici per ragazzi):
13. La perfezione (nella progettazione) si ottiene non
quando non c'è più
nulla da aggiungere, ma quando non c'è più nulla da togliere.
Quando il codice diventa più bello e più semplice si può essere
confidenti che è anche giusto. Nel corso di questo processo,
fetchmail acquisto un'identità distinta, diversa da quella del suo
antenato popclient.
Era venuto il momento di cambiargli nome. Il nuovo progetto era molto
più simile a quello di sendmail di quello del vecchio popclient:
entrambi MTA, ma mentre sendmail prima manda (send), poi consegna,
questo prima recupera (fetch), poi consegna. E fu così che, a due
mesi dall'inizio, lo chiamai fetchmail.
7 Fetchmail cresce
E così mi trovavo con un progetto innovativo, che sapevo funzionare a
dovere perché lo usavo tutti i giorni, e una lista beta in continua
espansione, e cominciai a capire di non essere più impegnato in un
banale trucco personale che era anche utile a qualcun'altro. Stavo in
effetti lavorando ad un programma necessario per chiunque avesse un
sistema Unix e una connessione SLIP o PPP.
Con l'aggiunta dell' invio SMTP, si era posizionato abbastanza avanti
come concorrente per diventare un "category killer", uno di quei
classici programmi che soddisfano la loro nicchia così bene che le
alternative non vengono quasi considerate.
Non penso che un risultato del genere possa essere progettato in
anticipo: ci si viene attirati da idee progettuali così potenti che,
a cose fatte, il risultato sembra inevitabile, preordinato. L'unico
modi per ottenere idee di questo tipo è partire da un sacco di idee,
oppure avere il discernimento ingegneristico di saper prendere idee
di altri e portarle al di là di ciò che le aveva pensate immaginasse
potessero andare.
Andrew Tanenbaum ebbe l'idea di creare una semplice variante di
Unix per il 386, da usare a fini didattici. Linus Torvalds spinse
questa idea ben oltre il punto in cui lo stesso Tanenbaum -
probabilmente - pensava potesse andare, e questa crebbe fino a
diventare qualcosa di meraviglioso. Allo stesso modo, ma in tono
minore, io avevo preso le idee di Carl Harris e Harry Hochheiser e
avevo aggiunto il mio olio di gomito. Nessuno di noi era `originale'
nell'accezione romantica che di solito si associa al genio, ma in
fondo gran parte della scienza e dell'ingegneria non sono opera di
genialità, checché ne dica la mitologia hacker.
Ciononostante, i risultati furono comunque impressionanti, e qualunque
hacker ne sarebbe stato più che soddisfatto. Questo significava che
avrei dovuto aderire a standard ancora più stringenti: per dare a
fetchmail la qualità che sapevo poteva raggiungere, avrei dovuto
scrivere non solo per soddisfare i miei bisogni, ma anche per
includere funzionalità necessarie ad altri e, nel farlo, cercare di
mantenere il programma semplice ed affidabile.
La prima funzionalità - e di gran lunga la più importante - che
aggiunsi dopo che ebbi capito tutto ciò fu il supporto per il
multidrop, cioè la possibilità di prelevare posta da caselle che
avevano accumulato messaggi per un gruppo di utenti e consegnare ogni
messaggio individualmente.
La decisione di aggiungere il multidrop fu provocata, in parte, dal
fatto che alcuni utenti ne avevano bisogno, ma soprattutto perché
pensavo che mi avrebbe aiutato ad eliminare i bachi dalla parte che
gestiva il funzionamento consueto, costringendomi ad affrontare il
problema dell' indirizzamento in generale - e così fu. Riuscire ad
ottenere una versione corretta di un interprete
RFC822
richiese un bel po' di tempo, non perché ogni singola parte sia
complessa, ma perché entravano in gioco svariati dettagli delicati e
interdipendenti.
Inoltre il multidrop si dimostrò un'eccellente decisione progettuale,
secondo i dettami di un altro principio:
14. Ogni strumento dovrebbe svolgere bene il compito per cui è stato
creato, ma un ottimo strumento si presta ad essere usato in
maniere completamente inaspettate.
In questo caso, l'uso inaspettato era la possibilità di mantenere
mailing-list dal lato client, facendo anche l'espansione degli alias
dalla parte del client, e questo permetteva a persone collegate a un
provider tramite SLIP o PPP di centralizzarne la gestione su di una
macchina personale piuttosto che su quella del provider.
Un altro importante cambiamento richiesto dai miei utenti fu il
supporto per le operazione MIME a 8 bit, ma questo fu facile da
implementare: ero infatti stato attento a rendere tutto il mio codice
compatibile con operazione a 8 bit, e questo non perché avessi
previsto questa funzionalità, ma in osservanza di un altro principio
guida:
15. Nello scrivere un qualsiasi tipo di programma di trasferimento
dati bisogna impegnarsi per non perturbare il flusso dei dati, e,
soprattutto, non bisogna mai perdere informazione, a meno che non
sia il destinatario a rifiutarla.
Se non avessi osservato questa regola, introdurre MIME a 8 bit
sarebbe stato difficile, e il risultato pieno di errori. Nella mia
situazione, invece, mi bastò leggere RFC 1652
RFC 1652
e aggiungere qualche banale manipolazione dell'intestazione.
Alcuni utenti Europei continuavano a chiedermi di poter limitare il
numero dei messaggi recuperati per sessione (e così permettergli di
controllare i costi telefonici), cosa a cui mi opposi per lungo tempo,
e della quale non sono ancora completamente soddisfatto. Ma chi
scrive per il mondo deve ascoltare i propri clienti, anche se non
pagano in moneta sonante.
8 Altre lezioni imparate da fetchmail
Prima di tornare a questioni generali di software engineering, voglio
considerare un paio di lezioni più specifiche imparate
dall'esperienza di Fetchmail. La sintassi del file .rc include
parole non necessarie, che l'interprete ignora completamente. La
sintassi, simile alla lingua Inglese, che esse permettono di usare è
considerevolmente più leggibile delle classiche e scarne coppie di
opzione/valore che rimangono quando esse vengono eliminate.
Tutto cominciò come un esperimento a tarda notte quando osservai che
le espressioni del file .rc stavano cominciando a rassomigliare ad un
mini-linguaggio di comandi (questo fu il motivo per cui cambiai la
direttiva originale di Popclient da "server" a "poll").
Pensai che il tentativo di rendere questo mini-linguaggio di comandi
più simile all'inglese poteva renderne l'uso più semplice. Però,
sebbene io sia un convinto sostenitore della scuola del "fanne un
linguaggio" esemplificata da Emacs, HTML e molti motori di database,
normalmente non sono un grande fan delle sintassi English-like.
Tradizionalmente i programmatori preferiscono le sintassi di
controllo che sono molto precise, compatte e non hanno
ridondanze. Questo è un patrimonio culturale derivato dal tempo in
cui le risorse tecnologiche erano costose, e quindi la fase di
analisi doveva essere il più possibile economica e
semplice. L'Inglese, una lingua con circa il 50% di ridondanza, non
sembrava comunque essere il modello più appropriato.
Non è però questo il motivo che normalmente mi fa evitare la sintassi
di tipo Inglese - infatti, lo cito solo per confutarlo. In un periodo
in cui memoria a cicli di macchina sono così economici, infatti la
concisione non dovrebbe più essere fine a se stessa, perché è più
importante che un linguaggio sia comodo per gli esseri umani che non
economico per il calcolatore.
Ci sono altri motivi per stare attenti, comunque, a cominciare dal
costo derivante dalla complessità della fase di traduzione, che non
dovrebbe diventare tale da essere una sorgente di bachi e da
confondere l'utente. Un altro possibile problema è che le sintassi di
tipo Inglese spesso richiedono un ``Inglese'' così deformato da
far sì che la sua superficiale somiglianza col linguaggio naturale
divenga, essa stessa, un motivo di confusione pari a quella che
sarebbe stata provocata da una sintassi più
tradizionale. (È quello
che si vede nei cosiddetti linguaggi ``di quarta generazione'' e nei
linguaggi d'interrogazione per database).
La sintassi di controllo di fetchmail cerca di evitare questi problemi
restringendo al massimo il dominio linguistico ed evitando di
diventare un linguaggio di uso generale: si limita a dire in maniera
semplice cose che non sono molto complesse, e questo riduce la
potenziale confusione che deriva dal doversi muovere mentalmente tra
un piccolo sottoinsieme della lingua Inglese e il linguaggio di
controllo vero e proprio. La lezione che possiamo imparare da questo
è:
16. Quando il linguaggio da sviluppare è ben lontano da essere
completo secondo Turing, lo ``zucchero sintattico'' è un vostro
alleato.
Un'altra lezione riguarda la riservatezza ottenuta tramite la
segretezza. Alcuni utenti mi avevano chiesto di rendere possibile
l'uso di password cifrate nel file di configurazione, in modo da
proibire ai curiosi di vederle. Io decisi di non farlo, perché questa
aggiunta non avrebbe di fatto accresciuto la sicurezza: infatti, chiunque
possa leggere il file rc è anche in grado di eseguire fetchmail con
l'identità del proprietario, e, se è interessato alla sua
password, probabilmente sarà in grado di estrarre gli algoritmi di
decodifica direttamente dal codice di fetchmail per ottenerla.
L'unico risultato ottenuto consentendo password cifrate in
.fetchmailrc sarebbe stato dare un falso senso di sicurezza a persone
irriflessive. La lezione che se ne può trarre è:
17. Un sistema di sicurezza è sicuro quanto il suo segreto: diffidate
degli pseudo-segreti.
9 Condizioni necessarie allo stile bazaar
I primi recensori di questi articoli posero molte domande sulle
condizioni che devono preesistere ad un modello bazaar di successo,
sulle qualità necessarie al capo del progetto e la condizione in cui
si trova il codice nel momento in cui ci si presenta al pubblico
per creare una cooperativa di sviluppatori.
Sembra chiaro che lo stile bazaar non si presta a scrivere un
programma da zero: si possono condurre test, debugging e introdurre
miglioramenti grazie allo stile bazaar, ma iniziare un progetto in
questo stile sarebbe molto difficile. Infatti Linus non ci si provò e
nemmeno io. Bisogna dare alla comunità un programma che funziona e
possa essere provato con cui sperimentare.
Quando si cerca di costruire una comunità bisogna essere in grado di
presentare una promessa plausibile. Non è necessario che il programma
funzioni particolarmente bene; può essere rudimentale, ``bacato'',
incompleto e poco documentato. Ciò su cui il non può permettersi di
sbagliare è nel convincere potenziali co-sviluppatori che ha la
possibilità di evolvere in qualcosa di valido in tempi accettabili.
Linux e Fetchmail si presentarono al pubblico entrambi con un
progetto di base forte ed attraente. Sono in molti a pensare -
correttamente - che il modello bazaar, come l'ho presentato, dipenda
in maniera essenziale da questo aspetto: subito dopo, però, saltano
alla conclusione che un alto livello di intuizione progettuale ed
intelligenza del capoprogetto sia altrettanto indispensabile.
Eppure, Linus prese il suo progetto da Unix, e io ereditai il mio dal
vecchio popclient (anche se in questo caso i cambiamenti furono assai
più radicali di quanto non avvenne con Linux). Così nasce la domanda:
il leader-coordinatore di un'impresa a stile bazaar deve avere
veramente un eccezionale talento progettuale o può far leva sul
talento progettuale di altri?
Io non penso sia cruciale che il capoprogetto sia in grado di creare
da solo progetti di spiccata originalità, ma che sia assolutamente
indispensabile che il capoprogetto sia in grado di riconoscere le
buone idee progettuali degli altri.
Entrambi i progetti di Linux e Fetchmail ne sono una prova. Linus,
che non è un progettista incredibilmente originale (come già discusso
in precedenza), ha però mostrato una particolare abilità nel
riconoscere i buoni progetti ed integrarli nel kernel di Linux. Per
quanto mi riguarda, ho già descritto come la migliore funzionalità
introdotta in Fetchmail, cioè il forwarding SMTP, sia dovuto a
qualcun altro.
I lettori delle prime versioni di questo documento mi hanno spesso
detto - adulandomi - che sono propenso a sottovalutare l'apporto
dell'originalità progettuale nei progetti a bazaar perché ne posseggo
molta, e quindi tendo a darla per scontata. Questo può essere vero,
e infatti la progettazione, al contrario della programmazione e del
debugging, è senza dubbio la cosa in cui riesco meglio.
L'altra faccia dell'essere intelligente ed originale nel progettare
software è che tende a diventare un'abitudine. Si comincia così a
pensare cose ingegnose e complicate quando si dovrebbe invece cercare
di mantenerle robuste e semplici. Proprio a causa di questo errore ho
fallito in alcuni progetti, mentre Fetchmail fu un successo.
Credo che la riuscita del progetto Fetchmail sia dovuta in parte
proprio all'essere riuscito a frenare la mia tendenza ad essere
troppo acuto e questo dovrebbe sostenere l'ipotesi che l'originalità
progettuale non sia essenziale per ottenere il successo con progetti
a bazaar. Supponiamo che Linus Torvalds si fosse messo a cercare di
realizzare innovazioni fondamentali nell'architettura dei sistemi
operativi durante lo sviluppo di Linux: vi sembra possibile che il
kernel risultante avrebbe finito con l'avere le caratteristiche di
stabilità e popolarità che ha acquisito?
Naturalmente è richiesto un certo livello base di professionalità
nella progettazione e programmazione, ma mi aspetto che tutti quelli
seriamente intenzionati a lanciarsi in un'impresa a stile bazaar
siano già in grado di andare oltre questi requisiti di base. Il
mercato interno - un mercato dove si scambiano reputazione e
credibilità - della comunità open source esercita una sottile
pressione sulla gente che inibisce l'avvio di imprese di sviluppo a
coloro che non sono abbastanza competenti per seguirle. Sino ad ora
sembra aver funzionato tutto alla perfezione.
C'è un altro tipo di professionalità normalmente non associata con lo
sviluppo del software che penso sia importante quanto le famose idee
intelligentissime; forse addirittura più importante. Sto parlando
della figura del leader-coordinatore che deve avere buone capacità
comunicative e di gruppo.
Questo dovrebbe essere ovvio. Chi ha l'intenzione di realizzare una
comunità di sviluppo, deve saper attrarre le persone, interessarle a
ciò che sta facendo e mantenerle soddisfatte del lavoro che
affrontano. Ci saranno problemi collegati a questioni tecniche, ma
questo non è il luogo per parlarne. Anche la personalità ce si mette
in luce ha importanza.
Non è una coincidenza che Linus sia un ragazzo simpatico che induce
le persone ad imitarlo ed aiutarlo. Non è una coincidenza che io sia
un energico estroverso che ama lavorare in compagnia ed talvolta si
si esprime come un comico di professione. Per far sì che il
progetto bazaar funzioni, avere un minimo di fascino personale è
utilissimo.
10 Il contesto sociale del software Open Source
E' stato giustamente scritto: le migliori modifiche nascono come
soluzioni dei problemi personali e quotidiani dell'autore e si
diffondono perché il problema è condiviso da un'ampia classe di
utenti. Questo ci rimanda alla lezione della regola 1, riformulata in
maniera più adatta:
18. Per risolvere un problema interessante, comincia cercando un
problema che sia interessante per te.
Così è stato con Carl Harris e l'originario Popclient e così con me e
Fetchmail, ma si tratta di qualcosa che è scontato da tempo. Un
aspetto interessante messo a fuoco dalle storie di Linux e Fetchmail
è la fase successiva: l'evoluzione del software in presenza di una
larga e attiva comunità di utenti e co-sviluppatori.
Nel libro "The Mythical Man-Month" Fred Brooks osserva che il tempo
del programmatore non è flessibile, cioè che aggiungere sviluppatori
ad un progetto software in ritardo lo fa ritardare ulteriormente, e
sostiene che la complessità ed i costi di comunicazione di un
progetto crescono col quadrato del numero degli sviluppatori, mentre
il lavoro fatto da soli cresce linearmente. Questa affermazione si è
poi diffusa come "la legge di Brooks" ed è ampiamente considerata
come una verità auto-evidente. Ma se la legge di Brooks fosse l'unico
fattore in gioco,allora il fenomeno Linux sarebbe impossibile. Il
testo classico "La psicologia della programmazione dei computer" di
Gerald Weinberg può essere letta a posteriori come una sostanziale
correzione alla tesi di Brooks. Nella sua discussione sulla
"programmazione altruistica", Weinberg ha osservato che in attività
dove gli sviluppatori non sono possessivi verso il loro codice ed
incoraggiano altre persone a cercare bachi e potenziali correzioni,
le migliorie si susseguono assai più veloci che in altri progetti.
La terminologia usata da Weinberg ha probabilmente impedito che la
sua analisi ricevesse l'attenzione che meritava; l'idea di descrivere
gli hacker come "altruistici" faceva sorridere, ma penso che oggi la
sua argomentazione sia più comprensibile che ai suoi tempi.
La storia di Unix dovrebbe averci preparato per ciò che stiamo
imparando da Linux (e che ho verificato in scala ridotta dalla mia
deliberata replica dei metodi di Linus), cioè che, mentre scrivere
codice rimane un'attività essenzialmente solitaria, il vero grande
salto sta nell'utilizzare l'interesse e le capacità intellettuali di
intere comunità. Lo sviluppatore che impiega le proprie capacità in
un progetto chiuso, soccomberà allo sviluppatore che sa come creare
o aprire contesti evolutivi per individuare bachi e correzioni con
l'aiuto di centinaia di persone.
Il tradizionale mondo Unix fu ostacolato, nello spingere questo
approccio ai suoi estremi, da diversi fattori, tra i quali i vari
contratti di licenza, i segreti industriali e gli interessi
commerciali collegati. Un altro importante fattore (come sappiamo a
posteriori) era che internet non era ancora sufficientemente
sviluppata da fornire il supporto necessario.
Prima dell'internet a basso costo, c'erano alcune comunità
geograficamente localizzate dove la cultura dominante incoraggiava la
programmazione "altruistica" di Weinberg ed un programmatore poteva
facilmente disporre di parecchi co-sviluppatori qualificati e persone
con cui discutere. Fu così che i Bell Labs, il MIT AI Lab, UC
Berkeley, divennero fucine di innovazioni che sono tuttora leggendarie
e potenti.
Linux fu il primo progetto a fare un tentativo, consapevole e di
successo, di utilizzare il mondo intero come una miniera di
talenti. Non penso sia una coincidenza che il periodo di gestazione
di Linux coincida con la nascita del Web e che Linux sia uscito dalla
sua infanzia nello stesso periodo (del 1993-94) che vide il decollo
dell'industria ISP e l'esplosione di interessi primari in
internet. Linus è stato il primo che ha saputo utilizzare le nuove
regole che il dilagare di internet rendeva possibili.
Mentre l'internet a basso costo era una condizione necessaria per
l'evoluzione del modello Linux, penso che non sia stata, da sola, una
condizione sufficiente. Un altro fattore vitale è stato lo sviluppo
di uno stile di leadership adeguato ed il configurarsi di concezioni
cooperative che permettevano ai programmatori di attrarre
co-sviluppatori ed ottenere il massimo risultato consentito dal mezzo
utilizzato.
Ma cos'è questo stile di Leadership e cosa sono queste concezioni?
Non è possibile basarle su rapporti di potere ed anche se si potesse,
una Leadership autoritaria non potrebbe dare il risultato che
vediamo. Weinberg cita, dall'autobiografia dell'anarchico russo del
XIX secolo Pyotr Alexeyvich Kropotkin, intitolata "Memorie di un
rivoluzionario", parole appropriate a questo contesto:
"- Essendo cresciuto in una famiglia proprietaria di schiavi, entrai
nella società attiva come tutti i giovani maschi del mio tempo, cioè
con molta confidenza nella necessità dell'uso del dominio, sotto
forma di disposizioni, rimproveri, punizioni eccetera. Ma quando ben
presto mi trovai a gestire imprese serie, e farlo con uomini liberi,
e quando ogni errore poteva portare a pesanti conseguenze, cominciai
ad apprezzare la differenza tra l'agire secondo i principi del
comando e disciplina e l'agire secondo i principi del giudizio
condiviso. Le tradizioni funzionano a meraviglia nelle parate
militari, ma non hanno senso nella vita reale, dove lo scopo può
essere raggiunto solo attraverso il severo impegno di molte volontà
convergenti -".
"Il severo impegno di molte volontà convergenti" è precisamente ciò
che richiede un progetto come Linux. Il principio di comando è
effettivamente impossibile da applicare tra volontari nel paradiso
anarchico che chiamiamo internet. Per operare e competere
efficacemente, gli hacker, che vogliono dar luogo a progetti
collaborativi, devono imparare come reclutare efficienti comunità di
interesse ed infondervi vigore nel modo a cui allude Kropotkin: il
principio del giudizio condiviso. Devono imparare ad utilizzare la legge
di Linus.
Prima ho parlato dell'effetto Delfi come una possibile spiegazione
della legge di Linus, ma analogie forse più persuasive vengono dai
sistemi adattativi in biologia ed economia. Il mondo Linux si
comporta per molti aspetti come un libero mercato o come un sistema
ecologico, dove un insieme di agenti si muovono egoisticamente
tentando di massimizzare la funzione d'utilità, e in questo processo,
producono un ordine spontaneo ed autocorreggente più complesso ed
efficiente di qualsiasi forma di pianificazione centralizzata. Questo
è il luogo dove ricercare il "principio di giudizio condiviso".
La funzione d'utilità che gli hacker di Linux stanno massimizzando
non è quella data dell'economia classica ma è quella intangibile
costituita dall'autogratificazione e e dalla reputazione acquisita
tra gli altri hacker. (Questa si potrebbe chiamare una motivazione
"altruistica" ma ignoreremmo il fatto che l'altruismo in sé è già una
forma di autogratificazione dell'altruista.) Culture volontaristiche
che funzionano in questo modo oggi sono comuni; un ambiente simile,
al quale ho partecipato a lungo è il fanatismo (in senso buono) per
la science fiction, in cui, però, non esiste quel fattore di crescita
di reputazione di un individuo rispetto agli altri (detto anche
``egoboo'') e che è invece riconosciuto esplicitamente
nell'hackerismo come guida fondamentale per l'attività dei volontari.
Linus ha dimostrato un'acuta padronanza del "principio di
comprensione condivisa" di Kropotkin, proponendosi con successo nel
ruolo di guardiano di un progetto nel quale lo sviluppo è
fondamentalmente fatto da altri ed alimentando l'interesse nel
progetto finché esso non è diventato auto-sufficiente. Questa
prospettiva quasi-economica del mondo di Linux ci permette a
riconoscere come questa "comprensione" è stata applicata.
Potremmo vedere il metodo di Linus come un modo di creare un
efficiente ``mercato dell'egoboo'' che vincola il più possibile l'egoismo
di singoli hacker a obiettivi assai ardui, che possono venir raggiunti
solo con una prolungata collaborazione. Con il progetto Fetchmail ho
dimostrato, sebbene in scala ridotta, che questo metodo può essere
replicato con buoni risultati. Io, forse,l'ho fatto con più
sistematicità e consapevolezza di Linus.
Molte persone, specialmente quelle che, per motivi ideologici, non
accettano i mercati liberi, potrebbero aspettarsi che una cultura di
"egoisti auto-guidati" sia frammentaria, territoriale, devastata,
riservata ed ostile. Ma questa aspettativa è chiaramente disattesa,
per esempio, dalla sbalorditiva varietà, qualità e profondità della
documentazione di Linux; è ben noto che i programmatori odiano
scrivere documentazione; com'è allora che gli hacker di Linux ne
generano così tanta? Evidentemente il libero mercato del Linux-egoboo
lavora meglio e produce comportamenti virtuosi e altruistici ignoti
rispetto alla costose organizzazioni di documentazione tipiche dei
produttori di software commerciale.
Entrambi i progetti di Fetchmail e del kernel di Linux mostrano che,
ricompensando giustamente l'ego di molti altri hacker, un buon
capoprogetto può riuscire a utilizzare internet per guadagnare il
beneficio di avere un gran numero di co-sviluppatori, senza vedere
il progetto sprofondare in un disordine caotico. È per questo che,
alla Legge di Brooks, io contrappongo la seguente:
19. Se il capoprogetto ha un mezzo di comunicazione buono almeno
quanto internet e ha la capacità di guidare senza costrizione,
allora molte teste sono inevitabilmente meglio di una.
Penso che il futuro del software open source sarà dalla parte delle
persone che sapranno come giocare al gioco di Linus, lasciando
indietro la cattedrale per abbracciare il bazaar, ma questo non
significa che la visione individuale e l'intelligenza vivace non
avranno più una funzione: credo piuttosto che la frontiera dell'open
source apparterrà alle persone che, cominciando con brillanti visioni
individuali, sapranno amplificarle attraverso l'effettiva costruzione
di comunità volontarie di interessi.
E forse questo non vale solo per il futuro del software open source.
Nessuno sviluppatore di progetti ``chiusi'' potrà far concorrenza
alla moltitudine di talenti della comunità Linux nel concentrarsi su
un problema. In realtà, non sono molti quelli che potrebbero
permettersi anche solo di pagare le persone (più di 200) che hanno
contribuito a Fetchmail!
Forse, alla fine, la cultura open source trionferà non perché la
cooperazione è moralmente giusta o l'accumulazione di software è
moralmente sbagliata (e c'è chi lo pensa, al contrario ad esempio di
Linus e e di me stesso) ma semplicemente perché il mondo dei sorgenti
chiusi non può vincere una competizione evolutiva con comunità open
source, che possono permettersi di utilizzare il tempo di
professionisti in quantità che sono ordini di grandezza superiori.
11 Ringraziamenti
Questo articolo è stato migliorato da discussioni con un gran numero
di persone che ne hanno reso possibile il debugging. Particolari
ringraziamenti vanno a Jeff Dutky , che ha
suggerito la formulazione ``il debugging è parallelizzabile'' e ha
sviluppato l'analisi che ne consegue, a Nancy Lebovitz
per avermi suggerito di imitare Weinberg
citando Kropotkin. Critiche acute mi sono venute da Joan Eslinger
e Marty Franz ,
della lista General Technics. Sono grato a tutti i membri del PLUG,
the Philadelphia Linux User's Group, per essere stati il pubblico di
prova della prima lettura di questo articolo. E infine, i commenti
di Linus Torvalds mi sono stati di grande aiuto, e il suo sostegno di
grande incoraggiamento.
12 Altre letture
Ho citato diverse parti dal classico di Frederick P. Brooks "The
Mythical Man-Month" perché, sotto molti aspetti, le sue intuizioni
sono ancora le migliori. Raccomando calorosamente l'edizione
del 25° anniversario dell'Addison-Wesley (ISBN 0-201-83595-9) al
quale ha aggiunto il suo documento "No silver bullet" del 1986.
La nuova edizione si chiude con una preziosa retrospettiva fatta 20
anni dopo, nella quale Brooks ammette che alcune argomentazioni nel
testo originale non hanno resistito alla prova del tempo. La prima
volta che lessi la retrospettiva questo documento era già nel suo
stadio finale e fui sorpreso nello scoprire che Brooks attribuisce
pratiche tipo bazaar alla Microsoft! (Comunque, a quanto pare, si
sbagliava. Nel 1998 il Documento di Halloween
(
http://www.opensource.org/halloween.html) ci rivelò che la
comunità
dei programmatori Microsoft è pesantemente balcanizzata e che
l'accesso generalizzato ai sorgenti che è necessario per supportare
il bazaar non è nemmeno remotamente concepibile)
Gerald M. Weinberg con "The Psychology of computer programming"
(N.Y. Van Nostrand Reinhold, 1971) introdusse il concetto piuttosto
sfortunatamente denominato "egoless programming" (programmazione
altruista) e fu probabilmente il primo a riconoscerlo e a discuterlo
nel contesto dello sviluppo del software.
Richard P. Gabriel, contemplando la cultura Unix dell'era pre-Linux,
ha con riluttanza ammesso la superiorità di un primitivo
modello di tipo
bazaar nel suo documento del 1989 titolato "Lisp: good news, bad
news, and how to win big". Sebbene per certi aspetti antiquato,
questo saggio è ancora giustamente celebrato tra i fan del Lisp (me
incluso. Un corrispondente mi ha suggerito che la sezione intitolata
"Peggio è meglio" può essere vista quasi come
un'anticipazione di
Linux. Il documento è accessibile sul web all'indirizzo:
http://www.naggum.no/worse-is-better.html
Il testo di De Marcon e Lister titolato "Peopleware: productive
projects and teams" (N.Y. Dorset House, 1987; ISBN 0-932633-05-6) è
un gioiello sottovalutato che sono stato lieto di veder
citato da Fred Brooks nella sua retrospettiva. Mentre poco di ciò
che gli autori dicono è applicabile a Linux o alla comunità
open-source, l'intuizione degli autori sulle condizioni necessarie
per il lavoro creativo è acuta e meritevole per chiunque tenti di
importare alcune delle virtù del modello bazaar in un contesto
commerciale.
Infine, devo ammettere di essere stato sul punto di chiamare questo
documento "La cattedrale e l'Agorà": agorà, in Greco, significa un
mercato aperto o un luogo di incontri pubblici. Sono stati i testi
fondamentali di Mark Miller e Eric Drexler sui "sistemi agorici", che
descrivono l' emergere di un'ecologia computazionale analoghe ai
mercati aperti, che mi hanno aiutato nel pensare chiaramente ad
fenomeni analoghi nella cultura open source, quando Linux me li mise
sotto naso cinque anni fa. Questi documenti sono disponibili sul Web
presso l'indirizzo
http://www.agorics.com/agorpapers.html.
13 Epilogo: Netscape abbraccia il bazaar!
Accorgersi di stare aiutando la storia a compiersi è una strana sensazione.
Il 22 gennaio 1998, circa sette mesi dopo la prima pubblicazione di
questo documento, la Netscape Communications Inc. ha annunciato
l'intenzione di distribuire i sorgenti di Netscape Communicator
(
http://www.netscape.com/newsref/pr/newsrelease558.html). Prima del
giorno dell'annuncio, non ne avevo il minimo sentore.
Eric Hahn, Vice Presidente esecutivo e capo ufficio tecnologico della
Netscape, mi ha inviato una breve email di cui cito una parte: "a
nome di tutta la Netscape, voglio ringraziarla per averci aiutato a
comprendere l'importanza di questo fenomeno. Le Sue idee ed i Suoi
scritti sono stati ispirazioni fondamentali per le nostre
decisioni."
La settimana seguente andai nella Silicon Valley su invito della
Netscape per partecipare ad una conferenza strategica (il 4 febbraio
1998) con alcuni dei loro top manager esecutivi e tecnici. Insieme
progettammo la strategia e la licenza dei sorgenti di Netscape e
disponemmo alcuni piani aggiuntivi con la speranza di avere un impatto
positivo e di vasta portata nella comunità open source. Come ho
scritto prima, è ancora troppo presto per essere più precisi ma presto
potremo osservarne gli sviluppi.
Netscape è prossima a fornirci, su larga scala, un test di portata
mondiale del modello bazaar nel mondo commerciale. La cultura open
source ora è di fronte ad un problema: se l'iniziativa di Netscape
non funzionerà, il concetto dell'open source potrebbe uscire così
screditato da indurre il mondo commerciale a tenersene alla larga per
un'altro decennio.
D'altra parte, questa è anche una opportunità spettacolare. Le
reazioni iniziali di Wall Street a questa mossa sono state cautamente
positive. Questa è anche un'opportunità di prova per noi. Se Netscape
riconquisterà sostanziose quote di mercato grazie a questa mossa,
potremo trovarci al principio di una rivoluzione attesa da parecchio
nell'industria dell'information technology.
Il prossimo anno credo sarà molto istruttivo ed interessante.
14 Versioni e modifiche
Original Id: cathedral-bazaar.sgml,v 1.42 1998/11/22 04:01:20 esr Exp
La versione 1.16 fu letta al Linux Congress il 21 Maggio 1997
La bibliografia fu aggiunta il 7 Luglio 1997, versione 1.20
L'aneddoto sulla Perl conference fu aggiunto il 18 Novembre 1997,
versione 1.20
Ho cambiato il termine ``free software'' in ``open source' Il 9
Febbraio 1998, versione 1.29
Ho aggiunto la sezione ``Epilogo: Netscape entra nel Bazaar!'' il 10
Febbraio 1998, versione 1.31
La correzione di Brooks basata sul Documento di Halloween è del 20
Novembre 1998, versione 1.40
Altre versioni hanno recepito cambiamenti editoriali minori e
aggiustamenti al markup.
Per la versione Italiana:
$Id: catbaz.html,v 1.2 1999/07/14 14:27:03 alf Exp $
Traduzione dall'inglese all'italiano ad opera di Alessandro Forghieri
.
Prima versione ASCII (1.8) rilasciata sulla mailing
list ERLUG (Emilia Romagna Linux User Group) il 14 Luglio 1999.
Prima versione HTML (1.2) rilasciata al sito
ERLUG (Emilia Romagna Linux User Group) il 14 Luglio 1999.
15 Nota del traduttore
Ho cercato di tradurre ``La cattedrale e il bazaar'' eliminando la
maggior parte degli anglicismi gratuiti che affliggono la letteratura
tecnica, soprattutto quella relativa al mondo dell'informatica. In
questo spirito, ``bug'' è stato consistentemente rimpiazzato da
``baco'' e lo stesso è stato fatto con altri termini.
Termini che non hanno corrispondente in Italiano (ad esempio, i
derivati di debug - il termine gergale italiano ``sbacazzare''
significa ``riempire di bachi'' e non è appropriato) sono invece
stati mantenuti, come i vari derivati di ``hacker'' (con l'eccezione
di ``hack'', che ho variamente reso con ``trucco'' ``programma''
``modifica'', nello spirito del Jargon Dictionary, mantenuto dallo
stesso Eric Raymond).
Ho anche mantenuto le voci ``server'' e ``client'' perché la
traduzione italiana usuale, servente/cliente, mi sembra orrenda.
A proposito del termine ``hacker'', bisogna sottolineare che, nella
comunità dei programmatori, esso non ha il significato negativo che
gli viene attribuito dalla stampa popolare, ma sta significare
pressappoco ``programmatore esperto/virtuoso/creativo'' come nella
frase ``Richard M. Stallman is the archetypal hacker''.
Gli hacker della letteratura popolare (quelli che penetrano nei
computer altrui, per intenderci) sono invece spesso chiamati
``crackers'' o ``script kiddies'' quando se ne vuole sottolineare
l'infantilismo.
Da questo punto di vista, tanto Eric S. Raymond quanto Linus Torvalds
sono indubbiamente degli ottimi hacker.
Parti di questa traduzione sono basate su una traduzione parziale
preesistente (in autentico spirito bazaar) segnalatami da un
partecipante alla lista erlug. Purtroppo ho smarrito il messaggio
contenente tanto l'identità del traduttore quanto la URL del
documento originale. Se lo rintraccerò, ne inserirò il nome in una
prossima revisione.