Ce e important şi ce nu în programare?

Un articol mai vechi (din 1998) despre algoritmi şi programe, despre limbaje şi medii de programare şi despre cum alegem un mediu de programare. Multe din cele scrise aici sunt încă valabile.

Dacă înlocuieşti stiloul cu pana, nu ajungi poet.

E mai mult decât evident! Au fost atâţia scriitori care au scris noaptea, la lumina lumânării şi cu pană şi au lăsat omenirii opere literare de mare valoare. Aşa cum un amator netalentat poate folosi stiloul cu peniţa de aur cel mai scump sau chiar calculatorul şi imprimanta şi să nu realizeze nimic valoros din punct de vedere literar. Aşa stau lucrurile şi în programare. Poţi apela la un mediu de programare foarte performant şi să nu poţi realiza nimic valoros, sub aspect informatic, pe când – poate – folosind un mediu de programare mai puţin dezvoltat, să realizezi programe care să-i încânte pe toţi. Mediul de programare este pentru programator, precum pana sau stiloul pentru scriitor. Iar programul este precum un roman sau o poezie.

girl_computer

Fireşte, dacă foloseşti un toc a cărui peniţa o înmoi mereu în călimară cu cerneală, poţi avea diverse probleme. Poate că din greşeală răstorni călimară şi pătezi tot ce ai scris sau poate peniţa va scrie în unele locuri mai îngroşat, iar în altele mai subţire. Asta, însă, nu va afecta nicicum valoarea operei literare şi nu va schimbă cu nimic opinia criticilor despre ea. Dacă scriitorul va folosi un stilou cu rezerve de cerneală sau multe din problemele sale se vor rezolva. Dacă va apela la un calculator, va putea corectă cu uşurinţă greşelile, adaugă noi fragmenet de text printre cele scrise deja şi va putea imprimă lucrarea folosind caractere diferite. Va lucra mult mai comod, deci schimbarea instrumentului este în favoarea scriitorului şi nu a cititorului. Aşa se întâmplă şi cu programele. Folosind medii de programare avansate, programatorul îşi va uşura o importantă parte din muncă să, dar pentru a veni în întâmpinarea „cititorilor” sau, va trebui să dea dovadă de mult talent, de multă pricepere şi imaginaţie, pentru că „opera” să să fie deosebită şi să răspundă cerinţelor beneficiarilor.

Ce este algoritmul? De ce trebuie sa inveti sa sofezi in general si nu sa conduci Dacia?

Pentru că dacă înveţi să conduci Dacia, s-ar putea să nu te descurci decât cu autoturismul Dacia, eventual pe un alt model, dar nu şi pe o maşină la volanul căreia nu te-ai aşezat niciodată. Să presupunem că într-o bună zi vei avea un Mercedes. Dacă vei stăpâni tehnică şofatului în general şi nu vei învaţă pe de rost câteva comenzi de la maşină Dacia, vei reuşi să te adaptezi cu uşurinţă noului tău autoturism şi, fără experienţă prea mare la volanul sau, vei putea, în câteva zile, să conduci acest Mercedes aşa cum conduceai Dacia.

Programarea se rezolva cu rezolvarea de probleme. Fireşte, nu orice gen de probleme, ci acelea care operează cu informaţii şi pot fi modelate pe calculator. Dacă nu ştim o metodă generală de rezolvare a problemelor, ci doar un număr de rezolvări de probleme particulare, nu vom putea să ne descurcăm cu uşurinţă în situaţii noi. Noi trebuie să stăpânim tehnică rezolvării de probleme de programare şi nu să învăţăm pe de rost cum se rezolva problema X sau problema Y. Dacă ştim să realizăm un program prin care să desenăm, pe ecranul calculatorului, un pătrat roşu şi un pătrat verde nu trebuie să fim mulţumiţi! Trebuie să vedem cum putem desena un pătrat de orice culoare şi în orice poziţie a ecranului. Adică să determinăm algoritmul de rezolvare a problemei desenării pătratelor.

Algoritmul nu este altceva decât o metodă de rezolvare a unei clase de probleme, adică a unor probleme foarte asemănătoare între ele. În general aceste probleme diferă între ele prin dimensiunea lor, exprimată adesea printr-un număr natural n. Pentru a înţelege mai bine, vom exemplifică. Mai întâi, vom consideră două probleme foarte asemănătoare.

Să considerăm că avem un pahar cu vin şi unul cu suc şi un pahar gol. Pentru a interschimba conţinutul primelor două pahare, putem turna vinul în paharul al treilea. Acum primul pahar este gol şi putem turna în el conţinutul celui de-al doilea pahar, adică sucul. Paharul al doilea devine gol şi turnând din paharul al treilea în el, vom avea aici vinul.

A două problema este exact că prima, doar că în loc de vin şi suc avem apă şi bere. Fireşte, problema se rezolva la fel. În general, pe programator nu-l interesează ce se găseşte în cele două pahare, el pur şi simplu doreşte să găsească metodă de interschimbare a conţinuturilor celor două pahare, pur şi simplu. Astfel, din punct de vedere informatic, cele două probleme prezentate mai sus nu şut două probleme de programare diferite, ci doar una. Asta deoarece informaticianul nu ia niciodată în considerare „conţinuturile paharelor”, deci nu-l (prea) interesează valorile datelor pe care le prelucrează. Pentru el e foarte puţin important dacă în cele două pahare se află vin, bere, suc sau chiar acid clorhidric sau sulfuric. Lucruri esenţiale pentru cei ce utilizează un program pot fi fără nici o importantă pentru programator!

Spuneam, totuşi, că în general problemele rezolvate de acelaşi algoritm diferă printr-un număr natural n. Astfel, în cele două cazuri de mai sus avem de a face cu o singură problema de informatică, care se numeşte interschimbarea valorilor a două variabile. Nu se poate spune despre cele două probleme că formează o clasa de probleme, dar să dăm un alt exemplu.

Mai multe persoane candidează la un concurs de admitere la un liceu sau la o facultate. Candidaţii pot fi aranjaţi în ordinea descrescătoare a mediilor sau în ordinea alfabetică a numelor lor sau în funcţie de orice alt criteriu. Candidaţii pot fi oricâti, fie 100, fie 2000 fie chiar mai mulţi, deci putem notă numărul lor cu n. Acum avem de a face cu o clasa de probleme, care pot fi rezolvate prin acelaşi algoritm. Dacă vom găsi metodă generală de rezolvare, adică algoritmul, vom şti să aranjăm 100 candidaţi, descrescător după note, sau 2000 de candidaţi, în ordine alfabetică.

Aşadar, algoritmul este o metodă generală de rezolvare a unei clase de probleme. Nu este de ajuns. Există multe asemenea metode de rezolvare, dar trebuie să le considerăm doar pe cele care se termină într-un timp finit, sau într-un timp util pentru noi. De asemenea, esenţial este faptul că un algoritm să fie descris clar, fără ambiguităţi, pentru a putea fi înţeles de oricine.

Cum am putea descrie o metodă de rezolvare a unei probleme aşa încât să poată fie înţeleasă exact de către oricine? Sunt mai multe cai, dar folosind limba română, sau engleză sau orice altă limba naturală, vorbită, este posibil că să nu fim înţeleşi de toată lumea şi întotdeauna. Cu atât mai mult de către un calculator, care nu este atât de inteligent încât să înţeleagă o limba naturală. El poate învaţă o limba (un limbaj) simplu, cu un vocabular redus şi cu puţine reguli de sintaxa, dar pe care trebuie să le învăţăm (şi noi şi el) şi să le respectăm cu mare rigurozitate.

În limbajul natural pot apărea ambiguităţi. Un exemplu este celebra frază „Am văzut un om pe deal cu un telescop”. Această frază poate fi înţeleasă în trei feluri: „Folosind un telescop, am văzut un om, care era pe deal.”, „Am văzut pe dealul pe care era un telescop, un om” sau „Am văzut pe deal un om, care avea un telescop la el”.

Limbajul natural a fost folosit cu mult succes de învăţătoarea noastră, atunci când ne-a învăţat adunarea şi scăderea numerelor, cu mai multe cifre (numerele, nu învăţătoarea!) Când am învăţat scăderea, ne-a spus să aşezăm numerele unul sub altul şi e foarte probabil că toată lumea a înţeles că trebuie să aşeze al doilea număr (scăzătorul) sub primul (descăzutul) şi nu invers. Apoi ne-a explicat că trebuie să scădem cifra din cifra, iar când nu ne ajunge să ne „împrumutăm” de la cifra din dreapta. Noi am înţeles, mai repede sau mai târziu, cum se procedează, care cifra din care se scade, de la cine ne împrumutăm. Am reuşit să învăţăm din două motive: pentru că suntem inteligenţi (iar calculatorul, atenţie!, nu este) şi pentru că am exersat pe mai multe exemple (ceea ce nu se pune problema în cazul calculatorului).

Astfel, pentru a nu apărea ambiguităţi, vom reprezenta algoritmii folosind limbaje artificiale, create de om, că să vină în sprijinul calculatorului. Cele mai folosite modalităţi de reprezentare ale algoritmilor sunt limbajele pseudocod şi schemele logice. Despre ele se discuta în manualul de informatică.

Ce este programul? Ce este un limbaj de programare?

Nu e de ajuns să găseşti un algoritm pentru a rezolva o anumită problema. Trebuie să-l şi descrii, adică să-l reprezinţi. Cel mai bine este să foloseşti totuşi, un limbaj de programare, adică un limbaj de compromis între om şi calculator. Programul este, practic, reprezentarea într-un asemenea limbaj a unui algoritm. Dacă vrei că algoritmul tău să poată fi înţeles uşor de multă lume, care ştie sau nu ştie un limbaj de programare sau altul, este bine să apelezi la limbajele pseudocod. Ele seamănă mult cu limbajele de programare, dar au mai puţine restricţii sintactice şi oferă mai multă libertate programatorului.

Dar cel mai bine este să scrii direct programul, folosind un limbaj sau altul de programare, adecvat problemei pe care doreşti să o rezolvi prin respectivul algoritm. În general, programatorii ştiu să „citească” un program scris într-un limbaj de programare pe care nu-l cunosc, deoarece limbajele de programare seamănă mult între ele, sunt cam la fel gândite şi realizate. Seamănă între ele mai mult decât limbile vorbite. Există, fireşte, şi limbaje de programare speciale, care nu se aseamănă cu celelalte, dar sunt mai puţine şi nu ne vom referi la ele în această lucrare.

Pascal, C, C++, Java, Basic sunt limbaje de programare. Ele au fost inventate de oameni, cu creionul pe hârtie. E că şi cum ai inventa tu acum o limba nouă. Inventezi câteva cuvinte (care să definească substantive, verbe, adjective), apoi reguli de scriere, de sintaxa a propoziţiei şi a frazei şi înţelesurile (semantică) unor asemenea construcţii gramaticale. Asta nu înseamnă că cineva va şti să şi vorbească limba inventată de ţine!

Ce este un mediu de programare?

Aşa stau lucrurile şi cu Pascal, C, C++ şi celelalte. Ele au fost inventate de oameni că Niklaus Wirth, Denis Ritchie, Bjarne Stroupstroup, dar apoi a trebuit să se realizeze implementări ale lor. Adică nişte programe speciale (scrise în alte limbaje de programare, mai vechi şi mai primitive) care puse pe calculator să ştie să înţeleagă (compileze sau interpreteze) un text (program) în Pascal, C, C++ etc. O implementare a unui limbaj de programare devine un mediu de programare. Dar un mediu de programare de astăzi are mult mai multe funcţii decât cea principala, de interpretare şi executare a programului scris de noi. Un mediu de programare modern te ajută să depanezi programul realizat, să-i schimbi ordinea de execuţie a instrucţiunilor din el, să vizualizezi diferite aspecte legate de datele de intrare, de rezultate sau să realizezi o serie de prelucrări necesare bunei funcţionari a programului. De asemenea, un mediu de programare vine cu modificări şi îmbunătăţiri la limbajul de programare de baza, standard.

Turbo Pascal, Delphi sunt medii de programare bazate pe limbajul Pascal, C++ Builder şi Visual C++ sunt medii de programare bazate pe limbajele C şi C++, iar Visual Basic este un mediu de programare bazat pe limbajul Basic.

Concluzie! Cine ştie să sofeze poate conduce un Mercedes!

Aşadar, am plecat de la problema de programare. Ea prelucrează informaţii pentru a obţine altele. Pentru a rezolva o problema (şi toate asemenea ei), avem nevoie de un algoritm. Că algoritmul să fie descris fără ambiguităţi şi să fie înţeles de un calculator, cel mai bine este să folosim un limbaj de programare adecvat. Algoritmul devine program. Pentru că totul să meargă repede, frumos şi bine şi că să punem programul la lucru, vom folosi un mediu de programare corespunzător.

Limbajele de programare sunt cu sutele, iar mediile de programare cu miile. Fiecare mediu de programare se comercializează împreună cu o carte groasă, numită documentaţia să, în care este descris şi nimeni nu va putea să ştie pe de rost tot ce este acolo, nici măcar cei care au creat mediul de programare şi au scris cartea. Nici nu trebuie să-ţi baţi capul prea mult cu asta. Tu trebuie să ştii să rezolvi probleme, deci să elaborezi algoritmii potriviţi problemei date. Vei alege apoi cu mare uşurinţă limbajul de programare şi mediul de programare adecvat şi te vei adapta la momentul potrivit lui. Nu vei putea ţine niciodată pasul cu evoluţia impresionantă a tehnologiei din ultimii ani, de aceea nici nu trebuie să-ţi baţi capul cu noile medii de programare care apar pe piaţă. Ele sunt simple produse comerciale, mai mult sau mai puţin performanţe. Tu învaţă baza, adică să programezi, ceea ce înseamnă în primul rând să rezolvi probleme şi să elaborezi algoritmi. Cine ştie să sofeze va putea să conducă şi cel mai sofisticat Mercedes!

Bogdan Pătruţ

Vezi mai jos şi alte articole pe teme similare, scrise de mine:

  1. Programare – particular si general, concret si abstract
  2. De ce nu se angajeaza absolventii?