ABONAMENTE VIDEO REDACȚIA
RO
EN
×
▼ LISTĂ EDIȚII ▼
Numărul 19
Abonament PDF

Ce să înveți în 2014

Alexandru Bolboacă
Agile Coach and Trainer, with a focus on technical practices
@Mozaic Works
MANAGEMENT

Începutul de an este un moment bun pentru a medita la viitor. Cum putem crește în carieră? Cum putem avea o slujba (mai) stabilă? Cum putem deveni mai căutați într-o piață competitivă? Acest articol conține zece abilități tehnice care pot ajuta un programator să se facă remarcat de către colegi sau de către manageri pentru eficiență.

10. Touch typing

Mașinile de Formula 1 au multe secrete; cel mai bine păstrat este cel al anvelopelor. Motivul este simplu: oricât de eficient ar fi motorul și pilotul, anvelopele sunt cele care conectează mașina cu solul.

Tastatura este modul prin care creierul programatorului se conectează cu codul. Ideile sale, oricât de bune ar fi, trebuie în final transferate în cod cât de repede cu putință. Touch typing este abilitatea de a scrie la tastatură fără a o privi. Touch typing permite scrierea rapidă și concentrarea completă pe rezolvarea problemei. Mai mult, permite reducerea timpului de scris e-mail-uri sau documentație.

Ca orice abilitate, touch typing poate fi antrenat: www.typingstudy.com , www.typingclub.com/typing-qwerty-en.html sau play.typeracer.com sunt site-uri unde puteți învăța touch typing sau intra în competiție cu colegi sau prieteni la viteza de scris la tastatură. Utilizarea acestor site-uri poate deveni și o activitate foarte amuzantă, prin natura competitivă a lor.

9. Editorul (IDE-ul) folosit

Editoarele moderne de cod au sute de funcționalități. Câteva dintre ele sunt extrem de folositoare și nu îndeajuns folosite. Stăpânirea lor permite editarea, navigarea și modificarea rapidă a codului, chiar și dacă este necunoscut sau nu este bine structurat.

De exemplu:

  • Editare avansată :
    • Ștergerea unei linii (Ctrl+D în Eclipse, Shift+Ctrl+L în Visual Studio).
    • Mutarea unei linii mai sus sau mai jos. Funcționează și pentru mai multe linii.
    • Selecția oricărui bloc de cod între acolade sau paranteze (Ctrl + W în ReSharper).
  • Navigare :
    • Găsirea tuturor referințelor către o variabilă sau clasă;
    • Navigarea la implementarea unei metode;
  • Refactoring
    • Redenumirea unei variabile, metode sau clase (Alt + Shift + R în Eclipse, Ctrl + R, Ctrl +R în Visual Studio);
    • Extragerea unei metode (Alt + Shift + M în Eclipse, Ctrl + R, M în Visual Studio);
    • Extragerea unei interfețe;
    • Promovarea unei metode dintr-o clasă în interfață sau clasa de bază;
    • Extragerea unei clase.

Multe alte funcționalități utile sunt documentate în cheatsheets disponibile online.

8. Reducerea timpului de compilare

Orice modificare a codului necesită validare. Pentru cei care folosesc un limbaj compilat, timpul necesar pentru validare depinde de timpul de compilare. Nu este niciodată plăcut să aștepți ca programul să se compileze. În plus, concentrarea se pierde în acest timp.

IDE-urile Java, precum Eclipse și IntelliJ Idea oferă compilare continuă cu prețul timpului de procesor și memoriei. .NET Daemon de la RedGate (http://www.red-gate.com/products/dotnet-development/dotnet-demon) oferă același lucru pentru programatorii .NET.

Chiar și fără aceste unelte, este posibil să scazi semnificativ timpul de compilare al unui program, oricât de mare ar fi, folosind câteva tehnici:

  • Hard-uri SSD. Deși încă par scumpe, prețul lor este rapid absorbit de timpul câștigat de programatorii care nu vor mai aștepta după compilări;
  • Crearea de soluții/proiecte temporare (sau unități de compilare în C++) care pot fi modificate, compilate și validate mult mai rapid decât întreg proiectul;
  • Cunoașterea opțiunilor de compilare. De exemplu: compilarea incrementală și folosirea tuturor procesoarelor disponibile sunt opțiuni comune pentru compilatoare.

7. Limbajul de programare și tehnologia principală folosită

O funcționalitate poate fi implementată în nenumărate moduri. Doar câteva din aceste moduri sunt atât corecte cât și simple și ușor de extins.

Una dintre metodele de simplificare este de a folosi la maxim ceea ce este deja implementat în tehnologia folosită. Construcțiile de limbaj permit de asemenea simplificarea la maxim a codului.

O metodă contraintuitivă de a învăța foarte bine o tehnologie este de a încerca alte tehnologii și de a face comparații între ele. Cea mai simplă metodă de a încerca altă tehnologie este prin colaborarea cu un programator care o cunoaște, fie prin discuții pe cod existent sau scrierea de cod nou folosind pair programming (vezi 2).

6. Principii pentru design modificabil

Principala problemă din software în ziua de azi este faptul că trebuie sa modificăm mereu cod existent. Se observă în viața unui proiect cum la început, codul este ușor și rapid de modificat. Pe măsură ce proiectul avansează și tot mai mult cod este creat, modificările devin tot mai dificile. De aceea design-ul aplicației trebuie să fie optimizat pentru modificabilitate.

Principiile SOLID și design patterns au apărut acum mai mult de zece ani ca soluții la aceste nevoi. Orice echipă care are probleme cu modificarea codului ar trebui să investească timp în înțelegerea profundă și aplicarea acestor tehnici.

5. Refactorizare eficientă

Codul greu de modificat poate fi transformat în cod ușor de modificat prin refactorizare. Refactorizarea este o investiție în viitor; codul la care ajungem "opune" mai puțină rezistență, costurile de implementare ale funcționalităților noi scăzând.

Pentru o refactorizare reușită e nevoie de două elemente: cunoașterea și aplicarea principiilor de design modificabil (vezi 6) și scăderea timpului de refactorizare.

Există câteva secrete ale refactorizării eficiente:

  • Folosirea refactorizărilor automate. IDE-urile moderne (Eclipse, Visual Studio + ReSharper sau IntelliJ Idea) au asemenea facilități. Editoarele populare printre programatori, precum vim, oferă posibilitatea de a înregistra macrouri sau de a scrie scripturi de refactorizare. Indiferent de soluție, refactorizările automate economisesc mult timp.
  • Cunoașterea refactorizărilor manuale. Uneori editorul nu are automatizate anumite tipuri de refactorizare. Cartea "Refactoring" de Martin Fowler descrie în detaliu modul de a face refactorizări manuale sigure și rapide.
  • Refactorizarea continuă. Cu cât refactorizarea așteaptă mai mult, cu atât design-ul codului devine mai greu de modificat și va fi nevoie de o investiție mai mare. Refactorizarea continuă permite eliminarea problemelor de design din fașă, dar necesită cunoștințe solide de design și colaborarea cu colegii de echipă pentru revizuirea deciziilor luate.
  • Automatizarea prin scripting a refactorizărilor complicate dar comune. Majoritatea IDE-urilor pot fi exersate prin scripturi, ceea ce permite automatizarea unor refactorizări specifice aplicației.

4. Automatizarea eficientă a testării aplicațiilor mari

Pe măsură ce funcționalități noi sunt adăugate la o aplicație, timpul de testare tinde să crească. Modularizarea, adăugarea de noi testeri și/sau testarea automată sunt soluții posibile ale acestei probleme. Echipele care aleg testarea automată întâmpină dificultăți în fața testelor care devin complicate și dificil de menținut. Soluția este structurarea testelor automate folosind piramida testelor.

Piramida testelor este o abordare structurată a testării automate prin împărțirea testelor în mai multe categorii:

  • Teste unitare: validează comportamentele așteptate de la o clasă sau mai multe clase. Sunt rapide, simple, folosesc duble de testare (mocks și stubs) și sunt rulate de programatori după fiecare modificare a codului. Sunt cele mai multe și pot acoperi 90+% din comportamentele aplicațiilor.
  • Teste de integrare: validează integrarea claselor din aplicație cu orice sistem extern (librării, framework-uri, servicii externe, servicii ale sistemului de operare). Sunt mai lente, mai dificil de scris și trebuie rulate atunci când se modifică versiunile de librării folosite sau la build-ul automat.
  • Teste de contract: validează contractele de colaborare între două clase, adesea din module diferite.
  • Teste end to end: validează cele mai importante funcționalități din modul sau aplicație, prin exersarea sistemului real. Sunt de obicei complicate, lente și fragile, deoarece necesită crearea și configurarea unui mediu de testare similar cu cel de producție. Nu folosesc interfața utilizator.
  • Teste de sistem: validează sistemul folosind interfața utilizator. Pot fi manuale sau automatizate folosind tool-uri speciale (ex. Selenium)
  • Teste de explorare: sunt executate manual de un tester care explorează aplicația căutând activ posibile erori de programare. Foarte utile pentru prinderea problemelor ascunse.
  • Teste de acceptanță: scopul lor este de a crea specificații executabile care pot fi ușor citite de către Business Analysts, Product Manager, Product Owner, Business Stakeholders și alte persoane care nu sunt tehnice dar cunosc produsul și business-ul aplicației.

O strategie eficientă de testare se bazează pe o combinație între multe teste unitare, îndeajuns de multe teste din celelalte categorii și teste de explorare pentru prevenția majorității bug-urilor ce pot să apară. Această strategie poate acoperi o întreagă aplicație (în cazul celor business sau life critical) sau părțile cele mai riscante din aplicație. Un arhitect sau CTO poate defini această strategie și poate veghea la implementarea ei.

3. Lucrul rapid și eficient cu cod existent

Majoritatea programatorilor lucrează cu cod existent. Adesea, codul este vechi de 2-3 ani, uneori are 10 ani sau mai mult. Cei care l-au scris inițial nu mai sunt în echipă sau nu pot răspunde la întrebări legate de cod. Este așadar treaba programatorilor să înțeleagă codul existent și să-l modifice fără a-l strica atunci când adaugă o funcționalitate sau rezolvă un bug. Dacă testarea unei funcționalități noi este ușoară, validarea faptului ca nu am stricat nimic din funcționalitățile existente este mult mai dificilă. În același timp, am dori să îmbunătățim design-ul pentru a optimiza adăugarea de funcționalități noi în viitor (vezi 5). Dar cum, atunci când codul existent este de neînțeles?

Tehnici speciale de a înțelege și modifica cod neinteligibil au fost create în timp. Dintre ele putem enumera:

  • Golden master: scrierea de teste automate care la prima rulare stochează ieșirile și la rulările ulterioare compară ieșirile cu cele inițiale. Asigura un prim nivel de siguranță împotriva modificărilor nedorite.
  • Teste de caracterizare: scrierea de teste automate cu scopul de a descoperi comportamentele existente în cod. O dată ce o bucată din cod a fost acoperită de asemenea teste, poate fi extrasă în metode sau clase separate, ca prim pas spre simplificarea design-ului.
  • Extract and override: o metodă care permite concentrarea pe o bucată mică atunci când încercăm să înțelegem codul. Este compusă din extragerea unei bucăți complicate de cod pe care nu vrem încă să ne concentrăm într-o metodă care apoi este suprascrisă cu o metodă folosită în scopuri de testare (crearea unui mock parțial).
  • Refactorizarea exploratorie: Refactorizarea cu scopul de a descoperi alternative de design. Atunci când refactorizările sunt automatizate cu scripturi, ele devin Metoda Mikado.

Multe alte tehnici există, majoritatea descrise în cartea "Working Effectively with Legacy Code" de Michael Feathers și tratate în cursul "Working FAST and Safe with Existing Code" (www.mozaicworks.com/workshops/working-fast-and-safe-with-existing-code) .

2. Învățarea mai rapidă

Tehnologiile și industria software se schimbă continuu. Programatorii trebuie să învețe mereu lucruri noi, ceea ce înseamnă că optimizarea învățării este utilă oricui lucrează în acest mediu.

Câteva metode există pentru a învăța mai repede, dintre care enumerăm:

  • Implicarea altor programatori în învățare (social learning),
  • Pregătirea unei prezentări pentru o audiență prietenoasă,
  • Exersare deliberată (deliberate practice),
  • Coaching sau sesiuni facilitate,
  • Experimentare.

Pentru mai multe detalii citiți articolul "5 Trick to Amplify Learning" (www.mozaicworks.com/blog/5-tricks-to-amplify-learning).

1. Amintiți-vă să vă distrați!

Cel mai important lucru este să vă placă ceea ce faceți. Vor fi momente dificile, probleme sau neînțelegeri în orice echipă. Important este să vă amintiți că programarea este o meserie frumoasă, că lucrați cu oameni inteligenți și că puteți adesea să ușurați viețile utilizatorilor.

Celebrarea succeselor în echipă, evenimente precum "code and beer" sau code retreat, lucrul cu programatori necunoscuți la întâlniri de comunitate sunt câteva moduri prin care vă puteți bucura de crearea de cod și să vă reamintiți cât de distractiv este.

La Multe Împliniri în 2014!

LANSAREA NUMĂRULUI 87

Prezentări articole și
Panel: Project management

Marți, 24 Septembrie, ora 18:00
Impact Hub, București

Înregistrează-te

Facebook Meetup

Conferință

Sponsori

  • ntt data
  • 3PillarGlobal
  • Betfair
  • Telenav
  • Accenture
  • Siemens
  • Bosch
  • FlowTraders
  • MHP
  • Connatix
  • UIPatj
  • MetroSystems
  • Globant
  • Colors in projects