De multe ori, in facultate sau in lumea olimpicilor la informatica apare intrebarea daca folosesc la ceva cursurile avansate de algoritmi si structuri de date de la facultate, sau daca premiile la olimpiada au vreo valoare. Recent vorbeam cu Cosmin despre asta, iar mai demult vorbeam cu Calin Fusu despre daca intr-adevar este nevoie ca, la nivel de dezvoltator/programator, sa ai oameni ultra calificati sau este ok si cu programatori medii.
La vremea respectiva nu am reusit sa ii raspund convingator lui Calin insa, intre timp, am ajuns la niste concluzii organizate si ceva mai argumentate. ๐
Programatorii rezolva probleme. Cel mai bun exemplu recent de probleme vizibile sunt problemele de scalabilitate pe care le-a avut trilulilu.ro. Cum nu stiu care au fost cauzele, as imparti problemele lor in mai multe categorii posibile.
1. Limitare de resurse fizice. Spatiu pe disc, banda de internet, timp de acces la disc.
Daca ai ramas fara spatiu pe disc (exemplu simplist) nici un algoritm nu te poate ajuta (cel mai probabil), asa ca un programator foarte algoritmic nu se va diferentia probabil semnificativ de un programator mai putin olimpic. Singura solutie este cumpararea de mai multe resurse.
2. Limitare de putere de procesare. Query-uri care dureaza prea mult, procesoare care stau la 100% sau RAM insuficient.
Puterea de procesare si memoria sunt consumate de cod, cod care este scris de programatori. De obicei exista tentatia subestimarii pragului de complexitate unde cunoasterea algoritmilor face diferenta, asa ca simt nevoia sa dau un exemplu pe care l-am dat recent la o intalnire FlashCodersNY: determinarea duplicatelor intr-o lista de elemente.
Sa zicem de exemplu ca, in cazul trilulilu, vor ca dintr-o lista de clipuri sa determine titlurile duplicate. Un ne-olimpic cel mai probabil va ordona lista si va vedea daca titlurile de pe pozitii consecutive sunt egale. Un olimpic iti va spune ca asta se poate face mult mai rapid cu un hash. Diferenta intre cei doi algoritmi va fi probabil de cel putin cateva ordine de marime (sper sa nu deschid o cutie a pandorei cu ce stiu si ce nu stiu ne-olimpicii, exemplul este simplist, you get the point ๐ ).
Desigur, si in cazul asta ineficienta programatorului poate fi suplimentata prin cumparare de resurse. Pragmatic vorbind, costul unui programator care scrie cod (sa zicem) de doua ori mai ineficient decat ideal va fi salariul plus costul resurselor care trebuiesc cumparate pentru a suplimenta ineficienta codului. Daca programul ideal ar fi consumat resursele a 2 calculatoare, costul adaugat de dezvoltatorul slab va fi de 2 calculatoare. Daca ideal ar fi consumat 10, adaugi 10 calculatoare.
Am facut un grafic cu evolutia costurilor in functie de nevoia de scalabilitate, in contextul unui algoritm de (sa zicem) doua ori mai ineficient. In punctul A un programator slab ajunge sa coste compania la fel de mult ca un programator bun, in timp ce acesta din urma poate sa ajunga, cu aceleasi costuri, la un trafic de cateva ori mai mare.
3. Limitari date de solvabilitate. Exista anume probleme pe care pur si simplu doar oameni care stiu algoritmi le pot rezolva eficient, unde diferenta de performanta este prohibitiva inca de la dimensiuni foarte mici ale problemei.
De exemplu, drumul minim intre doua noduri ale unui graf. Un programator ne-algoritmic cel mai probabil nu va sti sa rezolve astfel de probleme si va decide ca ar dura ani si ani pentru un calculator sa gaseasca solutia. Un dezvoltator algoritmic iti va spune rapid ca asta se poate face chiar foarte usor si foarte repede.
Cand apar astfel de probleme? E drept, probabil nu in cazul trilulilu. Dar ganditi-va de exemplu la jocurile de strategie, in care trupele se muta pe harta dintr-un loc in altul printre castele, munti, dealuri si paduri.
Categoria asta de probleme nu mai poate fi rezolvata prin costuri de resurse fizice si cel mai probabil pot fi rezolvate prin schimbarea problemei. In acest caz compromisul inseamna feature-uri lipsa, specificatii diferite, comportamente diferite si asta nu mai este un compromis acceptabil atunci cand succesul business-ului tau sta in implementarea unui anumit produs intr-un anumit fel.
In loc de concluzie
Da, cel mai probabil exista categorii de produse si probleme care pot fi rezolvate fara olimpici si fara algoritmi. Mai mult, pana la un anumit nivel cunostintele unui olimpic pot fi inlocuite prin a cumpara mai multe resurse si costuri mai ridicate.
Insa de aici si pana la a afirma ca algoritmii nu sunt folositori sau ca olimpiadele nu au prea mare valoare este cale lunga.