18 giugno 2019

Meglio un uovo oggi o una gallina domani?

Una versione tecnologica di un quesito che da millenni affligge l'umanità

​Queste riflessioni nascono da due eventi del tutto indipendenti, e collegati solamente dalla nostra mente distorta. 

Il primo è una recente copertina di Wired, che tradotta recita circa "Sono stato fortunato ad essere nato in quel momento. I misteri del software richiamarono la mia attenzione quando ero un ragazzo. Lo amo ancora, il casino del codice, dei toolkit, fino ai pixel e ai processori…"

Il secondo è una frase di Lilli Gruber (o era un ospite?) a Otto e Mezzo: "Secondo lei è giusto insegnare l'intelligenza artificiale ai ragazzi di 11 anni?"
Lì per lì abbiamo pensato che allora a 12 anni gli insegniamo i qbit, saltando a piè pari tutta la fisica, dalla leva ai quanti, ma poi ci siamo resi conto che tutto sommato, e purtroppo, la cosa ha più senso di quanto ci piaccia ammettere, e questo è il punto.

Tornando a Wired, noi vecchi, fortunati ad essere nati in quel periodo, abbiamo imparato l'informatica col saldatore (letteralmente), abbiamo studiato su "The art of computer programming" di D. E. Knuth e all'intelligenza artificiale ci siamo arrivati, ma molto dopo.

E in questi anni (tanti) siamo passati dal 4004 (con le iniziali FF stampate nel die, (http://www.4004.com/assets/4004-masks-showing-fets-j3-.jpg), al 6502 (quello dell'Apple, per cui Bill Gates ha scritto il BASIC, ben 3200 transistor) e poi a 8080, 80286 (che ha fatto litigare Bill Gates con IBM), 80386, e poi alle architetture AMD X64, Xeon, ecc. Oggi gli Xeon multicore hanno diversi miliardi di transistor e incorporano in un singolo chip decine di processori indipendenti, più una quantità di cose che prima erano considerate periferiche.

Una cosa che crediamo sia quasi sempre stata vera è che il software è molti anni in ritardo rispetto all'hardware. Nel senso che se smettessimo di far evolvere l'hardware ci vorrebbero molti anni prima che il software arrivi a fare un uso ottimale dell'hardware disponibile. Abbiamo detto "quasi" perché sappiamo di almeno una eccezione: quando Bill Gates decise di progettare Windows NT per l'80386, che ancora non c'era, e per questo litigò con IBM. E questa è una cosa da non sottovalutare: rilasciato nel 1993 NT era un sistema operativo sviluppato da zero, non l'ennesima versione di qualcosa di esistente. E dopo 25 anni, Windows NT è vivo e vegeto (ma ha un altro nome).

L'evoluzione continua dell'hardware, che ci mette a disposizione sistemi sempre più potenti, non solo è causa di questo ritardo, ma rende del tutto inutile l'ottimizzazione del software. È più facile e meno costoso scrivere software subottimale e contare sulla potenza del processore per compensarne l'inefficienza, piuttosto che perdere tempo a scrivere bene. Questo spiega in parte come mai ci serve un personal computer assurdamente potente per fare cose che anni fa si facevano con molto meno.

Allo stesso tempo (anzi, appunto per questo) continuiamo a vedere strumenti di sviluppo software sempre più sofisticati. Quindi non i linguaggi, che tutto sommato sembrano aver rallentato nell'evoluzione ed essere un po' fermi dopo la grande rivoluzione della programmazione a oggetti, ma anche gli ambienti sono sempre più belli, automatici e multipiattaforma. Ma soprattutto vediamo una stratificazione di componenti applicative che presentano allo sviluppatore paradigmi concettuali sempre più lontani dall'hardware che gli sta sotto e più vicini alla realtà che modelliamo.

Ad esempio il programmatore non usa più strutture dati come le code, gli alberi, i buffer ciclici, e gli algoritmi necessari per manipolarle. Si limita a usare degli oggetti che fanno tutto da soli, come vogliono loro. Lo stesso succede nell'accesso ai database, nella comunicazione in rete, nell'interfaccia utente.
E va bene così, non possiamo reinventare l'acqua calda per ogni nuovo sviluppo. Ma una cosa è usare strumenti di cui capisco il funzionamento. Un'altra è non avere idea di cosa succeda dentro a una scatola nera che fa tutto per me.

Ed è grazie a questo che la domanda di Lilli Gruber tutto sommato ha senso. Si può usare il computer per fare intelligenza artificiale, pur non avendo le basi di informatica che parrebbero essere essenziali anche per fare cose molto meno sofisticate. E questo è vero per tutta l'informatica, non solo per l'intelligenza artificiale.
Purtroppo (o per fortuna) il programmatore non ha più bisogno di saper programmare. O meglio: il programmatore non è più un programmatore.
E soprattutto il programmatore non ha più bisogno delle basi, non deve studiarsi l'arte di programmare i computer. Si potrebbe dire che è normale, che non serve saper aggiustare un automobile per guidarla, o che non serve sapere l'informatica per aggiustare un'auto.

Sulla prima siamo d'accordo ma non ci pare la stessa cosa, qui non parliamo di "usare l'informatica" ma di progettarne. Sulla seconda, non siamo d'accordo. E infatti non c'è meccanico che sappia aggiustare un'auto moderna. Non che sia previsto…

Quello che serve sono le basi. E visto che l'informatica è dappertutto forse tutti dovrebbero sudiarne le basi, proprio come tutti studiano le basi della matematica (e useranno la calcolatrice). 

Concludendo: programmatori sempre più efficienti (e ignoranti di informatica) e programmi sempre più inefficienti.
E la domanda: è meglio un programmatore efficiente (oggi) o un programma efficiente (domani)?

Noi li vorremmo entrambi, programmatori efficienti, ma che hanno le basi e quindi sanno cosa succede "lì dentro", e che usano con cautela i fantastici "framework" a nostro parere oggi un po' sopravalutati.

Segui la nostra
pagina su LinkedIn