Sari direct la conținut »

Te ajut să înveți programare: top 15 cărți de care ai nevoie să fii programator bun

Te ajut să înveți programare: top 15 cărți de care ai nevoie ca să fii un programator bun

Azi trecem în revistă cele mai bune 15 cărți din care poți învăța atât bazele cât și cele mai importante idei esențiale din programare.

Te ajut să înveți programare: top 15 cărți de care ai nevoie ca să fii un programator bun
Video-ul meu de pe YouTube cu sugestii de cărți de citit pentru a învăța programare, varianta video a articolului de mai jos.

Cărțile pe care vreau să ți le recomand azi sunt în general utile indiferent ce limbaj de programare vrei să înveți: JavaScript, Python, C, C++, C#, Java, Go, Ruby, Rust și așa mai departe. Doar unele din ele sunt mai potrivite pentru un anumit limbaj, și vei vedea asta chiar din titlu de obicei.

1. Introduction to Algorithms de Thomas Cormen, Charles Leiserson, Ronald Rivest, Clifford Stein (ediția a 3-a)

Există cărți despre algoritmi care fie sunt riguroase și incomplete, fie sunt stufoase dar neorganizate – cartea asta e considerată biblia algoritmicii, e folosită în facultăți de profil ca manual de studiu și e una din cărțile la care te vei întoarce mulți ani de zile pe parcursul carierei tale ca să referențiezi tehnici și algoritmi de care vei avea nevoie în proiectele mai complexe. Merită clar s-o ai în bibliotecă fiindcă acoperă o gamă foarte largă de subiecte și chiar dacă n-o s-o poți citi din scoarță-n scoarță fiindcă e destul de mare, îți va oferi pe măsură ce ai nevoie o bază teoretică și practică foarte solidă. E și agnostică de limbaj fiindcă folosește engleza și pseudocodul să descrie algoritmii, nu vreun limbaj anume, deci e utilă pentru orice specializare și limbaj de programare.

2. Clean Code: A Handbook of Agile Software Craftsmanship de Robert Martin

Codul curat este o cerință esențială pentru orice programator odată ce trece de juniorat. În majoritatea companiilor și echipelor în care vei lucra drept programator, dacă nu scrii cod curat, vei fi taxat și chiar dat afară, fiindcă poți afecta întregul business în mod negativ. Robert Martin, adică „uncle Bob” e omul ideal care să-ți explice bunele practici în a scrie cod curat, iar cartea asta e una pe care o vei trata ca fundația carierei tale de adevărat profesionist în domeniu. Vei învăța cum să diferențiezi între cod scris prost și cod scris OK, cum să scrii cod și să transformi cod nasol în cod bun, cum să formatezi codul pentru lizibilitate maximă, cum să implementezi gestionarea erorilor fără să ascunzi logica din cod, cum să scrii teste unitate și cum să faci test driven development corect. Odată ce citești și îți asumi principiile din carte te poți numi cu adevărat programator, e un test de maturitate și recomand călduros cartea din motivul ăsta.

3. The Clean Coder: A Code of Conduct for Professional Programmers de Robert Martin

Tot de la Uncle Bob vine să completeze cartea anterioară, introducând atât tehnici pragmatice de folosit în echipă și companie ca să stimulezi scrierea de cod curat și de calitate, cât și tactici interumane de convingere a colegilor, superiorilor și management-ului să aloce resurse și timp pentru codul curat. De la introspecția deciziilor pe care le iei – când să zici „nu” și ce înseamnă când zici „da” în probleme de calitate a codului, cum să-ți faci management-ul timpului și așa mai departe – până la abordarea problemelor care țin de conflicte, deadline-uri și manageri care nu te lasă să-ți profesezi corect meseria. Cartea asta te responsabilizează nu doar să înțelegi principiile de cod curat ci și să le aplici în contextele reale interumane în care te vei afla pe parcursul carierei tale.

4. Clean Architecture de Robert Martin

Asta e a treia carte a lui Uncle Bob pe care o recomand. Se referă la aplicarea principiilor de cod curat la nivel arhitectural și de design de aplicație, la nivel macro dacă vrei. E esențială dacă vrei să fii un arhitect de aplicații bun, și nu-ți dă doar niște idei vagi despre deciziile arhitecturale pe care le vei lua, ci îți spune exact cum să abordezi fiecare situație și posibilele repercusiuni pe care le vor avea deciziile pe care le iei (sau nu le iei) în gândirea și construcția scheletului care susține dezvoltarea unei aplicații. De la principii esențiale pentru arhitectura software și exact cum poți s-o dai în bară dacă le ignori, până la ce discipline și practici trebuie să adopți și tu ca lider și echipele de sub tine ca să mulezi un proiect pe nevoile de business și bazele sănătoase de care au nevoie ca să crească frumos.

5. Head First Design Patterns de Eric Freeman, Kathy Sierra, Bert Bates și Elisabeth Robson (ediția a 2-a)

Dacă lucrezi în software development, nu vrei niciodată să reinventezi roata.. E mult mai eficient să te folosești de ceva ce alți oameni au construit și testat deja de sute sau mii de ori până acum. Lucrurile astea se numesc Design Patterns, și sunt prezentate în cartea asta. E practic o listă de probleme și rezolvările lor predilecte, cu care s-au zbătut deja suficient de mulți oameni care și-au dat seama că nu există o modalitate mai bună să rezolvi problema respectivă. Dacă te folosești de ele, poți să-ți petreci timpul rezolvând lucruri mai interesante, spre exemplu probleme pe care nu le-a mai avut nimeni până acum și cu care te confrunți tu în proiectul la care lucrezi acum.

6. Refactoring: Improving the Design of Existing Code de Martin Fowler și Kent Beck (ediția a 2-a)

Un citat celebru de-al lui Fowler zice că orice prost poate scrie cod pe care să-l înțeleagă calculatorul, dar doar programatorii buni scriu cod pe care-l înțeleg și oamenii. Refactorizarea codului e una din activitățile critice de care ai nevoie ca să-ți păstrezi proiectul curat și ușor de înțeles și parcurs de oricine, performant și fără spaghetti prin el. Cartea asta îți explică exact ce e și de ce ai nevoie de refactorizare, cum s-o faci ca să fii eficient, indiferent de ce limbaj de programare folosești. Și cel mai util dintre toate: îți sugerează exact când ar trebui să-ți dai seama că o bucată de cod are nevoie sau nu de refactorizare. E un skill foarte util, în special pentru programatorii cu experiență.

7. Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation de Jez Humble și David Farley

Când ești programator, vine din când în când momentul să livrezi munca ta și s-o combini cu munca colegilor tăi, în felul ăsta îndeplinind obiectivele de business ale companiei și făcându-vă utilizatorii fericiți. Procesul ăsta e destul de complex, riscant și ia destul de mult timp. În cartea asta poți învăța cum să livrezi calitate în mod incremental, validat și eficient, poți învăța cum să automatizezi procesele care mănâncă cel mai mult timp așa încât tu să te poți concentra pe alte lucruri mai importante și cum să faci echipa în care lucrezi mai eficientă și mai fericită datorită lipsei durerilor de cap asociate deploy-urilor.

8. The Mythical Man-Month: Essays on Software Engineering de Frederick Brooks Jr. (ediția aniversară)

Puține cărți despre management-ul proiectelor software au fost așa de impact cum a fost cartea asta. Și e valabilă și azi. Mai exact, e o combinație de statistici legate de natura muncii în software cu opinii și interviuri relevante care pun punctul pe „i” când vine vorba de management-ul proiectelor complexe. E și un manual de istorie (fiindcă e scrisă de mult și situația de atunci e comparată cu prezentul – surprinzător, sunt foarte similare) dar și un mod de a evita greșelile trecutului.

9. Code Complete de Steve McConnell (ediția a 2-a)

Una din cele mai bune ghiduri practice de programare, cartea asta a fost scrisă inițial acum mai bine de zece ani și completată recent folosind tehnici moderne. Vei putea vedea exemple concrete de cod care ilustrează felul cum se rezolvă anumite probleme și veți experimenta soluții derivate din cercetare, abordarea științifică și mai ales din experiența directă cu software-ul real, comercial. Cartea te învață să faci tot posibilul să ai complexitate minimă și creativitate maximă, să folosești colaborarea eficient, să aplici tehnici de programare defensivă, să scoți în evidență erorile mai repede pentru a le putea rezolva și așa mai departe.

10. The Pragmatic Programmer: From Journeyman to Master de Andy Hunt și Dave Thomas (ediția a 2-a)

Dintotdeauna, programatorii au avut o problemă cu transformarea unor cerințe de business în specificații tehnie și mai apoi în cod funcțional care face userii fericiți. Sau nu o problemă, dar cu siguranță un challenge. Toate aspectele tehnice din spatele transformării unei specificații într-un moment de fericire replicabil pentru toți userii sunt tratate destul de bine aici. De la învățare continuă la evitarea duplicărilor de informații și cod, de la folosirea corectă a uneltelor până la concretizarea cerințelor, de la protecția împotriva vulnerabilităților la creșterea echipei, responsabilitate personală și testare continuă, le aveți pe toate aici.

11. Artificial Intelligence: A Modern Approach de Stuart Russell și Peter Norvig (ediția a 3-a)

Inteligența artificială e unul din cele mai util de învățat domenii din programarea modernă dacă ai la ce s-o folosești. Nu toate problemele tehnice se pot rezolva cu inteligență artificială, dar cu siguranță e util să știi despre ce e vorba ca să poți decide dacă o folosești sau nu. Cartea asta e una din cele mai bune din domeniu, e folosită în cursuri la facultăți importante din toată lumea și acoperă toată problematica AI-ului: agenți logici și inteligenți, tehnici de căutare, jucarea de jocuri și sisteme cu constrângeri și ținte, logică primară, inferență, planificare, nesiguranță și decizii probabilistice, rețele neuronale, învățare asistată, comunicare, percepție și robotică.

12. Algorithms de Robert Sedgewick și Kevin Wayne (ediția a 4-a)

Ne întoarcem puțin la algoritmi ca să menționez cartea asta, care e și ea de referință în domeniu. Uitați-vă pe review-uri și decideți care din cele două vă e mai utilă, dar eu cred că e musai să aveți în bibliotecă măcar una din cărțile de algoritmi din acest articol. Diferența dintre cartea de față și cea de Cormen e că asta folosește Java ca să explice algoritmii (și are și un site companion), iar Cormen folosește pseudocod (și de-aia mi se pare cea de Cormen mai bună). Ideea e că a cunoaște algoritmii cei mai folosiți în diversele probleme în care intervin e ca și cum ai învăța gramatica unei limbi străine. Sigur, poți supraviețui fără s-o știi, dar o să râdă toată lumea de tine când vorbești și o să te considere un neofit ineficient indiferent câtă experiență ai.

13. Git for Humans de David Demaree

GIT-ul e cea mai bună modalitate să faci management-ul codului, a surselor și a resurselor de orice fel în cadrul unui proiect. Prin GIT poți versiona, păstra istoricul, dezvolta în paralel cu toți colegii tăi și disemina cunoștințe dacă-l folosești corect. Iar cartea asta e una din cele mai directe și nepretențioase modalități de a învăța cum să te descurci în GIT.

14. JavaScript: The Good Parts de Douglas Crockford

Am mai povestit despre cartea asta și în alte articole, pentru că e una din cele mai bune cărți care vorbește în mod deosebit despre părțile bune ale JavaScript-ului, care devine (dacă nu e deja) cel mai popular limbaj de programare din lume. Crockford e unul din oamenii care a pus bazele JavaScript-ului modern, și deci e o sursă foarte reputabilă de informații legate de ce-ar trebui să știi despre limbajul ăsta permisiv ca să nu-l folosești în așa fel încât să regreți mai târziu. Pentru că poți face asta, cu siguranță. Acoperă sintaxa, obiectele, funcțiile, moștenirea, vectorii, expresiile regulate, metodele, stilul și tot ce trebuie să te dezveți din a folosi ca să poți folosi lucrurile bune, așa cum trebuie. Iubesc cărțile de bune practici. Asta e una pe care trebuie s-o aibă orice front end și full stack developer.

15. Structure and Interpretation of Computer Programs de Harold Abelson, Gerald Jay Sussman și Julie Sussman

Dat fiind faptul că manualul ăsta e folosit la MIT de foarte multă vreme pentru a introduce studenții în programare, n-o să zic prea multe despre ea. Doar că merită citită printre primele, pentru că pune bazele cunoștințelor tale despre cum funcționează calculatorul și cum sunt structurate limbajele și compilatoarele, cum interacționează ele cu hardware-ul (cu memoria și restul resurselor) și cum ar trebui să abordezi tu învățarea lucrurilor ăstora ca să ai o bază foarte solidă pe viitor.

Mai sunt multe alte cărți mișto pe care nu le-am inclus aici: The art of computer programming de Knuth, Code de Charles Petzold, Cracking the Coding Interview de Gayle Laakmann McDowell, Blockchain Basics de Daniel Drescher, The Algorithm Design Manual de Steven Skiena, Release It! de Michael Nygard, Seven Languages in Seven Weeks de Bruce Tate, Coders at Work de Peter Seibel, The Self-Taught Programmer de Cory Althoff, The Art of Unit Testing de Roy Osherove, Grokking Algorithms de Aditya Y Bhargava, SQL Queries for Mere Mortals, Database Design for Mere Mortals, User Stories Applied, Growing Object-Oriented Software, Patterns of Enterprise Application Architecture, Enterprise Integration Patterns (și volumul 2), Domain-Driven Design, Systems Performance, The Little Schemer, Working Effectively with Legacy Code, Agile Web Development with Rails 6 sau chiar It Doesn’t Have to Be Crazy at Work de Jason Fried și David Heinemeier Hansson. Dar despre ele – și nu numai – poate vorbesc într-un articol viitor, într-o continuare a articolului curent. Momentan cred că e de ajuns pentru tine.

Cum ar fi ideal să înveți programare?

Așa cum te-am obișnuit, o să-ți spun și faptul că niciuna din cărțile de mai sus nu e un substitut pentru experiența practică. Dacă vrei să te apuci de programare, n-ai nicio șansă să înveți decât dacă faci multă practică. Dacă nu știi exact cum să procedezi, e simplu:

  1. Alege-ți un domeniu: vrei să fii programator în zona aplicațiilor web și a site-urilor, în zona aplicațiilor mobile, în zona jocurilor, în zona aplicațiilor desktop, în zona aplicațiilor pentru alte dispozitive sau în altele?
  2. Pentru fiecare domeniu ales anterior există câte un limbaj de programare pe care ar fi ideal să-l înveți, dar înainte de a ajunge acolo, poți începe de la un limbaj mai simplist. Python e un punct excelent de plecare și e destul de generic. Dacă vrei ceva specific fiecărui domeniu, recomand: JavaScript pentru web, C# pentru mobile, jocuri și desktop sau Java pentru desktop și device-uri. Incidental, astea sunt și cele mai populare limbaje de programare de pe piață astăzi, conform studiului HackerRank.
  3. Pentru oricare din limbajele de mai sus și nu numai, găsește tutoriale gratuite pe YouTube sau pe Google care să te treacă prin limbaj și să te-nvețe sintaxa, ceva algoritmi de bază și să te treacă prin caracteristicile limbajului, de la type system la structuri de date și variabile, de la design patterns la bune practici. Pentru JavaScript spre exemplu, următorul articol și video pe care-l voi publica va prezenta în detaliu tutorialele, cursurile și materialele pe care e bine să le urmezi ca să devii un developer bun în JavaScript. Pentru restul, recomand să începi de la resurse reputabile cum ar fi TheOdinProject pentru JavaScript, FreeCodeCamp sau Scrimba pentru Python, Microsoft Dotnet pentru C# sau LearnJavaOnline pentru Java.
  4. Apucă-te de rezolvat probleme de algoritmică de pe HackerRank și LeetCode, unde găsești exemple practice de algoritmi puși în context pe care va trebui să-i folosești (cu orice limbaj de programare preferi) să rezolvi problemele care sunt din ce în ce mai grele pe care ți le pun platformele astea la dispoziție. Ai și award-uri de strâns, pe care la o adică le poți pune și-n CV, fiindcă sunt achievement-uri reale. După ce le termini pe-alea, fă uz și de CodeWards și de CodinGame, care abordează situația similar, cu niște mici diferențe sociale sau gamificate.
    BONUS: ai și două resurse românești excelente de unde poți învăța programare: site-ul InfoArena unde găsești probleme rezolvate de algoritmică, cursuri și documentație foarte bine pusă la punct, plus câteva cursuri și laboratoare de la Politehnica București, facultatea de Automatică și Calculatoare.
  5. În timp ce înveți practic, sau după ce faci asta, comandă-ți cărțile de mai sus și parcurge-le ca să devii un programator mai bun.

Nimic nu bate experiența practică, și dacă vrei să te și angajezi ca programator, ar trebui să-ți pregătești și un portofoliu consistent de proiecte (prezentate nu doar sub formă de cod sursă pe GitHub, ci ca pe ceva testabil, eventual ca studii de caz dacă sunt suficient de complexe) așa încât omul care îți evaluează aptitudinile să înțeleagă exact ce știi să faci. În plus, ai nevoie și să-ți pui la punct CV-ul (pentru care am un articol pentru tine chiar aici) și să folosești platformele de job-uri eficient (pentru care am o serie întreagă de video-uri în articolul ăsta).

Spune-mi în comentarii despre ce alt limbaj de programare să fac un deep dive așa cum voi face pentru JavaScript în curând, și dacă ți-a plăcut articolul ăsta, nu uita să te înscrii la newsletter-ul meu folosind formularul din dreapta, și vei primi ocazional mail-uri de tip rezumat al conținutului pe care-l scriu.

Sper că te-a ajutat lista asta de cărți, îți urez spor la muncă practică și apoi spor la citit!

Succes în carieră!

Comments
  • În cât timp poți deveni un programator bunicel, dacă studiezi zilnic 2 ore, făcând tot ce ai descris mai sus?

    • Între 6 și 18 luni e perioada în care-am observat eu că se atinge un nivel minimal de cunoștințe secondat de un portofoliu serios, despre care am un video pe YouTube la care ar trebui să te uiți aici.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

Acest site folosește Akismet pentru a reduce spamul. Află cum sunt procesate datele comentariilor tale.