Matematică în programare

Am fost întrebat recent ce componente ale matematicii am utilizat de-alungul timpului în meseria mea de programator:

  • Geometrie analitică în plan (2D): deseori am folosit aspecte ale acesteia de multe ori în realizarea de interfețe utilizator mai complexe, precum, de exemplu, aranjarea unor dreptughiuri pe marginea interioară a unei elipse; totuși, de multe ori foloseam unele aproximații euristice în loc să caut sau să calculez formulele exacte, pur și simplu pentru că rezultatul nu trebuia să fie exact: un exemplu este că în loc de a determina dacă pun punct de pe o hartă politică a lumii se află într-o țară și în care anume pe baza unor verificări de interior poligonal, am folosit o metodă cu dreptunghiuri definite pentru fiecare țară ordonate după mărime și poziționate pe Z-index în această ordine și verificarea interioarelor dreptunghiurilor; am putut astfel specifica într-un fișier mult mai ușor dreptunghiurile fiecărei țări, în loc de a specifica toate punctele poligoanelor lor, și în plus, performanța rezultată a fost, probabil, chiar mai bună prin aproximare; suplimentar, am avut nevoie de geometrie analitică și pentru diverse animații (modificări în timp ale imaginii vectoriale 2D), inclusiv pe baza unor curbe (ca de exemplu, bezier), pentru mișcarea naturală a imaginii;
  • Geometrie analitică în spațiu (3D): uneori, destul de rar ce-i drept, am avut nevoie să construiesc figuri și scene 3D, chiar și animate; am căutat însă întotdeauna să nu am nevoie de 3D, iar dacă puteam reprezenta direct proiecția 2D pe ecran o făceam (pentru optimizare dar și viteză de lucru: să înțelegi și să simți în 3D e mai greu decât același lucru în 2D, odată ce te-ai obișnuit cu ecranul 2D pe care afișezi, de obicei, toate informațiile);
  • Matrici: am avut nevoie de ele pentru diverse transformări 2D sau 3D (translații, scalări, rotații, statice sau în animații), tot la nivelul interfeței utilizator: nu le-am utilizat însă direct întrucât existau deja obiecte de translație gata implementate;
  • Combinatorică: am utilizat de câteva ori permutările, aranjamentele sau combinările în cadrul unor calcule algoritmice complexe; de exemplu, pentru crearea unei funcții de resource leveling pentru o componentă în legătură cu managementul de proiect; uneori, însă, timpul necesar tuturor încercărilor combinatorice (mai ales utilizând backtracking recursiv) era prea mare și atunci am aplicat și un nivel de euristică: am prioritizat anumite combinări în detrimentul altora, iar după un anumit interval de timp (considerat de mine rezonabil pentru utilizator) am returnat o soluție optimă locală, determinată până atunci;
  • Logaritmică: o singură dată (în trecut) am avut nevoie de o transformare logaritmică, și anume, o anumită componentă avea nevoie de setarea unui parametru de tip volum de sunet, specificat între o valoare negativă maximă în modul și zero (zero însemna volumul maxim, valoarea negativă însemna minim); probabil că programatorul acelei componente a preluat ideea din fizică (unde decibelii sunt logaritmici); dar eu în interfața utilizator aveam un volum specificat cu un track bar, între 0 și 100 (100 fiind volumul maxim), deci a trebuit să găsesc o soluție de conversie; totuși, din câte-mi aduc aminte, am folosit și aici niște aproximații, poate chiar barbare, în loc de formule exacte;
  • Probabilități: am avut nevoie (rar) și de aspecte probabilistice (la crearea unor jocuri); în plus am avut nevoie de random adevărat, entropic (non-gaussian) pentru obținerea unor chei de securitate, dar aici deja am putut folosi unelte pre-existente;
  • Artimetică și algebră: desigur că am avut nevoie aproape tot timpul de aceste fundamente ale matematicii, fie pentru calcule simple, precum costul unui set de sarcini, dacă sunt date costurile fiecăreia, fie pentru a determina relații complexe, precum soluțiile unor ecuații apărute pentru că era necesară prezentarea unei valori calculate pe baza altora cunoscute în interfața utilizator.

În concluzie: e bine să ai un fundament matematic atunci când ești progamator; în afara aritmeticii și algebrei, ai nevoie de ele măcar pentru a ști cum poți aproxima lucrurile și a ști să găsești eventual componente pre-existente (căutând după numele elementelor pe care le cunoști); referitor la aproximări, chiar dacă nu vei folosi formulele exacte, cunoașterea esenței lor e importantă prin prisma proprietăților pe care le au: dacă vei cunoaște aceste proprietăți poți găsi mai ușor soluții de aproximare, făcându-ți în final viața de programator mult mai ușoară în ansamblu, iar performanța programelor mai bună sub formă de corolar.

About Sorin Dolha

My passion is software development, but I also like physics.
This entry was posted in Computere și Internet and tagged , , , , , , , , , . Bookmark the permalink.

Add a reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s