La matematica nella programmazione

Quanto matematica utilizza uno sviluppatore? E quanta matematica bisogna conoscere per saper e poter sviluppare bene?
Se si ha la passione per la programmazione molto probabilmente si riescono a superare tutti gli ostacoli dovuti a qualche mancanza matematica. Ciononostante se oltre alla passione si possiede una decorosa conoscenza matematica, nonché della logica, la nostra “vita” da sviluppatore ne guadagnerà sicuramente. Risulta comunque evidente che non tutti i programmatori hanno necessità di scontrarsi con problemi “matematici”. Molto, anzi tutto, dipende dal tipo di programma che si sta sviluppando. Una rubrica telefonica ha sicuramente molta meno matematica di un giochino come PacMan! Anche se non è sempre detto. In definitiva tutto dipende dalla “parte” di codice che stiamo sviluppando.

Centrare un elemento

Chi ad esempio sviluppa user interface (UI), ha certamente dovuto affrontare almeno una volta situazioni che richiedevano moltiplicazioni e divisioni aggrovigliate assieme.  Una volta mi è capitato di imbattermi in un codice che doveva centrare orizzontalmente una window rispetto allo schermo. La funzione (non riporto il codice originale in C per semplificare la lettura a tutti) era scritta in questo modo:

1
window.x = ( screen.width / 2 ) – ( window.width / 2 )

Probabilmente il programmatore quando l’ha scritta ha – correttamente – ragionato in questo modo:

  1. Trovo il centro dello schermo ( screen.width / 2 )
  2. Posiziono la finestra nel mezzo dello schermo ( window.x = screen.width )
  3. Dato che in questo modo sarebbe centrato solo l’angolo superiore sinistro della finestra, sottraggo anche la metà della larghezza della finestra ( window.width / 2) per “centrare” il tutto
  4. window.x = ( screen.width / 2 ) – ( window.width / 2 )

Fino qui la logica e la passione hanno sicuramente aiutato il nostro sviluppatore. Tuttavia un ulteriore miglioramento poteva esser fatto giusto per evitare le due divisioni, ovvero:

1
window.x = ( screen.width – window.x ) / 2

La conoscenza delle frazioni, e quindi un po’ di matematica elementare, avrebbero risparmiato alla CPU un divisione di troppo: una delle operazioni più pesanti tra l’altro!
Se poi vogliamo essere “maniaci” o perfezionisti, potremmo, in base al linguaggio di programmazione che usiamo, migliorare ulteriormente l’operazione scrivendo:

1
window.x = ( screen.width – window.x ) >> 1

Dove è >> indica l’operazione logica di “spostamento” a destra di un bit – notoriamente operazione molto rapida. Spostare a destra di un bit un valore equivale a dividerlo per 2!

15 commenti a: “La matematica nella programmazione”

  1. 21 gen, 2009 vik:

    Dove è >> indica l’operazione logica di “spostamento” a destra di un bit – notoriamente operazione molto rapida. Spostare a destra di un bit un valore equivale a dividerlo per 2!

    … è per questo che odio il C!!!

  2. 21 gen, 2009 Giovambattista Fazioli:

    @vik:

    … è per questo che odio il C!!!

    Come ??!! Non dire così… il C è il linguaggio per eccellenza! Tutti, da Java, PHP, Javascript e Actionscript hanno ereditato l’esperienza e la sintassi del C ( o C++ ). È, tra l’altro, il linguaggio più longevo che conosco, a parte qualche BASIC rivisto e corretto. Javascript e Actionscript, ad esempio, possono essere considerati C evoluti… Un consiglio: pazienta e prova ad usare o anche solo a leggere qualche codice C, vedrai che con il tempo lo apprezzerai ed amerai come molti :D

  3. 21 gen, 2009 mestesso:

    Questo post sottintende una errata visione della matematica come disciplina e ne descrive semplicemente la visione “dell’uomo comune”, tutt’altro che corretta :( .

    Se si ha la passione per la programmazione molto probabilmente si riescono a superare tutti gli ostacoli dovuti a qualche mancanza matematica.

    No. Controesempio: nel campo della grafica, se sviluppi anche solo un programmino che visualizza un orologio analogico, se non conosci un pizzico di geometria…you’re lost! E non mi sembra sia una applicazione “difficile”! E poi, TUTTI inconsciamente se non la conoscono, da “praticoni” usano la matematica senza saperlo…la questione direi che è malposta.

    Una rubrica telefonica ha sicuramente molta meno matematica di un giochino come PacMan!

    No. Questa è la tipica visione “quantitativa” dell’Uomo Comune. La matematica è la scienza che descrive in forma rigorosa, dati alcuni elementi definiti aprioristicamente ed un insieme finito di procedure per derivare nuove regole, le relazioni tra le entità definite.
    Se si vuole dare una relazione d’ordine come “maggiore di”, necessaria per poter dare significato alla frase quotata sopra, occorre avere le idee ben chiare su cosa si stia facendo questa operazione!

    “Più matematica” vuol dire, seguendo la mia definizione data sopra (brutta per altro) di matematica significa “più regole, più teoremi…”. Davvero una rubrica, o meglio le operazioni che si possono fare su una rubrica, hanno meno regole di Pacman (con tutto l’amore che ho per il videogame)?
    Sicuramente no. Lo dico a ragion veduta: Pacman è un “semplice” giochino, una rubrica è un insieme ordinato, che può essere oggetto di una vasta e profonda analisi.

    Per avere una idea mooolto banalmente quantitativa, guarda questo libro: The Art of Computer Programming, vol 3″, 800 pagine sugli algoritmi di ordinamento e ricerca necessari a produrre e consultare una rubrica! E non è una opera completa….Sei ancora sicuro che Pacman sia “più complesso”?

    Quanta matematica c’è dietro Pacman, oltre alla geometria elementare? Senza svilire il giochino che a me piace, ma non moltissimo.

    Sentitamente….

  4. 21 gen, 2009 Giovambattista Fazioli:

    @mestesso: visto che quello che hai scritto in parte lo condivido, in un contesto generale, è bene che faccia una precisazione, onde evitare fraintendimenti.
    Il mio “esempio” è riferito agli attuali ambienti di sviluppo. Prodotti come Microsoft Visual Basic o lo stesso Adobe Flash, mettono a disposizione oggetti drag & drop che fanno moltissime operazioni senza a volte dover scrivere una riga di codice. Conosco programmatori, nel senso di persone che producono software, che davvero non hanno idea di come centrare una window in uno schermo! Eppure i software da loro creati hanno Window centrate! Questo avviene in quanto alcuni tool di sviluppo ad alto livello (ai quali mi riferivo indirettamente) propongono oggetti Window con la proprietà align da impostare semplicemente su center, in questo modo lo “sviluppatore” non ha la minima idea di cosa accada “sotto”.

    Per quanto riguarda la questione della “rubrica telefonica”, è ovvio che qualsiasi applicazione può essere sviluppata in modi assai diversi. Tuttavia il mio esempio si riferiva al fatto che è possibile in modo semplice, ad esempio usando PHP e MySQL:

    - Creare una tabella “rubrica” con gli appositi campi
    - Impostare una textbox per eseguire un INSERT
    - Scrivere una semplice SELECT per estrarre i dati

    Nonostante la sua rozza architettura e senza applicare nessuna “matematica” (intesa nel contesto del post), un applicativo di questo tipo è pur sempre una “rubrica telefonica” (per “sortare” gli elementi ci pensa il database con un semplice ORDER BY).

    Contrariamente, per realizzare un “rozzo” Pacman, anche il più semplice pensabile, si è costretti a scontrarsi per forza di cose con qualche “nozione matematica”.
    Non considero, ovviamente, l’uso di qualche prodotto che “crea” videogame con il semplice click del mouse… in questo caso sarei perfettamente d’accordo con te. Stesso discorso vale per le applicazioni grafiche che citavi:

    nel campo della grafica, se sviluppi anche solo un programmino che visualizza un orologio analogico, se non conosci un pizzico di geometria…you’re lost!

    Questa tua affermazione è tanto vera quanto falsa, esattamente quanto lo è il mio post. È possibile infatti scaricare “oggetti” preconfezionati (io ne stavo preparando propio uno per Adobe Flash) che vanno solo impostati tramite le loro proprietà (colore del quadrante, lancette, dimensioni, etc…) così da visualizzare un orologio analogico nella nostra applicazione, senza davvero sapere cosa c’è sotto.

    Anche solo pensare a strutturare un gioco come Pacman, mi riferisco a tracciarne la “logica” su un foglio di carta, richiede un approccio “matematico” sicuramente differente da una “rubrica telefonica”. Quest’ultima, infatti, come sottolineavi tu, può avere a corredo numerose implicazioni “matematiche”, ma non è essa stessa una “struttura matematica” – intesa sempre nell’ottica di una applicazione.

    Un gioco come Pacman, invece, è di per se una “struttura matematica”! Prima di tutto è del tutto paragonabile ad una matrice bidimensionale, che rappresenta il gioco in se stesso. Senza poi prendere in considerazione gli algoritmi legati ai “nemici fantasmini” che devono inseguirti per poi “scappare” impautiri quando ingoi una “pillola” :D

    Insomma, io ho capito la tua precisazione, e mi trovi d’accordo. Tuttavia il taglio del mio post non era “generale” ma “parziale”. Tutto è “matematica” e niente lo è, se non contestualiziamo.

    Nel ringraziarti della segnalazione del libro The Art of Computer Programming, vol 3, dai uno sguardo, ad esempio, a Tile Based Games

    P.S.
    Conosco bene gli algoritmi di ordinamento, un tempo ne ho scritti vari in Assembly Motorolo 68000 :D – quindi “sfondi una porta aperta” :D
    Peccato, oggi nessuno li scrive più… sono tutte funzioni già fatte e incapsulate in qualche Kernel o oggetto :(

  5. 22 gen, 2009 mestesso:

    Conosco programmatori, nel senso di persone che producono software, che davvero non hanno idea di come centrare una window in uno schermo!

    Il tutto rientra in quello che ho detto “utilizzo inconsapevole” della matematica. Che significa appunto, usarla senza saperlo. Ma si usa cmq :) .

    Un gioco come Pacman, invece, è di per se una “struttura matematica”!

    Ma certo che lo è! Io mica ho detto il contrario. Ma continuo a dirti che Pacman è (matematicamente) mooolto più semplice di una rubrica!Contiene meno regole! Lascia perdere poi il fatto che esistono meno tool per fare videogame rispetto alle applicazioni da ufficio: il fatto che uno copi la matematica fatta da altri è per me ininfluente. La usa, e basta. Ma ne usa più o meno a seconda. Pacman, per chi parta da zero, è più facile da scrivere di un algoritmo di ordinamento. Provare con un ragazzino che ha appena iniziato ad usare il computer per credere ;) .

  6. 22 gen, 2009 Giovambattista Fazioli:

    @mestesso: io continuo a pensare che sia decisamente molto più complesso realizzare un gioco come Pacman che una rubrica telefonica. Un algoritmo di sort – dal più rozzo bubble sort – è un “problema” isolato, che si può risolvere più o meno elegantemente. Diverso è tutto il “parallelismo” interno in un gioco come Pacman, dove devi saper organizzare l’intero “applicativo” in un flusso continuo in movimento, dal personaggio principale, ai nemici, allo score, ai bonus, etc…

    Pacman non solo è più articolato a livello matematico, ma lo è anche a livello di struttura: un applicativo come una “rubrica telefonica” normalmente attende che l’utente prema qualche tasto. Un gioco, diversamente, ha una sua “vita” propria e non aspetta necessariamente un nostro “input” (se non muovi Pacman all’inizio del gioco… in pochi secondi verrai ucciso…).

    Tuttavia è anche una questione di punti di vista… :D

    Potremmo chiedere direttamente agli sviluppatori?!

    Tempi e difficolta nel realizzare un gioco come Pacman e una Rubrica Telefonica in Javascript (PHP/MySQL) e/o Actionscript… :D :D

  7. 22 gen, 2009 mestesso:

    @Giovambattista Fazioli:

    Tanto tempo!=difficile. Non tutto quello che è lungo da realizzare è complesso: a me viene in mente una cli che ho fatto per lavoro, alla fine il tutto era aggiungere case ad un switch in C, ma aggiungerne *tanti* semplici occupa molto tempo, ma mica è difficile ;) .

    Ah, una cosa: ma su questo blog perché non si riesce a fare righe vuote nei post? E’ veramente scomodo…

  8. 22 gen, 2009 Napolux:

    Ti ho risposto in un post che uscirà domani da me :P

  9. 25 gen, 2009 nicola:

    Bene o male oggi lo sviluppatore basa il proprio lavoro su librerie o framework già fatti, e anch’io preferirei di gran lunga fare una rubrica che un pacman. Ma anche iniziando da zero ritengo pacman ben più difficile.

    Se nella rubrica c’è l’algoritmo di ordinamento (problema non difficile, a mio avviso) nel pacman ho bisogno di un generatore di numeri casuali per muovere i fantasmi (tutt’altra pasta). Se ho una ricerca binaria da una parte, ho il rendering di un cerchio dall’altra.

    La grafica è un incubo se devi farla da zero: il solo disegnare una linea inclinata è un incubo perché le soluzioni banali sono da scartare per via delle prestazioni.

  10. 27 gen, 2009 unwiredbrain:

    Non sempre comunque uno shifting verso destra risulta più veloce rispetto ad una “normale” divisione: in JavaScript, ad esempio, non vi è alcuna convenienza in termini prestazionali. Parola di Douglas Crockford! (mica mio cuggino)

    Cito testualmente da una slide pubblicata durante un suo talk:

    The bitwise operators convert the operand to a 32-bit signed integer, and turn the result back into 64-bit floating point.Gli operatori bit a bit (bitwise) convertono l’operando in un intero con segno a 32 bit, quindi ritornano il risultato riconvertito in un numero a virgola mobile a 64 bit.

    Se in più si considera che i numeri in JavaScript sono solo a 64 bit, salta immediatamente all’occhio l’immane perdita di tempo.

    Per chi volesse farsi un ripasso: “Douglas Crockford – The JavaScript Programming Language” http://developer.yahoo.com/yui/theater/

  11. 27 gen, 2009 unwiredbrain:

    Ehi! Mi ha tranciato i paragrafi dal blockquote!

  12. 27 gen, 2009 Giovambattista Fazioli:

    @unwiredbrain:

    Non sempre comunque uno shifting verso destra risulta più veloce rispetto ad una “normale” divisione

    Hai detto bene! Tutto dipende infatti dal linguaggio che si sta usando, dal sistema operativo, dal tipo di compilatore e/o interprete ed altri fattori. Quello che dici è tanto vero quanto sconcertante, ad esempio, in ambiente Adobe Flash. Da alcuni test fatti, si è visto che le performance cambiano a seconda della versione, nell’uso del proiettore stand-alone o nell’uso (nella versione) del player Flash per il browser.
    Diciamo che a livello didattico, se sviluppassimo a basso livello in C o in Asembly, le operazioni binarie sono sicuramente più rapide (basta vedere i cicli di clock di un microprocessore). Poi ovviamente le implementazioni ad alto livello introducono evidentemente disturbi ed alterazioni che rendono alcune tecniche del tutto inefficaci come da te sottolineato; vedi il caso di Javascript.

  13. 27 gen, 2009 Giovambattista Fazioli:

    @unwiredbrain:

    Ehi! Mi ha tranciato i paragrafi dal blockquote!

    Dove?

  14. 27 gen, 2009 unwiredbrain:

    @Giovambattista Fazioli: all’interno del blockquote avevo piazzato due paragrafi separati… Boh…

    Per il resto, condivido il tuo commento nell sua interezza: volevo solo evidenziare l’anomalia dello specifico caso ;)

  15. 31 gen, 2009 RSS Week #40: articoli interessanti che ho trascurato - Matteo Moro:

    [...] quanto riguarda la questione dei programmatori-matematici (o dei programmatori-fisici), io sto dalla parte di Linus Torvalds: “Se sei abbastanza bravo, [...]

Lascia un commento

TAG XHTML PERMESSI: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> INSERIMENTO CODICE:
<pre></pre> // blocco generico
					<code></code> // blocco generico
					[cc_actionscript][/cc_actionscript] // Actionscript
					[cc_actionscript3][/cc_actionscript3] // Actionscript 3
					[cc_css][/cc_css] // CSS Style Sheet
					[cc_html][/cc_html] // HTML
					[cc_js][/cc_js] // Javascript
					[cc_objc][/cc_objc] // Objective-C
					[cc_php][/cc_objc] // PHP
					[cc_sql][/cc_sql] // SQL


Stop SOPA