[Soci SLIP] Da grande farò il programmatore

Lucio Crusca lucio a sulweb.org
Mer 20 Mar 2013 10:45:52 CET


In data Tuesday 19 March 2013 19:37:30, llcfree ha scritto:
> Senza sapere cosa si ottimizza, infatti, non ha significato. Potrebbe
> non essere il tempo del programmatore la variabile da ottimizzare.
> 
> Per chi si occupa di sprechi, mi sembra ovvio che sia importante capire
> dove nasca lo spreco (prima di e per decidere se ridurlo o no). Per
> questo, occorre fare i conti giusti.

Sì, sono d'accordo. Magari le prestazioni del software in oggetto sono 
veramente tanto pietose rispetto alla mole di dati trattata da richiedere 
interventi. Il sospetto però in questo caso è che le ottimizzazioni non 
basteranno, ma si renderà necessaria una riscrittura degli algoritmi (o nel 
caso peggiore del software intero, se originariamente era stato proprio 
scritto male).

> Per chi fa l'imprenditore, mi sembra ovvio che il successo dipenda
> soprattutto dal buon progetto e il buon progetto e' quello che non
> spreca nulla, per definizione 

Non è detto, ovvero non è sempre quella la definizione di "buon progetto". 
Seguendo la tua regola zero, che riassumo con "tutto è relativo", cosa sia 
buono e cosa no dipende dagli obiettivi che ci poniamo. Io da imprenditore 
direi che un buon progetto è quello che soddisfa il cliente. Se poi spreca 
qualcosa che ad oggi costa quasi zero, pazienza. 

Faccio un esempio pratico: se scrivo un software che usa delle variabili 
intere per rappresentare dei valori booleani (vero o falso), sto sprecando 
tipicamente 31 bit su 32 per ogni valore booleano che memorizzo. Se il compito 
del software è memorizzare e gestire sequenze lunghissime (svariati miliardi) 
di valori booleani, forse varrebbe la pena ottimizzare il codice, utilizzando 
un solo bit per ogni valore e quindi memorizzando ben 32 valori in una sola 
variabile intera. Risparmierei circa il 95% della memoria. Dico forse però, 
perché poi dipende dagli algoritmi che dovrò applicare su quelle sequenze: se 
gli algoritmi diventano complicati per il fatto che per accedere ad uno dei 
booleani non posso più usare funzioni già predisposte in varie librerie, 
probabilmente non conviene ottimizzare nonostante il risparmio di memoria. 
Se invece il mio software usa una al più manciata di booleani che servono a 
memorizzare le preferenze dell'utente e qualche altra variabile booleana 
sparsa qua e là per il codice, in questo caso non c'è proprio nulla che 
giustifichi l'ottimizzazione: la soluzione è usare un intero per ogni booleano, 
anche se si sprecano 31 bit su 32 (fossero anche 63 su 64 il discorso non 
cambia). Il tutto IMHO.


> Ergo, e questa invece e' la domada:
> 
> Come pensi si possano "scegliere" i pezzi da comporre (che e' quello che
> il tuo approccio giustamente suggerisce) senza sapere cosa facciano,
> come comporli e quali siano i costi reali (tutti, non solo il costo del
> programmatore, ma anche il costo dell'oggetto che ne risulta, rispetto a
> quello che l'oggetto puo' fare)?
> 
> Voglio dire, come si fa a far rendere tutto il possibile, senza sapere
> esattamente cosa sia possibile e cosa no, che e' poi il criterio con cui
> lavorare in modo sano?

Non sono sicuro di capire la domanda, provo a rispondere, ma se rispondo fuori 
tema prova a farmi un esempio pratico, anche se inventato.

I pezzi da comporre (le librerie) non si possono scegliere se non sai che cosa 
fanno. Prima ancora devi sapere cosa vuoi fare tu con il tuo software. Quando 
lo sai ed hai una visione delle funzionalità che ti servono, cominci a cercare 
(su Google), per ogni funzionalità, se esiste una libreria che la implementa. 
Se la trovi, sai che cosa fa (visto che l'hai cercata per un motivo). Se non 
la trovi... beh o cerchi meglio, o è una funzionalità specifica del tuo 
software e quindi te la devi scrivere. Ho risposto?

> 
> > 6. qualsiasi linguaggio va bene.
> 
> Ma ogni linguaggio ti porta piu' o meno vicino allo spazio di problemi
> che puo' risolvere in modo efficiente. Imparare un nuovo linguaggio di
> programmazione e' davvero banale, infinitamente piu' semplice
> dell'imparare un lingaggio naturale. Il vero probelma e' imparare a
> programmare, con un linguaggio qualsiasi (qualsiasi ??? alcuni sono
> infinitamente peggio di altri, per questo scopo).

Diciamo che c'è una distinzione fra il linguaggio e le librerie disponibili 
per quel linguaggio. Imparare un linguaggio, ovvero una sintassi, è 
effettivamente banale. Corrisponde grosso modo ad imparare come si strutturano 
soggetto, verbo e complementi in una nuova lingua che vogliamo imparare ed in 
cui non esistono eccezioni (utopia nel caso delle lingue).

Imparare invece le librerie che sono disponibili per un determinato linguaggio 
è un po' come imparare, oltre al tedesco, anche tutta la letteratura e la 
storia della Germania, la filosofia tedesca, il sistema legislativo, politico ed 
economico, in modo da avere gli strumenti per sostenere un discorso di 
qualsiasi livello con chiunque quando si andrà in Germania in vacanza. 
Ovviamente possiamo imparare solo una parte della lingua e nulla di tutto il 
resto e tanto ci basterà ad arrangiarci in vacanza. Allo stesso modo, nei 
linguaggi di programmazione, basterà imparare una piccola parte delle librerie 
e tanto basterà ad arrangiarsi, ovviamente accettando il fatto che i programmi 
risultanti sembreranno come discorsi di un italiano in germania che ha 
imparato il tedesco con il corso deagostini.

> Senza conoscerne "almeno" due, come si fa? 

Non si fa. Questo è un punto che aggiungo volentieri all'elenco.

12. Sapere un solo linguaggio non basta. Di solito non basta saperne neppure 
solo due, se consideriamo linguaggi anche le sintassi puramente dichiarative 
come HTML, XML, CSS e cose del genere. Non è però necessario essere esperti di 
tutto quanto. Un linguaggio sarà il nostro preferito, quello con li quale 
risolveremo il 90% dei problemi. Per il restante ed irrinunciabile 10%, 
obbligatorio perché il nostro programma necessariamente dialogherà con altri 
programmi e sconfinerà in spazi di problemi in cui il nostro linguaggio 
preferito non calza a pennello, dobbiamo avere almeno le basi di alcuni altri 
linguaggi.

> I problemi da risolvere e gli
> strumenti per farlo spaziano dall'arduino al cray. Come giustamente dici
> anche tu. Ma chi sa solo un linguaggio, a quello si affeziona. L'ho
> visto succedere con il bellissimo, elegantissimo "scheme": frotte di
> programmatori sfornati da scienze dell'informazione che usavano le liste
> invece degli array 

Sì, è vero, io sono uno di quelli (non di quelli affezionati a scheme, ma di 
quelli affezionati al concetto di programmazione funzionale). Al primo 
programma scritto in C che va in stack overflow perché il C è il linguaggio 
sbagliato per scrivere funzioni ricorsive, ci si rende conto che forse esiste 
anche un mondo là fuori, inteso fuori dall'università, e che forse scheme non 
è necessariamente la risposta a tutti i mali.

> In buona sostanza, non pensate di diventare miracolosamente ottimi
> progettisti/programmatori (un programmatore e' un soggetto che progetta
> software) senza l'esperienza necessaria. 

Soprattutto non pensate che bastino i 12 punti elencati... :D

> Potete ritrovarvi ad essere
> ottimi "sprecatori", al piu', e vi funzionera' solo finche' non sarete
> messi alle strette dai limiti imposti dalle risorse disponibili o dalla
> competizione (sacrosanta, quando non violenta) sui mercati.

Se ci si mette ad ottimizzare i bit però si sarà messi alle strette dalla 
competizione molto prima di quanto uno sprecatore sarà messo alle strette 
dalle risorse disponibili (a meno che non si parli di microcontrollori, in 
quel caso può essere molto più importante non sprecare, a seconda di cosa si 
vuol far fare ad arduino o chi per lui, pena il rischio di non riuscire 
proprio a farglielo fare).




Maggiori informazioni sulla lista Soci