In liceu si in facultate am intalnit profesori care predau informatica intr-un mod specific matematicii. Aproape la fiecare problema in liceu aparea un tipar: numarul de elemente dintr-un vector era notat cu m sau n, variabila cu care parcurgeam ciclul era i sau j sau k s.a.m.d. Asa te apucai si scriai algoritmul.
Scurt si cuprinzator?
Apoi il citeai si incercai sa intelegi ce ai scris acolo, sa-ti explici cum functioneaza algoritmul si, eventual, de ce ai scris asa si nu altfel. In momentul respectiv, creierul facea un pas in plus: descifrarea a ce inseamna n, ce inseamna i sau k. Poate nu pare mare lucru sa tii minte trei nume de variabile si sensul atasat fiecaruia, dar cand te apuci sa scrii o expresie care le foloseste pe toate trei in acelasi timp, lucrurile parca se complica putin.
M-am uitat de curiozitate pe arhiva educationala de pe infoarena, o initiativa de apreciat de altfel, ce pune la dispozitia vizitatorilor site-ului o serie de probleme pe care aproape orice elev/student le intalneste in scoala. Un lucru care mi-a placut mai putin si pe care il faceam si eu in liceu este economia de litere cand vine vorba de numele variabilelor. Este parca o obsesie generala aceea de a folosi o singura litera pentru numele unei variabile, eventual sa-i mai punem si o cifra in coada in cazurile in care alfabetul nu ne poate oferi mai multe litere.
As vrea ca atunci cand citesc un algoritm sa il citesc natural, sa nu stau la fiecare linie sa-mi spun: “a…este q, si q este notatia pentru… deci…”. Am cautat sa vad de unde vine “zgarcenia” cu care suntem invatati in scoala. Da, scoala ne ofera acest model si ne da impresia ca este “modul corect” de a face lucrurile. Cel putin asa a fost in cazul meu.
Originea zgarceniei
Banuiesc ca originea zgarceniei se gaseste in relatia cu matematica. In problemele de matematica notam cu x,y,z etc. toate variabilele de care avem nevoie si lucrurile chiar merg bine acolo. De ce acolo merg si aici nu? Cred ca in “implementarea” solutiilor problemelor de matematica avem in medie mai putine “instructiuni” si “variabile” pe foaie/caiet decat in cazul problemelor de informatica. Cate rezolvari de probleme de matematica de sute sau mii de “linii de cod” ati vazut? Eu niciuna. Tin minte ca in gimnaziu, cand aveam la matematica o problema a carei rezolvare depasea doua table, apareau dificultati in a intelege de fapt care era valoarea unei “variabile”, ce reprezenta ea si unde a fost “modificata” ultima data.
De aici trag concluzia ca informatica nu se mananca in acelasi fel ca si matematica. Profesorii de informatica ar trebui sa tina cont si de lucruri ce tin de modul de scriere al codului. Aceste lucruri le-ar fi folositoare elevilor/studentilor in timpul concursurilor, cand isi recitesc algoritmul, si mai tarziu in cariera de dezvoltatori software. Si asta nu numai la clasa, ci si in toate rezolvarile pe care le propun pentru o culegere de probleme sau pentru un site gen infoarena.
In toti anii de scoala (atat in liceu cat si in facultate) nu am intalnit niciun profesor care sa scrie cod zilnic sau frecvent. Poate de aici rezulta si ignoranta pentru felul in care codul este scris.
Cum ne vindecam de zgarcenie
De ce e important sa scriem cod usor de citit? Jeff Atwood da un raspuns:
If you ask a software developer what they spend their time doing, they’ll tell you that they spend most of their time writing code.
However, if you actually observe what software developers spend their time doing, you’ll find that they spend most of their time trying to understand code.
Joel Spolsky spune concis:
It’s harder to read code than to write it.
Cred ca este datoria fiecarui dezvoltator software sa-si imbunatateasca permanent modul in care scrie cod. Usureaza in primul rand munca sa si, in al doilea rand, pe cea a celor care vor fi nevoiti sa-I citeasca liniile de cod.
O resursa foarte buna pentru vindecarea “zgarceniei” o reprezinta cartea Code Complete, 2nd Edition a lui Steve McConnell, in principal capitolele 31 (Layout and Style), 32 (Self-Documenting Code) si 34 (Themes in Software Craftmanship).
“Write Programs for People First, Computers Second”
In cazul unui proiect cum este arhiva educationala a infoarena este cu atat mai important ca solutiile problemelor sa fie prezentate intr-o maniera cat mai usor de inteles. Principalul scop al unui cititor este sa inteleaga solutia/algoritmul, nu sa piarda timp descifrand codul “destept” sau “concis” al unei solutii.
Scriind cod mai concis, economisesc timp pretios pentru implementarea solutiei
Acest mit ia nastere mai ales in cazul concursurilor de programare, unde viteza de rezolvare a unei probleme este esentiala pentru reusita. Aceasta “economisire” de timp induce de fapt mai multe penalizari de timp in momentul citirii codului.
Steve McConnell:
Making code readable is not an optional part of the development process, and favoring write-time convenience over read-time convenience is a false economy. You should go to the effort of writing good code, which you can do once, rather than the effort of reading bad code, which you’d have to do again and again.
Dar daca scriu cod numai pentru mine? Nu conteaza cum il scriu, oricum nu-l citesc decat eu.
Steve McConnell avertizeaza si in privinta acestei capcane:
The idea of writing unreadable code because you’re the only person working on a project sets a dangerous precedent. Your mother used to say, “What if your face froze in that expression?” And your dad used to say, “You play how you practice.” Habits affect all your work; you can’t turn them on and off at will, so be sure that what you’re doing is something you want to become a habit. A professional programmer writes readable code, period.
Liceul si facultatea reprezinta perioada in care se formeaza primele obieciuri de programare. Recent am fost neplacut surprins sa vad o lucrare (dealtfel foarte buna) la un concurs de software pentru elevi si studenti, scrisa de un student in anul I, cu experienta declarata de 7 ani de progamare, care pentru citirea propriului format din fisier folosea numai variabile denumite in genul i1…in. Codul respectiv arata foarte “egoist”, scris parca doar pentru autorul lucrarii, fara sa ia in calcul posibilitatea ca cineva sa foloseasca acel cod vreodata.
Chiar daca momentan mi se pare fantezista ideea de a vedea pe vreunul din fostii mei profesori (din liceu sau facultate) urmand sfaturile de mai sus, as fi fost mai mult decat incantat daca as fi invatat cum sa scriu cod de la ei. Probabil ca pentru a te lovi de aceste lucruri trebuie sa fi scris software mai intai.
VN:F [1.6.3_896]
Rating: 5.0/5 (3 votes cast)
VN:F [1.6.3_896]