Hai să-ți povestesc azi cum arată evoluția unui programator, nu din punct de vedere al skill-urilor, pentru că partea asta e subiectivă, depinde de fiecare cum o să evolueze și ce o să învețe pe parcursul carierei, ci mai degrabă din punctul de vedere al modului cum o să privești lucrurile în funcție de stadiul în care te afli.

Începutul

Bun, păi hai să începem cu începutul. Când ești la început, interesul tău maxim va fi să înveți cât mai multe lucruri de ‘low level’. Adică vei vrea să-ți construiești skill-urile pe o fundație solidă, altfel nu vei înțelege nimic din tot ceea ce înseamnă software development.

Ce vreau să spun prin asta?

Că vei vrea să începi prin a studia chestiile de bază legate de cum funcționează limbajele de programare, cum se execută codul, ce-i ăla garbage collection, ce-nseamnă pass by reference sau by value, adică în mare genul de lucruri despre care vei fi întrebat într-un interviu tehnic dar nu numai. Sunt enorm de multe lucruri despre care nu vei fi întrebat la un interviu dar îți va folosi enorm să le știi. De asemenea, sunt și extrem de multe lucruri despre care ești întrebat des la interviuri dar în realitate le vei folosi foarte rar spre deloc.

Vă dau un exemplu, mi s-a întâmplat destul de des să fiu întrebat despre method shadowing în C#, dar în realitate, nu mi s-a întâmplat niciodată să vad asta într-un proiect real.

Construiește fundația

În fine, să ne întoarcem la ale noastre.

Deci target-ul tău va fi să devii cât mai bun tehnic. Să scrii cel mai bun cod pe care îl poți scrie, să te întrebi tot timpul cum poți să îmbunătățești bucata de cod pe care lucrezi pentru că astfel nu numai că vei curăța bucățele mici de cod și în timp vei reduce technical debt-ul ci îți vei crește și tu skill-urile într-un ritm mult mai rapid.

Deci ce faci de fapt aici? Construiești fundația, așa cum ziceam mai devreme.

Partea asta nu va fi deloc ușoară, pentru că din punctul meu de vedere learning curve-ul în domeniul ăsta arată ca graficul unei funcții exponențiale.

La început va fi greu, multă informație, va trebui să înveți să filtrezi prin ea și să extragi ce e relevant pentru tine la momentul respectiv. Dar va funcționa ca un bulgăre, cu cât înveți și experimentezi mai mult, cu cât vezi mai mult cod, cu cât scrii mai mult cod, din ce în ce mai multe lucruri vor face clic în mintea ta și vei începe să vezi utilitatea unui design pattern atunci când se ivește ocazia, precum o piesă de puzzle.

Evoluția unui programator

Din punctul în care simți că ți-ai pus bine bazele tehnic vorbind, ai construit cam ce era de construit la fundație, vei începe să urci către zona mai de ‘higher level’, unde vei fi pus în situația de a gândi cum să refactorizezi o aplicație pentru a fi mai modulară, sau pentru a scrie niște teste unitare pentru a crește nivelul de încredere al echipei atunci când împing un nou feature sau un bug fix în producție.

Vei începe să gândești cum să orchestrezi interacțiunea dintre mai multe aplicații, cum să optimizezi timpii de răspuns atunci când e nevoie. Cum să faci o analiză pentru a identifica diferite puncte de bottleneck șamd.

Adică pe scurt, vei începe ca încet, încet să nu mai fie nevoie să lucrezi la acel de ‘low level’, pentru că munca la nivelul ăla va veni în mod natural. Nu va mai trebui să ‘te chinui’ să faci lucrurile să meargă. Ci focusul tău se va muta la nivelele mai înalte ale proiectului. De la ‘cum fac asta să meargă’ la ‘cum fac astea să meargă împreună bine’.

Învățatul devine mai ușor

Ce se va întâmpla, e că după un număr de ani în care ai progresat continuu și ai lucrat pe tot felul de proiecte, ai văzut și te-ai întâlnit cu tot felul de situații tehnice dificile, vei progresa încet, încet către rolul de arhitect. Bineînțeles dacă îți dorești să rămâi în zona tehnică și nu vrei să treci pe people management.

Pe măsură ce urci pe scara ierarhică a cunoștințelor, îți va fi tot mai ușor să absorbi cunoștințe despre subiecte care la început ți se păreau chineză pură.

De-asta spuneam mai devreme că parcursul tău va arăta ca o curbă exponențială. Că în momentul în care ești la un punct mai sus pe grafiul ăla, îți va fi mult mai ușor să jonglezi cu lucrurile de la nivelurile de jos, cum ar fi să înveți o tehnologie sau un limbaj nou.

După ce ai ajuns la un nivel mai înalt cu unul, ți se vor deschide enorm de multe uși și vei putea să înveți din ce în ce mai multe, din ce în ce mai ușor.

Arhitect Software

Nu trebuie să te pripești totuși, să gândești arhitectura unor sisteme nu e deloc ușoară, dar de-asta ca să ajungi acolo, trebuie să treci prin N situații la nivelurile anterioare.

Și totodată, să nu ai vreodată impresia ca ai ajuns să le cunoști pe toate. Pentru că o altă variabilă aici e faptul că, așa cum mai spuneam și în alt video, tehnologia evoluează într-un ritm extrem de rapid și trebuie să poți ține pasul.

De asemenea și diversitatea situațiilor în care te-ai putea regăsi e enormă. Mai ales când e vorba de proiectele enterprise, vei fi tot timpul surprins de câte ceva, pentru că în proiectele astea software, mai ales în cele mari, se regăsește și multă creativitate din partea celor care le-au creat. Nu e vorba doar de skill tehnic, pentru că deși programarea OOP de exemplu are niște guidelines când vine vorba de good practices, îți oferă totodată și multă libertate în ceea ce privește modul în care îți creezi aplicațiile. Și aici intervine creativitatea echipei de development și arhitectură.

Nu te plafona

Deci cam asta se va întâmpla cu tine dacă vei fi pasionat de domeniul ăsta, vei avea mereu tendința să încerci să împingi lucrurile la un alt nivel.

Dacă nu vei vrea să faci asta, deși poate ești pasionat și îți place să faci asta, consider că în timp vei deveni irelevant. De exemplu, am auzit situația în care cineva care programează și activează în industrie de peste 10 ani, nu știe și nici nu vrea să știe niciun framework din ecosistemul cu care lucrează.