Numarul 29 - noiembrie 2014 - Today Software Magazine

Page 1

Nr. 29 • Noiembrie 2014 • www.todaysoftmag.ro • www.todaysoftmag.com

TSM

T O D A Y S O F T WA R E MAG A Z I NE

ShareCluj - Jurnal tehnic

Interviu cu Peter Lawrey

Sfaturi străvechi pentru un Product Owner Comunicarea cu clientul Un joc mai greu decât ne imaginăm Automatizare folosind Puppet 5 greșeli frecvente în securizarea rețelelor windows Comunicarea într-un startup

De ce Agile? Componente vizuale java fx Tradiția dusă mai departe: Bionic Bird Dosare de Startup: Foody Java vs. Objective-C Cum poate o companie de outsourcing să devină un partener de încredere



6 Interviu cu Peter Lawrey Ovidiu Măţan

8 Tradiția dusă mai departe: Bionic Bird Laurence Blestel

10 Dosare de startup: Foody Radu Popovici

12 Comunicarea într-un startup Mircea Vădan

14 How to Web Startup Spotlight Irina Scarlat

17 Share Cluj Jurnal tehnic Silvia Răusanu

20 Cum poate o companie de outsourcing să devină un partener de încredere Călin Lupo

22 5 greșeli frecvente în securizarea rețelelor windows Teodor Olteanu

25 Comunicarea cu clientul Bogdan Mureșan

28 De ce Agile? Alexandru Bolboacă

31 Componente vizuale Java FX Silviu Dumitrescu și Diana Bălan

34 Automatizare folosind puppet Claudiu Demian

36 Cod curat – limitări, gestionarea erorilor şi a obiectelor Radu Vunvulea

38 Sfaturi străvechi pentru un Product Owner – Sun Tzu “Arta războiului” Liviu Ştefăniţă Baiu

41 Java vs. Objective-C Bogdan-Alexandru Vlăduț

44 Eliminarea diferențelor dintre business și tehnologie în zona testării automate Mădălin Ilie


editorial

S

Ovidiu Măţan

ovidiu.matan@todaysoftmag.com Editor-in-chief Today Software Magazine

e pare că educația se impune din ce în ce mai mult în atenția mediului de afaceri care conștientizează necesitatea unor viitori angajați cât mai bine pregătiți și cât mai competitivi. Întâlnirea grupului de HR din cadrul Cluster-ului de IT Cluj, la care am asistat în această primăvară, a inclus printre subiectele importante și pe acesta al nivelului slab de pregătire al studenților. Fapt în general împărtășit de cei ce lucrează în domeniu. Răspunsul reprezentanților universităților a justificat această stare de fapt prin atragerea atenției asupra timpului redus de studiu pe care și-l dedică studenții, din moment ce mulți dintre ei sunt angajați deja din anul II. Un punct de vedere perfect valid dacă ne gândim că după opt ore de lucru este puțin probabil ca un student chiar și foarte bun să mai poată învăța ceva și pentru școală. Dincolo de retorica explicațiilor și a justificărilor venite din ambele direcții, este de dorit să se ajungă la un numitor comun menit să mai dilueze starea de criză. Poate ar fi momentul să se considere o abordare unificată a companiilor clujene care să aibă doar un intership pe perioada vacanțelor de vară, iar angajarea să se întâmple la finalizarea studiilor. De asemenea, sincronizarea cu un sistem de burse private cred că ar oferi șansa formării unor generații de excepție în acest domeniu. Două evenimente care s-au desfășurat în această lună la Cluj și la care am participat oferă speranța că acest decalaj între expectențele mediului de afaceri și gradul de pregătire al angajaților poate fi mult diminuat. Este vorba de Academy+Plus, un program care s-a bucurat la inaugurare de prezența ambasadorului Franței în România, Francois Saint-Paul și a altor oficialități locale și naționale. Programul Academiei, preluat de la Școala 42, care este una dintre cele mai mari școli private de informatică din Franța, își propune un program de studii pe durata a trei ani, care să formeze programatori cu o bună experiență în ceea ce privește lucrul în echipă. Al doilea program este dedicat doar elevilor. Denumit IT Brainiacs, susținut și organizat de către Telenav în colaborare cu Apex Edu, acest program se va desfășura sub forma unui mentorat pe durata unui an școlar de zile. Le dorim mult succes și ne bucurăm să vedem din ce în ce mai multe inițiative private în acest domeniu ! Luna aceasta, revista a propus tema generică a comunicării. Articolele precum, Comunicarea cu clientul - Un joc mai greu decât ne imaginăm, Comunicarea într-un startup, ShareCluj - Share Cluj - Jurnal tehnic sau Cum poate o companie de outsourcing să devină un partener de încredere, dezvoltă fiecare în parte această temă vastă. În zona de startup-uri se integrează un prim articol dintr-o serie denumită Dosare de startup, startup-urile înscrise în competiția How To Web Startup Spotlight, proiectul francez de pe IndieGoGo - Bionic Bird. Conceptul Agile este dezbătut de Alexandru Bolboacă în articolul De ce Agile ?. O abordare tehnică destinată programatorilor, vă oferim în articolele: Java vs. Objective-C, Automatizare folosind puppet sau Componente vizuale Java FX. Sperăm că v-am trezit atenția și vă invităm să citiți săptămânal revista Today Software Magazine online deoarece vom publica articole noi odată la câteva zile.

Vă dorim o lectură plăcută !!!

Ovidiu Măţan

Fondator al Today Software Magazine

4

nr. 29/2014 | www.todaysoftmag.ro


Redacţia Today Software Magazine Fondator / Editor in chief: Ovidiu Mățan ovidiu.matan@todaysoftmag.com Graphic designer: Dan Hădărău dan.hadarau@todaysoftmag.com Copyright/Corector: Emilia Toma emilia.toma@todaysoftmag.com

Lista autorilor Liviu Ştefăniţă Baiu

Mircea Vădan

Senior Business Consultant @ Endava

www.clujstartups.com

Claudiu Demian

Irina Scarlat

Systems Administrator @ Yardi

PR Manager @ How to Web & TechHub Bucharest

Bogdan-Alexandru Vlăduț

Mădălin Ilie

liviu.baiu@endava.com

claudiu.demian@yardi.com

Traducător: Roxana Elena roxana.elena@todaysoftmag.com Editor startups: Mircea Vădan mircea.vadan@todaysoftmag.com Reviewer: Tavi Bolog tavi.bolog@todaysoftmag.com Reviewer: Adrian Lupei adrian.lupei@todaysoftmag.com Contabil : Delia Coman delia.coman@todaysoftmag.com Produs de

Today Software Solutions SRL str. Plopilor, nr. 75/77 Cluj-Napoca, Cluj, Romania contact@todaysoftmag.com www.todaysoftmag.ro www.facebook.com/todaysoftmag twitter.com/todaysoftmag

ISSN 2284 – 6352

Bogdan-Alexandru.Vladut@ msg-systems.com Java Developer @ msg systems România

mircea.vadan@gmail.com

irina.scarlat@howtoweb.co

mădălin.ilie@endava.com Cluj Java Discipline Lead @ endava

Alexandru Bolboacă

Bogdan Mureșan

Agile Coach and Trainer, with a focus on technical practices @Mozaic Works

Director of Engineering @ 3Pillar Global

Silvia Răusanu

Călin Lupo

Senior Developer @ ISDC

Client Engagement Manager @ Endava

Radu Vunvulea

Silviu Dumitrescu

Senior Software Engineer @iQuest

Java Line Manager @ Accesa

Laurence Blestel

Radu Popovici

Relations presse @ XTIM

Associate @ Gemini Solutions Foundry

Teodor Olteanu

Diana Bălan

End User Computing Lead @ Betfair

Java developer @ Accesa

alex.bolboaca@mozaicworks.com

Silvia.Rausanu@isdc.eu

Radu.Vunvulea@iquestgroup.com

laurence@mybionicbird.com

Teodor.Olteanu@betfair.com

bogdan.muresan@3pillarglobal.com

calin.lupo@endava.com

silviu.dumitrescu@accesa.eu

radu.popovici@geminisols.com

Diana.Balan@accesa.eu

Copyright Today Software Magazine Reproducerea parțială sau totală a articolelor din revista Today Software Magazine fără acordul redacției este strict interzisă. www.todaysoftmag.ro www.todaysoftmag.com

www.todaysoftmag.ro | nr. 28/octombrie, 2014

5


interviu

Interviu cu Peter Lawrey, invitat special la Cluj IT Days 2014

P

Ovidiu Măţan

ovidiu.matan@todaysoftmag.com Editor-in-chief Today Software Magazine

6

nr. 29/2014 | www.todaysoftmag.ro

eter Lawrey este un profesionist Java, specializarea sa fiind performanța în Java fiind în top 3 pe StackOverflow. Avem plăcerea de a-l avea invitat special la Cluj IT Days 2014, ocazie cu care va prezenta un subiect tehnic Hot topics in Java Performance Tuning precum și o prezentare despre experiența sa de consultant independent What I have learnt by becoming an independent consultant. De asemenea, Peter va susține un training de o zi despre Java Performance, mai multe detalii puteți găsi pe www.itdays.ro. Am avut așadar plăcerea de a îl provoca pe Peter la câteva întrebări tehnice înainte de eveniment. [Ovidiu Mățan]. Cum vezi Java 8 din perspectiva performanței? [Peter Lawrey] Poate că cea mai importantă îmbunătățire a performanței a fost extinderea Compressed Oops la o memorie de 64 GB. Dacă ai un heap între 32 GB și 64 GB, poți obține o îmbunătățire a eficienței memoriei. Poți folosi compressed oops pentru 128 GB heaps, dar este puțin probabil să ajute în această fază. Ades e a, mai imp or t ant ă decât performanța CPU este performanța dezvoltatorului. În această privință, adăugarea de lambda și lanțul API pot face o mare diferență dacă le poți folosi efectiv. Un dezvoltator costă de obicei mai mult într-un an decât un server scump, așa că economisirea timpului de dezvoltare este importantă, adesea mai importantă decât salvarea CPU. Putem lua în considerare orice clase care se comportă mai bine din punctul de

vedere al utilizării memoriei decât în Java 7 sau 6? JSR 310 are o bibliotecă DateTime îmbunătățită; este mult mai bună decât Calendarul din mai multe motive, iar performanța este unul dintre ele. Optimizarea aplicațiilor necesită un mod de testare adecvat și repetat. Folosiți de obicei un framework sau alt mecanism pentru a obține acest lucru? [Peter] Clienții noștri utilizează Chronicle Queue pentru a înregistra fiecare intrare într-un sistem timp de o zi / zile. Derularea acestui șir care persistă le permite să recreeze bug-uri obscure și să investigheze probleme de performanță dificil de găsit. Încercarea de a recrea probleme de performanță cu un test sintetic este un început bun, dar este dificil să găsești mai mult de jumătate din problemele de performanță în acest mod. În


TODAY SOFTWARE MAGAZINE

schimb, este mai bine să folosești un volum o metodă simplă și rapidă de stocare de de lucru real pentru o zi sau o săptămână. date. Notă: deoarece harta este păstrată pe disk, ea este limitată numai de măriÎn agenda workshop-ului, avem subiec- mea spațiului liber de pe discul tău și nu tul Low level Java programming, how to de mărimea heap. Cum este off heap, nu make using Unsafe safer? (Programarea contribuie la timpul de pauză al GC-ului Java low level,cum să faci utilizarea Unsafe tău, indiferent cât este de mare. De asemesă fie mai sigură?), ceea ce sună foarte inte- nea, necesită un timp scurt de încărcare la resant. Poți să oferi un indiciu cititorilor restart, căci nu este nevoie să fie încărcat în heap. O hartă de 1000M poate dura 10ms noștri? [Peter] Pe scurt, vrei o bibliotecă care pentru a fi gata de utilizare. te încurajează să utilizezi Unsafe într-un În ultimul articol al tău de pe blog, mod sigur. Noi folosim o bibliotecă pe care o numim Java-Lang, care are un thread (fir) Chronicle Map și Yahoo Cloud Service sigur, versiuni de 64 biți ale ByteBuffer, Benchmark, propunerea ta era de a utiliza care vă permite accesul la fișierele de valori de 100 biți pentru perechi valori cheie memorie partajate, într-o manieră rela- pentru a obține rezultate mai bune. Totuși, tiv sigură. Ceea ce ar trebui să fie și mai menționezi efectul de colectare de deșeuri în interesant este că puteți utiliza structuri de teste. Cum putem de asemenea minimiza date pe care noi le-am construit pe această intervenția cumulărilor de deșeu în codul bibliotecă pentru a susține șirurile, Maps și de performanță înaltă? [Peter] În Yahoo Cloud Ser vice Sets, care au interfețe mai simple cu care să lucrezi. Ambele Queue și Map pot persista Benchmark, deșeurile produse devin în și distribui date între procese pe același final o constrângere. La aproximativ 3 aparat într-un ritm de 30+ M operații per milioane de citiri/scrieri pe secundă, bensecundă. Ceea ce ar fi fost imposibil de chmark-ul poate utiliza până la 90% din CPU. făcut în Java pură, în oricare alt mod. Cel mai bun loc pentru a începe să De exemplu, poți scrie reduci reziduul este să rulezi un test reaMap<String, String> map = list într-un profiler de memorie. Eu utilizez ChronicleMapBuilder.of(String. class, String.class). YourKit, dar mai există și alte profiler-e createPersistedTo(file); comerciale bune. Odată ce vezi unde se // you can now use the map as normal. generează cea mai mare parte a reziduului, map.put(“hello”, “world”); le poți înlocui cu alternative care creează String s = map.get(“hello”); mai puține reziduuri sau deloc. De exem[Peter] Ceea ce e magic în legătură cu plu, utilizați primitive, obiecte simple în aceasta este că intrarea este vizibilă în mai loc de Maps, obiecte mutabile reciclate, sau puțin de o micro-secundă la toate JVM- structuri de date off heap. Cel mai mare beneficiu al reducerii urile de pe computerul tău și persistă. Este

reziduurilor este pe lângă durata de pauză GC, și viteza de rulare a codului tău între pauze. Reducerea ratei alocate poate îmbunătăți rezultatul de 2- 5x excluzând timpul de pauză GC. Rate de alocare mai mici înseamnă că nu îți umpli cache-urile din CPU-ul tău cu reziduuri în fiecare fracțiune de milisecundă și că thread-urile (firele) tale lucrează mai eficient. L1 cache nu este numai de 10-20x mai rapid decât L3 cache-ul tău, dar L3 cache este o resursă partajată, așa că thread-urile tale încep să se încurce unele pe altele cu cât utilizezi mai mult L3 cache, iar programul tău nu mai scalează la fel de bine atunci când folosești mai multe nuclee.

www.todaysoftmag.ro | nr. 29/noiembrie, 2014

7


startups

Tradiția dusă mai departe: Bionic Bird

M

ai mult decât o dronă acţionată de elice, Pasărea Bionică – prima pasăre veridică, controlabilă prin mişcarea mâinii, este obiectul unei campanii crowdfunding pe Indiegogo. Edwin Van Ruymbeke, director al XTIM, inginer aeronautic şi inventator al Păsării Bionice, prezintă ornitopterul care poate zbura cu o agilitate asemănătoare păsărilor. XTIM a lucrat timp de 3 ani la această pasăre extraordinară controlată de smartphone.

Etapele diferite ale acestei campanii crowdfunding

Lansată pe 21 Octombrie, compania franceză XTIM a ales această platformă de crowdfunding internaţională care se concentrează în special pe inovaţiile tehnologice, pentru a supune pasărea lor aprobării publicului. Primul pas în campania noastră crowdfunding ($ 25,000, care au fost deja colectaţi) este să creăm un număr de păsări în ediţie limitată care vor fi un „obiect al colecţionarului”. Primele 1000 de păsări vor fi oferite la un preţ de 100 $, mult mai ieftine decât preţul viitor propus pentru vânzarea cu amănuntul. Acestea vor fi livrate de sărbători. Al doilea pas ($ 50,000, de asemenea atins) va permite dezvoltarea Aplicaţiei Bionic Bird, „the FlyingApp”, pe Android OS. Adăugată la aplicaţia IOS programată iniţial, aceasta a lărgit lista sa de smartphone-uri compatibile pentru a acoperi marea majoritate a dispozitivelor existente pe piaţă. Vor fi necesare aproximativ 2 luni pentru dezvoltarea aplicaţiei, adaptarea UI la numeroasele modele Android şi în final livrarea pe Google Play. Avem promisiunea că aplicaţia va fi disponibilă pentru utilizatori până la sfârşitul lui Decembrie. Astăzi, trecem mai departe la etapa a 3-a, un adevărat decalaj tehnologic care trebuie depăşit! Scopul său va fi atins de îndată ce se ajunge la fondul de $ 200,000: controlarea cozii de la distanţă. Prin utilizarea bio-metalului (aliaj cu memoria formei) dispozitivele de acţionare vor putea controla unghiul cozii de la distanţă, ceea ce va deschide calea spre noi capacităţi de zbor: cascadorii aeriene precum lupingul (descrierea unor bucle), zboruri cu viteză foarte mică, traiectorii precise. Acest nou pas este esenţial pe drumul către proiectul final al unei drone Bionic Bird

8

Bionic Bird: miracolul micro-tehnologiei, inspirat de biomimetism.

dezvoltarea micro-bateriilor (LiPo) şi a micro-motoarelor (coreless). Înainte nu ar fi fost posibil să ai o pasăre electrică suficient de uşoară pentru a zbura la viteză mică cu o aşa anvergură redusă a aripilor. După ani de cercetări, Pasărea Bionică a sosit! Primul prototip a zburat frumos, mai bine decât m-am aşteptat… S-au deschis noi drumuri!” - Edwin Van Ruymbeke, un inginer dintr-o familie de inventatori.

„Mulţi ani am lucrat pentru firma bunicului şi a tatălui meu, inventatori ai TIM, bine-cunoscuta pasăre care zboară bătând din aripi, propulsată de o bandă elastică. Drept parte a cursurilor mele de inginerie aeronautică, am studiat zborul păsărilor şi am visat să găsesc o cale de a înlocui banda de cauciuc care propulsa pasărea cu un motor electric şi o baterie, astfel încât să poată fi dirijată de la distanţă. Acest lucru a devenit posibil numai odată cu apariţia noilor telefoane mobile, care sunt uşoare şi compacte, cât şi cu

Pentru a descoperi mai multe detalii, i-am pus lui Edwin Van Ruymbeke câteva întrebări: [Laurence Blestel]Care este cea mai mare diferenţă între Pasărea ta Bionică şi păsările mecanice pe care le-au construit tatăl şi bunicul tău? [Edwin Van Ruymbeke] De fapt, cea mai mare diferenţă în termeni de funcţionalitate, este că poate zbura un timp mult mai lung (8 minute faţă de 8 secunde), că poate fi controlată de la distanţă (de către un smartphone) şi că are o viteză de zbor reglabilă, care permite şi zborul în interior. Din punct de vedere tehnic, provocarea a fost să înlocuim o bandă de cauciuc simplă, de 3 grame, cu 2 motoare, o baterie, 2 cutii de viteze şi o placă cu circuit integrat cu 2 CPU pentru o şi mai mică greutate la raportul de anvergură a aripilor. Pasărea noastră Bionică cântăreşte 9 grame pentru o anvergură a aripilor de 33 cm. Originalul TIM cântărea 16 grame pentru o deschidere a aripilor de 40 cm. Acest lucru a fost obţinut printr-un design care nu a făcut nicio concesie zborului în defavoarea greutăţii, cu mecanică ultra-miniaturizată,

complet funcţională. A patra etapă ($ 400,000) este de a controla planarea Păsării Bionice. Aceasta va fi suficient de stabilă în zborul său pentru a înregistra filmuleţe clare, ceea ce ne duce la etapa finală ($ 800,000): inserţia unei micro-camere de luat vederi în interiorul corpului păsării bionice.

Observând păsările reale, Edwin Van Ruymbeke a conceput şi patentat un sistem de direcţie utilizând distorsiunea aripilor, care permite schimbări rapide şi imediate de direcţie. Ajustarea unghiului de incidenţă a cozii permite păsării să zboare atât în interior cât şi în exterior. În spaţiu deschis, raza sa este de 100 yarzi iar viteza de 12 mile pe oră. Pasărea Bionică cântăreşte numai 9,3 grame pentru o lungime de 6,7 inci şi o anvergură a aripilor de 13 inci. Are 2 procesoare, 2 motoare şi o baterie, dar şi un mecanism patentat similar unui mecanism de ceasornic. Pasărea bionică se încarcă pe oul său, printr-un contact magnetic, în mai puţin de 12 minute. Folosind oul drept un încărcător nomad, pasărea bionică poate susţine 10 zboruri de până la 8 minute. Mai mult, prin magia mimetismului, zborul păsării bionice este atât de real încât celelalte păsări cred că este una de a lor.

nr. 29/noiembrie, 2014 | www.todaysoftmag.ro


TODAY SOFTWARE MAGAZINE şi alegerea celor mai avansate materiale bătaie al arişi componente care pot fi găsite în zilele noastre. Şi un set de soluţii

inovatoare care au

fost patentate.

Care este numele bunicului şi al tatălui tău, care au inventat prima pasăre mecanică? Poţi să ne spui un pic mai multe despre afacerea lor? Au vândut păsările? A fost aceasta afacerea familiei voastre? [Edwin Van Ruymbeke] Bunicul Gaston şi tatăl meu, Gerard Van Ruymbeke au inventat prima pasăre mecanică care putea zbura bătând din aripi şi a fost vândută drept un produs industrial. Ei au înfiinţat împreună o fabrică de jucării şi au produs această pasăre din 1969 şi până acum. A fost un mare succes în întreaga lume în anii 70 şi încă se vinde şi în zilele noastre. Eu am lucrat cu ei timp de 20 de ani. Acum mi-am creat propriul meu proiect şi propria companie, dar fratele meu încă vinde pasărea mecanică originală prin compania familiei DeRuymbeke SARL.

Este dovedit faptul că ei au fost primii care au inventat o pasăre mecanică zburătoare? [Edwin Van Ruymbeke] Da, este dovedit şi bine cunoscut în industria jucăriilor drept un produs celebru, unic pe piaţă. Tatăl meu deţine brevetul. Toate celelalte produse similare pe care le puteţi găsi sunt copii care nu au primit niciodată dreptul să fie vândute în ţările vestice sau în Japonia datorită protecţiei brevetului. Le puteţi găsi numai în ţările din Asia. Care a fost cea mai mare provocare tehnică pe care a trebuit să o depăşiţi pentru a construi Pasărea Bionică? [Edwin Van Ruymbeke] După cum am explicat mai sus, provocarea nr. 1 a fost să reducem greutatea şi dimensiunea la minim. A doua a fost să îmbunătăţim în mod radical eficienţa sistemului de

pilor. În

rândunelele! Ce educaţie ai? Cum ai deprins abilităţile pentru a dezvolta Pasărea

comparaţie cu un sistem cu elice, noi avem dezavantajul de a avea o mişcare alternativă, care, teoretic, iroseşte multă energie numai prin inerţie. Trebuie să accelerezi /opreşti/ accelerezi aripile în fiecare ciclu. O elice doar se roteşte şi poate înainta toată puterea sa în aer. După luni întregi de cercetare, aripile noastre au atins o eficienţă apropiată de cea a elicelor. Cu un motor identic, propulsarea verticală a păsării noastre este similară cu cea a unui elicopter de jucărie pe care îl puteţi găsi pe piaţă.

Bionică? [Edwin Van Ruymbeke] Eu sunt inginer aeronautic. Asta este ceea ce am studiat şi am absolvit o şcoală Franţuzească de ingineri. Dar în perioada anilor în care am îmbunătăţit pasărea mecanică, am mers mult mai departe cu studiile mele decât era necesar pentru acea jucărie. Am creat prototipuri diverse, am făcut calcule, programe pentru a studia principiul de bătaie a aripilor. De asemenea, eu cred că a fi inventator este o stare de spirit pe care o ai toată viaţa. Şi pui cap la cap toate ideile sau În videoclip pare că ai controla pasărea gândurile care vor rezulta în final în ceva prin mişcarea smartphone-ului – care este cu totul nou. tehnica din spatele acestui lucru? Cum este De ce o pasăre? Toată lumea lucrează pasărea controlată mai exact, prin aplicaţie la drone în zilele noastre; de ce ai decis să sau gesturi? [Edwin Van Ruymbeke] Noi folo- construieşti o pasăre, în schimb? [Edwin Van Ruymbeke] M-am decis sim senzorul inclus în smartphone-uri. Senzorul G, senzorul de câmp magnetic. să fac o pasăre acum multă vreme. Este Un algoritm calculează unghiul de încli- proiectul de o viaţă. A început în mintea nare a telefonului şi îl transformă într-o mea când lucram la pasărea mecanică. La comandă către sistemul de direcţie al acea vreme, tehnologia motoarelor şi a păsării. Când înclini telefonul spre stânga bateriilor nu era suficient de uşoară pen(şi proporţional la unghi), pasărea se va tru a reuşi asta. Dar aşteptam momentul întoarce spre stânga (respectiv dreapta). când aceasta va deveni posibilă, iar acel Precizia poate fi reglată prin setările apli- moment a venit în sfârşit odată cu batericaţiei pentru a se putea adapta „simţului” ile Lipo şi motoarele fără miez. Eu nu am oricui. Aceste gesturi foarte naturale de urmat niciodată trendul. Şi mă mândresc a controla direcţia de zbor a păsării face destul de mult că nu sunt numărul o mie utilizatorul să simtă că interacţionează care am făcut o dronă multi-rotor, şi că am direct cu pasărea, iar, după puţin antrena- dezvoltat ceva unic. ment, să „uite” de dispozitivul de control. Devine mult mai intuitiv decât un emiţător standard. Există vreo pasăre anume care a servit drept model pentru Pasărea Bionică sau pentru comportamentul său de zbor? [Edwin Van Ruymbeke] Forma corpului şi proporţia dintre lungimea corpului şi anvergura aripii este inspirată de o pasăre răpitoare. Arată ca un mini-vultur. În ceea ce priveşte comportamentul său de zbor, viteza de bătaie a aripilor este mai mare, şi ar fi mai apropiată de cea a unui porumbel. Dar cu performanţa sa foarte bună de planare, se apropie din nou de o pasăre de pradă. Rezultatul este un amestec. Dar cele care o îndrăgesc cel mai mult când zboară pe cer şi vin să se joace cu ea sunt

Laurence Blestel

laurence@mybionicbird.com Relations presse @ XTIM

www.todaysoftmag.ro | nr. 29/noiembrie, 2014

9


startups

Dosare de startup Foody – Prima platformă de loializare de restaurante din România

A

m făcut cunoștință cu Iulian si Vlad acum aproape un an când ne-au trecut pragul cu o idee de aplicație destinată platformelor mobile, denumită Foody. Iulian venea la masă cu experiența sa din domeniul HORECA, Vlad, cu expertiza tehnică, iar Gemini Solutions Foundry cu învățăturile culese în urma celor 10 ani de lucru cu startup-uri. Așa că ne-am așezat la masă și am început să întoarcem acea idee pe toate părțile și să o cizelăm pentru a defini cât mai bine un MVP ce avea să apară mai târziu pe piață. Un MPV (Minimum Viable Product) este un produs ce conține un set minimal de funcționalități cheie ce permit lansarea pe piață într-un timp cât mai scurt cu efort și costuri minime. În urma feedbackului obținut va porni o nouă iterație ce va rafina produsul după dorințele pieței, în acest fel evitându-se un scenariu în care se construiește “produsul perfect pe care nu îl utilizează nimeni”. O altă definiție ar fi: “MVP-ul este o versiune a unui produs ce permite unei echipe să primească o cantitate maximă de cunoștințe validate despre clienții săi cu un efort minim depus.”

În momentul de față la echipa Made by Apes (Foody este produs de echipa Made by Apes) s-au alăturat cu forțe proaspete Edmond și Cristian. Edmond are în spate o experiență de peste 12 ani în domeniul de vânzări pe parte de HORECA, iar Cristian vine cu experiența unui business de succes pe piața din România în domeniul vânzărilor de combustibil, lucru care a permis continuarea proiectului cu resurse proprii. Cu ajutorul lor, Foody a adăugat peste 100 restaurante din București și a acumulat peste 2500 de utilizatori ce fac zilnic rezervări prin intermediul aplicației. Drumul lor nu se oprește aici, însă despre Pentru Foody, MVP-ul arăta în felul aceasta ne va povesti mai multe Iulian. următor: [Radu Popovici] Iulian, ce înseamnă, de • Existența a două aplicații pentru cele mai utilizate platforme mobile din fapt, Foody? [Iulian Geană]: Foody este prima platRomânia: Android și iOS; formă de loializare din România, destinată • Prin intermediul aplicațiilor: • Utilizatorul va putea descoperi restaurantelor, puburilor și barurilor, menită să faciliteze accesul oamenilor la restaurantele din proximitate; • Utilizatorul va putea rezerva o programele lor de fidelizare (discount-uri, meniuri speciale, vip rewards ,etc.), prin masă la un restaurant; • În schimbul rezervării, utilizatorul intermediul unei aplicații de mobil. Mai mult decât atât, Foody este va primi un discount la nota de plată.

10

nr. 29/noiembrie, 2014 | www.todaysoftmag.ro

aplicația destinată tuturor oamenilor care doresc să mănânce în oraș sau călătoresc și au nevoie de un ghid care să îi ajute să aleagă un restaurant în alte orașe sau în alte țări. Vrem ca FOODY să devină cel mai bun prieten al tău când mănânci în oraș și care să te răsplătească de fiecare dată când ieși. De unde a pornit această idee? [Iulian] Ideea de la care s-a născut FOODY a fost una destul de simplă la început. În urma unei discuții cu Vlad, ne-am dat seama că, deși el este din București, iar eu m-am mutat de peste zece ani în capitală și mâncăm destul de des în oraș, nu cunoaștem decât 10-15 restaurante și câteva shaormerii. Și astfel a început călătoria noastră... Prima platformă de loializare: am pus ideile pe hârtie și am realizat că putem construi o punte de legătură între clienți și restaurante; relația existentă astăzi fiind una destul de rece și nu din cauza calității produselor (se mănâncă bine de tot în foarte multe locuri), ci datorită serviciilor și recompensării oamenilor care sunt loiali unui brand.


TODAY SOFTWARE MAGAZINE În afară de locațiile noi, la ce să ne așteptăm în viitorul apropiat din partea Foody? [Iulian] Bonusuri și un joc plin de surprize alături de un nou concept care vă va face să ieșiți în oraș pentru o experiență culinară extraordinară și accesibilă.

Sunt receptive restaurantele la soluția oferită? [Iulian] Restaurantele încep să înțeleagă din ce în ce mai mult importanța de a-și fideliza FIECARE client care le trece pragul prin diverse metode pentru a oferi oamenilor un motiv în plus să revină și a-i transforma în ambasadori ai brandului lor. Cei care au înțeles acest lucru mai de mult au deja rezultate vizibile . Restaurantele pot folosi FOODY ca o platformă de loializare pentru clienții lor deja loiali și în același timp și pentru a atrage noi clienți. Spre deosebire de alte canale de promovare, rezultatele venite prin FOODY sunt contorizate 100%, față de un banner sau o reclamă într-o publicație unde return-ul nu este ceva exact, ci doar o expunere. Iar avantajele unei aplicații ca FOODY vs “O aplicație specifică unui singur restaurant” sunt evidente: numărul potențialilor clienți cărora te adresezi poate fi de sute sau chiar mii de ori mai mare, costurile sunt de zeci de ori mai mici și lista continuă.

de conversie de peste 95%. Experiența din industria HORECA ne-a ajutat foarte mult aici. De asemenea și faptul că avem o aplicație de nișă și nu ceva generalist, ne ajută foarte mult să păstrăm o concentrare ridicată asupra a ceea ce facem.

Văd că pe Play Store aveți câteva ratinguri negative. Ce s-a întâmplat? [Iulian] Concurența. Este un lucru extraordinar că primim și ratinguri negative deoarece ne arată unde greșim și ne ajută foarte mult să creștem calitatea produsului. Cred că o aplicație cu 100% ratinguri de 5 stele este la fel de reală ca o Românie cu străzi fără gropi. Revenind la ce s-a întamplat la noi, greșeala ne aparține deoarece într-un fel sau altul mai multe persoane din afara Bucureștiului au aflat de aplicație și au instalat-o și evident au avut o experiență neplăcută văzând că cel mai apropiat restaurant se afla la sute de km de ei. Lucrăm la un plan de extindere pentru FOODY în toate marile orașe din România. Dorim întâi să stabilim o relație strânsă cu utilizatorii din București și restaurantele locale Pentru un business ca al vostru, de obi- după care vom începe extinderea. cei primii pași sunt cei mai grei. Este greu Cât de curând vom vedea Foody și în să atragi utilizatori în platformă dacă nu ai ce le oferi, și este greu să atragi restaurante alte orașe din țară? [Iulian] În următoarele 6 luni credacă nu ai mulți utilizatori. Cum ați trecut dem că putem începe în orașe precum: de acest impas? [Iulian] Cred că cel mai important Constanța, Cluj, Timișoara, Sibiu, Brașov, lucru este execuția, viteza de reacție și capa- Iași. Depinde foarte mult de rezultabilitatea de a pivota în funcție de rezultate. tele și fine-tuning-ul din București. Ne Uneori însă cea mai scurtă distanță dintre dorim foarte mult să venim cu o soluție două puncte nu este o linie dreaptă, ci o pentru întreaga țară. Mai ales că suntem linie curbată care ocolește obstacolele și te naționaliști și iubim România! ajută să ajungi la capăt. Pașii au fost destul Dar în alte țări? de evidenți pentru noi: construim plat[Iulian] Noi ne dorim ca FOODY să forma, mergem la restaurante pentru a le înrola în FOODY și a avea o bază minimă ajute utilizatorii să găsească restaurantele de locații și oferte pentru a fi interesantă din toată lumea în viitor și să aibă acces pentru utilizatori după care începem la toate beneficiile oferite de acestea. expunerea către clienți. Ideea a fost destul Însă pentru aceasta avem nevoie de un de bine primită de restaurante cu o rată investitor.

Considerați utilă colaborarea cu Gemini Solutions Foundry? [Iulian] Întâlnirea cu Gemini Solutions Foundry a reprezentat un moment cheie pentru noi. Ajutorul și motivația oferite de voi ne-au ajutat să mergem mai departe, fiind loviți de “Palma deznădejdii” pe care o primim toți când începem să construim ceva nou și ne lovim de primele probleme grele la care nu se văd soluții imediate. Optimismul și profesionalismul voastru au contribuit destul de mult la dezvoltarea FOODY și sperăm că o va face și în viitor. Deci ați recomanda tiner ilor antreprenori să ne contacteze? [Iulian] Fără un ajutor precum cel oferit de GSF cred că șansele ca un start-up să se împotmolească sunt maxime. Și noi ne considerăm destul de experimentați în industria pe care am ales-o. Personal recomand cu toată încrederea oricărui antreprenor care pornește la drum să colaboreze cu firma voastră deoarece ajutorul pe care i-l puteți oferi este inestimabil pentru un “newbie”. Pornind de la expertiza tehnică, analiza codului, sfaturile pe partea de Legal & Finance, design și user experience sunt atuuri pe care GSF le aduce la masă oferind șanse reale de succes oricărui start-up. Iar contactele pe partea de Venture Capital reprezintă un “gold-mine” pentru orice antreprenor. Dacă v-am făcut curioși, puteți download-a aplicația Foody de pe pagina Made By Apes1, iar dacă doriți să vedeți restaurantul vostru preferat cât mai repede în platformă trimiteți un email2 specificând acest lucru. 1 http://madebyapes.com/ 2 foody@madebyapes.com

Radu Popovici

radu.popovici@geminisols.com Associate @ Gemini Solutions Foundry

www.todaysoftmag.ro | nr. 29/noiembrie, 2014

11


startups

Comunicarea într-un startup

C

u ocazia unui startup care a implicat ca temă de gândire comunicarea, am ajuns la concluzia că, la fel ca și în alte proiecte sau organizații, această “comunicare” e o “umbrelă” care formează baza lucrului în echipă și a interacțiunii umane între cofondatori, utilizatori sau alți stakeholder-i. Așa că din această perspectivă, mi-am pus întrebarea că, dacă ar fi să încep un nou startup, cum aș face-o și ce sfaturi mi-aș da valorificând experiența de până acum? Iar răspunsul îl găsiți mai jos, în rândurile ce urmează. Am intrat în contact cu lumea startup-urilor acum aproape trei ani și, până acum, am fost implicat în UseTogether cu spinoff-ul generat (Momly) și în ZenQ. În același timp, am avut ocazia să vorbesc cu alți fondatori de startup-uri din comunitatea din Cluj/România, dar și cu cei prezenți în cele două acceleratoare la care am participant (Launchub și TechPeaks). Comunicarea internă, în echipă, începe de fapt înainte de startup. Extrem de rar se întâmplă ca un startup să ajungă departe cu o echipă ai cărei membri se cunosc de puțin timp sau superficial. Co-fondatorii sunt ca niște frați/surori în care încrederea ar trebui să fie extrem de mare. Iar pe lângă acest factor, e nevoie și de o potrivire în mindset și atitudine. Am întâlnit cazuri în care co-fondatorii lucrau bine împreună, dar nu încercau să se înțeleagă sau să țină legătura ca prieteni; când momentele grele au apărut, nu au reușit să le depășească, tocmai pentru că nu aveau o legătură mai puternică. Cu cât un startup are o echipă mai mare cu atât mai mult se subțiază conexiunile între membrii echipei, din simplul motiv că timpul petrecut cu una sau două persoane se împarte, de exemplu la 4 sau la 5 persoane și inevitabil ajunge să fie mai puțin, deci durează mai mult ca legăturile să prindă rădăcini. La începutul unui startup, cred că accentul cade mai ales pe formarea și întărirea echipei și nu pe dezvoltarea produsului. Dacă produsul se schimbă, nu

12

nr. 29/noiembrie, 2014 | www.todaysoftmag.ro

e o tragedie, dar schimbarea unei echipe sau a unui membru generează conflicte mult mai mari. Să ai încredere maximă încă de la început e ca și cum ai conduce o mașină cu ochii închiși. Primele săptămâni/luni sunt de tatonare, ca și cum un cuplu învăță să danseze vals, trebuie să ajungi să simți acel partener. Cred că durează un timp până când așteptările devin mai clar definite în mintea fiecăruia ca apoi să fie rostite. Un contract de vesting (felul cum vor fi împărțite acțiunile și în ce condiții le vor primi fiecare dintre co-fondatori sau primii angajați) e ceva obligatoriu, poate nu chiar de la început, dar cât mai repede după ce colaborarea ajunge să fie mai statornică. E o discuție ciudată, îți vine să discuți despre orice altceva decât despre acest lucru, dar dacă e amânată peste măsură atunci nu mai e cale de întoarcere, deoarece între timp, așteptările fiecăruia au crescut, au prins rădăcini și sunt mai greu de lăsat deoparte. Am trecut de trei ori prin acest proces și de fiecare dată am avut


TODAY SOFTWARE MAGAZINE strângere de inima când am abordat subiectul. A avea o înțelegere de tip “vesting” nu înseamnă neapărat înființarea firmei imediat după, deci nu e o complicație legală, dar are rolul de a limpezi apele și îndoielile, iar co-fondatorii pot respira mai ușurați. Fii sigur că fiecare dintre ei are această temă în minte, dar de multe ori așteaptă momentul potrivit sau deschiderea subiectului de către altcineva. Cât despre comunicarea internă on-line, am folosit soluțiile cele mai simple: Skype (chat + video), grup privat pe Facebook, Google Hangouts - sunt cunoscute, toată lumea le folosește și satisfac nevoile de bază. Dar o dată ce am încercat soluții din generația nouă (www.slack.com, www.kato.im, www.hipchat. com) , create expres pentru comunicarea în echipă, mi-am dat seama că există atâtea alte feature-uri care sunt extrem de folositoare: tags, chatrooms, screen sharing, integrări cu zeci de alte tool-uri pentru teamwork și team management, toate incluse în același produs. În ultima vreme, trendul echipelor dispersate în mai multe locații crește și, pe bună dreptate, oferă o mai mare flexibilitate, doar că se omite frecvent o condiție: nivelul de coeziune al echipei. E o diferență foarte mare între o echipă ce se întâlnește zilnic sau o dată la câteva zile și o echipă ce are ședințe/întâlniri la fel de des în on-line. Doar dacă o echipă e închegată și funcționează deja bine, poate încerca lucrul dispersat pe termen mai lung, din punct de vedere al locației. Altfel, în timp, entuziasmul și dedicarea scad, nu din rea voință, ci pur și simplu pentru că e nevoie de conexiunea umană care on-line e mult mai greu de susținut. În zona comunicării externe, reținerea în activități de PR e o simptomă des întâlnită, mai ales deoarece co-fondatorii consideră că produsul nu e destul de prezentabil. Da, oamenii vor judeca (unii vor da și feedback), dar e mai bine așa decât supra-protecția pe care tindem să o acordăm startup-ului. Deși e “copilul nostru” tot trebuie să iasă în lume, cu cât mai repede, cu atât mai bine. Un pericol neașteptat aici este asocierea puternică în mintea fondatorului între startup și propria persoană, critica adusă startup-ului sau produsului nu e o critică personală adusă co-fondatorului. Bineînțeles, fondatorii sunt responsabili de startup, dar nu ar trebui să se identifice cu acesta și să ia în nume personal toate probleme care apar. Nu doar că dăunează startupului, dar afectează moralul fondatorilor. În comunicarea externă intră și comunicarea cu utilizatorii, care înseamă de multe ori, e-mailuri pe diverse subiecte mărunte, la ore variate, câteodată pare o corvoadă, dar e necesară mai ales cu primele sute de utilizatori. Îmi aduc aminte că am dat atenție sporită unui produs, chiar l-am folosit de mai multe ori după un e-mail primit de la unul din fondatori. Deși sunt destul de sigur că era un e-mail automatizat, era scris atât de simplu, prietenesc încă am avut impresia că mi-a fost scris mie special. Dacă aș fi primit ceva în format de newsletter l-aș fi deschis (poate) și după două secunde l-aș fi șters. În aglomerația de e-mailuri și newslettere, e mult mai greu să acaparezi atenția cuiva printr-un format standard. Ah, încă ceva: să fie scurt, ce e mai mult de trei paragrafe (7-10 rânduri) îmi pare deja prea lung ca să fie citit cu atenție. Per total, o problemă rar identificată ce ține de comunicarea și atitudinea internă mi se pare că este lipsa de concentrare, atât în partea de produs cât și în partea de go-to-market. Atâtea feature-uri excelente pot fi adăugate, atâtea nișe pot fi atrăgătoare cu statut de clientelă, încât energia disipată între ele face ca efectul

pe fiecare direcție să fie mai redus și rezultatele mai scăzute. Un startup, prin definiție, are resurse scăzute , dar claritatea în focus ajută în primele reușite, tocmai pentru că permite abordarea unui aspect sau a unei probleme cu toată energia posibilă. “ Concentrați-vă, concentrați-vă!/ Focus, focus, focus!” e mantra pe care co-fondatorii ar trebui să și-o comunice în fiecare zi și să-și pună întrebarea ce nu e necesar, ce e în plus și nu ne aduce mare lucru în schimb?

Mircea Vădan

mircea.vadan@gmail.com www.clujstartups.com

www.todaysoftmag.ro | nr. 29/noiembrie, 2014

13


eveniment

How to Web Startup Spotlight prezintă cele 32 de echipe admise în program

B

ucurești, 30 octombrie 2014. 32 de startup-uri din 10 ţări vor participa în luna noiembrie la How to Web Startup Spotlight, competiţie şi program de mentorat adresat echipelor din Europa Centrală şi de Est care dezvoltă produse tech cu potenţial disruptiv. Acestea vor participa la workshop-uri şi sesiuni de mentorat şi vor avea ocazia să îşi prezinte produsele pe scena principală a How to Web Conference 2014 şi să intre astfel în cursa pentru premiile în valoare totală de 20.000 USD oferite de IXIA, partener principal al programului. Startup-uri early-stage în tehnologie care dezvoltă produse în domeniul tehnologiilor purtabile, internet of things, mobile, medtech sau ecommerce au aplicat la Software-as-a-Service întregului ecosis- utilizatorii să îşi monitorizeze consumul cea de a treia ediţie How to Web Startup tem (site-uri web, agenţii, companii de energetic şi pe furnizorii de energie să gestioneze perioadele de încărcare crescută a Spotlight. Participanţii au fost selectaţi de ecommerce sau publicitate); Axosuits (România): exoscheleţi uşor reţelei; un juriu de specialitate luând în consideEkipa (Serbia): aplicaţie care conecrare experienţa echipei, dimensiunea pieţei de folosit şi accesibili ca preţ pentru pertează grupuri de trei prieteni cu alte şi tendinţele actuale, validarea utilizatori- soanele cu dizabilităţi; Bethall (Grecia): platformă care aduce grupuri de trei prieteni şi le facilitează lor, creşterea iniţială, costul de achiziţie al utilizatorilor, scalabilitatea şi fezabilitatea împreună pasionaţii de pariuri sportive şi acestora întâlnirile în diferite localuri; Fastrrr (Ungaria): echipament care le permite acestora să găsească şi să publice afacerii. permite practicanţilor de sporturi naupreviziuni; Bitrise (Ungaria): platformă care tice să determine viteza exactă pe apă şi să Cine sunt participanţii How to Web automatizează dezvoltarea de aplicaţii iOS detecteze cele mai mici diferenţe de viteză Startup Spotlight 2014? cauzate de schimbări de vreme sau de conîn cloud; Cele 32 de echipe dezvoltă produse Blushr (România): aplicaţie mobilă diţii tehnice; în domenii precum software, hardware, fittter (România): aplicaţie mobilă internet of things, mobile sau med- care ajută adolescenţii cu vârste cuprinse tech. Aceste echipe provin din România, între 13 şi 17 ani să descopere care dintre şi web în domeniul sănătăţii şi fitnessului care conectează călătorii de business Polonia, Grecia, Ungaria, Ucraina, Serbia, prietenii lor îi plac. CloudPress (România): plaformă prin cu antrenorii şi îi ajută să îşi menţină Muntenegru, Bulgaria, Slovenia şi Moldova și vor participa între 19 şi 21 noiembrie care designerii pot crea site-uri Wordpress obiceiurile sănătoase de viaţă pe durata la How to Web Startup Spotlight 2014. responsive în manieră vizuală şi le pot deplasărilor; Geostep (Muntenegru): aplicapublica la final printr-un singur click; Acestea sunt: DailyOne (Ungaria): aplicaţie de ţie care permite crearea de vânători de 3Deva (România): adaptor hardware care transformă dispozitivele mobile în crowdfunding pentru organizaţiile comori interactive şi ajută utilizatorii să descopere atracţii turistice neobişnuite şi nonprofit; aparate de realitate virtuală; Devicehub (România): platformă web impredictibile; Attensee (Polonia): statistici online de Latio Inc (Ucraina): kit de dezvoleye-tracking pentru optimizarea conver- care analizează datele generate de miliarde de dispozitive conectate la internet şi te tare software personalizabil, care permite siei pe site-urile web; dezvoltatorilor şi companiilor să integreze Av an d or C on s u m er Prof i l i ng ajută să iei cele mai bune decizii; Ecoisme (Ucraina / Polonia): un ser- tehnologiile iBeacon fără a se pierde în (România): platformă deschisă de date ale consumatorilor disponibilă ca viciu şi un dispozitiv electronic care ajută detalii; L i f e b o x (România): Aplicaţie mobilă care îţi reminteşte să împărtăşeşti fotografiile cu prietenii care au fost Young spirit alături de tine la un Mature organization eveniment; A shared vision Marketizator ( R om â n i a ) : Join our journey! Platformă 3 în 1 pentru optimizarea ratei de conversie pe siteurile de ecommerce; www.fortech.ro O b l i c o (România): aplicaţie

14

nr. 29/noiembrie, 2014 | www.todaysoftmag.ro


TODAY SOFTWARE MAGAZINE Spotlight vor participa la workshop-uri şi sesiuni de mentorat dedicate şi vor întâlni prof e s i on i ş t i cunoscuţi din i n du s t r i a d e tehnologie la nivel g lobal, precum şi reprezentanţi ai unora dintre cele mai apreciate programe de accelerare şi fonduri de investiţii early stage. În plus, st ar tup - u r i l e vor avea ocazia să îşi prezinte pro dus ele în faţa întregii audienţe a How to Web Conference 2014 şi vor intra astfel în cursa pentru premiile în valoare totală de 20.000 USD oferite de IXIA, partener principal al programului. How to Web Startup Spotlight 2014 este un program dezvoltat în parteneriat cu IXIA cu sprijinul partenerilor Telekom Romania, Bitdefender, Grapefruit, Av ang ate, S of t l aye r, Cy b e r Gho st , Hub:raum, Domain.me, Ambasada Canadei în România şi Reea şi va debuta miercuri, 19 noiembrie, cu o sesiune de pitching în urma căreia va fi realizat un clasament iniţial. Juriul va desemna 8 echipe finaliste care vor concura pentru toate premiile disponibile şi 16 semifinalişti care se vor lupta pentru premiile pentru cea mai bună prezentare, respectiv IXIA Innovation Award, alături de finalişti. În cea de a doua parte a zilei, participanţii Startup Spotlight vor avea ocazia să participe la workshop-urile dedicate şi Startup Spotlight Office Hours care se vor desfăşura la TechHub Bucharest. Pe 20 şi 21 noiembrie, echipele vor avea acces la toate activităţile How to Web Conference 2014 şi vor încheia fiecare dintre zile cu sesiuni de mentorat 1 la 1 cu profesionişti şi experţi în domenii de interes pentru ei. How to Web Startup Spotlight 2014 se Între 19 şi 22 noiembrie, cele 32 de incheie sâmbătă, 22 noiembrie, cu un eveechipe participante la How to Web Startup niment social în cadrul căruia participanţii

mobilă bazată pe geo-localizare care foloseşte informaţiile de pe LinkedIn pentru a te ajuta să te conectezi cu profesionişti la evenimente şi conferinţe; Pocketo (România): Platformă şi kit de dezvoltare hardware pentru a construi dispozitive purtabile şi a le face să comunice între ele; PPrintee (România): imprimantă de buzunar care îţi permite să tipăreşti oriunde ai fi, pe orice format de hârtie; Project Wipe (România): ochelari electronici care ajută persoanele cu dizabilităţi de vedere să se orienteze şi să evite obstacolele; Shipros (România): Platformă care aduce împreună clienţi care doresc să expedieze bunuri şi transportatori în căutare de comenzi în domeniul transporturilor terestre; StudyMentors (Bulgaria): Platformă care conectează potenţialii studenţi la universităţi din străinătate au absolvenţi ai acestora şi îi ajută să facă o alegere informată a programului şi universităţii; Style Jukebox (România): aplicaţie care îţi permite să accesezi întreaga ta colecţie de muzică, de pe toate dispozitivele şi la calitate foarte bună; Susurrus (Grecia): platformă care ajută brandurile să identifice blogurile pe care îşi pot promova produsele prin postări (conţinut) şi să măsoare eficienţa acestei activităţi sponsorizate prin statistici de trafic; Traderion (România): serviciu de evaluare şi recrutare pentru industria financiară realizat sub forma unui joc; TravelStarter (Slovenia): manieră alternativă de călătorie care te ajută să obţii recompense dacă susţii antreprenorii locali (ex. Primeşti cazare gratuită în hostelul la a cărui deschidere ai ajutat); ViewFlux (România): platformă de colaborare online pentru designeri care îi ajută să îşi îmbunătăţească procesul de lucru; Vintage (Re publi c a Mol d ova/ România): platformă care conectează artiştii cu afacerile pentru a-şi expune operele; VisionBot (România): linie de producţie pentru transformarea prototipurilor în produse industriale pentru cantităţi medii; Wr1st (Bulgaria): Brăţară pentru plăţi fără cash, control acces şi recunoaştere a utilizatorului dedicată evenimentelor.

vor avea ocazia să formeze conexiuni valoroase cu personalităţi cheie din industrie la nivel global. Startup Spotlight 2014 se desfăşoară în paralel cu How to Web Conference 2014, cel mai important eveniment dedicat inovaţiei, tehnologiei şi antreprenoriatului din Europa de Sud-Est. Cea de a cincea ediţie internaţională a How to Web reprezintă un nou început: evenimentul se maturizează şi propune un format mai complex care tratează în profunzime subiecte specifice. Astfel, pe scena principală se va discuta despre tendinţele în tehnologie şi antreprenoriat, în timp ce track-urile specializate despre product management, dezvoltarea de jocuri şi investiţiile de tip angel vor oferi unor categorii specifice de audienţă şansa de a acumula cunoştinţe şi competenţe relevante pentru domeniile lor de interes. Bilete Early Bird sunt disponibile online pe site-ul conferinţei howtoweb.co/tickets până joi, 13 noiembrie.

Irina Scarlat

irina.scarlat@howtoweb.co PR Manager @ How to Web & TechHub Bucharest

www.todaysoftmag.ro | nr. 29/noiembrie, 2014

15


comunități

Comunităţi IT

N

oiembrie este singura lună din acest an în care v-am recomandat să participați la toate evenimentele din calendarul nostru. Conferințe importante au loc precum: Microsoft Summit, How To Web 2014, MOBOS, OSOM, DefCamp și bineînțeles evenimentul anual organizat de Today Software Magazine: Cluj IT Days 2014. Vă invităm să participați la ele !

Transylvania Java User Group Comunitate dedicată tehnologiilor Java. Website: www.transylvania-jug.org Data înfiinţării: 15.05.2008 / Nr. Membri: 594 / Nr. Evenimente: 47 Comunitatea TSM Comunitate construită în jurul revistei Today Software Magazine. Websites: www.facebook.com/todaysoftmag www.meetup.com/todaysoftmag www.youtube.com/todaysoftmag Data înfiinţării: 06.02.2012 /Nr. Membri: 1890/Nr. Evenimente: 25 Cluj Business Analysts Comunitate dedicată analizei de business Website: www.meetup.com/Business-Analysts-Cluj Data înfiinţării: 10.07.2013 / Nr. Membri: 91 / Nr. Evenimente: 8 Cluj Mobile Developers Comunitate dedicată tehnologiilor mobile Website: www.meetup.com/Cluj-Mobile-Developers Data înfiinţării: 05.08.2011 / Nr. Membri: 264 / Nr. Evenimente: 17 The Cluj Napoca Agile Software Meetup Group Comunitate dedicată metodelor Agile de dezvoltare software. Website: www.agileworks.ro Data înfiinţării: 04.10.2010 / Nr. Membri: 437 / Nr. Evenimente: 93

Calendar Noiembrie 12 (Cluj) Lansarea numărului 29 al Today Software Magazine www.todaysoftmag.ro Noiembrie 12-13 (București) Microsoft Summit 2014 www.mssummit.ro Noiembrie 14-16 (Cluj) 3 Day Startup Cluj cluj.3daystartup.org Noiembrie 19 (Cluj) 4th BigData/DataScience meetup.com/Big-Data-Data-Science-Meetup-ClujNapoca/events/216156792 Noiembrie 20-21 (București) How To Web 2014 - recomandat de TSM 2014.howtoweb.co Noiembrie 20-21 (Cluj) MobOS Conference romobos.com

Cluj Semantic WEB Meetup Comunitate dedicată tehnologiilor semantice. Website: www.meetup.com/Cluj-Semantic-WEB Data înfiinţării: 08.05.2010 / Nr. Membri: 192/ Nr. Evenimente: 29

Noiembrie 23 (Cluj) #15 PM Meetup - Monitoring & Controlling Process meetup.com/PMI-Romania-Cluj-Napoca-Project -Management-Meetup-Group/events/213993162/

Romanian Association for Better Software Comunitate dedicată oamenilor cu experiență din IT indiferent de tehnologie sau specializare. Website: www.rabs.ro Data înfiinţării: 10.02.2011 / Nr. Membri: 251/ Nr. Evenimente: 14

Noiembrie 24 (Cluj) OSOM – Open Source Open Mind osom.ro

Tabăra de testare Comunitate formată din testeri și alți profesioniști din industria IT care, în cadrul unor întâlniri informale lunare, împărtășesc din cunoștințele proprii și învață din experiențele profesionale ale celorlalți membri. Website: www.tabaradetestare.ro Data înfiinţării: 15.01.2012/Nr. Membri: 1243/ Nr. Evenimente: 107

16

nr. 29/noiembrie, 2014 | www.todaysoftmag.ro

Noiembrie 24 (Cluj) Workshop-urile Cluj IT Days 2014 www.itdays.ro Noiembrie 25-26 (Cluj) Cluj IT Days - recomandat de TSM itdays.ro Noiembrie 28-29 (București) DefCamp 2014 defcamp.ro


concurs

programare

Share Cluj - Jurnal tehnic

A

m auzit prima data de Share Cluj când încă era în stadiul de idee, când echipa încă lucra să clarifice scopul proiectului, se gândea cum să implice mai multă lume și cum să pună Clujul pe harta lumii. Inițial, rolul meu în proiect era de a fi un ambasador al Clujului, însă participând la o ședință de proiect și având pe masa de discuție partea tehnică a proiectului, am devenit imediat un membru al echipei. Silvia Răusanu

Silvia.Rausanu@isdc.eu Senior Developer @ ISDC

Latura tehnică consta în a construi o platformă care să poată susține concursul din cadrul proiectului: orice persoană din Cluj și nu numai să promoveze Clujul în călătoriile sale, fie ele concedii sau delegații, împărtășind poveștile lor despre Cluj cu toți cei care încă nu au auzit de Cluj, și apoi să încarce pe rețelele sociale ”dovada”: o fotografie a mesajul ”#sharecluj” în fiecare locație. Provocarea tehnică pe care am văzut-o eu a fost agregarea pe baza hashtagului ”#sharecluj” (dorit în mesajul post-ului) a feed-urilor de pe Facebook, Twitter, Instagram și prezentarea lor pe site-ul proiectului www.sharecluj.com.

Prima soluție

Nu am fost atât de încântată când am descoperit că există platforme/site-uri care pot face acea agregare, însă tot aveam ocazia să le studiez și să aleg opțiunea cea mai bună pentru nevoile proiectului: să expună un API ce să conțină feed-ul cu pozele concurenților de pe rețelele sociale. Am analizat ce oferă Rignite, Hashtagr, TINT, TagBord. Nici una dintre acestea nu expunea API-ul pe care mi-l doream, însă fiind servicii plătite, am presupus că se poate discuta cu cei care întrețin platformele și se poate găsi o soluție pentru a reuși o integrare cât mai rapidă și o

lansare a proiectului cât mai curând posibil. Era deja luna iunie, iar noi ne doream ca până în iulie să dăm drumul la concurs. În așteptarea răspunsurilor de la Rignite și TINT, am început să fac teste pentru anumite hashtag-uri pe care le tot vedeam în feed-ul personal de Facebook. Lucrurile nu erau prea roz, nu prea găseam nimic din ce mă așteptam, nici nu se punea problema de a găsi tot - cum ai putea ține un concurs dacă unii concurenți sunt înscriși și alții nu? Așadar, pe lângă integrarea încă sub semnul întrebării cu site-ul sharecluj.com, o altă situație mult mai dificilă se întrezărea: nu puteam folosi nici unul dintre serviciile existente. Deci trebuia să facem totul de la zero!

Soluția ”adevărată”

Când termenul propus era din ce în ce mai aproape, iar partea tehnică nu era nici pe-departe rezolvată, vă puteți imagina că nu eram prea fericită și nici prea încrezătoare că aș putea să termin tot singură în așa scurt timp. Supărată cum eram, am mers la serviciu și, cu jumătate de gură, mi-am întrebat colegii - pe Călin, Dan și Răzvan dacă vor să facă voluntariat tehnic. Nu știu dacă starea mea de spirit i-a convins sau dacă și ei au văzut aceeași provocare pe care am văzut-o eu inițial, dar cert e faptul că

www.todaysoftmag.ro | nr. 29/noiembrie, 2014

17


programare Share Cluj - Jurnal tehnic

doar în 10 minute ne-am stabilit o întâlnire la Dan, pe seară, la un pahar de vin, să ne facem un plan cum implementăm sharecluj. com. Până seară, ne-am făcut rost și de specificații funcționale de la Alina, care din manager de proiect s-a transformat instant în product owner. Chiar dacă tentația e mare să experimentezi cu tehnologii noi când ai pe mână un proiect green field, ne-am decis rapid să folosim ca tehnologie de bază Java și framework-uri cunoscute: Spring MVC, JDO. Costul proiectului trebuia să fie cât mai mic posibil, deci nu se putea pune problema închirierii unui server, așa că am ales ceva ce nu am mai folosit până atunci: Google AppEngine cu o quota suficient de mare pentru stocare de date, operațiuni pe baza de date, ore de instanță, indecși, deploy-uri, etc. . AppEngine s-a dovedit a fi cel mai potrivit pentru proiect. Integrarea cu rețelele sociale urma să fie făcută folosind API-ul expus de fiecare prin scrierea de clienți care să aducă metadata post-urilor și să o stocheze în baza de date.

Implementarea

Pentru a ne asigura că vom reuși să terminăm tot ceea ce product owner-ul, Alina, ne-a cerut, am împins termenul limită către începutul lui august. Implementarea fiecărui punct s-a făcut prioritizat, în funcție de riscul pe care credeam noi că îl poate reprezenta. Aplicațiile web bazate pe Java și Spring MVC nu reprezintă o noutate pentru echipa nou formată, așa că primul pas a fost investigația GraphAPI-ului oferit de Facebook - Facebook, fiind cea mai folosită rețea socială în România (deci și cea mai relevantă pentru proiect), dar și platforma care era cel mai rar regăsită în rezultatele testelor pe agregatoarele de hasgtag-uri, prezenta cel mai mare risc. De vreme ce exista posibilitatea de căuta din aplicația Facebook după un hashtag, aveam așteptări foarte mari de la GraphAPI ca acesta să-mi ofere exact ceea ce

18

nr. 29/noiembrie, 2014 | www.todaysoftmag.ro

îmi doream: post-urile cu hashtag-ul ”#sharecluj”. Dar nici vorbă de așa ceva! Am aflat de alternativa de a folosi API-ul de search pentru cuvinte cheie, folosind hashtag-ul; căutarea funcționa după reguli bizare, unele post-uri apăreau printre rezultate, altele nu. Am făcut experimente pe contul personal: am postat mesaje de test conținand ”#sharecity” (nu voiam să stric lansarea); am așteptat o zi, o săptămână să îmi apară - nimic; în plus, în scurt timp, API-ul urma să devină obsolete și retras. ( Nu mai este accesibil la momentul de față). În căutările după explicații, am dat peste secțiunea FAQ de la TINT, unde precizau că pentru a avea întregul feed este necesar un workaround și anume ca utilizatorii să posteze pe o pagină de Facebook sau să eticheteze (tag) un utilizator pe conținut. Nu tocmai cea mai ”profi” soluție, însă am fost de acord toți că era singura. O veste bună din zona Facebook a fost că pentru autentificare aveau OAuth2 și că se putea face și offline, dintr-u cron job – așa cum intenționam și noi. Peste GraphAPI s-au scris suficienți clienți Java, dintre care am ales RestFB - ușor de folosit și extensibil. După experiența cu Facebook, așteptările generale față de orice API au scăzut; însăTwitter avea ceea ce ne doream: un API simplu, bazat pe hashtag. Conform descrierii endpoint-ului, Twitter nu garantează că absolut toate tweet-urile cu un hashtag vor fi returnate, deoarece se face automat o filtrare în funcție de relevanță/popularitate; alternativa oferită este de a ne lega și ”asculta” la stream-ul public. În acest caz a apărut o altă dificultate: dacă alegeam stream-ul însemna că am avea nevoie de încă o instanță în AppEngine - ceea ce ar fi întrecut limitele gratuității. Luând în considerare și costul, dar și o eventuală consistență în procedură, am ales să folosim API-ul pentru mentions (un utilizator să fie menționat în tweet). Din fericire, integrarea a fost simplă: am folosit un client Java pentru API-ul Twitter: Twitter4j. Instagram a fost integrat mai tarziu față de celelalte rețele, iar soluția nu a avut nevoie de nici o concesie. Am fost încântată să observ că au un API per hashtag, nefiltrat, singura limitare fiind la numărul de rezultate - la fiecare apel se returnează cel mai nou conținut și nu se reține starea completă (prin API) a tuturor posturilor. Pentru Instragram, nu sunt atât de mulți clienți, însă cel ales, jInstagram, a fost suficient. În ceea ce ține de autentificare, și Instagram implementează OAuth2, însă nu se poate folosi și offline (pentru cron job), dar exact API-ul utilizat ( /tags/{tag}/ media/recent) se putea folosi doar pe baza unui client_id. Mi-a plăcut să fac cunoștință cu întregul ecosistem Java din AppEngine - am putut să folosesc fără probleme toate frameworkurile dorite. În primul rând, nu a trebuit să-mi fac griji că acest cod ar putea deveni public înainte să fie ceva cu adevărat valoros - pentru fiecare aplicație există un Git repo, nu se poate clona


TODAY SOFTWARE MAGAZINE direct, ci prin SDK-ul corespunzător. Apoi, pentru integrare cu Maven, există atât un plugin pentru management, cât și un arhetip pentru proiecte web. Pentru interacțiunile cu baza de date se poate folosi atât JPA, cât și JDO la fel de ușor (am ales JDO). De asemenea, suportul pentru cron jobs este inclus, având ca premise existența unui serviciu REST pentru execuție și un fișier de configurare. Aplicația web construită cu Spring MVC expune servicii REST atât pentru a culege datele din rețelele sociale, cât și pentru a face datele accesibile pentru interfața web. Toate datele afișate se aduc asincron, prin apeluri de Ajax.

Lansarea

După toate problemele întâmpinate în locuri neașteptate, dar și ”ajutorul” din partea tool-urilor bine făcute, am ajuns la următorul design, care a fost lansat pe 4 august, exact la termen. Imediat după lansare, aproape întreaga echipă de dezvoltare a plecat în concediu. Nimic grav nu s-a întâmplat pentru că aplicația era stabilă,deși nu am avut un tester oficial în echipă. Însă, între timp, Facebook a lovit din nou! Pe măsură ce proiectul devenea tot mai cunoscut și poze cu ”#sharecluj” erau uploadate în diverse forme, descopeream tot mai multe probleme și lacune în API-ul Facebook-ului: unele poze, deși urmau întreaga procedură, nu erau returnate de serviciu. Am declarat în august un defect care abia la sfârșitul lui octombrie a fost rezolvat, dar nu complet, încă sunt concurenți care nu au fost înregistrați pe platformă - drept urmare, am declarat un nou bug.

Unde suntem acum

După trei luni de când proiectul a fost lansat, aplicația este în continuare stabilă. Bineînțeles, ajustări minore au fost făcute pentru a corecta scăpări sau pentru a completa informații. A fost și va continua să fie până în octombrie 2015, o experiență foarte interesantă; nu credeam niciodată că voi ajunge să cunosc într-atât de aproape rețelele sociale sau că voi descoperi defecte la Facebook sau că voi face deploy-uri în producție de pe canapeaua de acasă. În concluzie, mă bucur că am contribuit la proiectul Share Cluj și că am reușit să punem deja Clujul pe harta lumii în 36 de țări, printre care unele foarte exotice: Senegal, Singapore, Puerto Rico, Australia. Haideți să continuăm să ”Share Cluj”!

www.todaysoftmag.ro | nr. 29/noiembrie, 2014

19


management

Cum poate o companie de outsourcing să devină un partener de încredere

P

rima provocare a oricărei companii de outsourcing este găsirea de noi clienți. Odată (și dacă) acest lucru se întâmplă presiunea se mută spre a menține și dezvolta relația. Ca să fim sinceri cu noi însine, la începutul relației cu noul client ești departe de a fi considerat partener (chiar mai departe de a fi considerat partener de încredere). Ești considerat un simplu furnizor și este normal și de așteptat ca la început sa existe o oarecare doză de scepticism în ceea ce te privește. Dar relațiile pot evolua și ar putea trece prin stagiile descrise în rândurile de mai jos. Nu e un model pe care l-am gândit eu și nu aș dori să mi-l asum (sursa: www. trainingindustry.com), însă mi se pare a fi valid.

Furnizor aprobat

poți dezvolta relația cu clienții tăi? Care este drumul de la furniAi un model de tarifare bun și o reputație (destul de) bună. zor aprobat la partener de încredere? Privind înapoi la relația de Felicitări! Ai ajuns pe lista furnizorilor. Dar încă nu este perceput încredere dezvoltată cu furnizorii tăi, poți identifica unele acțiuni care te-au adus într-o astfel de relație. Sunt sigur că există mai ca având un avantaj competitiv față de ceilalți furnizori. multe modalități de a deveni un partener de încredere, dar aș vrea să îți spun propunerea mea, distilată din experiența Endava Furnizor preferat Ești văzut ca fiind mai eficient și primești mai mult de muncă și proprie în relațiile cu clienții si furnizorii. decât ceilalți furnizori de pe lista inițială. Ești acum într-un club mai select dar ești încă implicat doar în execuție. Doar că faci mai Premisele mult decât ceilalți furnizori. Pentru a ajunge să fii un partener de încredere există o serie de premise. Acestea sunt de asemenea puncte care v-ar obține contractul în primul rând. Nu voi insista foarte mult pe acestea, Consultant Aduci valoare produsului clientului tău și ești perceput ca un deoarece acestea pot fi considerate ca fiind de bun simț, însă lider de opinie când vine vorba de tehnologie. Lucrezi împreună merită menționate. Lucrurile care te pun pe lista de furnizori și care sunt primul pas în a deveni un partener de încredere sunt: cu clientul și îi sfătuiești de CUM să lucreze. • Calitatea serviciilor – livrează mai mult și mai bine decât se așteaptă clientul. Sau cel puțin livrează ce ai promis. Contribuitor strategic • Prețul - dacă nu te poți încadra în bugetul clienților tăi nu Stai la masa de lucru cu privire la DE CE, care problemele de vei primi șansa de a dovedi cât ești de bun. afaceri pe termen mai lung. În acest moment te-ai mutat în zona • Capabilitățile – poți livra tot ce are nevoie clientul tău? Sau de parteneriat și îți ajuți clientul în o gamă mai largă de provocări îți poți construi capacitățile suficient de rapid pentru a satisface cu care se confruntă. cererea noului tău client?

Partener de încredere

Conducere de nivel superior cere sfatul tău. Ești perceput ca un partener pe termen lung și ca fiind esențial succesului pe termen lung. Să inversam puțin rolurile pentru o secunda și să privim lucrurile dintr-o perspectivă diferită. La fel cum ai clienți, sunt sigur că (atât ca persoană cât și ca și companie) ai câțiva furnizori. Să ne gândim la ei puțin. Gândiți-vă la relația cu contabilul, agentul de asigurare, mecanicul sau societatea de curățenie. Există 2 puncte cheie în relația ta cu ei. Începutul, atunci când îi alegi, mai ales pentru că ai nevoie de un furnizor și te-ai decis asupra lor pentru că poate au cel mai bun cost sau calitate, ți-au fost recomandați sau ei au fost singurii în acel moment care te puteau ajuta. Deci, ei au devenit un furnizor aprobat. Și momentul “Acum”, când aceștia sunt partenerii tăi de încredere. Tu îi respecți și ai încredere în opinia lor și vice-versa. E o relație reciproc avantajoasă și ei au nevoie de tine la fel de mult cât ai tu nevoie de ei. Așadar, întrebarea este, cum poți tu deveni un partener de încredere? Cum ai ajuns la acel punct cu proprii furnizori și cum

20

nr. 29/noiembrie, 2014 | www.todaysoftmag.ro

Dacă satisfaci toate premisele te afli la linia de start. Pentru a obține mai mult va trebui să îți ajuți noul client în diverse moduri.

Ce nevoie de ajutor are clientul tău? Trebuie să înțelegi nevoile clientului tău și provocările afaceri sale. Odată ce ai făcut asta, va trebui să îți adaptezi oferta pentru a satisface aceste nevoi. S-ar putea să ai cel mai bun produs sau serviciu, dar în cazul în care clientul tău nu are nevoie de așa ceva sau are nevoie de altceva (un alt produs sau serviciu) mai mult, s-ar putea să cazi de pe lista de furnizori și drumul vostru împreună să ia sfârșit. Știi și înțelegi nevoile clientului tău? Excelent!

Ajută-l să creați o viziune comună În stadiile incipiente este important să vă cunoașteți reciproc, să setați așteptările corecte și să stabiliți o viziune comună pentru relația voastră (incipientă) de lucru. Cum veți interacționa? Ce vreți să realizați împreună? Discuta tot ceea ce simți că este necesar pentru a stabili baza pentru discuții și interacțiuni ulterioare.


diverse Implică-te devreme și în mod constant în business pentru a înțelege care e direcția business-ului și în mod constant revizuiți așteptările voastre.

Ajută-l să crească Îți cunoști clientul și știi ce vreți să realizați împreună. Dar cum poți tu (și organizația ta) să îți ajuți clientul să se dezvolte și să devină mai de succes? Asigură-te că vei crea soluții de câștig reciproc, că veți lucra și învăța împreună. Nu te rezuma în a-ți vinde doar produsul sau serviciul. Creează valoare și creștere pentru și pentru clientul tău!

Ajută-l să își păstreze controlul asupra sistemelor sale

TODAY SOFTWARE MAGAZINE noștri ca indivizi. Parteneri de încredere își cunosc clienții lor ca oameni și nu văd relația ca fiind una între două organizații și atât. Încearcă să îți cunoști clienții mai bine prin arată grijă și preocupare pentru ei ca indivizi.

Ajută-l să inoveze. Provoacă-l Uneori poate fi dificil să îți spui părerea, să adresezi acele câteva întrebări dificile sau pur și simplu să spui “nu” la cererile clientului tău. Dar, dacă tu crezi că ai ceva de valoare pentru clientul tău, spune-i. S-ar putea să ai ceva poate util, o nouă perspectivă, o înțelegere diferită a situației, resurse, instrumente sau practici noi. Acestea ar putea ajuta în a face produsul clientului tău mai bun sau v-ar putea ajuta să fiți mai eficienți. Discută cu clientul tău și arată-i că îți pasă de el, produsul său și că îți dorești să contribui și să adaugi valoare ori de câte ori poți. Nu îți face griji, acest lucru nu este nepotrivit sau lipsit de respect. Dar acordă o atenție deosebită la modul în care transmiți mesajul. Comunicarea este cheia.

Fii transparent cu munca ta. Există diferite moduri de a face acest lucru și cu atât mai automatizat cu atât mai bine. E momentul să îți arăți abilitățile și potențialul, deci concentrează-te pe calitate și livrare continuă. Dacă clientul poate vedea modul în care produsul evoluează, unde sunt probleme, dar poate vedea, de asemenea, că ai abilitățile și cunoștințele pentru a gestiona situații complicate, acest Ajută-l să aibă încredere în tine lucru le va da încredere în a lucra cu tine Toată lumea face greșeli mai devreme mai departe. sau mai târziu. Mai ales în primele etape ale relației voastre, acest lucru este normal fiind încă in stadiul de cunoaștere Ajută-l să se conecteze cu tine. Sau fă mai reciprocă. Recunoaște-ți greșelile și ia-țti multe ca să te conectezi cu clientul tău Trebuie să îți pese. Cu adevărat. Și responsabilitatea soluției. Fii sincer cu trebuie să îți pese nu doar de client ca clienții tăi și ei la rândul lor, te vor răsplăti organizație (și de nevoile și provocările cu încrederea lor. De asemenea, respectăsale), dar, de asemenea, să îți pese oamenii ti angajamentele, nu face promisiuni pe cu care interacționezi și nevoile și provocă- care nu le poți respecta și întotdeauna rile lor. O parte din scopul nostru de bază străduiește-te să lucrezi mai bine. Setează în Endava, ADN-ul nostru cum ne place bucle și intervale scurte de feedback astfel să spunem, este să avem grijă de clienții încât să îți poți ajusta și îmbunătăți modul

de lucru constant. Acum îți cunoști clientul, îi înțelegi nevoile și și știi ce vrea să realizeze. Poți oferi calitate, servicii competitive și îți poți ajuta clientul în a dezvolta în continuare produsul său. Ai arătat că vrei să contribui, că nu îți e teamă să pui întrebările dificile și ești interesat de succesul lor, nu numai câștigul tău. Clientul tău are încredere în tine să fii sincer atunci când îți cere părerea și are încredere în opinia ta, deoarece ai dovedit a fi un bun cunoscător al domeniului. Ești transparent cu munca ta și ai reușit să te conectezi cu clientul tău ca individ. Acum ești un partener de încredere. În cele din urmă, nu te aștepta să dezvolți o relație de partener de încredere cu toate conturile și clienții tăi. Motivele și factorii sunt destule și pot varia de la stabilirea prețurilor, calitatea percepută a serviciului, probleme de comunicare sau pur și simplu nu faceți clic. Și ține minte că nu este vorba doar despre servicii de calitate, capabilități, prețuri și alte lucruri pe care le-ar putea crede ca fiind simple pentru a asigura o relație de lungă durată. Acestea sunt importante, dar pentru a deveni un partener de încredere ai nevoie de mai mult. Ai nevoie să te concentrezi pe nevoile clientului, de comunicare și transparență. Călin Lupo

calin.lupo@endava.com Client Engagement Manager @ Endava

www.todaysoftmag.ro | nr. 29/noiembrie, 2014

21


securitate

programare

5 greșeli frecvente în securizarea rețelelor windows

Î

n acest articol voi descrie câteva dintre greșelile frecvente care pot duce la probleme de securitate grave și voi prezenta și unele soluții care ne permit să ne apărăm împotriva acestor tipuri de amenințări. Dacă sunteți interesați de securitatea sistemelor de operare Windows, atunci acest articol este pentru voi!

Teodor Olteanu

Teodor.Olteanu@betfair.com End User Computing Lead @ Betfair

Desigur, există mai mult de cinci greșeli frecvente...dar dacă veți începe să vă gândiți la cele prezentate în acest articol, rețeaua voastră va deveni mult mai sigură! Cauzele acestor erori sunt tipice: lipsa de timp, lipsa sistemelor de monitorizare, lipsa de cunoștințe. De multe ori, greșelile sunt foarte grave si pot duce la breșe serioase în securitatea rețelei. Nimănui nu-i place când parolele utilizatorilor sunt sparte și sunt furate informații prețioase, nu-i așa? Hackerii încearcă trucuri noi, dar sunt contracarați de administratorii de sistem care adaugă noi tehnologii în domeniul securității astfel încât lupta devine din ce în ce mai grea. Totuși administratorii de sistem sunt adesea foarte ocupați cu alte sarcini și securitatea nu se află printre prioritățile lor. Greșelile acestora și indisciplina angajaților pot fi de mare ajutor pentru cei care doresc să obțină acces la informații confidențiale. Vă invit în continuare să trecem în revistă cinci dintre cele mai frecvente greșeli pe care administratorii de sistem le fac cu privire la securitate și să aflați cum câteva mici îmbunătățiri pot avea un impact enorm asupra securității rețelei voastre.

p aro l a : „ Mi c k e y Mi nni e P l u t o Hu e y LouieDeweyDonald GoofySacramento”. Când a fost întrebat de ce folosește o parolă atât de lungă, el dădu ochii peste cap spunând: „Hei! IT-ul mi-a spus că parola trebuie să aibă cel puțin 8 caractere (n.r. în engleză „character” înseamnă și personaj) și să includă cel puțin o capitală (n.r. „capital” în engleză are sens dublu: majusculă sau capitală.)”

Aceasta este o glumă, desigur. Dar realitatea este că o parolă lungă și complicată, nu vă protejează în toate situațiile! Un studiu realizat de BitDefender în 2010 arată că 75% dintre persoane folosesc aceeași parolă pentru site-urile de social media cât și pentru adresele lor de e-mail. Cazuri de site-uri importante ca Facebook, LinkedIn, Twiter și altele, care au fost sparte și parolele a mii de utilizatori furate sunt bine cunoscute. Deci, dacă un hacker are parola de Facebook a unui angajat de-al vostru are cel mai probabil și acces la căsuța acestuia de e-mail și astfel la date confidențiale din companiei voastre. De fiecare dată când introduceți o parolă pentru a vă autentifica, există cel puțin un mecanism care trebuie să cunoască acea parolă pentru a o folosi mai târziu cu scopul de a vă permite accesul. Atunci când salvăm o parolă în Windows Greșeala 1: Neînțelegerea parolelor Un a u d i t r e c e n t , a d e s c o p e - acesta este stocată în SAM (Security rit că un angajat utiliza următoarea Accounts Manager) sau în baza de date

22

nr. 29/2014 | www.todaysoftmag.ro


programare Ntds.dit din Active Directory. Dar, faptul că sistemul de operare poate reutiliza parola înseamnă totodată și că alții o pot decripta! În multe cazuri, atacatorii nici nu trebuie să știe parola ci pot folosi tehnica „pass the hash” pentru a rula cod malițios pe calculatoarele voastre, autentificându-se folosind hash-ul parolei. Dar recent au fost dezvoltate utilitare avansate, care permit decriptarea hash-urilor care sunt stocate în memorie. Mimikatz este o aplicație creată de Benjamin Delpy (aka gentilkiwi), care extrage parole în format text din WDigest (un DLL adăugat în Windows XP, care este folosit pentru a autentifica utilizatori prin cu ajutorul HTTP Digest) interfațat prin LSASS (Local Security Authority Subsystem Service) . Deci, dacă v-ați conectat vreodată la un sistem folosind un cont de administrator de domeniu și cineva a rulat Mimikatz pe acel sistem atunci, practic, întreaga voastră infrastructură este în mâinile atacatorului. Nu există o metodă unică de apărare împotriva acestei tehnici.Drept urmare practicile standard de apărare trebuie aplicate în acest caz - de exemplu, utilizarea de firewall-uri, sisteme de „intrusion detection”, autentificarea 802.1x, IPSec, software-ul antivirus, criptare completă de disc, reducerea numărului de persoane cu privilegii sporite, aplicarea proactivă de patch-uri de securitate etc. . Blocarea Windows-ului de a mai stoca parolele in cache poate limita atacatorii să mai obțină hash-uri din memorie, ceea ce înseamnă, de obicei, că acel cont țintă trebuie să fie conectat la mașină atunci când atacul este executat, pentru ca atacatorul

TODAY SOFTWARE MAGAZINE să vadă parola. De aceea este important să folosim principiul celui mai mic privilegiu necesar care sugerează o abordare în care utilizatorii nu ar trebui să utilizeze conturi cu mai multe privilegii decât le este necesar pentru a-și îndeplini sarcinile. Configurarea sistemelor care să nu folosească LM sau NTLM poate consolida securitatea lor, dar aplicațiile noi de cracking sunt capabile să transmită și tichetele Kerberos într-un mod similar, decriptând parolele. Limitarea privilegiilor de depanare de sistem (debug) poate bloca unele atacuri care injectează cod sau fură hash-uri din memorie. Alte lucruri pe care ar trebui să le verificați sunt parolele folosite pentru a rula anumite servicii. Dar este important de a nu rula un serviciu de pe un cont de administrator, utilizați în schimb gMSA (Group Managed Service Accounts). De asemenea, sunt vulnerabile task-urile planificate care se execută folosind un anumit cont cu privilegii înalte, pentru că la fel ca și în cazul serviciilor, parola poate fi aflată. Dacă doriți să aflați mai multe detalii despre modul în care Windowsul gestionează parolele stocate, vă recomand un scurt articol care vă oferă o imagine mai clară asupra a ceea ce se întâmplă cu parolele salvate. Îl găsiți aici: technet.microsoft. com/en-us/library/hh994565.aspx

Greșeala 2: Ignorarea accesului fizic

curățenie, de un laptop furat sau despre cineva care-și duce laptopul acasă unde și alte persoane pot avea acces la el. Pentru a diminua pierderile de date în acest caz, există mai multe etape de protecție care se pot pune în aplicare: • Nu permiteți boot-area de pe USB / CD / DVD. • Implementați criptarea discurilor (Bitlocker). • Managementul porturilor USB. • Organizarea de cursuri care să-i informeze pe angajați cu privire la pericolele de securitate la care pot fi expuși.

Greșeala 3: Utilizarea de tehnologie veche E greu să fii la zi cu tehnologia, dar sistemele de operare antice cum ar fi Windows XP și Windows 2000 ar trebui să fie aruncate la gunoi! În principal datorită faptului că Microsoft nu mai oferă suport pentru ele și orice breșă nouă de securitate nu mai este acoperită. Efectuați verificări periodice ale infrastructurii voastre și planificați-vă să aduceți la zi sistemele de operare pentru care nu se mai oferă suport sau pentru care suportul va expira în curând. Sistemele și aplicațiile fără patch-uri la zi pot lăsa uși deschise către rețeaua voastră astfel încât se impune să aveți o strategie lunară de patching și să mențineți sistemele dumneavoastră la curent cu ultimele patch-uri de securitate. Puncte bine cunoscute de atac sunt și produsele Oracle și Adobe (Java, Flash, Reader etc.). Așa că pe lângă produsele Microsoft țineți cont de faptul că va trebui să faceți actualizări și pentru aceste aplicații.

Accesul fizic permite unei persoane să aibă acces direct la un sistem și în felul acesta să folosească metodele descrise mai sus pentru a accesa date confidențiale. Nu trebuie să fie neapărat o persoană care a reușit să intre în clădire nevăzută. Poate Greșeala 4: Lipsa monitorizării fi vorba de un vizitator, de persoana de la În cazul rețelei există o binecunoscută

www.todaysoftmag.ro | nr. 29/noiembrie, 2014

23


securitate 5 greșeli frecvente în securizarea rețelelor windows regulă: nu permite trafic pe care nu-l recunoști. De asemenea, trebuie să fiți conștienți de faptul că cele mai multe dintre protocoale conțin spațiu pentru date în ele. De exemplu, mulți administratori se concentrează asupra monitorizării rețelei pe protocoale TCP și UDP. ICMP este adesea trecut cu vederea, dar este aproape la fel de viabil pentru transferul de date. Transferul de date prin intermediul ICMP este posibil, dar nimeni nu monitorizează traficul ICMP. Voi permiteți ping-uri din afara rețelei tale? O altă amenințare majoră este instalarea de conținut piratat, care de cele mai multe ori poate avea malware atașat. Vă recomand să păstrați locația unde aveți kiturile de instalare pentru aplicațiile pe care le utilizați intern la zi cu ultimele versiuni și să stocați checksum-urile lor într-un alt loc astfel încăt să puteți valida kiturile de instalare ca fiind autentice când este nevoie. Fișierele de instalare injectate cu malware nu sunt neapărat recunoscute de antivirus, iar injectarea fișierului cu malware poate avea loc chiar înainte de a descărca fișierul undeva pe rețea între voi și site-ul de unde îl descărcați. Așadar trebuie să fiți atenți de unde descărcați kiturile de instalare. Se recomandă să implementați o soluție de inventariere software, astfel încât să puteți afla în orice moment ce software este instalat în rețeaua dumneavoastră.

Greșeala 5: Lipsa documentației Este aceasta într-adevăr greșeala administratorului ? Da, eu sunt de părere că acest lucru este una dintre cele mai mari greșeli pe care o poate face o organizație IT. Cele mai multe companii nu sunt nici măcar pregătite atunci când personalul IT pleacă în concediu! Fiți proactivi, împărțiți și rotiți sarcinile între administratorii de

24

sistem, organizați cursuri de instruire pentru utilizatorii voștri și păstrați wikiul intern actualizat. Efectuați audituri periodice ale infrastructurii și nu uitați să auditați și permisiunile și ACL-urile. Cele mai ieftine și mai eficiente atacuri sunt de multe ori cele non-tehnice. Oamenii tind să aleagă calea ușoară și intențiile lor sunt greu de controlat. Monitorizați-vă utilizatorii rețelei și arătați-le că o faceți. Parolele implicite pot crea găuri imense de securitate. Parolele goale din MSSQL pot duce la un server compromis în întregime. Parolele goale pe interfețele de management pot duce, de asemenea, la rețele compromise. Utilizați scanere de vulnerabilități și scanați rețeaua pentru servicii HTTP, FTP, Telnet și SSH. De asemenea, asigurați-vă că utilizați parole diferite pentru contul de administrator local și contul de administrator de domeniu. Dacă nu sunteți convinși de pericolul parolelor implicite, vă invit să accesați siteul shodan.io. Acest site este o bază de date cu servicii care sunt expuse în internet și care folosesc parole implicite sau goale. E uimitor ce poți găsi aici - de la webcam-uri, echipamente de rețea și fișiere, toate accesibile prin internet. În concluzie, încercați să alegeți una dintre greșelile pe care le-am descris mai sus și gândiți-vă dacă se aplică la locul vostru de muncă și dacă ați putea îmbunătăți situația actuală. Examinați modul în care lucrați în prezent și încercați să schimbați ceva înainte de a fi prea târziu. Dacă v-am deschis apetitul pentru acest subiect, vă recomand să căutați sesiunile Paulei Januszkiewicz. Ea este expertul meu favorit pe teme de securitate și a fost cea care m-a insiprat să scriu acest articol.

nr. 29/noiembrie, 2014 | www.todaysoftmag.ro

Vă mai invit să accesați site-ul Trustworthy Computing la adresa microsoft.com/twc. TWC este un program pe termen lung, care presupune un efort de colaborare cu scopul de a oferi acces la informație întrun mod sigur și privat pentru toată lumea. Aici găsiți linkuri care vă direcționează și către Microsoft Security Intelligence Report oferindu-vă o imagine de ansamblu asupra vulnerabilităților actuale și asupra evoluției lor.


programare

management

Comunicarea cu clientul Un joc mai greu decât ne imaginăm

T

Bogdan Mureșan

bogdan.muresan@3pillarglobal.com Director of Engineering @ 3Pillar Global

eoria spune că 90% din munca unui manager de proiect este comunicare. Ceea ce este cu adevărat important este faptul că pentru un manager de proiect comunicarea se află peste tot în jurul lui. Ceea ce nu remarcăm noi întotdeauna este că cizelarea abilităților noastre de comunicare începe mult mai devreme și este parte integrantă a mediului nostru de lucru și a vieții noastre mai mult decât ne dăm seama în mod conștient. Dacă ne referim strict la locul de muncă, comunicarea se desfășoară în toate direcțiile și are loc între persoane cu diferite abilități de comunicare și cu diferite specializări cum ar fi: developer-i, testeri, administratori, persoanele de pe resurse umane. Dintre toate aceste posibile conexiuni cred că cel mai sensibil canal de comunicare este cel cu clientul și asupra acestuia mi-am propus să mă focalizez în acest articol. În contextul actual al dezvoltării de software, când trendul este dat de metodologiile Agile, întreaga echipă este expusă interacțiunii cu clientul. Acest fapt deschide un canal de comunicare destul de complex între oamenii ce au un background tehnic și oamenii orientați înspre afaceri. Dacă pentru un manager de proiect stăpânirea acestui canal de comunicare este obligatorie și face parte din munca de zi cu zi, oamenii orientați spre tehnic ar putea întâmpina dificultăți în construirea acestei punți ce tranzitează limbajul tehnic spre limbajul cotidian. Când este important să livrăm un mesaj, trebuie să avem în vedere, printre altele, două aspecte foarte importante: • Valoarea conținutului: în primul rând, dacă vrem să demonstrăm ceva, dacă vrem să ne facem înțeleși, trebuie să scoatem în evidență foarte clar valoarea adusă de ideea noastră. În consecință, primul aspect important este să putem explica valoarea conținutului. • Conținutul: în al doilea rând, trebuie să punem pe masă argumentele corecte pentru a explica ideea în sine. Oricât de bună ar fi ideea, în marea majoritate a cazurilor nu se explică de la sine. Cu atât mai mult, dacă avem de-a face cu o

idee tehnică și avem discuția cu cineva non tehnic. Deci al doilea aspect important este să putem prezenta și explica conținutul. Valoarea conținutului nu numai că este un lucru dificil de explicat, dar în același timp trebuie procedat total diferit în funcție de publicul vizat. Pentru a ne alege strategia corect trebuie să înțelegem exact ce este important, ce anume aduce valoare celorlalte părți participante la discuție. Pentru persoanele tehnice valoarea este dată de expresii la modă cum ar fi extensibilitate, tehnologie de ultimă oră, ultimele framework-uri. Pentru clienți cea mai importantă valoare este dată de rata de recuperare a investiției. Într-o traducere liberă ar fi “Cum îmi vor aduce aceste tehnologii de vârf din care nu înțeleg o iotă mai mulți clienți, mai mulți bani?“. Pentru echipa de la resurse umane valoarea se traduce în fericirea oamenilor și păstrarea lor în firmă. Pentru a putea exemplifica acest lucru mai bine să încercăm să ne jucăm cu o posibilă situație. Să presupunem că o echipă vrea să aducă unul dintre framework-urile externe folosite pe proiectul curent la ultima

www.todaysoftmag.ro | nr. 29/noiembrie, 2014

25


management Comunicarea cu clientul - Un joc mai greu decât ne imaginăm versiune. Bineînțeles că va trebui făcut un studiu, s-ar putea să fie nevoie chiar de un prototip și în final vor rezulta tone de argumente care mai de care mai valide ce vor susține această necesitate. Totuși beneficiile acestei schimbări vor fi explicate total diferit celor implicați (sau doar interesați) în această schimbare. Echipa de implementare va discuta despre faptul că noua versiune va permite o mai ușoară integrare cu modulul de securitate; va discuta despre ușurința cu care noul framework poate fi personalizat în funcție de nevoile curente și va discuta despre suportul pe care noul framework îl oferă în mod nativ pentru scrierea unit testelor, suport inexistent în versiunea ce se vrea a fi înlocuită. În schimb când echipa va merge în fața clientului lucrurile se complică. Ei trebuie să știe cât timp va lua schimbarea și câți dintre membrii echipei vor fi implicați, iar această combinație va da costul operațiunii. Odată puse cărțile pe masă, echipa are nenumărate variante pentru a motiva beneficiile pe care schimbareai. Unit testele vor asigura o stabilitate mai mare a aplicației, deci vor reduce costurile de întreținere. În același timp cu noua versiune de framework implementarea noilor funcționalități este mult mai rapidă astfel încât după câteva iterații timpul investit în upgrade va fi amortizat. Echipa nu va avea întotdeauna câștig de cauză, dar înțelegând ce aduce valoare clientului cu siguranță va avea mai multe șanse de reușită. și după multe discuții între membrii echipei, între echipă și client, într-o pauză de țigară, cineva de la resurse umane se va apropia conspirativ de managerul de proiect și va întreba: “Am auzit că v-ați încins la discuții nu glumă … e totul în regulă?”; ”Da, vrem

doar să aducem un framework la ultima versiune și să convingem clientul că a fost o treabă destul de dureroasă”; ”Dar de ce vreți schimbarea asta?”; ”Pentru că-i ține pe oameni în priză și motivați”. Trei grupuri țintă diferite, trei moduri diferite de a motiva același lucru: banala schimbare a versiunii unui framework. Conținutul s-ar putea să fie și mai greu de explicat. S-ar putea să avem nevoie de și mai multe abilități pentru a putea face acest lucru așa cum ne dorim. De obicei bariera de limbaj se instalează între persoanele tehnice și cele non tehnice. Am participat în suficiente discuții care ar fi trebuit să dureze zece minute și s-au întins mult peste o oră. În timpul acestor discuții de multe ori microfoanele au fost oprite (când aveau loc între locații diferite) pentru ca acei implicați sa se liniștească. Am fost și în câteva discuții în care una dintre părți doar a avut impresia ca microfoanele au fost oprite în timp ce se descărca și nu a ieșit prea bine. Ceea ce ar ajuta ca aceste discuții sa fie mai relaxate ar fi ca lumea să fie conștientă de specializarea fiecărei părți implicate în discuție și să fie concentrată și pe acest lucru. Odată ce conștientizăm acest lucru putem să ne adaptăm argumentele astfel încât să fie înțelese rapid și corect de ceilalți implicați. Ce credeți că este mai ușor? Pentru o persoană non tehnică să găsească argumente tehnice sau invers? Am văzut persoane non tehnice care cu bune intenții au folosite cuvinte cheie pentru a se integra într-o anume discuție. Sunt situații foarte haioase. Poți depista când cineva nu știe exact ce spune de la un kilometru. E ca și cum aș încerca eu să povestesc cu cineva de la contabilitate despre salariul brut și salariul net.

Cred cu convingere că cel mai ușor e pentru o persoană tehnică să găsească exemple care să aibă legătură cu viața de zi cu zi. Ceva ce toată lumea înțelege, ceva la care se pot raporta cu toții. Pentru că discuțiile cu clienții sunt aproape întotdeauna mici vânzări , trebuie să ne alegem cuvintele și analogiile cu mare grijă. Haideți să încercăm iar un mic joc imaginativ.Să ne imaginăm că trebuie să explicăm avantajele testării continue de-a lungul unei iterații cuiva care nu știe nimic despre Agile și Scrum. Vom începem să povestim despre integrarea rapidă a testării și a fixării erorilor în procesul de dezvoltare, vom continua să povestim despre reducerea numărului de erori și vom termina prin a povesti despre o aplicație mai stabilă la sfârșitul fiecărui sprint. Clientul va asculta cu interes, va sorbi fiecare explicație mai mult decât validă a cum se va desfășura procesul și în același timp în mintea lui va avea loc următorul monolog: “Sprint … sprint … unde am auzit eu de sprinturi? … Usain Bolt e super tare la sprinturi …“. Va zâmbi la propria-i glumă și noi vom pleca cu convingerea că l-am făcut să ne mănânce din palmă. Peste două zile vom avea aceeași discuție. O altă abordare ar fi să facem o analogie cu gătitul. Nu spun asta doar pentru că sunt gurmand. Toată lumea știe, mai mult sau mai puțin, cum se pregătește mâncarea. Să comparăm planificarea unei noi versiuni cu un plan de gătit pe șapte zile. Fiecare zi va fi o iterație și în fiecare zi va trebui să facem ceva diferit de mâncare. Testarea și fixarea erorilor o vom asemăna cu spălatul vaselor. Dacă nu spălăm vasele în fiecare zi, bucătăria s-ar putea să fie plină de vase murdare încă din ziua a cincea. Iar la sfârșitul zilei a șaptea când Our core competencies include:

Product Strategy

3Pillar Global, a product development partner creating software that accelerates speed to market in a content rich world, increasingly connected world. Our offerings are business focused, they drive real, tangible value.

www.3pillarglobal.com

26

nr. 29/noiembrie, 2014 | www.todaysoftmag.ro

Product Development

Product Support


TODAY SOFTWARE MAGAZINE ne vom apuca de spălat vasele, vom ajunge cu siguranță în ziua a opta. Astfel, deși am terminat de gătit după șapte zile, am lăsat bucătăria curată de-abia în ziua a opta și ne-am ratat termenul limită deoarece la sfârșitul celor șapte zile, munca noastră era plină de mizerie. Dacă în schimb de fiecare dată când așteptăm după ceva, cum ar fi să dospească un aluat sau să se coacă ceva în cuptor, spălăm vasele folosite până în acel moment, la sfârșitul fiecărei zile vom avea bucătăria curată, mâncarea făcută și planul nostru va evolua impecabil. Iar scopul nostru după cele șapte zile va fi atins cu succes. Bineînțeles că mâncarea din prima zi va fi aproape expirată și vom vrea să o refacem, mai ales că între timp am și primit un cuptor mai performant, dar asta-i cu totul altă poveste. Exemplul anterior a fost unul simplu, dar în munca de zi cu zi ne întâlnim cu siguranță cu situații mult mai complicate. Gândiți-vă cum ați explica unui client non tehnic ce înseamnă un load balancer sau ce înseamnă un index compus pe o tabelă din baza de date. Acuma îmi vine în minte un exemplu amuzant din experiența proprie: cu câteva săptămâni în urmă, una dintre echipele cu care lucrez se delecta cu un release. Am întrebat dacă sunt probleme și răspunsul scurt, concis și profesionist a fost: sunt probleme cu generarea unui bundle. Vreme de două secunde am stat și m-am uitat la ei cu un aer ca și cum le-aș înțelege perfect durerea, după care mi-am călcat pe mândrie și am întrebat ce-i ăla. Din nou un răspuns scurt și la obiect cu niște termeni pe care nu i-am putut ține minte. Deși cândva în vremuri de glorie demult apuse am fost o persoană tehnică

(pe vremea când pointer-ul era cea mai tare devine mult mai ușor de jucat, mai apetichestie inventată după roată) în momen- sant și chiar mai distractiv. tul de față am cam pierdut trenul și mi-a fost destul de greu să prind explicațiile. Gândiți-vă cam ce simte o persoană care chiar n-are nici o treabă cu programarea când aude acești termeni. În cazul meu, unul dintre colegi a realizat că încă aștept explicații și mai în glumă, mai în serios a început sa-mi explice ca și unui copil mic: ,,Știi , Bogdan, fișierele acestea sunt toate puse la un loc într-unul singur. Apoi, un mic vrăjitor din calculator (unul bun, nu unul rău) face fișierul acela mic de tot astfel încât să ajungă mai repede unde e nevoie de el”. Așadar, câteodată este nevoie ca un om tehnic să explice ceea ce face ca și cum s-ar adresa unui copil. Știm că este în natura noastră, în codul nostru genetic, să acționăm întotdeauna în acele circumstanțe în care ne simțim confortabili. Dacă toată ziua ne învârtim într-un anturaj ce vorbește aceeași limbă ca și noi și povestim fără restricții, ne va fi foarte greu să ne schimbăm modul de a ne pregăti argumentele în acea jumătate de oră pe zi în care povestim cu clientul. Acest lucru vine de obicei cu experiența, cu multă muncă dar și cu o mentalitate adecvată. E important de menționat că din cauza evoluției în domeniu, din cauza metodologiilor Agile care încurajează interacțiunea continuă între oamenii tehnici și client (mai ales în lumea outsourcing-ului, a exportului de servicii) este de dorit să fim măcar conștienți de acest mod de a gândi. Contextul în care ne manifestăm, în care au loc discuțiile ne obligă la utilizarea unui anumit tip de limbaj. Dar o dată ce știm să jonglăm cu cuvintele, cu situațiile, jocul

www.todaysoftmag.ro | nr. 29/noiembrie, 2014

27


programare

De ce Agile? “Cunoașterea adevărată constă în a-ți ști gradul de ignoranță.” Confucius

D

e-a lungul carierei mele de 15 ani ca dezvoltator, technical lead, manager de proiect, freelancer, trainer, agile/lean/technical coach și din nou dezvoltator am văzut multe eșecuri în dezvoltarea de software. Dar am văzut și succese neașteptate.

Alexandru Bolboacă

alex.bolboaca@mozaicworks.com Agile Coach and Trainer, with a focus on technical practices @Mozaic Works

Dintre toate industriile, dezvoltarea de software pare destul de imprevizibilă. În calitate de client, poți cere să adaugi o funcționalitate destul de simplă ce pare să dureze o zi sau două până e gata, (ex. Adaugă euro la un sistem de contabilitate creat pentru francii francezi) și în realitate îți va lua două luni. Sau poți cere o funcționalitate care pare teribil de complexă dar durează doar o zi pentru a fi dezvoltată. La ce să te aștepți? La un buget de zece ori mai mare pentru funcționalitatea de care ai nevoie sau la un software livrat mai rapid decât l-ai cerut?

Mai Mult Proces Reacția umană inițială la imprevizibilitate este de a adăuga mai multe puncte de control, mai mult proces, mai mult management. La urma urmei, fabricile pot produce mai repede atunci când acestea sunt mai bine gestionate, optimizate și automatizate. De ce nu ar funcționa și în software? Lucram pentru o companie de outsourcing ca technical lead când managementul a decis să obțină certificarea CMMI. În caz că nu sunteți familiari cu el, CMMI este un “maturity model” pentru dezvoltarea de software. Nivelul 3, cel la

28

nr. 29/2014 | www.todaysoftmag.ro

care era evaluată compania se axa pe a avea un proces standardizat și măsurat. Nivelul 4 consta în îmbunătățiri continue bazate pe metrici. Fiind implicat în proces, am învățat foarte mult despre CMMI. CMMI-ul nu este un sistem rău, dar cerințele lui pot fi prost interpretate. Este foarte ușor pentru o companie să dea faliment dacă cerințele sunt interpretate ad litteram. Cea mai simplă cale de ieșire dintr-o evaluare CMMI este de a lua fiecare cerință și a adăuga un document pentru ea. Acest lucru ar crea atât de mult de lucru încât ori ar trebui suspendată producția, ori compania ar trebui să mai angajeze oameni care să scrie documentele. Din fericire, liderul proiectului de tranziție, Managerul Calității, a ales o altă cale. A citit cerințele CMMI-ului și a găsit cel mai bun mod de a răspunde la ele. Pentru o mai bună înțelegere a contextului, CMMI cere să dovedești că urmărești anumite practici, dar nu precizează exact ce fel de dovadă este necesară. Dovada poate fi un document, dar deseori este suficient să ai raportul dintr-un tool, o poză sau un checklist. Experiența CMMI m-a învățat două lucruri: 1. A avea un mod de lucru structurat


programare este benefic pentru dezvoltarea de software. 2. Punctele de control încetinesc producția. Eram la acel moment un dezvoltator de software interesat de cum să execuți în mod repetitiv proiecte de succes. CMMI avea potențial, dar în același timp putea să se transforme cu ușurință într-un proces greu de întreținut care nu asigura succesul.

Confuzie La momentul respectiv din cariera mea, am început să caut orice tip de cunoaștere care ar putea ajuta. Cum fac alte companii dezvoltare de software? Există principii fundamentale de urmat pentru a crea software de înaltă calitate în timp ce menții clienții fericiți? Care sunt ingredientele succesului? Am început prin a citi cărți și articole pe tema asta. Lucrările lui Fred Brooks “_The Mythical Man Month_” și “_No silver bullet_” mi-au deschis ochii către ceva ce nu conștientizasem înainte: dezvoltarea de software este diferită de celelalte industrii. Până la urmă, să adaugi oameni la un proiect de construcție ce este în întârziere va ajuta proiectul să se termine mai repede. Nu și în cazul dezvoltării de software: să adaugi oameni unui proiect deja întârziat în mod normal îl va întârzia și mai mult (lucru știut sub forma de „legea lui Brooks”). Mai interesant, legea lui Brooks poate uneori fi evitată. Motivul pentru care proiectul este livrat mai târziu este că oamenii care se alătură proiectului trebuie întâi să învețe. Dar, dacă sunt aleși astfel încât să aibă deja cunoștințele necesare, vor ajuta în loc să încetinească livrarea. Cartea lui Steve McConnel, “Software Estimation: Demystifying the Black Art” a fost o altă lectură interesantă. Modul prin care făceam estimări la vremea respectivă era ghicitul. CMMI mă expusese deja la metode de estimare, dar cartea mi-a oferit o mai bună înțelegere. Ca inginer, am găsit tentante și cu mult sens ideile de a profita de statistici și de a face peer review pentru a îmbunătăți estimările. Pe de altă parte dezvoltarea de software părea că nu se înțelege bine cu statistica. Un lucru pe care l-am învățat din lecturile mele (mă tem că nu-mi amintesc sursa exactă) a fost că bug-urile nu erau distribuite uniform în cod. În mod ciudat, nu sunt: ele tind să se grupeze. O primă consecință este că zonele în care un bug este găsit ar trebui verificate cu mai multă grijă pentru alte buguri. Totuși, dacă distribuția normală nu se aplică la localizarea bug-urilor în cod merită să ne întrebăm: s-ar aplica distribuția normală la estimări? Cărțile și articolele au fost foarte interesante, dar tot nu am ajuns la concluziile căutate despre cum să faci dezvoltare de software de succes. Ce ar ajuta: mai mult proces, estimări mai precise, mai multe practici, programatori mai buni…? Nimeni nu părea să știe. Atunci m-am decis să mă mut într-o companie mică de dezvoltare de produs, să mă implic într-o comunitate agile în șapte orașe românești și în mod treptat să mă îndrept către training și coaching agile, lean și tehnic.

TODAY SOFTWARE MAGAZINE 2. Agilitatea Dezvoltării – capacitatea de a produce o funcționalitate pe care clientul o dorește, mai rapid decât are nevoie acesta de ea. 3. Productivitate îmbunătățită – prin înlăturarea impedimentelor, reducerea procesului, ajutorul pentru ca dezvoltatorii să se simtă mai bine la lucru Principiile sunt enunțate în Manifestul Agile; în loc să le citez, le voi enumera pe scurt (și incomplet) , dar filtrate de interpretarea mea: • Gestionează echipa, nu fiecare individ. • Dă autonomie echipei și arată-i scopul clar, lăsându-i să-și facă treaba. • Tratează echipa de dezvoltare ca pe niște adulți inteligenți și motivați, nu ca pe niște copii ce au nevoie de îndrumare. • Îmbunătățirea continuă a modului în care echipa și compania lucrează. Căutarea continua a impedimentelor și îndepărtarea lor cu zel. • Feedback-ul este instrumentul cel mai important de control al procesului. Asigurați-vă că feedback-ul este în timp util, de înaltă calitate și se aplică la toate nivelurile de dezvoltare software (de la cod, design, cerințe și funcționalități utilizate). Practicile cele mai agile/lean/tehnice sunt despre feedback. • Singurul vostru scop este de a lansa software de succes. Aceasta este deja o sarcină foarte dificilă, așa că trebuie eliminată orice distragere a atenției (de exemplu: documente inutile, întâlniri inutile, procese de aprobare, puncte de control etc.). Acest lucru nu înseamnă eliminarea practicilor care sunt de ajutor (documente sau întâlniri utile, puncte de control care ajută la îmbunătățirea calității sau dezvoltă abilitățile dezvoltatorilor). Multă lume crede că practicile sunt cele care definesc agile: întâlnirile zilnice, retrospectivele, integrarea continuă, Test Driven Development, ca să dau doar câteva exemple. În cei cinci ani de training și coaching am învățat despre agile, lean și practicile tehnice.

Agilitatea este mai importantă decât Agile.

Ori de câte ori o companie vrea să facă o transformare agile, prima întrebare pe care eu și colegii mei de la Mozaic Works o avem este: “Ce sperați să obțineți cu asta?” Răspunsurile variate pe care le primim “Am auzit că agile este cool”, “concurenții noștri o fac”, “clienții noștri ne-au cerut să facem agile” necesită mai multe discuții. Cel mai bun răspuns la care ne așteptăm este “avem nevoie pentru a îmbunătăți X”, unde X este de obicei: reducerea ciclului de release, calitate, productivitate (pe baza unor criterii clare) sau inovație. Prin definirea unui scop de business clar, ne putem pune de acord asupra principiilor și putem introduce practicile care sunt cele mai potrivite pentru companie. Uneori, companiile au nevoie de implementări complete de Scrum, alteori de Kanban, în timp ce unii au nevoie doar să înceapă cu Visual Management și îmbunătățire continuă. Nu este important să fii neapărat agile, dar agilitatea în afaceri Agile reprezintă un avantaj competitiv. … este din păcate un termen foarte ambiguu, plin de emoție Dar de ce ar funcționa agile? Cum ajută? Întrebarea aceasta și de marketing. În ciuda acestor provocări, am înțeles că este un set de principii, un set de practici și o listă de beneficii potențiale. m-a condus la o altă concluzie interesantă. Beneficiile sunt la diferite niveluri: 1. Agilitatea Businessului – capacitatea unei companii de a Software-ul este cunoaștere. se adapta rapid la nevoile pieței și ale clienților. Am învățat acest lucru de la o discuție cu Mike Beedle, unul www.todaysoftmag.ro | nr. 29/noiembrie, 2014

29


programare De ce Agile? dintre semnatarii Manifestului Agile și co-autor al uneia dintre primele cărți despre Scrum. Am simțit că am cochetat cu ideea înainte, fără a pune însă degetul pe ea. Ca să fim mai exacți: “Software-ul este cunoaștere codată și foarte precisă.“ Codată, din moment ce este scrisă în cod. Precisă, deoarece computerele nu pot lucra cu ambiguitate. Această declarație simplă are impact în fiecare aspect al dezvoltării de software. Iată câteva aspecte pe care le-am extras: • Dezvoltarea de software constă în traducerea cerințelor ambigue în cod precis. • Ceea ce este echivalent cu a construi cunoștințe. • Când construiești cunoștințe, sunt de ajutor oricâte creierul poți folosi. De aceea, planificarea în echipa și programare în pereche pot fi foarte eficiente. • Calitatea rezultatului și eficiența procesului este influențată de câte pierderi are transferul de cunoștințe. Cel mai bun transfer de cunoștințe se face prin comunicare față-în-față, din cauza feedback-ului instant și de înaltă calitate (poziția corpului, gesturile feței și mâinilor, mișcarea ochilor, inflexiunile vocale etc.). Documentele nu oferă niciun feedback-ul cititorilor; va trebui să discutați cu autorul pentru a le înțelege mai bine. (A nu se înțelege că documentația nu este de ajutor pe termen lung.) • Oamenii au tendința de a subestima precizia necesară. Feedback-ul continuu este singura modalitate de a se muta asimptotic către ea. • Un număr foarte mare de decizii este necesar pentru a obține o cunoaștere exactă. Aceste decizii sunt împărțite între client și echipa de dezvoltare. Echipa are nevoie de întregul context, astfel încât deciziile lor să se potrivească cu nevoile clientului. • Structurarea cunoașterii construite este un impediment cu care încă ne luptăm în industria software. • Programatorii au nevoie de o minte specială, pregătită să transforme cerințele ambigue în cod precis. • Învățarea continuă este inclusă în dezvoltarea de software. Până la urmă, învățarea nu este altceva decât construirea de cunoștințe.

De ce Agile?

Pentru a încheia: de ce agile? Pentru că: • Agilitatea în afaceri, dezvoltarea agilității și productivitatea îmbunătățită pot fi obținute prin utilizarea principiilor, valorilor și practicilor agile. • Dezvoltarea de software înseamnă construire de cunoștințe și necesită o abordare fundamental diferită față de construirea de piulițe și șuruburi. • Dezvoltatorii au performanțe mai bune când au autonomie, expertiză și scop (cheia către motivația intrinsecă după cum spune Dan Pink) și lucrează într-un mediu care favorizează fluxul (vezi lucrările lui Mihaly Csikszentmihalyi despre fericire și productivitate) • Când construiești cunoștințe, ai nevoie de toate creierele pe care le poți folosi.

Când nu este agile util? Există situații chiar și în dezvoltarea de software, când construirea de cunoștințe nu joacă un rol atât de important: de ex. , customizări pentru aplicații sau platforme existente. Există modele de afaceri care funcționează și care nu au

30

nr. 29/noiembrie, 2014 | www.todaysoftmag.ro

nevoie de agilitate. De exemplu, software de contabilitate. Există dezvoltatori care sunt mai fericiți atunci când primesc task-uri pe care le rezolvă fără a lua o mulțime de decizii; un mediu agil îi va face nefericiți. Așadar, este agile răspunsul? Nu cred. Mai avem încă un drum lung de parcurs pentru a obține predictibilitate în dezvoltarea de software. Cred totuși că unul din două lucruri se pot întâmpla. Industria fie va: • Găsi moduri să minimizeze nevoia de construire de cunoștințe prin specializare. • Ori va găsi noi moduri de a construi cunoștințe precise, codate, prin îmbrățișarea acestei paradigme. Nu pot spune încă pe ce drum vom merge, dar pentru mine a doua direcție sună foarte interesantă și merită de a fi explorată.


programare

programare

Componente vizuale Java FX

T

abelele reprezintă unul dintre cele mai puternice instrumente folosite în JavaFX pentru afişarea datelor, suportând următoarele acţiuni:

Silviu Dumitrescu

silviu.dumitrescu@accesa.eu Java Line Manager @ Accesa

Diana Bălan

Diana.Balan@accesa.eu Java developer @ Accesa

• Reordonarea coloanelor afişate de către utilizator, • Sortarea multiplă a coloanelor, • Redimensionarea, • Factories de celulă pentru customizarea conţinutului celulei.

Mai multe clase din JavaFX SDK API sunt folosite pentru reprezentarea datelor în formă tabelară. Dintre acestea cele mai importante sunt TableView, TableColumn şi TableCell. Putem popula un tabel dintrun model de date şi îi putem aplica apoi un cell factory. TableView are facilităţi ce includ: • API-ul TableColumn: • Suport pentru cell factories, ce permite o customizare a conţinutului celulei în ambele stări: de afişare şi de editare. • Sp e c i f i c are a m i n W i d t h , prefWidth, maxWidth, precum şi a coloanelor de dimensiune fixă. La rulare, redimensionarea de către user. • La rulare, reordonarea coloanelor de către user. • S u p o r t p e n t r u î n c u i b a r e a coloanelor. • Diferite politici de redimensionare care determină ce se întâmplă atunci când utilizatorul redimensionează coloanele. • Suport pentru sortarea pe mai multe coloane prin apăsarea header-ului de coloană (apăsând tasta Shift în timp ce facem click pe header)

- T a b l e V i e w < S > , unde S este tipul obiectului ce conţine lista itemilor din TableView - TableColumn<S, T>, unde S are tipul generic TableView, iar T este tipul conţinutului tuturor celulelor din acest TableColumn.

TableView este construit dintr-un număr de instanţe TableColumn. Fiecare TableColumn este responsabilă de afişarea şi de editarea conţinutului unei coloane. În plus TableColumn conţine proprietăţi pentru: • Redimensionare, • Vizibilitate, • Afişarea textului de header, • Afişarea coloanelor încuibate pe care le poate conţine, • Afişarea unui meniu de context atunci când utilizatorul face click dreapta pe zona capului de coloană, • Posibilităţi de sortare.

Când creăm o instanţă TableColumn, probabil cele mai importante proprietăţi de setat sunt textul (adică ce afişăm în capul de tabel al coloanei) şi cell value factory (utilizat pentru popularea celulelor individuale din coloană). Clasa T a b l e C e l l < S , T > repreCrearea unui tabel zintă intersecţia unei linii cu o coloana Minimal avem nevoie de clasele urmăîn T a b l e V i e w . Conţine următoarele toarele pentru a crea un tabel: www.todaysoftmag.ro | nr. 29/noiembrie, 2014

31


programare Componente vizuale Java FX proprietăţi: • tableColumn: instanţa TableColumn din spatele TableCell; • tableView, TableView-ul asociat cu TableCell; • tableRow, TableRow-ul în care TableCell-ul este plasat; Pentru a identifica intersecţia, TableCell conţine o proprietate de index. Cell<T> este utilizat pentru o celulă individuală într-un TableView. Fiecare celulă este asociată unui singur item de date, reprezentat de proprietatea item. O celulă este responsabilă de renderizarea itemului care rezidă în el, care este de obicei un text. O celulă permite customizarea printr-un cell factory. API-ul Cell este utilizat pentru virtualizarea controalelor precum ListView, TreeView şi TableView. Un Cell este un control etichetat, folosit pentru a renderiza o unitate întrunul dintre controalele mai sus amintite. Cell este responsabil atât pentru afişare cât şi pentru editarea item-ului. Pe lângă text, Cell poate fi reprezentată de alte controale precum CheckBox, ChoiceBox sau orice Node precum HBox, GridPane sau chiar Rectangle. Deoarece ListView, TreeView, TableView precum şi alte asemenea controale pot fi folosite pentru afişarea unei cantităţi mari de date, nu este practic să creăm un Cell pentru fiecare item din control. Fiecare celulă este reutilizată, ceea ce face acest control virtualizat. Deoarece Cell este un Contro,el are în spate un model. Skin-ul său este responsabil pentru definirea look and layoutului, în timp ce Behaviour este responsabil pentru manipularea evenimentelor şi utilizarea acelor informaţii continute pentru a modifica starea. Cell este stilizat prin CSS ca orice alt control. Pentru a specializa o celulă utilizată pentru un TableView trebuie să furnizăm o implementare a funcţiei callback cellFactory() definită pe TableView. Cell factory este apelată de platformă ori de câte ori o nouă celulă trebuie să fie creată. Implementarea unui cell factory este responsabil pentru crearea unei instante Cell și pentru configurarea necesară pentru ca Cell să reacţioneze la schimbările stării sale. Cell factory este responsabil de virtualizarea skin-urilor de container pentru a renderiza reprezentarea predefinită a unui item Cell. Spre exemplu, într-un ListView converteşte itemii la un String si apelează Labeled.setText(String). Dacă dorim să specializăm celula utilizată în ListView, trebuie să furnizăm implementarea funcţiei callback definită pe ListView. Cell factory este apelat de platformă ori de câte ori determină că o celula trebuie să fie creată. Spre exemplu, un ListView are 10 milioane de itemi. Crearea tuturor celor 10 milioane este foarte costisitoare. Aşadar, implementarea skin-ului ListView va crea doar atâtea celule cât să umple spaţiul vizual. Dacă se redimensionează spaţiul vizual, sistemul va determina dacă este nevoie de crearea altor celule. În acest caz va apela cellFactory() (dacă există vreuna) pentru a crea o implementare Cell. Dacă nu este furnizată niciuna implementarea predefinită este utilizată. ObservableList este modelul de date care stă la baza lui TableView. O instanţă TableView este definită astfel: TableView<Person> table = new TableView<>();

ObservableList<Person> teamMembers = getTeamMembers(); table.setItems(teamMembers);

O dată setată lista de itemi, TableView este automat updatată ori de câte ori lista teamMembers se modifică. Dacă lista de itemi este disponibilă înainte ca TableView să fie instanţiat, este posibil să o trimitem direct în constructor. Ceea ce mai trebuie să facem este să împărțim datele conţinute în model în una sau mai multe instanţe TableColumn. Pentru a crea un TableView cu două coloane, ce afişează firstName şi l a s t N a m e vom folosi codul: public class DataTable extends Application { TableView<Person> table = new TableView<>(); BorderPane root = new BorderPane(); VBox mainBox = new VBox(); // Container for content final

ObservableList<Person> teamMembers = FXCollections.observableArrayList( new Person(„Ion”, „Tech”), new Person(„Petre”,”Petrescu”), new Person(„Doru”, „Dorescu”), new Person(„Vasile”, „Vasilescu”)); @Override public void init() { Label centerLbl = new Label(„Persons”); centerLbl.setStyle(„-fx-font-size:16pt; -fx-font-weight:bold;”); table.setItems(teamMembers); TableColumn<Person, String> firstNameCol = new TableColumn<Person, String>(„First Name”); firstNameCol.setCellValueFactory( new PropertyValueFactory<Person,String>(„firstName”)); TableColumn<Person, String> lastNameCol = new TableColumn<Person, String>(„Last Name”); lastNameCol.setCellValueFactory( new PropertyValueFactory<Person,String> („lastName”)); table.getColumns().setAll(firstNameCol, lastNameCol); mainBox.getChildren().add(centerLbl); mainBox.getChildren().add(table);

Am definit astfel un tabel primar. Modelul de date este creat pe baza unui ObservableList. Îl putem seta direct în } TableView. Spre exemplu:

32

nr. 29/noiembrie, 2014 | www.todaysoftmag.ro


programare @Override public void start(Stage primaryStage) { primaryStage.setTitle(„Data Table”); root.setCenter(mainBox); primaryStage.setScene(new Scene(root, 400, 300)); primaryStage.show(); } public static void main(String[] args) { launch(args); } }

Prin aceasta am d e f i n it c om plet proprietăţile minime cerute pentru a crea o instanţă TableView. Nici o altă proprietate a clasei Person nu va fi afişată pentru că nu avem definite alte TableColumn. Implementarea unui cell fac tor y este responsabilă nu doar pentru crearea instanţei Cell, dar şi pentru configurarea acelei celule. În exemplul următor am creat o clasă Callback ce are ca atribute instanţe ale claselor TextAlignment şi F o r m a t cu parametrii: • S, tipul generic al lui TableView; • T, tipul conţinutului în toate celulele lui TableColumn public class FormattedTableCellFactory<S, T> implements Callback<TableColumn<S, T>, TableCell<S, T>> { private TextAlignment alignment; private Format format; public TextAlignment getAlignment() { return alignment; } public void setAlignment(TextAlignment alignment) { this.alignment = alignment; } public Format getFormat() { return format; } public void setFormat(Format format) { this.format = format; } @Override public TableCell<S, T> call(TableColumn<S, T> p) { TableCell<S, T> cell = new TableCell() { @Override public void updateItem(Object item, boolean empty) { if (item == getItem()) return;

TODAY SOFTWARE MAGAZINE super.updateItem(item, empty); if (item == null) { super.setText(null); super.setGraphic(null); } else if (format != null) { super.setText(format.format(item)); } else if (item instanceof Node) { super.setText(null); super.setGraphic((Node) item); } else { super.setText(item.toString()); super.setGraphic(null); } } }; cell.setTextAlignment(alignment); switch (alignment) { case CENTER: cell.setAlignment(Pos.CENTER); break; case RIGHT: cell.setAlignment(Pos.CENTER_RIGHT); break; default: cell.setAlignment(Pos.CENTER_LEFT); break; } return cell; } }

Respectiv: FormattedTableCellFactory<Person, String> xx = new FormattedTableCellFactory<>(); xx.setAlignment(TextAlignment.CENTER); firstNameCol.setCellFactory(xx);

Beneficiile utilizării CSS-urilor pentru a seta stilul unui tabel constau în eficienţa de timp şi eficienţa de memorie, usurinţa utilizării şi construirii bibliotecilor pentru celule, usurinţa customizării formatării de afişare. Utilizăm CSS-ul pentru a seta culorile celulei: • Fiecare celulă poate fi stilizată direct din CSS. Spre exemplu, dacă dorim să schimbăm culoarea predefinită a backgroundului fiecarei celule din TableView la alb, trebuie să utilizăm urmatorul CSS .table-cell { -fx-padding: 3 3 3 3; -fx-background-color: white; }

• Pentru a seta culorile unor celule selectate dintr-un TableView, la albastru, vom folosi urmatorul CSS: .table-cell:selected { -fx-background-color: blue; }

Pentru ca table-cell:selected să funcționeze trebuie să setam cellSelectionEnabled la true. Multe implementări de celula extind IndexedCell în loc de Cell. Aceasta permite adăugarea altor două pseudoclase: odd și even. Cu acestea putem obține colorarea alternantă a liniilor prin intermediul unui CSS de forma: .table-row-cell:odd{ -fx-background-color:lightblue; }

Vă mulţumim pentru lectură şi aşteptăm cu plăcere, ca întotdeauna, discuţiile cu toţi cei interesaţi.

www.todaysoftmag.ro | nr. 29/noiembrie, 2014

33


programare

Automatizare folosind puppet

A

utomatizarea reprezintă o componentă importantă în IT, atât în dezvoltarea software cât și în administrarea sistemelor și a infrastructurii. În cazul mediilor mari și dinamice, implementarea unei forme de automatizare reprezintă o nevoie esențială pentru a asigura un proces optim de management al resurselor.

Claudiu Demian

claudiu.demian@yardi.com Systems Administrator @ Yardi

34

nr. 29/2014 | www.todaysoftmag.ro

Puppet este un sistem de management al configurațiilor care permite administratorilor de sistem definirea stării infrastructurii IT. Orice modificare care trebuie efectuată se traduce într-o modificare în configurația puppet pentru respectiva resursa (fișier/pachet/nod/grup de noduri etc.), care este aplicată în mod automat pe toate serverele sau nodurile vizate de respectiva schimbare. Descrierea acestei stări se realizează folosind limbajul puppet, care este un limbaj declarativ. Configurația generală se găsește în fișierul /etc/puppet/manifests/ site.pp. Aici sunt referite modulele, clasele și resursele definite în /etc/puppet/modules. Puppet poate funcționa atât într-o arhitectură de tip client-server cît și standalone. În primul caz, serverul puppet poartă numele de puppetmaster. Pe mașina puppetmaster este definită configurația infrastructurii, care este mai apoi preluată de către clienți la intervale regulate de timp (modificabile de către administrator). În continuare, oferim un exemplu elocvent pentru modul de utilizare a limbajului:

/etc/puppet/modules/lighttpd/manifests/init.pp: class lighttpd { package{‘lighttpd’: ensure => installed, } file{‘/etc/lighttpd/lighttpd.conf’: content => template(‘lighttpd/ lighttpd.conf.erb’), notify => Service[‘lighttpd’]; } service{‘lighttpd’: ensure => running, enable => true, } }

Aceasta clasă prezintă o instalare a serverului web lighttpd, descriind fiecare componentă necesară. Astfel, putem identifica primele tipuri de resurse de care dispune puppet și care sunt probabil și cele mai folosite. Un modul reprezintă un set de clase, definiții, template-uri și fișiere care împreună,îndeplinesc un singur scop. De aici rezultă și prima recomandare în scrierea unui modul: trebuie să îndeplinească o singură funcționalitate. Exemplu: un server LAMP ar putea fi gestionat cu un singur modul puppet care se


programare ocupă de instalarea Apache-ului, a serverului MySQL, a PHP-ului și a oricăror alte servicii conexe din Linux (autentificare, NTP, etc.). Problema care apare este că acest modul riscă să ajungă prea mare și greu de gestionat. În plus, își pierde din portabilitate. O soluție mai elegantă este despărțirea configurațiilor în patru module separate, reducându-se astfel complexitatea fiecăruia. Clasa reprezintă un bloc de cod care poate fi instanțiat. Fiecare modul are definită în fișierul manifests/init.pp clasa principală a modulului. Instanțierea unei clase la nivelul unui nod, astfel încât să se aplice schimbările sale se realizează folosind directiva include. /etc/puppet/manifests/site.pp: node /web\d+/ { include lighttpd }

Clasele suportă moșteniri și pot fi instanțiate de mai multe ori în configurația generală puppet, care se găsește în fișierul site.pp. De asemenea, clasele pot fi parametrizate. În cadrul unei clase definim starea dorită a sistemului folosind resurse de tipuri predefinite sau definite de administrator. În exemplul anterior, putem identifica următoarele resurse: pachetul lighttpd, fișierul /etc/lighttpd/lighttpd.conf și serviciul lighttpd. Fiecare resursă are un tip (package, file și respectiv service), un nume și unul sau mai multe atribute (ensure, content, notify, etc.). Puppet dispune de un număr satisfăcător de tipuri predefinite pentru resurse, foarte bine documentate în documentația lor oficială. O altă funcționalitate utilă a puppet-ului este aceea de template-ing. Folosind limbajul ERB (Embedded Ruby), puppet oferă posibilitatea de a genera fișiere în funcție de parametri oferiți de administrator la instanțierea clasei sau de starea sistemului, folosind fact-uri. Împreună cu puppet-ul, pe sistem se instalează și un utilitar numit facter. Acesta aduna informații despre sistem și le expune ca fact-uri (exemplu: ip_address, fqdn, operatingsystem etc.). Aceasta funcționalitate poate fi extinsă cu fact-uri definite de administrator care, la rândul lor, pot fi utilizate în template-uri. Datorită faptului că modulele sunt de sine stătătoare și refolosibile, puppet oferă serviciul PuppetForge prin care utilizatorii

TODAY SOFTWARE MAGAZINE pot oferi gratuit module realizate de ei și pot descăra modulele altor utilizatori. Pe lângă funcționalitatea de bază, aceea de a descrie starea sistemului, puppet poate fi extins pentru a aduna statistici despre infrastructură. Aceasta se realizează folosind serviciul puppetdb. Acesta are în spate o bază de date în care se agregă fact-urile tuturor sistemelor din infrastructură. Aceste informații pot fi utilizate ulterior în cadrul claselor pentru a genera dinamic resurse. Un exemplu de utilizare al puppetdb-ului îl reprezintă un modul de gestionare a unei instanțe de Nagios. Acesta, folosind informații despre sisteme din puppetdb (hostname, ip, din care hostgroup-uri face parte), generează automat câte un fișier de configurare pentru fiecare nou host introdus în infrastructură. Administratorului îi rămâne doar sarcina de a defini comenzi, check-uri și hostgroup-uri. O altă posibilitate de a extinde puppet-ul este folosind puppet-dashboard. Acest serviciu oferă o interfață web prin care ni se oferă mai multe informații și statistici despre infrastructură. În primul rând, fiecare client trimite către serverul pe care rulează puppet-dashboard un raport despre ultima rulare a clientului: dacă a rulat cu succes, dacă s-a modificat ceva, ce a crăpat etc. Putem vizualiza aceste rapoarte în aplicație, precum și statistici generate din aceste rapoarte. De asemenea, puppet-dashboard ne oferă și un serviciu numit Inventory Service prin care să putem interoga starea sistemului, tot în funcție de fact-uri. Dacă folosind puppetdb putem folosi aceste informații în interiorul claselor, folosind Inventory Service avem acces la ele din exterior. Folosind API-ul lor, putem construi unelte/aplicații care să folosească aceste informații. Acest articol s-a dorit a fi o introducere în puppet pentru cei care încă nu l-au introdus în mediul lor. Flexibilitatea și potențialul de a ușura munca administratoriloor pe care puppet le oferă pot reprezenta argumente convingătoare în favoarea adoptării acestuia. Nu susținem că puppet reprezintă soluția tuturor problemelor sau că este cel mai bun sistem de gestiune a configurațiior- mai sunt chef, cfengine sau alte sisteme comerciale- dar susținem ideea că orice administrator de sistem ar trebui să folosească un astfel de sistem în infrastructura pe care o gestionează.

Objective C

jobs-cluj@yardi.com Yardi Romania

www.todaysoftmag.ro | nr. 29/noiembrie, 2014

35


programare

Cod curat – limitări, gestionarea erorilor şi a obiectelor

Î

n ultimele trei luni am încercat să scriu despre diferite subiecte prezentate în Clean Code. Chiar dacă acesta este al patrulea articol pe această temă, am sentimentul că mai există încă multe probleme despre care ar trebui să discutăm atunci când vorbim despre un cod curat şi bine scris.

Am putea spune că această carte, „Clean Code” scrisă de Robert C. Martin, a stabilit standardele în industria noastră din această perspectivă. Este biblia dezvoltatorilor şi de multe ori este utilizată drept „legea” codului. Nu vreau să intru mai adânc în acest subiect, dar promit că într-o zi voi vorbi în detaliu despre motivele pentru care ar trebui să utilizăm sau nu această carte ca un reper important al dezvoltatorilor .

Subiectul de azi

În acest articol, analiza va fi orientată asupra obiectelor şi structurii datelor XXXX. Vom trece de la formatul codului la cum ar trebui să arate codul şi la cum ar trebui să implementăm funcţionalităţi diferite.

Obiecte şi structura datelor

Cred că ne amintim cu toţii cursurile de la Universitate, când profesorii încercau să ne explice că ar trebui să expunem dintr-o clasă numai informaţiile de care au nevoie ceilalţi. Dar, din cauză că limbajul de programare actual ne oferă atât de uşor posibilitatea de a expune datele în afara unei clase, adesea sfârşim prin a avea o mulţime de date private dezvăluite sistemului. Unul dintre colegii mei s-a referit la getter /setter drept dispozitivul diavolului. Este amuzant, dar uneori este adevărat. Nu este atât de important dacă utilizăm un getter / setter al unei metode. Cel mai important lucru este să expunem datele într-un mod abstract, care să nu dezvăluie detaliile de implementare. De exemplu, dacă este nevoie să dezvăluim o informaţie legată de greutatea unei

36

persoane, noi putem folosi un getter sau o metodă simplă. Ambele soluţii sunt bune atâta timp cât nu oferim niciun fel de detalii de implementare. public class Person { public double WeightInKg { ... } // OR public double GetWeightInKg() { ... } }

cadrul metodei, • Metode din obiectele care sunt trimise drept argumente, • Metode din obiectele instanțiate în clasa în care metoda este implementată

Hibride

Structurile hibride sunt obiecte care conţin de asemenea şi structuri de date. Problema cu acestea este că e destul de greu să le adaugi funcţionalitate nouă sau date noi. Aceasta creează confuzie deoarece nu ştii ce ar trebui să adaugi acolo. În afara acestei clase, nu ştii cum arată Poate indica faptul că scopul acelei entităţi aceste date sau care este formatul lor. Dacă nu este clar şi nici dacă este necesară proam adăuga getters şi setters peste tot, care tejarea datelor. ar fi valoarea încapsulării? … ZERO. Atunci când începeți să scrieți cod, e Obiect cu structură de date important să țineți cont de faptul că există Sunt utilizate mult când este nevoie să o mare diferenţă între structurile de date stocăm datele undeva (DB) sau să trimişi obiecte. Cel mai bun lucru pe care puteţi tem date prin fir. Acestea se numesc DTO să îl faceţi este să păstraţi o linie clară între şi de obicei nu au nici un fel de funcţionaacestea două. litate. Scopul lor este bun, dar ar trebui să Structura datelor expune numai reţinem că trebuie să le utilizăm numai în datele, fără nici un fel de funcţionalitate, scopul pentru care eu fost create. Altfel, o în contrast cu obiectele, care expun numai schimbare în structura de date va atrage funcţionalitatea. Bineînţeles, noi trebuie să multe schimbări în codul nostru. ţinem minte că echilibrul dintre cele două Deasupra DTO avem Active Records, este greu de păstrat. Vei avea nevoie de o care sunt similare cu DTO-urile, dar au structură a datelor care expune funcţiona- metode utilizate pentru navigare, cum litatea. Trebuie doar să ai în minte datele ar fi Fiind, Save, Delete, Send şi aşa mai pe care doreşti să le expui şi unde ar trebui departe. Această funcţionalitate este de adăugată implementarea funcţionalităţii. obicei oferită de DB. Problema cu ele este Atunci când implementezi o funcţi- că dezvoltatorii le folosesc de obicei drept onalitate, ar trebui să vorbeşti numai cu obiecte şi le adaugă noi funcţionalităţi. De prieteni şi niciodată cu străini (Legea lui aceea ajungem să avem un Active Record Demeter). Acest lucru înseamnă că o func- care are logică business în interior. ţie ar trebui să acceseze / apeleze numai: Ce ar trebui să facem? Să creăm Active • Metode din clasa în care este Records care stochează numai structura de implementată, date şi să utilizăm obiecte separate pentru • Metode din obiectele create în a stoca regulile de business.

nr. 29/noiembrie, 2014 | www.todaysoftmag.ro


programare

TODAY SOFTWARE MAGAZINE Este important să reţinem că funcţia n care naşte o aşteptare ar trebui să furnizeze suficient conţinut despre sursa erorii. Ar trebui să încercăm să definim excepţiile specifice pe baza nevoilor apelantului. De ce? Pentru că scopul lor principal este să îl ajute pe apelant să găsească sursa problemelor.

Nul

Gestionarea erorilor

De ce trebuie să discutăm despre gestionarea erorilor? Deoarece, chiar dacă scopul principal al codului nu este gestionarea erorilor, ci funcţionalitatea care este implementată, ajungem să avem cod în care poate fi văzută numai gestionarea erorilor şi ne este aproape imposibil să găsim detaliile despre funcţionalitatea reală care este expusă acolo. Pentru a evita aceste situaţii, există câteva lucruri mărunte care pot fi făcute la nivelul codului. Mai întâi de toate, evitaţi să folosiţi coduri de eroare. Acest lucru adaugă mult cod metodelor voastre şi ascunde informaţia după excepţia în sine. De asemenea, cel care apelează trebuie să verifice de fiecare dată codul raportat şi să implementeze un manipulator special pentru diferitele coduri de eroare. Excepţia poate fi utilizată cu succes în blocuri try/catch care pot fi văzute drept blocuri de „tranzacţie”, unde te aştepţi la excepţii şi eşti pregătit să le gestionezi. De asemenea, există o separare clară între funcţionalitate şi gestionarea excepţiei. try { // Functionality } catch (FantaException nullEx) { ... } catch (CokeException nullEx) { ... }

definim un adaptor care să ne izoleze de biblioteca terţei părţi. Vom avea cazuri în care va trebui să mimăm comportamentul sau când API-ul terţei părţi se va modifica. În acest caz, nu dorim să creăm efectul de domino în întregul nostru cod. Adaptorul nu ar trebui să expună 1:1 funcţionalitatea expusă de partea terţă, ci să expună numai funcţionalitatea de care avem nevoie, nu cea care este oferită. Toate detaliile implementate ar trebui să fie puse chiar în adaptor.

Concluzie

Ar mai fi atât de multe lucruri de spus despre subiectele atinse în acest articol. Iată trei lucruri pe care aş dori să le ţineţi minte din acest articol: • Diferenţa dintre un obiect şi o structură de date. • Niciodată să nu returnaţi un NUL sau să îl trimiteţi mai departe unei alte metode. • Un adaptor pentru o limită ar trebui să expună funcţionalitatea de care aveţi nevoie, nu pe cea expusă de terţa parte.

Nu ar trebui niciodată să faci două lucruri: • Să pasezi NULL-ul unei alte funcţii, deoarece funcţia va trebui să verifice dacă este nul sau nu şi să gestioneze această situaţie. De fapt, tu pasezi proDe asemenea: Da! Fiecare dintre noi ar blema unei alte funcţii, dar fără a o trebui să citească „Clean Code”. rezolva. • Să returnezi un NULL. Apelantul va fi nevoit să verifice rezultatul, dacă este nul sau nu şi să adauge un manipulator specific. Mai bine ar fi să returnezi o excepţie care poate fi arhivată şi Radu Vunvulea Radu.Vunvulea@iquestgroup.com gestionată de către apelant.

Limitări

Senior Software Engineer @iQuest

Noi suntem înconjuraţi de frontiere. Atunci când utilizăm biblioteci ale unor părţi terţe, cod implementat de alte echipe, nucleu API şi aşa mai departe. În toate aceste situaţii avem trasată o limită, dar şi un set de funcţii pe care le putem utiliza pentru a trece peste ea. Este important de ştiut cum să păstrăm aceste hotare curate şi utile. Primul lucru pe care ar trebui să îl facem când este nevoie să utilizăm o resursă externă este să ne rezervăm timp pentru a învăţa despre ea şi a o explora. Noi trebuie să descoperim hotarul şi cum putem să gestionăm şi să utilizăm funcţionalitatea expusă de acesta. Cea mai simplă metodă de a învăţa este să scriem teste care validează scenarii diferite. Astfel, putem fi siguri 100% că diferitele fluxuri vor funcţiona şi că ştim cum să le gestionăm. De asemenea, vom putea valida şi faptul că partea terţă ne oferă ceea ce ne trebuie cu adevărat. Atunci când avem părţi terţe externe care expun limitări este obligatoriu să www.todaysoftmag.ro | nr. 29/noiembrie, 2014

37


management

Sfaturi străvechi pentru un Product Owner – Sun Tzu “Arta războiului”

U

nul dintre cele mai vechi şi folosite tratate militare este “Arta războiului”. Cartea a fost scrisă în jurul anului 500 î.e.n. de către un general de la curtea regelui ţinutului Wu şi prezintă un set de treisprezece capitole cu precepte despre tactică şi strategie destinate comandanţilor de armate. Am citit cartea cu destul de multă vreme în urmă, dar urmărind tendinţele actuale referitoare la tehnici de comunicare şi management, am decis să o recitesc şi să împărtăşesc câteva dintre sfaturile străvechi ale lui Sun Tzu aplicabile unei poziţii moderne precum aceea de Product Owner.

Argumentaţie

Liviu Ştefăniţă Baiu

liviu.baiu@endava.com Senior Business Consultant @ Endava

Aşa cum bine ştim, rolul de Product Owner este specific metodologiei Agile SCRUM. Acest rol poate fi ocupat de o singură persoană care, conform Ghidului Scrum, este responsabilă de: • formularea clară a cerinţelor din “product backlog”. • ordonarea în funcţie de prioritate a cerinţelor din “product backlog”. • optimizarea valorii adăugate a acestor cerinţe. • a s i g u r a r e a c o n d i ţ i i l o r d e transparență şi claritate a cerinţelor. • prezentarea cerinţelor la care echipa SCRUM va lucra în perioada următoare. Dacă aplicăm un joc de cuvinte pentru lista de mai sus, prin înlocuirea termenului cerinţe cu ordine (militare) și înlocuirea sintagmei echipa SCRUM cu armată vom obţine următoarele: • formularea clară a ordinelor (militare). • ordonarea în funcţie de prioritate a ordinelor (militare). • optimizarea valorii adăugate a acestor ordinelor (militare).

38

nr. 29/2014 | www.todaysoftmag.ro

• a s i g u r a r e a c o n d i ţ i i l o r d e transparență şi claritate a ordinelor (militare). • prezentarea ordinelor (militare) pe care armata le va executa în perioada următoare.

Întrebări

Transformarea de mai sus conduce, în mod natural, către următoarele întrebări: 1. Putem considera că rolul de Product Owner poate fi asimilat celui de comandant de armată? 2. Poate fi considerată “Arta războiului” un ghid pentru un Product Owner? Părerea mea este ca răspunsul pentru ambele întrebări este DA. În cele ce urmează voi oferi si raţionamentul pe baza căruia am ajuns la acest răspuns.

Product Owner - comandant de armată

Voi încerca să argumentez de ce consider că rolul de Product Owner şi cel de comandant de armată sunt similare. Un Product Owner trebuie să aducă la viaţă viziunea sa despre un produs, să atingă scopul proiectului prin împărţirea acestuia într-un set de cerinţe clare, ordonate după prioritate. Fiecare dintre cerinţe trebuie să aducă valoare prin sine şi trebuie să permită gruparea în iteraţii, care să aibă un rezultat funcţional şi palpabil. Conceptele cheie prezentate mai sus sunt: Claritate, Scop, Cerinţe, Prioritate, Iteraţie şi Rezultat (funcţional şi palpabil).


management De asemenea, un Product Owner este singurul responsabil pentru prezentarea viziunii către echipă precum şi pentru asigurarea unei înțelegeri comune a viziunii şi a produsului în rândul tuturor celor implicaţi, atât membri ai echipei cât şi responsabilii de produs din exteriorul echipei. Succesul unui proiect depinde de modul în care Product Owner-ul reuşeşte să menţină toate aceste persoane concentrate asupra scopului proiectului, dar şi de modul în care Product Owner-ul reuşeşte să canalizeze eforturile tuturor către livrarea cerinţelor care aduc valoarea cea mai mare produsului final. Rolul de Product Owner implică şi responsabilitatea de a fi în permanenţă informat despre schimbările care apar pe piaţa pe care urmează să fie lansat produsul dar și despre modul în care evoluează comportamentul grupului ţintă de consumatori. De asemenea, este important şi să reacţioneze la acestea pentru ca produsul să se poată livra în cel mai scurt timp. Mediul de lucru al echipei este o altă responsabilitate a Product Owner-ului, pentru ca echipa să aibă posibilitatea de a-şi desfăşura activitatea în condiţii optime. Această responsabilitate este indirectă şi este împărţită între Product Owner și Scrum Master. Aria de responsabilitate a Product Owner-ului se referă la alinierea echipei SCRUM la mediul şi procesele interne ale organizaţiei. Toate cele de mai sus trebuie privite prin prisma livrării produsului într-un mod eficient din punct de vedere al costurilor. Un Product Owner trebuie să compare valoarea pe care o aduc funcţionalităţile care se implementează cu suma costurilor implicate. Acesta este unul dintre cei mai importanţi indicatori care intervin în stabilirea priorităţii unei cerinţe, dar şi în evaluarea maturităţii și succesului proiectului. În “Arta războiului”, generalul este responsabil pentru obţinerea victoriei (Scop şi Rezultat). Pentru a atinge acest rezultat, generalul are nevoie de un plan clar, de metode pentru a menţine moralul trupelor şi dedicaţia acestora pentru obţinerea victoriei, de resurse de calitate şi de logistică eficientă, dar şi de disciplină si comunicare. Generalul este singurul care poate da ordine (cerințe) armatei şi trebuie să fie la curent cu mişcările de trupe ale inamicului pentru a putea să decidă următoarele manevre ale armatei sale (Prioritatea și iteraţiile). Sun Tzu prezintă in detaliu “factorii”

TODAY SOFTWARE MAGAZINE

care ar trebui luaţi în considerare la întocmirea planurilor de luptă: • Influenţă Morală, descrisă astfel: “… înţeleg ceea ce determină armonia dintre popor şi conducătorii lui…” • Condiţii Meteorologice “…înţeleg jocul reciproc al forţelor naturii... de asemenea, conducerea operaţiunilor militare în acord cu anotimpurile…” • Teren “…înţeleg distanţele, uşurinţa sau dificultatea de a le străbate, lărgimea sau îngustimea terenului…” • Comandament - Autoritate “…înţeleg calităţile de înţelepciune, de dreptate, de omenie, de curaj şi de severitate ale generalului.” • Doctrină “…înţeleg organizarea, autoritatea, promovarea ofiţerilor la rangul cuvenit, siguranţa căilor de aprovizionare şi grija de a face faţă nevoilor esenţiale ale armatei.” Sunt vizibile asemănările dintre cele două roluri. Desigur, nici unul dintre factorii menţionaţi mai sus nu se aplică ad litteram, dar prin extrapolarea ideilor prezentate de Sun Tzu, un cititor avizat va ajunge relativ uşor la termeni cum ar fi Leadership, Market Conditions, Market

Trends, Consumer Behavior, Methodology sau Processes. În opinia mea, nu ar trebui omise alte două calităţi care trebuie să fie proprii pentru ambele roluri, atât cel de Product Owner cât și cel de comandant militar – Claritatea și Onestitatea în relaţia cu echipa SCRUM / armata.

“Arta razboiului” – un ghid pentru Product Owner

Cea de-a doua întrebare (“Poate fi considerată “Arta războiului” un ghid pentru un Product Owner?”), are acelaşi răspuns – Da. Iar argumentele sunt prezentate în cele ce urmează. În cartea sa, Sun Tzu a prezentat mai mult decât rolul şi responsabilităţile comandantului armatei, oferind detalii despre ce semnifică victoria, care sunt strategiile şi tacticile pentru a o obţine, cum se pot folosi în mod eficient diferitele categorii de armate. De asemenea, a prezentat importanţa trupelor de informaţii şi spionaj, care joacă un rol deosebit de important în adaptarea strategiei în funcţie de manevrele inamicului, adică in capacitatea de a reacţiona la schimbare. Un alt element important pentru un

www.todaysoftmag.ro | nr. 29/noiembrie, 2014

39


management Sfaturi străvechi pentru un Product Owner – Sun Tzu “Arta războiului” general este capacitatea de a obţine maximum de rezultate menţinând costurile la minimum. Conform lui Sun Tzu, aceasta se poate realiza prin folosirea resurselor inamicului – în special hrana – al cărei cost creşte pe măsură ce armata înaintează în teritoriul inamic. Un alt precept specifică modul în care mişcările de trupe trebuie planificate în funcţie de viteza de deplasare a diferitelor categorii de armate (infanterie, cavalerie, care de luptă), precum şi de importanţa sincronizării manevrelor (aceasta poate fi echivalată cu importanţa calculării indicatorului velocity pentru echipele de SCRUM şi a folosirii judicioase a resurselor). O calitate importantă a unui general, aşa cum o prezintă Sun Tzu, este aceea de a identifica, măsura și evalua permanent schimbările care survin în teatrul de război și de a reacţiona rapid la acestea, adaptând în permanenţă planurile tactice. Acesta este cel mai important argument pentru răspunsul meu. Evaluarea permanentă a teatrului de război este descrisă astfel de Sun Tzu:

“10. Atunci când elaborezi un plan de război, compară următoarele elemente, apreciindu-le cu cea mai mare minuţiozitate. 11. Dacă imi spuneţi cine e suveranul cu cea mai mare înrâurire morală, comandantul şef cel mai competent, armata care are de partea sa avantajul condiţiilor meteorologice şi ale terenului, şi în sânul căreia regulamentele sunt cel mai riguros respectate şi ordinele cel mai bine executate, îmi arătaţi care sunt trupele cele mai puternice. 12. Cine are ofiţerii şi oamenii cei mai bine pregătiţi? 13. Şi cine atribuie recompensele şi pedepsele cu cel mai mare discernământ? 14. Voi fi în măsură să prevăd de partea cui va fi victoria şi de partea cui înfrângerea.”

moralul echipei şi mediul de lucru. De asemenea, trebuie să comunice în permanenţă cu echipa şi cu responsabilii de produs din exteriorul echipei, pentru a menţine un nivel ridicat de informare despre progresele care se fac în realizarea produsului final. În încheiere, sper că, prin intermediul paralelei efectuate în acest articol, am reuşit să vă trezesc interesul asupra acestei cărţi ale cărei pagini conţin sfaturi aplicabile în diferite domenii și să vă conving de actualitatea unor principii ale străvechii înțelepciuni orientale.

Bibliografie

Arta războiului - Sun Tzu, Editura ANTET XX PRESS, 1993

În zilele noastre, un Product Owner trebuie să fie în contact permanent cu piaţa pe care va fi lansat produsul, dedicat metodologiei folosite (Agile SCRUM), să monitorizeze în permanenţă procesele,

MobOS 2nd edition will consists of a 2 days-conference, first day dedicated to mobile technology presentations and open panel talks, while the second day will host 4 workshops, iOS and Andoid related, for both beginners and advanced developers. 10 presentations, 4 workshops, 6 international speakers and 4 local speakers, 2 full-days in Cluj Napoca – to engage in the world of Mobile technology development. We’re looking forward to meeting you there! 2 key speakers for each track will deliver on the second day 2 workshops When: 20 – 21 November 2014 Where: Golden Tulip Ana Dome Hotel

40

nr. 29/noiembrie, 2014 | www.todaysoftmag.ro


programare

TODAY SOFTWARE MAGAZINE

Java vs. Objective-C

Î

n rândurile acestui articol îmi propun să realizez o scurtă introducere în mediul de dezvoltare iOS, urmărind în special caracteristicile limbajului de programare Objective-C. Voi viza elementele definitorii ale limbajului, precum și detalii privind cel mai utilizat framework în acest context, Cocoa-Touch. Concluziile exprimate în acest articol sunt din punctul de vedere al unui

programator Java. Veți putea identifica multe comparații cu acest limbaj de programare. Nu îmi propun ca acest articol să fie un tutorial detaliat de Objective-C, ci o expunere critică a unor caracteristici ale acestui limbaj de programare. Pentru detalii puteți utiliza documentația oficială Apple, disponibilă la adresa https://developer.apple. com/, precum și alte tutoriale disponibile pe Internet. Câteva dintre punctele atinse pe parcursul articolului vizează modalitatea de implementare a principiilor OOP în Objective-C, expresiile lambda și o paralelă a gestionării memoriei în Java și Objective-C. Probabil primul lucru la care ne duce cu gândul Objective-C este sintaxa ”ciudată” a acestui limbaj de programare. Exemplul de cod de mai jos surprinde declararea unei metode, instanțierea unui obiect și apelul metodei anterior definite:

NSNumber *num = [NSNumber numberWithUnsignedInt: 7];

Acest tip de instanțiere implementează practic DesignPattern-ul Abstract Factory. Clasa abstractă NSNumber returnează, în funcție de metoda de instanțiere apelată, o instanță a uneia dintre următoarele clase: • NSCFNumber – pentru toate tipurile numerice și pentru tipul caracter; • NSBooleanNumber – pentru tipul primitiv boolean.

Ulterior, în cod, apelând metode precum intValue, booleanValue etc., vor fi create obiecte concrete (sunt, de fapt, tipuri primitive): fie prin returnarea valorii cu care a fost instanțiat factory-ul – dacă este stocat același tip cu cel cerut de apelul metodei -, fie convertind valoarea la tipul solicitat. Deși Objective-C nu implementează auto-(un)boxing, putem identifica două avantaje -(void) setNumerator:(int) numerator andDenominator: ale acestei abordări: (int) denominator{ • subclasele NSNumber cuprind metode utile de conversie self.numerator = numerator; între tipurile de date (metode asemănătoare sunt implementate self.denominator = denominator; } și de clasele wrapper din Java); ... • în acest fel vor fi utilizate preponderent tipurile de date MSGFraction *fraction = [[MSGFraction alloc] init]; [fraction setNumerator: 3 andDenominator: 7]; primitive , fiind instanțiat un obiect wrapper doar în situațiile necesare. De exemplu, pentru stocarea datelor într-o listă. În Acum, după ce am făcut cunoștință cu Objective-C, putem Java, deși conversia de la tipuri primitive la obiecte wrapper vorbi despre tipurile de date ale acestui limbaj de programare. este facilă, folosirea celei de-a doua opțiuni poate introduce Objective-C este o extensie a limbajului C, fiind astfel moștenite probleme de performanță semnificative. toate tipurile de date existente în C: arrays, pointeri, structuri etc. .Poate singura diferență importantă în ceea ce privește tipurile de În ceea ce privește aplicarea principiilor OOP în Objective-C, date numerice din Objective-C față de Java sunt tipurile unsigned, păstrate în cazul primului limbaj menționat. Spre deosebire de prima diferență față de Java poate fi identificată în cazul definiJava, unde există câte o clasă wrapper pentru fiecare tip nume- rii unei clase. Dacă în Java o clasă este definită într-un singur ric primitiv, aici gestionarea se realizează prin intermediul unei fișier, având extensia .java, în Objective-C o clasă constă din două singure clase, NSNumber. Această clasă cuprinde metode utile componente: • componenta publică, denumită interfață, cuprinde metode instanțiere specifice pentru fiecare tip de date. De exemplu, dele publice ale clasei. Trebuie menționat faptul că interfața din pentru instanțierea unui obiect ce reprezintă un întreg unsigned, Objective-C nu este echivalentă cu cea din Java. Aici trebuie poate fi utilizată una dintre următoarele construcții: definite atât metodele instanței, cât și metodele clasei (metoNSNumber *num = [[NSNumber alloc] initWithUnsigneddele statice din Java). O posibilitate pe care eu o consider utilă Int: 7]; este aceea a declarării câmpurilor în interfață. Dacă aceste sau variabile sunt marcate cu identificatorul @property atunci vor www.todaysoftmag.ro | nr. 29/noiembrie, 2014

41


programare Java vs. Objective-C fi generate automat metode getter și setter, în funcție de parametrii specificați. În Java, o astfel de abordare este posibilă cu ajutorul framework-ului Lombok, însă acesta necesită un compilator special;

#import <Foundation/Foundation.h> @interface MSGFraction : NSObject @property (nonatomic) int numerator; @property (nonatomic) int denominator; -(void) setNumerator:(int) numerator andDenominator:(int) denominator; @end

• componenta privată a unei clase cuprinde implementarea propriu-zisă a metodelor declarate în interfață. Echivalentul unei interfețe din Java este denumit în Objective-C protocol și se definește cu ajutorul identificatorului @protocol. Un lucru merită însă amintit în cazul protocoalelor din Objective-C: se realizează distincția între metodele ce vor trebui implementate în mod obligatoriu într-o clasă ce se conformează unui protocol și metodele opționale (definite prin intermediul identificatorilor @required, respectiv @optional). O utilitate majoră a acestei posibilități oferite de Objective-C se regăsește în cadrul Design Pattern-ului Delegate, acesta fiind un pattern de bază în dezvoltarea iOS. Cel mai adesea, pentru a oferi posibilitatea ca o clasă să nu implementeze o anumită metodă, în Java este folosit un adapter, adică o clasă ce oferă o implementare standard pentru toate metodele dintr-o interfață. În exemplul de mai jos a fost definit un adapter pentru MouseListener. Ulterior, în proiect, va fi utilizată această nouă clasă și vor fi suprascrise doar metodele de care este nevoie, cel mai adesea, doar mouseClicked.

metodă) – oferă o mai bună consistență și lizibilitate a codului; • au acces la variabilele de context – definite anterior. Astfel nu este nevoie ca aceste variabile să fie trimise ca parametri pentru o metodă; • sunt optimizate pentru execuția în paralel; • execuția unui bloc e mult mai rapidă decât cea a unei metode (nu este nevoie de lookup). Cum aceste structuri de cod sunt foarte des utilizate în framework-ul Cocoa Touch, au fost incluse și în cadrul unui Design Pattern: Completion Handler. În acest context blocurile sunt utilizate asemeni unei funcții callback: la terminarea unei acțiuni va fi apelat un bloc. Voi realiza în cele ce urmează o analiză a claselor specifice colecțiilor de date din Objective-C și Java. În Objective-C, fiecare clasă destinată stocării datelor are două variante: • immutable – conținutul unui obiect este stabilit la instanțiere și nu poate fi modificat apoi; • mutable – extinde tipul immutable și conține metode pentru modificare/adăugare/ștergere; Cu ajutorul unor metode utile obținerea unui obiect mutable dintr-unul immutable (sau invers) se realizează foarte ușor: NSArray *immutableArray = @{„A”, „B”, „C”}; NSMutableArray *mutableArray = [[NSMutableArray alloc] init]; [mutableArray addObjectsFromArray: immutableArray];

Folosirea unor obiecte immutable are o utilitate foarte importantă în programare, printre avantajele acestei abordări numărându-se: public class MouseListenerAdapter implements • stocare eficientă în memorie, întrucât nu va fi alocat mai MouseListener{ public void mouseClicked(MouseEvent e){} mult spațiu decât este necesar; public void mouseEntered(MouseEvent e){} • la trimiterea unui obiect ca parametru pentru o metodă public void mouseExited(MouseEvent e){} public void mousePressed(MouseEvent e){} putem fi siguri că acesta nu va fi modificat; public void mouseReleased(MouseEvent e){} • cea mai eficientă metodă de implementare a unui meca} nism thread-safe este folosind obiecte immutable. Dacă în Java de-abia în ultima versiune au fost introduse expresiile lambda, corespondentul din Objective-C, denumit În Java nu există astfel de colecții. Singura posibilitate este bloc, poate fi utilizat începând cu versiunea 4 a iOS. Un bloc este o structură de cod manipulată asemeni unei funcții C, ce este utilizarea java.util.Collections pentru a crea un wrapper al unei folosită cel mai adesea pentru apeluri de tip callback. Un bloc colecții trimise ca parametru. Colecția returnată va arunca o reprezintă de fapt un pointer la o funcție C. Blocurile cuprind excepție în cazul în care se apelează o metodă de modificare a liscod nativ C, fiind gestionate de un compilator extins pentru a tei (de exemplu, add()). Dar, dacă este modificată colecția inițială, recunoaște astfel de structuri, iar Apple chiar militează pentru aceste modificări vor fi resimțite și în cea wrapper, întrucât reține doar o referință la cealaltă. În acest moment ar fi foarte dificilă acceptarea în specificația standard de C a blocurilor. adăugarea unei astfel de posibilități în Java: ar implica modificaint multiplier = 7; rea întregului framework de colecții sau crearea unuia nou. int (^myBlock)(int) = ^(int num){ return num*multiplier; }; O problemă importantă în cazul oricărui limbaj de progra... mare o reprezintă posibilitățile pe care acesta le pune la dispoziție myBlock(5); pentru gestionarea memoriei. Chiar dacă pentru a lucra în iOS Asemeni unei funcții, un bloc poate primi parametri. În plus , are acces la variabilele anterior definite în cod, dar nu le nu mai este necesară înțelegerea tuturor conceptelor prezentate poate modifica. Acesta realizează practic un snapshot cu valorile în această parte, o analiză mai profundă ne va ajuta să înțelegem din momentul declarării și dacă după declararea blocului acea mecanismele utilizate pentru gestionarea memoriei în iOS. variabilă a fost modificată, va fi înregistrată totuși valoarea din Fiecare obiect din Objective-C conține un câmp (denumit refemomentul declarării. Dacă la definirea unei variabile se utilizează rence count) ce păstrează numărul de referințe active către acesta. identificatorul __block , atunci acea variabilă poate fi și modificată Apelul metodei retain determină incrementarea acestui număr și în interiorul unui bloc. Sunt apelate exact ca o funcție C și pot fi returnarea unei referințe la obiect. Când nu mai este nevoie de asignate unei variabile – pot fi apelate metode specifice ale obiec- un obiect se apelează release, ceea ce determină decrementarea reference count. Atunci când counter-ul a ajuns la zero, se apelează telor precum: copy, retain, etc. . imediat metoda dealloc, echivalentă a metodei finalize() din Java, Dintre avantajele utilizării blocurilor menționăm: • sunt definite acolo unde este nevoie de ele, chiar și în inte- cu deosebirea că dealloc va fi cu siguranță apelată și putem deterriorul unei metode (nu mai este nevoie să fie definită o nouă mina chiar și momentul. Cu alte cuvinte, vom ști încă din timpul

42

nr. 29/noiembrie, 2014 | www.todaysoftmag.ro


TODAY SOFTWARE MAGAZINE compilării cât timp va exista un obiect. Începând cu iOS 5 a fost introdus un sistem de management al memoriei denumit Automatic Reference Counting (ARC). Logica utilizată este identică cu cea anterior prezentată, cu deosebirea că nu mai intră în atribuțiile programatorului. Compilatorul este echipat cu un analizor al codului sursă pentru a determina unde începe folosirea unui obiect, precum și când acest obiect nu mai este utilizat. Altfel spus, apelul metodelor retain și release va fi realizat automat. Putem vedea astfel cum o constrângere a mediului (resursele limitate ale mediului mobil) poate conduce la găsirea unei soluții mai eficiente. Inițial, pentru OS era utilizat un Garbage Collector (GC). Începând cu OS X 10.8 (Mountain Lion) această abordare este deprecated, optânduse și în acest caz pentru utilizarea ARC. Principalul avantaj al ARC este dat de identificarea rapidă și eficientă, încă de la compilare, a garbage-ului. În acest fel nu este nevoie ca un proces adițional, consumator de resurse, să ruleze constant pentru identificarea resurselor ce pot fi reutilizate. Există și câteva dezavantaje importante ale ARC, care nu cred însă, că pot înclina balanța în favoarea GC: • pentru fiecare obiect va fi stocat un câmp suplimentar, crescând astfel spațiul de memorie cu cel puțin un byte per obiect; • asignarea și eliminarea referinței unui obiect aduc o problemă de performanță datorită nevoii de a realiza o operație suplimentară; • cea mai importantă problemă este detectarea retain cycle (atunci când două obiecte se referențiază reciproc, dar nu sunt referențiate și din altă parte a codului). Pentru a rezolva această

problemă au fost introduse două tipuri de referințe: strong și weak. O referință strong determină incrementarea counter-ului intern, pe când una weak, nu. Dacă nu există nicio referință strong la un obiect, acesta este considerat garbage. În Java nu există această problemă. GC determină practic referințele active, cele la care se poate ajunge pornind de la rădăcina heap-ului. Toate celelalte obiecte vor fi eliminate din heap. Am văzut așadar că în Objective-C clasa wrapper a tipurilor primitive implementează Design Pattern-ul Abstract Factory și că lipsa auto-(un)boxing nu trebuie neapărat privită ca un impediment. Am putut observa, de asemenea, faptul că framework-ul de colecții din Objective-C este mai rafinat decât cel din Java. Pe de altă parte, în Objective-C nu există tipuri generice (deși, ar argumenta unii, implementarea din Java este la rândul ei una problematică). În final, am realizat o comparație a modalităților de gestionare a memoriei în cele două limbaje de programare, concluzionând că la acest capitol, Objective-C propune o metodă mai simplă și mai eficientă decât GC.

Bogdan-Alexandru Vlăduț Bogdan-Alexandru.Vladut@ msg-systems.com Java Developer @ msg systems România

www.todaysoftmag.ro | nr. 29/noiembrie, 2014

43


testare

management

Eliminarea diferențelor dintre business și tehnologie în zona testării automate

U

na dintre cele mai mari provocări ale echipelor Agile este o planificare a activităților de testare care să respecte următoarele condiții: • Echipa testează exact ce Produc Owner-ul a menționat în criteriile de acceptanță. • Ține pasul cu specificațiile care se schimbă continuu. • Preconizează un nivel ridicat de acoperire (coverage) a criteriilor de acceptanță prin aplicarea testelor automate și găsește echilibrul dintre efortul investit în testare (atât manuală cât și automată) și importanța/impactul/riscul scenariului care este testat. Testarea automată rezolvă a doua parte, prin crearea unui set repetabil de teste care evoluează continuu și care poate fi executat în orice moment pentru a ne asigura că funcționalitatea existentă nu a fost afectată de adăugarea de funcționalități noi.

BDD (Behavioral Driven Development) rezolvă prima parte prin crearea unui limbaj comun între Product Owner și echipă oferindu-i Product Ownerului o vizibilitate cât mai bună și o mapare cât mai curată între criteriile de acceptanță și scenariile given-when-then, care mai departe pot fi testate automat sau manual. Pentru a rezolva însă a treia parte avem nevoie de ceva care să prezinte clar Product Owner-ului într-un mod non-tehnic și foarte ușor de înțeles care scenarii de testare sunt automatizate, ajutându-l astfel să poată lua decizii bazate pe risc pe partea de testare și să decidă împreună cu echipa ce merită a fi automatizată. Aceasta permite în același timp o mai bună aliniere pe testele de regresie și optimizează modul în care Product Owner-ul înțelege pachetele de regresie ajutându-l spre exemplu să reducă lungimea fazei de UAT.

given-when-then (GWTs). Aceste GWTs se regăsesc în JIRA (aplicația pe care o folosim pentru Agile Project Management) într-un task de testare legat de story. Fiecare GWT are un id. Convenția este ca acest id să identifice în mod unic un scenariu GWT dintr-un story. În cadrul testelor de Selenium vom marca scenariile acoperite de acel test folosind o adnotare Java numită @Covers. Spider va genera un raport precum cel de mai jos:

Ce?

Spider este o aplicație pe care am scriso pentru a rezolva această a treia parte. Creează un raport al testelor automate cu o mapare clară între scenariile de testare scrise în format BDD și testele automate efective. Folosind acest raport, Product Owner-ul poate decide mai departe dacă vrea să ridice nivelul de acoperire al testelor automate în ariile de business mai Raportul generat va prezenta grafic riscante, să tragă un semnal de alarmă dacă user story-uri cu impact scăzut sunt cât de mult dintr-un user story este acoperit de testele de Selenium. Partea verde tratate cu o importanță prea mare. va spune valoare exactă a procentului de acoperire (lungimea totală a unei bare Cum? Spider se bazează pe convenții. reprezintă numărul total de story points). Cr iter iile de accept anț ă din User Partea albastră nu are o conotație negaStories sunt transformate în scenarii tivă (motiv pentru care nu am ales roșul).

44

nr. 29/noiembrie, 2014 | www.todaysoftmag.ro

Spune doar ca Product Onwer-ul este confortabil cu faptul că anumite scenarii nu vor fi automatizate. Spider va calcula și acoperirea la nivel de sprint folosind o medie ponderată în raport cu numărul de story points, luând în considerare doar User Story-urile cu valoare funcțională, nu și pe cele pur tehnice. Spre exemplu, dacă avem: • 1 story de 5SP și o acoperire de 50%, • 1 story de 2SP și o acoperire de 100%, • 1 story de 8SP și o acoperire de 60%, • Media ponderată va fi: (5*50+2*100+8*60)/(5+2+8)=62%

Raportul generat va conține și o pagină cu maparea detaliată dintre GWT id și testul de Selenium care acoperă acel scenariu.

Când?

Spider poate fi rulat în orice moment pentru orice Sprint. Va considera doar acele user stories care au scenariile GWT deja create. Pentru a produce însă rezultate relevante, recomandarea este să se ruleze chiar la finalul Sprint-ului.

Unde?

Spider nu este încă o aplicație open source și momentan poate fi folosită doar în cadrul Endava. Sunt planuri pentru a transforma acest proiect într-unul open source. Mădălin Ilie

mădălin.ilie@endava.com Cluj Java Discipline Lead @ endava



sponsori

powered by


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.