Subiectele (reale) de la bac 2017

Cineva mi-a atras atenția că ceea ce am rezolvat eu acolo erau subiectele date model, nu cele reale de la Bac, așa că m-am pus să fac o scurtă evaluare și pentru subiectele reale. Ce am aflat e că subiectele reale au fost mult mai ușoare decât cele date de model, punându-i într-o lumină și mai rea pe programatorii care plângeau că nu ar lua 5 la examenul ăla.

Subiectul 1

  1. O chestiune de logică, cât se poate de simplă. Cel mult un minut
  2. Parcurgerea unui algoritm și implementarea lui în limbajul preferat. Singurul lucru de pus sub semnul întrebării e semnul = din pseudocod, care nu e dublat – dar e o convenție clară, asupra căreia se insistă destul de mult în liceu. Timp de lucru undeva înspre 20 de minute maximum. Observațiile sunt similare cu cele de la subiectele de model.

Practic ce avem aici este același lucru: o înțelegere de bază a calculelor făcute în cam orice limbaj de programare, înțelegerea unui algoritm, trecerea prin algoritm cu o valoare dată, înțelegerea comportamentului unei bucăți de cod, exprimarea algoritmului într-o altă formă (similară, dar cu condiția exprimată altfel), după care redactarea programului pe baza algoritmului. Toate astea sunt absolut necesare în piața muncii.

Subiectul 2

  1. Sunt câteva semne de întrebare legate de decizia profesorilor de a cere cunoașterea unei funcții standard C, apelată incorect în C++ (da, codul poate fi făcut să se compileze, dar ca să fim corecți, în C++ codul trebuia să arate cel puțin așa: `std::cout « ::strstr(…);`) În orice caz, faptul că s-a folosit un API standard C, fără să se folosească un echivalent C++ arată doar că în școală se predă C, nu C++. Din nou revenim asupra discuției legate de capacitatea profesorilor de liceu de a preda cele două limbaje. Pascal poate fi o alegere mai bună aici (deși aș merge, sincer, pe C#). În orice caz, e vorba de maximum jumătate de minut de petrecut aici, cu toate cârcotelile mele.
  2. O problemă interesanta cu grafuri. Programatorii experimentați sunt scuzați dacă nu știu terminologia – dar e o terminologie care le e familiară elevilor de liceu, deci nu e o problemă. Destul de simplu, și relativ rapid de rezolvat, hai să zicem că-și desenează un astfel de graf pe hârtie, durează vreo 3-5 minute.
  3. Poate unul din cele mai simple programe posibile cu structura dată. Programul ar trebui să nu ia mai mult de 2 minute de redactat.
  4. Desenezi un graf, îi scrii matricea de adiacență. Ai definiția în problemă. 3 minute, indiferent de gradul de familiaritate cu problema.
  5. O joacă cu matrici, un program mult mai simplu decât cel din model, unde trebuia să fii foarte atent cu codul scris. Trebuie să citești o matrice după care să faci un for și un for și-un if în interior. Chestiuni de programare de bază.

Nu există nicio scuză pentru un programator cu un minimum de experiență să nu ia nota maximă. Hai să zicem că dăm o dispensă pentru cei care nu au făcut C și nu știu ce face strstr, deși programatorii de PHP (că bănuiesc că cu asta se ocupă) au funcția strstr și la ei.

Subiectul 3

  1. Aici nici măcar nu ai nevoie să știi backtracking. E un exemplu de „care e următorul în secvență”, genul de exercițiu care separă oamenii cu IQ de o cifră de cei cu IQ de două sau trei cifre.
  2. Ai o funcție pe care trebuie să o evaluezi pentru două perechi de valori. 100% OK.
  3. Un joc cu șiruri. Subiect simplu de programare, trebuie să concepi un algoritm pe o problemă simplă. Algoritmul îți e descris în detaliu, practic enunțul e și pseudocodul programului, tu doar trebuie să-l exprimi într-un limbaj de programare.
  4. Este o problemă excelentă, numai bună de înlocuit FizzBuzz pentru interviuri tehnice. Explic mai jos. În orice caz, e o problemă de făcut pentru absolut orice programator.

Pentru cei ce nu știu, FizzBuzz e un program foarte simplu pe care foarte mulți programatori nu știu să-l facă. Presupune ca pentru toate valorile de la 1 la 100 să se scrie textul Fizz dacă numărul e divizibil prin 3, Buzz dacă e divizibil la 5 și FizzBuzz dacă e divizibil la 15. Dacă nu, să se scrie valoarea propriu zisă. Testul ăsta e un test incredibil de simplu de concepție de algoritm. Problema pe care au dat-o cei de la bac e o problemă mult mai faină pentru un astfel de interviu, pentru că presupune gândirea pe trei nivele, spre deosebire de 2 la FizzBuzz. Să vă explic.

La FizzBuzz problema reală unde se încurcă mulți este „când anume trebuie scris FizzBuzz”. Pentru că dacă fac teste simple de divizibilitate trebuie să le ordoneze; un programator care e în stare să gândească abstract își dă seama că de fapt tot ce trebuie să facă e să facă două teste și atât. Mă rog, ideea e că necesită gândirea în două nivele. Primul e o parcurgere a unui șir, al doilea e o transformare a unei valori numerice într-un text. Rezultatul nu e direct corelat, ci indirect – primul nivel e al ciclului, al doilea e al textului rezultat.

Majoritatea problemelor pe care le are de rezolvat un programator sunt de obicei pe mai multe nivele. De exemplu, dacă ai o listă de angajați, trebuie să-i identifici pe cei care au o vechime mai mare de 20 de ani și să le dai o mărire de 5% (să zicem) deja problema e pe trei sau patru nivele, și necesită sub-programe dedicate pentru fiecare „responsabilitate”. Ei, programul acesta propus de profesori pentru bacalaureat are trei nivele diferite de responsabilități: parcurgerea șirului și identificarea unei secvențe de numere pare consecutive, identificarea lungimii maxime a secvenței și numărarea aparițiilor acelei lungimi maxime. Practic, trebuie nu doar să urmărești conținutul șirului, ci și să îți construiești propria structură de urmărire a unor rezultate intermediare (lungimea maximă și numărul de apariții a acelei lungimi maxime).

Problema NU este dificilă, dar este inteligentă, și testează excelent capacitatea de a elabora un algoritm a programatorului. Mi se pare un program excelent pentru testat angajații (eventual în mod eliminatoriu).

Acum, să revenim la ce puncte sunt relevante pentru divina Piață a Muncii pe care o invocă firma de programatori meseriași:

Subiectul 1 e relevant în totalitate. Înțelegerea unui algoritm și transformarea algoritmului în cod C/C++ este un lucru necesar, un minimum minimorum. 30p 100% relevante.

Subiectul 2 ar putea fi invocat ca irelevant pentru problemele referitoare la grafuri și pentru folosirea lui strstr. Să zicem că undeva la 14 puncte ar fi nu foarte relevante – în rest, totul e cât se poate de relevant – 16 puncte care se dau pentru elaborarea unor algoritmi și scrierea lor în limbajul preferat.

Subiectul 3 e relevant în totalitate. Inclusiv cele 4 puncte acordate la backtracking.

Deci, din 90 de puncte doar vreo 14 puncte sunt sub semnul întrebării. Acum, să vorbim un pic despre grafuri. Aparent, pe piața muncii nu ar fi nevoie de grafuri. Să zicem, să zicem, deși oricine ar putea să recunoască folosirea grafurilor în probleme precum pathfinding-ul. Dar vorbim de o structură de date, una destul de simplă, care nu cere algoritmi foarte puternici. Cu un minimum de efort, răspunsul la întrebările legate de grafuri poate fi găsit. Dacă ar fi un interviu tehnic, gândiți-vă la momentul de „think outside the box” – să vedem, chiar dacă nu știi foarte multe despre ele, ai putea veni cu o soluție? Treaba unui programator e să se adapteze situațiilor neașteptate, și să conceapă soluții pentru probleme pe care poate că alții nu le-au avut. Să conceapă soluții proprii. Este ăsta un talent necesar pe piața muncii? Este.

Așadar, nota 8.60 pentru un programator mediocru care nu știe să scrie decât după dictare, dar nu e capabil să gândească foarte mult, și nota 10 pentru unul care răspunde unei provocări și încearcă mai mult decât „răspunsul nu poate fi găsit pe StackOverflow, deci el nu există”. Dacă programatorii firmei respective nu au reușit să ia mai mult de 8.50, practic oamenii ăia au eșuat cu 10 sutimi la un minimum de cunoștințe pentru încadrarea la locul de muncă. E echivalentul angajării unui ziarist care nu crede în litera z, e ferm convins că nu există, și poate să explice în discursuri emfatice că nu e o literă necesară pe piața muncii.

Cam despre asta e vorba.