Code efficiency sau ‘a doua venire a lui PHP’

Posted on Posted in Stiri

Noi toti cei din B/Programmer, suntem o echipa bine inchegata de dezvoltatori PHP. Toate solutiile noastre folosesc in spate acest limbaj si mai mult de atat– face treaba uimitoare pe serverele clientilor nostri. 

Dar de ce PHP? O sa prezint in urmatarele randuri o serie de motive care, pentru noi, fac din PHP alegerea cea mai buna. 

Observam o schimbare in modul in care dezvoltatorii web lucreaza cu el, iar asta se intampla pentru ca limbajul se modifca pentru a deveni mai matur si  mai robust. Si nu doar limbajul – intregul ecosistem se schimba. 

Noi tehnologii, librarii, framework-uri si articolele sunt dezvoltate constant iar design pattern-uri sunt definite pentru a face codul mai elegant si mai usor de inteles. 

Totul a inceput cu PSR-urile, urmate indeaproape de ComposerPHPUnitTravis CI si alte librarii si tool-uri uimitoare. Acum se pot folosi si IDE-uri precum PHPStorm cu add-ons de debugging – XdebugInsa si limbajul in sine a progresat, PHP 7 e de nerecunoscut in comparatie cu PHP 5, performanta sa fiind de 2X iar standardizarea in centrul atentiei 

Toolset-ul modern pentru PHP: 

  • Slimframework: a nice and cool microframework 
  • Symfony: un framework mai mare care este plin cu compnente reutilizabile 
  • Guzzle: un client HTTP simplu si usor de folosit  
  • PHPUnit: un framework pentru testare unitara  
  • Behat: un framework pentru Behavior-Driven Development(dezvoltare pe baza de comportament) 
  • PHPCS/CBF: code sniffer si code beautifier 
  • Faker: generator de date falese 
  • Psysh: o consola de runtime (CLI)  
  • Composer: manager al dependentelor 
  • Packagistrepository pentru pachete 
  • Twigtemplate engine 

Pentru dezbateri cu privire la PHP, ecosistemul acestuia sau pur si simplu discutii ma gasiti pe Twitter @xticriss sau pe mail cristian.lascu@bprogrammer.ro . 

TL;DR 

Definitia unui limbaj modern 

Gasim multe articole online care vorbesc despre cat de oribil este PHP si cum viata ta este groaznica daca trebuie sa lucrezi cu PHP.  Multi programatori se plang de faptul ca limbajul este urat, ca este de fapt un nonlimbaj si criticile pot continua. 

Ok, in calitate de dezvoltator PHP trebuie sa recunosc ca daca vei lucra cu cod legacy, atunci probabil viata ta nu va fi asa de grozava. Insa – si trebuie sa subliniez asta –  daca ai ocazia sa incepi un proiect nou si oportunitatea sa lucrezi cu un framework ca Symfony sau Laravel vei vedea PHP cu alti ochi.  

 

Cum definesti un workflow in PHP 

Pentru a fi eficient ai nevoie de un IDE pe masura, iar PHPStorm este un software extraordinar. Este singurul IDE pe care noi il folosim la B/Programmer. 

Apoi integrarea cu XDebug este perfecta. La fel si cea cComposer, cu Git, auto-complete iar generarea de cod si refactorizarea sunt doar cateava din beneficiile acestui IDE. 

Nu vreau sa va conving sa folositi un IDE, punctul de vedere exprimat mai sus este unul complet personal. Puteti folosi orice se potriveste nevoilor voastre fie ca este Vim, Atom, EmacsBracketNetBeansPHPStorm, Eclipse… orice.  

Doua puncte foarte importante mentionez aici insa – productivitatea si ergonomia. Editorul vostru de text/IDE-ul are ca un unic scop sa va ajute. 

Pentru mine de exemplu, un punct forte este integrarea cu un debugger. In momentul in care scrii cod pentru un proiect, indiferent de marime lui trebuie sa folosesti un debugger decent. Sa uitam pentru un moment acele var_dumps si print_rs. Lucrurile astea sunt esentiale si in plus, fac refactorizarea usoara. 

XDebug are tot ce va puteti dori. 

 image001

Tool-ul 

Celalat tool despre care vreau sa vorbesc este BitBucket. Ar trebui scris un articol intreg doar despre cat de eficiente sunt Git si BitBucket si de ce trebuie sa incepi sa codezi sub un sistem de versionare. Dar vrea sa spun cateva cuvinte despre intergrare. 

Sunt multe aplicatii ce se integreaza cu BitBucket pe care ar trebui sa incepi sa le folosesti. Ele pot genera metrice, pot porni teste sau joburi pentru tine in timpul unui proces continuu de integrare si mai poate face o multime de alte lucruri care sa te ajute in workflow-ul tau. 

 

Acum sa discutam un pic despre managementul dependentelor 

Alt punct in acest ecosistem modern de PHP este managementul dependentelor, iar Composer este dirijorul perfect pentru asta. 

Composer are 5 ani dar a fost adoptat la scara larga de acum vreo 2 ani.  

Practic eofera o interfata pentru Packagist, un repository de pachete pentru PHP ce e format din librarii PHP, proiecte si tooluri a caror cod sursa este stocat in GitHub(sau in BitBucket). 

 

Terminalul (CLI) 

In lumea PHP avem ceva numit “interactive mode” care poate fi accesat din terminal prin tastare 

php -a 

In acest mod interactiv puteti face teste. Functioneaza… dar tool-ul este contraintuitiv.  

Din cauza asta avem noroc ca exista un CLI (interfata pentru linia de comanda) numita PsyshPsysh este o aplicatie uimitoare plina de optiuni si poate fi instalata global sau per proiect folosind Composer. 

Cea mai buna functiune a Psysh este documentatia scrisa inline. Accesarea documentului pentru o functie PHP fara a te duce in php.net este super pentru productivitate.  

 

Testarea codului 

Tastarea… Din pacate zilnic trebuie sa iti testezi codulEu, la fel ca o multime de oameni nu imi testez codul pe cat de mult ar trebui.  

Am inceput testarea cand lucram cu proiecte complexe legacy. Codul era atat de fragil si rigid ca oricand adaugam cod noi stricam ceva.  

Primul tool pe care l-am descoprit a fost PHPUnitDupa cum este descris si in site-ul oficial: 

PHPUnit este un framework de testare PHP orientat catre programator. 

Deci PHPUnit este un framework ce te ajuta sa creezi teste pentru proiectul tau. Teste unitare. Iti da mai multe functii de testare si genereaza un output cu rezultatul acelor teste. 

De cand am inceput sa ma gandesc la teste, sa citesc si sa vorbesc cu oameni despre ele, am descoperit un alt tool care complementeaza munca pe care o depui in testare. Se numeste Behat si este un framework BDD pentru PHP. 

BDD(dezvoltarea pe baza de comportament) este un proces de dezvoltarea care a derivat din TDD(dezvoltare bazata pe test). Ambele fac parte dintr-un concept mai larg, Programare Extrema(XP). XP este ceva ce noi la BProgrammer credem cu tarieiar principiile precum Pair Programming, Code Review, TDD, Integrarea Continua (despre care am sa vorbesc mai jos) si altele consider ca ajuta foarte mult la crearea unei echipe solide iar programatorii juniori sunt ajutati sa capete experienta intr-un mod accelerat. 

Dar sa ne intoarce la testare automata  limbajul acesta se numeste Gherkin si este folosit pentru a descrie comportamentul asteptat in timpul testarii. 

In spatele acelor linii gherkin este cod PHP care este apelat ori de cate ori exista o potrivire intre o linie si un tipar regex specificat in PHPDoc-ul metodei. Acest cod implementeaza aceeasi pasi si ceea ce un utilizator adevarat ar face prin folosirea SDK-lui, aplicatiei sau sistemului web creat. 

Dupa ce totul este configurat corespunzator poti incepe sa scrii toate scenariile posibile pentru o testare. Prima data cand rulezi Behat primesti toate template-urile de metode pe care ar trebui sa le adaugi in clasa de context PHP pentru a implementa fiecare pas intr-un scenariu. 

Dupa asta, incepi sa scrii codul propriu-zis pentru fiecare pas si sa repeti acest ciclu: 

  • Implementarea codului PHP pentru un pas 
  • Rularea testelor 
  • Daca totul este ok scrii codul PHP pentru alt pas 
  • Daca ceva este stricat il repari 

 

Dupa jumatate de ora de configurare si citirea documentatiei esti pregatiti sa folosesti Behat, vei vedea ca in final este tot cod PHP si deja stii cum sa programezi cu el. 

 

Integrarea continua 

Intregrarea continua sau continous integration o practica din Programarea Extrema (XP) si are ca scop de a incorpora bucati mici de cod cat mai repede posibil si cat mai des posibil pentru a intampina rapid probleme de integrare si de a le rezolva cat mai repede. 

De mentionat  codul ce urmeaza sa fie adaugat  trebuie trecut prin procesul de testare automata in prealabil. Integrarea continua te ajuta sa automatizezi crearea, testearea si livrearea aplicatiei. 

Doar din cateva clickuri poti integra proiectul tau BitBucket cu Travis CI si fiecare push in repository va rula acele teste pe care le-ai creat cu PHPUnit si Behatspunandu-ti daca ultima functionalitatea pe care ai implemntat-o este gata sau nu pentru fuzionare. Pe langa aspectul acesta poti folosi Travis CI pentru a livrea codul in productie si staging. 

Daca ai o serie de activitati si un proces bine definit esti pe drumul cel bun, iar Travis CI poate sa te ajute sa faci acest lucru. 

 

Recomandarile standard PSR-1 si PSR-2 

PSR este un acronim pentru PHP Standard Recommendation si este propus de catre PHP Framework Interop Group- un consortiu format din membrii ai celor mai mari proiecte PHP dar si frameworkuri si CMS-uri, un consortiu care se gandeste la viitorul acestui limbaj si care discuta standardele ce trebuie urmarite. 

Pentru o perioada lunga de timp PHP nu avea un stil de codare. Motiv pentru care si-a atras atata ura. Nu sunt un programator din garda veche, dar de fiecare data cand ma uit in libraria sau proiectul cuiva vad ca persoana respectiva urmarea un standard diferit. 

Haos. 

PHP-fig face foarte multe alte lucruri dar prin propunerea unei singure unitaiti de cod el spune- “Hai sa nu ne mai gandim la stilul codului, fiecare sa urmareasca un standard si sa incepem sa ne gandim la cum putem face softuri calumea. Astfel cand te uiti la codul cuiva nu iti mai bati capul cu formatul si structura lui, ci cu modul in care codul lucreaza. 

Standardele acestea propun un stil de codare modern, eficient si firesc in PHP. Cititi-le. Nu o sa vi le aduceti aminte pe toate in timp ce codati pentru ca este un proces dinvatare, dar incetul cu incetul le veti memora. 

Tot in directia unei baze de cod uniforme – PHP CodeSniffer este un tool pe care il pueti gasi pe Packagist merge instalat cu Composer. Nu cred ca numele acestui repository a fost cel mai inspirat pentru ca se livreaza cu doua aplicatiidiferite– PHPCS si PHPCBF. 

Phpcs este codesnifferadica iti va scana tot codul cautand parti care nu sunt configurate conform standardelor. 

Poti folosi mai multe standarde de codare cu PHPCS sdar poti sa ti le creezi pe ale tale. La finalul scanului de cod PHPCS iti arata o lista cu bucati de cod care nu urmeaza standardele. 

Bun, ai rulat code sniffer si ai descoperit “erori”. Acum cum schimbi lucruile care nu sunt in regula. Fie poti sa deschizi fiecare fisier, schimbi codul, rulezi PHPCS din nou, vezi care erori nu sunt afisate si repeti procesul.  

Pentru a rezolva aceast rutina PHP CodeSniffer a dezvoltat un alt tool, numit PHPCBF, sau PHP Code Beautifier. Rulezi PHPCBF urmarind aceleasi reguli si se repara totul pentru tine, sau incearca sa faca treaba cat mai bine fara sa iti distruga codul. 

Incearca sa creezi obiceiul de a rula PHPCS si PHPCBF inainte de a impinge schimbari in cod in repository – asta va asigura ca toate codurile adera la standarde si daca cuiva ii place tool-ul/proiectul tau si vrea sa contribuie atunci ei nu vor avea nicio problema in a-l citi. 

 

Framework-uri 

Despre framework-uri am avea de discutat foarte mult si am sa pastrez aceasta discutie pentru un alt articol, dar pentru ontegritatea acestui articol am sa trec in revista cateva lucruri.  

Symfony face o treaba extraordinara in departamentul frameworkPuteti sa il folositi ca in intregime pentru sau puteti sa luati orice componenta doriti si sa o folositi, in functie de proiect. 

Pentru unul corporate, Symfony este unul din putinele framework-uri ce pot face fata cerintei, motivul fiind ca adera la standarde precum layered architecturemultitier architecture sau service architecture, acestea fiind doar cateva din multitudinea de pattern-uri ce vin cu Symfony. Nu pot sa vorbesc despre Symfony fara sa adaug in discutie si Doctrine, un ORM ce implementeaza Data Mapper pattern ce face lucrul cu baza de date o placere si in plus iti ofera siguranta ca aplicatia ta poate scala fara probleme o data cu cerintele aplicatiei. 

Symfony este grozav insa nu mereu ai nevoie sa faci o aplicatie la nivelul enterprise, de multe ori trebuie sa realizezi un prototip pentru a testa o idee sau sa creiezi un client API, in astfel de situatii un microframework ar fi o alegere mai potrivita. Sunt micute si ofera lucrurile de baza, sunt usor de customizat si iti structureaza proiectul mai bine. 

Microframework-ul meu preferat este Slimframework si cred ca ar trebui sa cititi despre el, iar autorul acestuia Josh Lockhart, are o serie de „best practices” pe internet numita PHP The Right Way ce ar trebui citita de fiecare programator PHP. Este destul de simplu cat sa faceti proiecte micute dar creste in complexitate cu cele mai mari. 

Pentru aceia dintre voi care noi in programare, consider ca trebuie sa va ganditi bine inainte sa adopati un anumit framework si mai bine il creati voi. Asta va da o intelegere mai buna a mecanismului din spatele lui. 

 

PHP in viitor 

PHP este un limbaj ce se adapteaza cu brio timpurilor noi si isi face foarte bine treaba…si surprinzator nu numai. Ecosistemul se dezvolta continuu si recent au aparut proiecte interesante in domeniul inteligentei artificiale. Exista suport oficial pentru FANN (Fast Artificial Neural Network) prin care poti crea o retea neuronala artificiala in cateva linii de cod iar antrenarea si prelucrarea datelor e incredibil de facila. Exista librarii pe GitHub ce ofera integrarea cu OpenCV cu care poti realiza proiecte in domeniul „Computer Vision”. De altfel exista proiecte foarte active in zona de „Real Time Computing” unde ReactPHP sau Ratchet imping limitele cu fiecare commit in repo-ul proiectului.