Nu aș fi luat provocarea de a rezolva subiectele de la bacalaureatul din 2017 dacă nu aș fi văzut acest articol publicat de Digi24, în care se repetă retorica obosită în care învățământul informatic nu îi pregătește pe elevi pentru încercările reale din câmpul muncii.

Retorica e destul de atractivă, e ceea ce își doresc părinții de liceu să afle. Când copiii lor nu reușesc să ia notă maximă la examenul de bacalaureat la informatică, părinții au nevoie să audă că ce sunt învățați copiii la școală este inadecvat, inutil și incomplet, și în niciun caz că copilul lor e incapabil să facă niște lucruri de bază pe care le exersează câțiva ani săptămânal la școală.

Am făcut, așadar, și eu subiectele (aparent le-am făcut pe cele greșite, date de model. Subiectele reale sunt înghesuite în altă parte la un loc cu toate subiectele de la proba E). Nu mi-a fost ușor, mi-a luat undeva la 1h:20m și probabil în condiții de examen mi-ar fi luat mai mult (chiar dacă nu mi-am modificat programele după ce am considerat că sunt gata, le-am verificat într-un compilator online, privilegiu pe care elevii nu îl au.

Am o veste foarte proastă pentru „firma care și-a pus programatorii să ia examenul de bacalaureat”. Oamenii sunt slabi dacă nu sunt capabili să ia notă de trecere, și dacă cel mai bun dintre ei a luat 8,50. Ăsta e examen pe care niciun programator nu are voie să îl ia cu notă mai mică decât zece (hai 9,50) – orice altceva înseamnă că oamenii sunt inadecvați pentru joburile pe care le execută. Ca și programator experimentat, cu ceva interviuri tehnice în calitate de intervievator, vă zic că acest examen trebuie trecut cu zece de oricine dorește să facă programare((Atenție! joburile în IT sunt mult mai multe și mai complexe decât doar programare, dar programarea e un aspect important)).

Să explic un pic subiectele (le accesați aici). Am selectat subiectele pentru secția de matematică-informatică, practic cele mai „tari” dintre variante.

Subiectul 1 îți cere să evaluezi o expresie (unde trebuie să știi diferența dintre matematică și informatică, împărțirea făcându-se în domeniul întreg), după care cere să lucrezi pe un algoritm. Punctul 2 este un caz clasic de debugging – pui o valoare, o treci printr-un algoritm, vezi ce se întâmplă. Făcând asta ar trebui să înțelegi și care e logica algoritmului, ce face el. E o treabă obligatorie pentru orice programator. Oricine greșește aici are câteva semne de întrebare majore din partea mea. Implementarea algoritmului dat e iarăși o treabă sine-qua-non, și asta pentru că vorbim nu despre o temă inventată peste noapte, ci o temă (un limbaj de programare) pe care oamenii l-au ales pentru examinare. Subiectul 2 e concentrat pe structuri de date și reprezentările lor. Problema de la punctul 5 e chiar interesantă – presupune parcurgerea unui text și prelucrarea lui. E o problemă simplă, care e drept că cere multă atenție, dar se poate face fără absolut nicio problemă, în condițiile enunțate (care simplifică mult programul). Primul punct e metoda backtracking. În mod normal, aproape orice soluție dată în realitate cu metoda backtracking e din start greșită, dar e inevitabilă în anumite zone. Nu aș fi ales acest subiect pentru examinare, dar având în vedere că e o metodă acceptată și studiată în liceu, e normal ca elevii să cunoască soluția. Mai mult, orice programator cu studii medii ar trebui să știe răspunsul, nu e ceva ce poți uita prea ușor.

Punctul 2 este o problemă de rulare a unui algoritm. Necesar pentru oricine folosește un debugger.

Punctul 3 e o problemă de optimizare, pentru că dacă te apuci să parcurgi toate numerele între două valori vei pica din start.

Punctul 4 cere un program nu foarte fain, dar ușor de implementat dacă stăpânești limbajul și algoritmica.

Examenul nu e neapărat ideal, dar pentru ceea ce se studiază în liceu și, pe alocuri, facultate, este excelent, e o trecere în revistă a celor mai importante elemente. E un examen bun, corect față de elevi. Mă aștept ca un programator decent să poată să-l treacă. Există însă câteva neconcordanțe care merită reclamate. În primul rând, se cere schimbarea unui tip de buclă cu alt tip de buclă în pseudocod. Pseudocodul nu are o structură bine definită tocmai pentru că nu e cod real – și faptul că pseudocodul școlar e acum structurat și impune o anumită nomenclatură este greșit. Pseudocodul e menit să îl ajute pe programator să exprime o soluție a unei probleme, nu să fie 1:1 cu codul compilabil. De aceea algoritmul modificat în pseudocod este un abuz, ratează complet obiectivul pseudocodului.

Al doilea e că algoritmii ceruți nu se folosesc de biblioteca standard de algoritmi. Nu sunt suficient de complecși, nu cer înțelegerea unei biblioteci de containere, un lucru absolut esențial pentru orice programator în orice limbaj.

Al treilea e că da, se cer limbaje precum C/C++ sau Pascal. Înțeleg de ce s-au păstrat aceste limbaje, dar nu cred că profesorii de liceu sunt capabili să scrie cod decent în C++, mai ales varianta modernă, și nici nu pot explica toate modurile în care pot greși elevii. Atenția se mută nu pe corectitudinea algoritmilor ci pe corectitudinea sintaxei, a amănuntelor mici. Cel mai sănătos ar fi mutarea pe un limbaj mai flexibil, precum Python sau chiar C# (măcar acolo lucrurile sunt mai clare de ce crapă când și cum). Nu aș recomanda Java, dar aici e vorba de o alegere personală. Pascal e o alegere greșită din partea profesorilor români care au redactat programa, dar aici vorbim de alte lucruri. Dar aici vorbim de preferințe, C++ se poate preda, însă ai nevoie de profesori extraordinari, ceea ce nu prea există. Dar ca să fiu corect față de sistemul de învățământ, și C/C++ și Pascal sunt, la nivelul predat, pentru genul de cunoștințe predate, suficiente și instructive. Un limbaj de programare nou se poate învăța la un nivel decent într-o săptămână dacă stăpânești bine algoritmii predați în C++/Pascal.

Acum hai să ne uităm peste ce au zis „cei de la firma care și-au testat programatorii”. „Subiectele nu văd să aibă aplicabilitate în jobul meu zilnic”, spune Vlad Ștefănescu, programator. Nu știm ce face Vlad Ștefănescu, dar în niciun caz programare, unde aplicabilitatea cea mai directă este înțelegerea unui algoritm și testarea unor ipoteze pe el.

„Conducerea companiei atrage atenția sistemul educațional ar putea fi îmbunătățit pentru a face față cerințelor actuale de pe piața muncii”. Conducerea companiei ar face bine să nu confunde necesitățile ei cu necesitățile pieței muncii. Deși e un pic ciudat să ai o companie de IT unde să nu fie necesar ca programatorii să cunoască ce e un algoritm, să poată să îl urmărească și să înțeleagă niște structuri de date. Dar doar un pic.

Avusesem recent o discuție cu Ovidiu în care încercam (dar nu reușeam) să îi explic că IT-ul de azi din România va pica destul de curând pentru că se pune accentul nu pe producție și pe excelență din punct de vedere tehnic, ci pe livrare de componente. Mai exact, în România cele mai multe companii de IT se ocupă cu împachetarea produselor prefabricate – se pun două, trei framework-uri cap la cap, se mai lipește cu un pic de stress și gata, ai produsul. Majoritatea produselor din România presupun ca programatorii să urmeze tutoriale de pe net și să le pună cap la cap. Zero creație, zero gândire, chiar și acolo unde programatorii se mândresc că gândesc.

Dar munca asta din prefabricate nu cere algoritmică, nu cere gândire, iar compania respectivă de oameni care chiar se cred deștepți nu sunt capabili să lucreze pe treburi simple, precum subiectele la bacalaureatul de vară 2017. Ce să mai vorbim de crearea propriilor unelte, criterii de performanță, securitate? Parcă ăsta era un lucru pe care îl reclamau și ei, că elevii nu sunt învățați securitate. Hai să vorbim un pic și despre asta.

Ca să vorbești despre securitate trebuie să vorbești despre niște lucruri foarte complexe (matematică de facultate, super-înaltă, probleme grele) dacă vorbim de criptografie, sau de conduită în folosirea framework-urilor de-a gata (ceea ce cred majoritatea companiilor românești că e securitatea). Dar învățământul românesc nu poate să-și asume nici prima variantă (cum ziceam, matematici înalte, prea înalte pentru liceu) nici a doua variantă. Asta pentru că framework-urile se schimbă o dată sau de două ori pe an, dacă tu începi să studiezi securitatea pe un subiect în 2017, în 2021 când ieși din liceu deja subiectul respectiv va deveni demodat și anacronic ca limbajul Pascal. E doar un motiv ca companiile să vină din nou să se plângă că sistemul de învățământ e inadecvat, uitând că marea majoritate a celor care termină liceul au mai mulți ani în acest sistem de învățământ decât media angajaților în cadrul companiilor (4 ani).

Deci, domnilor de la companii, greșiți. Vă cunosc retorica pe care am practicat-o și eu, ignorant. E o retorică atractivă, vinde publicitate pe site-urile de știri și poate vă dă un aer de importanță și autosuficiență. Dar, domnilor de la companii, întrebați-vă de ce angajații voștri nu sunt capabili să ia nota zece la bacalaureat. Nu cumva pentru că cei care iau 10 la bac merg la companiile care vă vând vouă uneltele și prefabricatele?