Am invatat acum ceva timp un lucru important de la un programator mult mai bun decat mine: “Sterge tot codul care nu merge inainte de a incheia ziua”. Abstractizez la “Nu lasa, cu buna stiinta, ceva care nu merge cum trebuie in codul tau”.
Adevarul e ca a doua zi:
- nu sunt intampinat de erori dubioase
- vin cu o abordare noua asupra codului care stiu ca nu mi-a mers ieri
- nu am ramasite de cod inutil sau problematic pe care trebuie sa le vanez
In seara asta am inceracat ceva nou. Nu a iesit, asa ca am sters tot codul nou. Tot codul nou! Iti trebuie sange rece si maturitate sa te apuci sa stergi ceva in care stii ca ai pus suflet. Dar se poate!
Practica aceasta te poate face un programator mai bun.
In asteptarea cafelei sa isi faca efectul am tras cateva cadre cu biroul meu de la Adobe.
Rareori e asa de ordonat si fotogenic. M-am prostit putin cu blitzul.

Design Patterns ca sa o scriu bine de data asta.

Ariciul de plus omniprezent si tastatura rar folosita.

Tin monitorul secundar rotit la 90 de grade doar cand lucrez la ceva ce necesita preview, debug si o eventuala alta consola sau monitor proxy.
Vineri la Adobe Romania am avut un eveniment intern de tip “Fedex Day“. Pe scurt, e o zi in care te autogestionezi si lucrezi la orice proiect iti doresti cu conditia sa livrezi ceva la finalul zilei. Te poti inhaita cu alti programatori sau poti sa lucrezi ca un lup singuratic.
Am participat la Fedex Day dar la finalul zilei nu aveam de prezentat decat un stack trace trist. Totusi, am ramas cu niste invataturi utile pentru auto-management si programare de gherila.
Cateva notes to self:
- Nu te inhama la mai mult decat poti face
Tine minte ca evenimentul dureaza o singura zi. Planifica-ti sa construiesti ceva in maxim 8-10 ore. Am gresit pentru ca am plecat la drum sa construiesc un framework pentru orice. Mult prea generic pentru ce aveam nevoie. Mult prea voluminos pentru cat timp am avut la dispozitie.
- Banda adeziva, ata de papiota si scuipat
Ca programator tii foarte mult la calitatea codului tau. Totusi, revino-ti! Intr-0 zi nu poti face ceva mai mult decat un prototip semi-functional. O unealta care de-abia merge este infinit mai utila decat una care nu merge deloc. Am depus prea mult efort pentru calitatea codului in loc sa livrez ceva functional.
- Instaleaza-ti catrafusele dinainte
Am pierdut timp valoros instaland mediul de lucru, facand bug-fixing si investigatii pentru ca librariile sa se inteleaga pe noua masina de dezvoltare! Nota secundara: nu lucra pe o masina noua, doamne-fereste sistem nou de operare, cand te afli sub presiunea timpului. Hodoraga veche, daca e pregatita, va functiona numa’ bine!
- Livreaza ceva!
Am lucrat prea disociat ca sa pot prezenta ceva la sfarsitul zilei. Am lucrat la framework si la teste si la client si la baza de date. La finalul zilei – foarte productiva dealtfel – aveam o gramada de piese care nu se pupau unele cu altele.
Chiar daca nu am terminat proiectul de care m-am apucat, Fedex Day a fost sigur un eveniment util pentru mine. Am avut ocazia sa experimentez cu niste tehnologii foarte volatile care probabil nu ar fi fost acceptate in proiectul Adobe la care lucrez.
Astept sa mai prind o zi cu programare de gherila. Poate data viitoare aproape livrez!
Prin bunavointa de mai sus am primit un LCD de 24”.

Noul monitor imi inlocuieste vechiul Dell de 19” si vine in plus cu 2 porturi DVI, HDMI, card rearder, inclusiv CF. Mai are foarte multi conectori pe care probabil nu am sa ii folosesc.
Ce am apreciat la noua jucarie este factorul plug-and-play si atat cu Mac-ul. L-am legat prin DVI la laptop si a rulat nativ la 1920*1200 px, cu tot ce ii trebuie pentru porturile USB, card reader, audio si culori foarte bune.
CD-ul cu drivere imi este inutil dar imi aduce aminte de vremurile triste pe PC.
Am gasit un articol deosebit despre “Duct Tape Programmers”.
http://www.joelonsoftware.com/items/2009/09/23.html
“A 50%-good solution that people actually have solves more problems and survives longer than a 99% solution that nobody has because it’s in your lab where you’re endlessly polishing the damn thing. Shipping is a feature. A really important feature. Your product must have it.”
Am un coleg care spune despre aplicatiile lui ca se tin cu “ata de papiota, scotch si scuipat”, dar adevarul e ca functioneaza.
Sunt fortat de circumstante sa lucrez la stiluri pe aceeasi pagina cu un fisier CSS care impune:
ul, ol {
margin-bottom:1.35em;
margin-top:1em;
padding-left:0;
}
ul, ol, dl {
letter-spacing:-2ex;
line-height:0;
word-spacing:-2ex;
}
Acesta este doar un fragment dintr-o nava mult mai urata.
Sunt prea suparat si obosit ca sa mai bocesc acum. Cine intelege codul poate sa priceapa ca e o dovada de incompetenta sau de lipsa de respect pentru cei care urmeaza sa construiasca pe baza lui.
Dupa 2 ani in salbaticie am invatat un lucru sfant: ia-ti un namespace si ascunde-te in el.
Intentionez sa public un post cu best practices pe care le-am deprins atunci cand lucrezi la cod ce va fi inclus in mii de alte pagini. Sa-mi aduci aminte daca uit!
S-au dat rezultatele!
Adobe Romania ia locul 1 la Hewitt Best Employer, iar eu iau Hummerul!
Bine, il impart cu alti 4 colegi care au avut incredere ca iesim pe primul loc. E ok, facem cu randul o saptamana!
Asta inseamna ca lucrez cu oamenii din cea mai apreciata companie de IT din Romania – si asta o spun angajatii. Pe baza opiniilor lor s-a facut clasamentul.
Topul mai este populat de inca 2 companii din IT: Microsoft care a luat locul 4 si Neogen care este pe 5.
Un aspect fundamental pe care nu l-am inteles mai devreme in cariera a fost acela ca un client se va razgandi in mod constant. Daca nu esti pregatit sa il abordezi cum trebuie tu vei fi cel care are de suferit intr-un fel sau altul – pierzi ore de somn si sanatate sau pierzi bani si reputatie.
Ceea ce urmeaza sa citesti iti poate fi util daca esti un web developer freelancer sau daca detii controlul asupra unei agentii de dimensiuni modeste care se ocupa de web development.
Metodologia SCRUM
O metodologie pe care o urmez unde lucrez acum se numeste SCRUM. Aspectele sale cele mai utile pentru mine sunt fragmentarea muncii in mai multe obiective, descompuse apoi in task-uri individuale. Obiectivele sunt apoi prioritizate dupa importanta in urma discutiilor cu managementul de proiect, in cazul tau ar fi clientul sau reprezentantul sau. Tu esti cel care decide cat timp si cat efort va lua fiecare obiectiv estimand task-urile individuale.
Lanseaza des
Aspectul reprezentativ al metodologiei este lansarea in iteratii, de regula o data la 30 de zile. In cazul unui proiect mai mic iti poti permite iteratii si mai rapide de 10 sau chiar 5 zile. In fiecare iteratie se indeplineste cel putin cate un obiectiv. Vei pleca la drum cu obiectivele fundamentale: baza de date in forma primara, modulele de baza – cele fara de care aplicatia nu are sens.
Lansand versiuni incrementale ale aplicatiei ii dai clientului sansa de a-si controla costurile si tie de a-ti doza efortul. Fiecarui obiectiv ii poate fi alocata o suma din costul total estimat al proiectului. In cazul in care clientul isi doreste modificari poti altera valoarea financiara a efortului pe care trebuie sa il depui pe fiecare obiectiv. In modul acesta tu si clientul veti observa ca proiectul inghite mai multi bani sau mai mult efort decat era prevazut si puteti conveni ce se intampla mai departe.
Lista de prioritati
Aici te ajuta lista de prioritati. Clientul poate alege sa renunte la unele mofturi din lista care au prioritatea mai scazuta dar care il vor costa, sau poate alege sa nu modifice obiectivele iteratiei deci vei depune efort care va fi remunerat suplimentar. De regula, orice client care intelege importanta functionalitatii de baza a aplicatiei sale va alege sa reunte la mofturi decat la calitatea produsului. Este datoria celui care intermediaza discutia cu clientul sa il indrume spre optiunea care va aduce mai multa valoare produsului decat bani usori in buzunarul dezvoltatorului. In final depinde de cum vrei sa iti construiesti cariera.
Avantajele modului de lucru cu SCRUM
- pleci la drum cu o estimare a costurilor, nu cu un pret fix.
- clientul are sansa sa vada produsul din si evolutia sa din timp.
- nu lucrezi degeaba perioade indelungate de timp fara sa ai feedback activ din partea clientului.
E aplicatia lui, are tot dreptul sa o vrea modificata.
- ajustezi din mers modul in care aplicatia se comporta si ceea ce face.
- ai ocazia sa iti observi ritmul de lucru pe intervale de timp bine determinate.
In viitor te va ajuta sa iti faci estimarile de timp si efort mult mai apropiate de realitate
- psihologic iti vine mult mai usor sa accepti schimbarea la un modul pe care nu ai apucat sa il construiesti.
Accepti mult mai usor schimbarea unui modul pe care l-ai construit deja atunci cand si clientul intelege impactul acestei decizii asupra costului produsului final sau a setului de optiuni pe care acesta il va oferi.
- daca aplici modelul de plata peste secventa de iteratii si tu, la randul tau, ai o siguranta financiara.
Scurt despre SCRUM
SCRUM este o metologie care include mai multe practici. Eu ti-am expus doar cateva esentiale pe care le-as folosi daca ar trebui sa lucrez la o aplicatie web pentru un client. SCRUM acopera multe aspecte are muncii de echipa si se bazeaza pe auto-managementul fiecarui individ. Daca esti interesat de mai multe detalii cauta singur. Google e un bun inceput.

Uneori, cand sunt intr-o stare lipsita de creativitate imi caut un spatiu care sa ma inspire. Asta inseamna ca trebuie sa iau cu mine doar ceea ce imi este strict necesar. Intr-o pauza de cafea proaspata am facut poze la un birou unde mi-a placut mult sa lucrez.
Nu sunt fan Flex desi trebuie sa lucrez cu el destul de des.
ActionScript 3, pe de alta parte, fundament pentru Flex si Flash este cu totul alta poveste. Are momente cand ma incita foarte mult.
Recent am descoperit o bucatica de AS3 nepretuita: local SharedObject.
Cookies
Daca esti familiar cu ceva din web development stii despre cookies ca:
- expira dupa un timp; daca nu este setat explicit, la incheierea sesiunii de browser
- pot stoca un numar limitat de date: 4 kb
- se pot seta 20 de cookie-uri pe domeniu
- pot fi interceptate si detrunate deci nu pune date vitale in ele (email/parola)
- BONUS TIP (de la Yahoo Exceptional Performance): sunt trimise intre browser si client la fiecare call peste HTTP – adica mananca timp si trafic inutil de multe ori.
SharedObject
- actioneaza in stilul cookie-urilor – sunt modul in care flashplayer (din browser) poate seta date pe client.
(pentru AIR ai sandbox separat)
- nu expira niciodata daca nu se seteaza explicit data de expirare
- nu se transmit niciodata catre server – se interpreteaza local de catre flashplayer.
- fiecare sharedObject stocheaza implicit cate 100kb de date – orice fel de date
- pot stoca tipuri de date native fara serializare – pui un ArrayCollection, XML, etc…, asta scoti.
- Se stocheaza intr-un folder special de pe client
- Nu se distruge la operatiunea de “clear cache” sau “clear cookies“; nu se distruge decat daca domeniul care le-a setat cere acest lucru prin AS3 sau le stergi manual din folderul in care sunt depozitate de flashplayer.
- BONUS TIP: sunt disponibile cross-browser. Date setate de un domeniu pe Firefox sunt disponibile aceluiasi domeniu pe Safari / Internet Explorer / etc…
Suna deja intersant?
Daca nu suna interesant si esti fan JavaScript adu-ti aminte ca ActionScript are clasa numita ExternalInterface. Aceasta permite expunerea publica a unor metode dintr-un SWF (AS3 compilat) catre alte limbaje (think JS).
Poti comunica prin ExternalInterface in ambele sensuri intre ActionScript si JavaScript.
Acum gandeste-te ca poti seta preferintele unui user, la fel cum ai face prin cookie, intr-un SharedObject care este cross-browser si care nu vor fi sterse data viitoare cand isi va rade cookie-urile sau cache-ul.
Din punct de vedere al usability-ului sunt mare fan al tehnologiei care imi permite sa nu imi bat la cap utilizatorul.
Daca el imi cere sa nu vada un anumit mesaj de informare tin minte asta. Daca prefera un anumit theme pentru aplicatia mea, tin minte. Daca prefera un anumit font-size / layout / refresh interval, etc… tin minte. Tin bine minte asta. Si acum si saptamana viitoare, si peste 9 luni.
Evident, nu e bullet-proof, asta in cazul in care utilizatorul isi reinstaleaza sistemul sau e vreo problema orifica la FlashPlayer. Mai bine ar fi sa il tin minte intr-o baza de date dar efortul tehnic pentru asa ceva este considerabil mai mare si oricum ma refer la setari care tin de client.
Acum suna interesant?