Tot ce am învățat ca programator autodidact

Două motivații au dus la apariția acestei pagini:

  1. Vreau să ajut alți oameni care se gândesc să-și schimbe cariera, și anume să ofer un exemplu care să-i ajute să-și formeze propriile idei despre decizie. Vreau să vadă că poți să schimbi cariera fără să te duci la bootcamp, facultate, sau să plătești o tonă de bani la mentori online. Da, trebuie să ai calculator și acces la internet, și da, ajută să schimbi opinii cu oameni – dar nu trebuie să dai căruțe de bani.
  2. Vreau să îmi monitorizez singură progresul, ca să îmi aduc aminte de unde am început și unde am ajuns

Nu vreau să intru aici în detalii despre cum și de ce am ajuns să schimb cariera la 30 de ani și să devin programator după ce am fost strateg și product manager un pic peste zece ani, ci doar să pun cap la cap un istoric care să arate și altora cum arată o traiectorie către domeniu, chiar dacă n-au studiat informatică sau subiecte conexe.

În interviuri tind să spun că am luat traseul pitoresc spre programare: chiar dacă am învățat să folosesc calculatoare și să programez din generală și îmi plăcea, nu am continuat să studiez în domeniu.

Am ajuns să fiu, cum ar veni, programatorul reticent, sau poate programatorul atipic. Nu am aceleași înclinații extracuriculare ca mulți colegi pe care îi întâlnesc, și am un bagaj de instincte diferit după cei 12 ani în care am fost product manager — unii îi zic product sense, sau un simț pentru ce ar prinde în soft, sau nu.

Calea mea spre programare a fost o explorare lungă și șerpuitoare, și a început pe la zece ani:

I – Epoca preistorică a cunoștințelor (înainte de 2000)

Include jocuri, sisteme de operare, primul calculator personal!

În perioada asta am învățat un pic despre calculatoarele pe care le foloseam:

  • Cum să vizualizez sursa HTML a unei pagini în browser (Netscape Navigator și, ulterior, Internet Explorer).
  • Cum să creez și să editez un fișier HTML cu un editor de text (Notepad) și să-l salvez local pe sistemul meu de fișiere (Windows ca sistem de operare).
  • Concepte de bază despre ce se întâmplă în calculator atunci când îl pornești de la buton, până la sistemul de operare (MS-DOS, apoi Windows)
  • Conceptul de memorie, biți și octeți, hard drive-uri, partiții, defragmentare, etc.

Când aveam vreo zece ani, bunicii mergeau ocazional în vizită la o vecină care avea un băiat programator și un calculator la care mă lăsa să butonez cât era la serviciu.

Internetul acasă era o raritate, încă prea scump scump prin dial-up, dar aveam jocuri care să mă țină ocupată — Prince of Persia și DOOM, singurele de care îmi aduc aminte. Când nu mă jucam, schimbam tot felul de chestii la fișiere și sistemul de operare ca să văd ce se întâmplă, după care le anulam și puneam totul la loc așa cum era la început, ca să-mi șterg urmele. Țin minte că percepeam calculatorul ca pe o jucărie infinită, care nu obosea.

Din când în când mai mergeam la birou la tatăl meu, unde aveau internet. Acolo am descoperit Netscape Navigator și HTML. Din episoadele astea, ai mei au văzut că mă pasionează calculatorul, și eventual mi-au cumpărat și mie unul, cam în același timp cu o vecină de aceeași vârstă cu mine. Când nu ne jucam împreună, ne trimiteam ‘mesaje’ una alteia făcând schimb de dischete cu fișiere notepad pe ele.

Fapt divers: prima mea carte despre calculatore a fost una de la Egmont, pentru copii, care se numea Ghid Internet. Uluitor, cineva i-a făcut o recenzie, 20 de ani mai târziu. Sper să nu dispară filmul ăsta de pe YouTube:

https://www.youtube.com/watch?v=5bagkXtPpAg&

II – Gimnaziu: Turbo Pascal la un cerc de informatică (circa 2001)

În perioada asta am învățat idei de bază despre programare:

  • Despre fluxul de control, tipuri de date, compilare, ce sunt bibliotecile standard, câteva idei despre registrul hardware, ideea de indicatori, referințe, etc. prin limbajul Turbo Pascal
  • Conceptul de programare orientată pe obiecte (OOP)
  • HTML și CSS: cum să folosesc cele două ca să creez pagini web, să schimb culori, fonturi, spațiere, etc. plus elemente de bază – text, titluri, liste, tabele, etc.

Înainte de gimnaziu, la scurt timp după primul calculator, s-a înființat un laborator de informatică la școală. Profesoara mea de atunci a organizat un cerc de informatică într-o vară, unde ne-a învățat bazele limbajului de programare Turbo Pascal, și la clasă ne arăta concepte simple, de operat calculatorul și creat pagini HTML.

Nu înțelegeam mereu teoria în spatele limbajului, dar aveam vreo 12 ani și era un pas înainte de la editat fișiere de capul meu. Așa am descoperit că calculatorul e capabil de mult mai mult decât credeam.

Aici intervine o mică greșeală: după ce s-a terminat cercul de informatică, am ajuns la un curs mai avansat de programare, împreună cu niște colegi. Bănuiesc că părinții s-au vorbit între ei, și am ajuns cu toții la ICI, Institutul de Cercetare în Informatică, nu foarte departe de casă și școala la care eram. Nu-mi aduc aminte multe, dar experiența n-a ținut mult: nu eram nici unul din noi la nivelul potrivit, și persoana care trebuia să ne predea nu cred că era obișnuită să primească copii.

III – Liceu: era internet acasă și bloguri (2003-2007)

Am învățat:

  • Cum să înregistrez propriul domeniu și să creez o pagină pe care să o vadă și alții
  • Cum să folosesc FTP (File Transfer Protocol) ca să încărc fișiere de pe computerul meu pe o gazdă web de pe internet pentru a face site-ul meu accesibil public
  • Despre găzduit site-uri, și un pic din mecanismele WordPress pentru făcut backup-uri la baza de date cu postări
  • Despre IRC (Internet Relay Chat) și protocoale de comunicare

Au urmat niște vacanțe de vară în care mergeam în concediu cu ai mei, și ei stăteau la plajă, iar eu la cafenelele internet în hoteluri. Abia la începutul liceului am instalat o conexiune acasă, când nu mai era pe dial-up.

Aici a avut loc explozia cambriană de programe de mesagerie (Yahoo! Messenger și MSN) și bloguri plus proto-rețele de socializare (paginile MySpace, GeoCities, Blogger, și alte motoare, last.fm ca să arăți ce muzică asculți). Mi-am făcut cont pe Facebook și Twitter în 2007, la fel și pe LinkedIn și Tumblr. Țin minte că Google Maps m-a impresionat cel mai mult în termen de funcționalitate, cât și scrobbler-ul last.fm, care era o aplicație de desktop care se sincroniza în timp real cu profilul tău, ca să arate ce muzică asculți.

În liceu, programatul a intervenit târziu, după ce am reluat materia despre folosit calculatorul. Am fost mai mult sau mai puțin forțați să luăm niște diplome ECDL, de ‘condus calculatorul’. Am aflat mai târziu că era un program UE, aparent faimos, recunoscut în lume. Programul era OK, adică te învăța niște concepte care ar fi trebuit să fie în programă, nu separate. Dar nici până acum n-am descoperit pe cineva în afara școlii care să știe de el. Am luat certificatul dar mă plictiseam la orele de informatică, unde am reluat materia despre cum să facem fișiere și să le redenumim.

Când am început să programăm, am făcut C++. Totul era predat pe tablă, pe hârtie, și în notepad, pe calculator. Nu țin minte mare lucru despre perioada asta, pentru că în retrospect, eram foarte deprimată în ultimii doi ani de liceu, chiar dacă nu știam să recunosc depresia vremea aia. Capitolul s-a încheiat cu un proiect special în C++ la sfârșitul liceului în 2007 – ceva cu o bibliotecă fictivă și intrări pentru cărți – dar nu mai țin minte dacă l-am predat sau nu.

Fapt divers: Git a apărut cât eram la liceu. GitHub nu exista, și toți eram înnebuniți despre primul iPhone și Kindle, care abia se anunțaseră sau apăruseră.

An iPod. A phone. And an internet communicator. An iPod. A phone …are you getting it? These are not three separate devices. This is one device. And we are calling it: iPhone. – Steve Jobs, 2007

IV – Cât am fost strateg și product manager (2010-2019)

O perioadă care nu se remarcă prin multe cunoștințe specifice, în afară de:

  • Ciclul dezvoltării de software (Software Development Lifecycle), plus metodologiile și teoriile conexe pentru programat sau planificare de proiecte. După ce am învățat și încercat multe, mențin părerea că foarte puține sunt utile. În cel mai rău caz, în unele companii ajung să fie niște dogme învechite pe care lumea le urmează fără să se întrebe de ce
  • Despre CI/CD (Continuous Integration și Continuous Deployment), paradigma actuală pe care multă lume o folosește ca să creeze softuri
  • Despre CLI – command line interfaces. Cât foloseam CLI-ul companiei la care lucram mă gândeam că poate într-o zi o să scriu și eu ceva de genul
  • Niște SQL de bază ca să pot să interoghez bazele de date și să determin cine și cum utilizează caracteristicile softului la care lucram, sau să fac rapoarte și analize
  • Despre mașini virtuale (virtual machines) și emulatoare pentru sistemele de operare mobile, pentru că tot softul la care lucram se axa pe ele (fără să intru mai mult în detalii)
  • Despre QA (Quality Assurance), automatizarea QA-ului, și problemele actuale în QA, tot legat de muncă
  • Despre statistică și machine learning, cel puțin conceptual, cât să pot să lucrez cu alți colegi și să creem o soluție human-in-the-loop pentru a automatiza niște sarcini pe care înainte le făceau oamenii 100%

Fapt divers: am supraviețuit toți anii ăștia ani fără să folosesc vreodată Google Sheets, Excel, sau alte programe similare în mod serios, în afară de niște ciorne și bugete personale sau plătit taxe.

V – Schimbare de carieră  (2019-2020)

Aici, au trecut deja 13 ani de când am terminat liceul și nu m-am mai atins de programat. M-am apucat din nou de toate, și am ales JavaScript și React datorită ecosistemului mare de programatori, biblioteci și resurse, plus un feedback loop scurt de la scris cod la executat și văzut diferența.

În primul an, pe lângă lecții de olandeză, am învățat:

  • HTML și CSS:
    • Despre DOM ca structură arborescentă de date, cuplat cu felul în care funcționează React
    • Noile paradigme Flex și Grid în CSS
    • Ceva despre famework-uri ca Tailwind, Bulma, Bootstrap, și ce mai era popular la vremea aia. Mă bucur că nu am prins perioada în care se stilizau tabele sau se folosea float! Plus, acum că scriu la 3 ani după, se pare că Tailwind a prins avânt.
    • Niște concepte despre cum să organizezi fișiere CSS, plus ceva despre preprocesoare de CSS (de ex. Sass)
  • Cum să folosesc utilitarul pentru linia de comandă pe macOS și să fac operațiuni cu fișiere, cum să mă autentific prin SSH. Recomand know enough command line to be dangerous, pentru început
  • Despre yarn și npm (registre de pachete), și vestul sălbatic pe care îl reprezintă, plus analiza vulnerabilităților prin servicii ca Snyl sau Dependabot (în GitHub)
  • JavaScript, React, și restul ecosistemului front-end:
    • Pentru JavaScript, am folosit o combinație de cursuri freeCodeCamp, care mi s-au părut destul de bune pentru începători. Am mai citit și Eloquent JavaScript, plus frunzărit cartea JavaScript de la O’Reilly, dar a durat până am pus cap la cap ce e JavaScript vechi vs. modern și care sunt preferințele actuale
    • React, React cu TypeScript și TypeScript în general am învățat de la cursurile de pe ui.dev, unde am primit cadou un abonament. Am făcut cunoștință cu create-react-app dar și creat aplicații de la zero. Am creat cinci-șase aplicații în total, plus un joc
    • Browserul, ca runtime environment pentru JavaScript. Citit despre variile engine-uri, gen V8, Chakra, etc.
    • Am experimentat cu Next.js pentru un blog în engleză, și Ghost (self-hosted) pentru altul, dar pe al doilea l-am închis, pentru că era aspirațional dar nu aveam, de fapt, timp să mă ocup de el
    • Am învățat despre Context Provider și Redux pentru state management, dar nu am ajuns să folosesc Redux
    • Un pic despre Webpack si Babel, în procesul de a-mi construi primele aplicații
  • Version control: Git și restul site-urilor care hostează cod (GitHub, GitLab, BitBucket)
  • Alte concepte de bază despre comunicarea între client și server, plus servicii web RESTful, operațiunile GET POST PUT DELETE
  • Despre baze de date, dar fără să experimentez direct cu foarte multe.

Am fost încântată să descopăr că HTML și CSS nu s-au schimbat chiar dramatic, deși au apărut multe unelte în ecosistem, mai multe decât poate un începător să ducă uneori.

Cel mai interesant a fost să văd cum au evoluat IDE-urile și ecosistemul JavaScript — a fost o provocare să acopăr o suprafață atât de mare în câteva luni — cam nouă luni de când am început, și până când m-am angajat.

VI – Primul post ca programator: 2020-2022

Am continuat să folosec React și JavaScript (cu TypeScript) și să aprofundez subiectele:

  • Am folosit multă programare asincronă cu async/await în React și node
  • Am folosit mult Hooks în React, dar din cauza ecosistemului Atlassian în care lucram, am fost limitați la versiuni vechi de React care nu includ concepte noi ca Portals, Suspense, React Router, ș.a.
  • Am folosit Storybook în câteva proiecte, poate în mod neortodox, nu chiar pentru documentat componente
  • Am ajuns să folosesc CSS în React prin Emotion / Styled-Components. Cel mai mult îmi place xstyled, o bibliotecă pe care o s-o folosesc și pe viitor
  • Am folosit și niște Jest pentru teste
  • Am început să învăț să scriu cod mai performant și securizat, cu îndrumarea colegilor și ajutați de faptul că avem cercetători care ne verifică constant aplicațiile în BugCrowd
  • Ca baze de date, am folosit Postgres și Google Firestore, în funcție de proiect
  • Scris configurații de unelte în YAML

VII – Al doilea post ca programator: 2022

Mă opresc aici, pentru că intervine o nouă aventură ca un fel de product engineer: un fel de hibrid între product manager și programator, dar la bază programator, adică nu product manager cu cunoștințe tehnice (deși, ciudat, acum aș putea fi și asta).

O să actualizez și rafinez pagina asta pe măsură ce trece timpul.

 

Addendum: Listă inspirată de articolul cu un titlu similar, de Tania Rascia