No. 3 / 2012 • www.todaysoftmag.ro
TSM
T O D A Y S O F T WA R E MAG A Z I NE
Interviu cu Mihai Tătăran Co-fondator ITCamp Cod nativ vs. cod portabil în dezvoltarea aplicaţiilor mobile Metoda de estimare Function Point Managementul Calității Big Data - Reprezentarea datelor
Ediţie Specială
Microsoft Kinect - Ghid de programare Tendințele în HR Proiectul CIVITAS – Archimedes IASI Avantajele unui MBA Guice Startup - Hack a server Think iCloud
6 Interviu cu Mihai Tătăran Co-fondator ITCamp Marius Mornea
12 Cod nativ vs. cod portabil Ion Ionuț
16 Metoda de estimare Function Point Ionel Mihali
21 Managementul calităţii
31 Proiectul Civitas Arhimede - Iaşi Sebastian Botiș
33 Guice Mădălin Ilie
36 Programarea concurentă modernă Béla Tibor Bartha
38 Avantajele unui MBA
Eugen Otavă
Sorin Stan
24 Big Data
40 Startup - Hack a server
Cătălin Roman
27 Microsoft Kinect Echipa Simplex
29 Tendinţe în HR Andreea Pârvu
Marius Corîci
43 Think iCloud Zoltán, Pap-Dávid
45 Gogu Simona Bonghez
editorial
Editorial
C
are este revista ta de programare preferată? Aceeași întrebare se regăsește pe roll-up-ul de participare la ITCamp, cea mai mare conferință pe tehnologii Microsoft din Transilvania. Este un fel de TIFF pentru programatori, fiecare participant putând alege în funcție de interes una din cele trei prezentări ce se desfășoară în paralel pe durata a două zile. Ne bucurăm că putem fi alături de cei 250 de participanți din anul acesta și promitem să revenim cu impresii. Numărul #3 este de altfel o ediție specială ITCamp și a fost oferită tuturor participanților. Mulțumim organizatorilor pentru suportul acordat și de asemenea celor trei sponsori ai revistei: ISDC, Small Footprint și Three Pillar Global. Ovidiu Măţan, PMP
ovidiu.matan@todaysoftmag.com Coordonates Gemini Solutions Cluj’s team, in the past worked as a Product Manager for Ovi Sync at Nokia, founder of Today Software Magazine.
Odată cu acest număr se marchează intrarea într-o etapă nouă, mai tehnică, menită să detalieze mai multe dintre subiectele articolelor precendente. Menționăm în acest sens articolele despre programarea device-ului Kinect sau Big data. Atingem un subiect la modă prin iCloud, stocarea și sinchronizarea datelor în ecosistemul Apple. Pe partea de dispozitive mobile, un articol interesant este Cod nativ vs. cod portabil unde sunt evidențiate opțiunile pe care le avem pentru dezvoltarea aplicațiilor în funcție de nevoile clienților: complexitate, buget sau timpul alocat dezvoltării. Cum estimăm resursele necesare pentru a executa un proiect? Este o întrebare la care se încearcă să se răspundă în articolul Metoda de estimare Function Point. Managementul calității este un subiect important pentru partea de testare a produselor și care a fost acoperit în acest număr. De asemenea, tendințele din HR este un articol care merită citit atât de către angajați, dar și de angajatori pentru a realiza o politică echilibrată de creștere. Revenind la inițiativele locale, prezentăm un proiect dezvoltat 100% de catre o companie clujeană pentru creeare de chioșcuri automate ce permit cumpărarea biletelor de autobuz. Acesta este pus în producție în Iași, iar în paginile revistei gasiți informații despre implementarea proiectului și arhitectura folosită. Un alt proiect românesc este și startup-ul Hack a Server care a început deja să reunească administratorii de sisteme și hackerii într-un scop constructiv, pentru protejarea mai bună a datelor. De ce este bine să ne certificăm? este o întrebare la care încercăm să răspundem în două articole: Avantajele unui MBA și problemele personajului din revista: Gogu. Revista începe să primească suportul comunităților și a companiilor locale iar dacă va face plăcere să o răsfoiți, trimiteți-ne impresiile voastre pe adresa contact@todaysoftmag.com.
Mulţumesc,
Ovidiu Măţan fondator Today Software Magazine
4
nr. 3/2012 | www.todaysoftmag.ro
Redacţie Fondator / Editor in chief: Ovidiu Mățan / ovidiu.matan@todaysoftmag.com Editor (startups și interviuri): Marius Mornea / marius.mornea@todaysoftmag.com Graphic designer: Dan Hădărău / dan.hadarau@todaysoftmag.com Colaborator marketing: Ioana Fane / ioana.fane@todaysoftmag.com Reviewer: Romulus Pașca / romulus.pasca@todaysoftmag.com Reviewer: Tavi Bolog / tavi.bolog@todaysoftmag.com Produs de Today Software Solutions 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
www.todaysoftmag.ro | nr. 3/2012
5
interviu
Interviu cu Mihai Tătăran Co-organizator ITCamp
Interviul acestui număr diferă față de cele anterioare prin subiectul principal: conferința ITCamp, reprezentată în timpul interviului de Mihai Tătăran, co-fondator al acesteia (alături de Tudor Damian).
Mihai Tătăran
mihai.tataran@avaelgo.ro Microsoft MVP Co-organizator ITCamp Avaelgo
un interviu realizat de:
Marius Mornea
marius.mornea@todaysoftmag.com Fost senior software developer in cadrul Nokia, în prezent fondatorul platformei Mintaka Research
6
nr. 3/2012 | www.todaysoftmag.ro
Așadar să începem cu introducerea intervievatului nostru: conferința ITCamp 2012 „este o conferință premium pentru specialiști pe tehnologii Microsoft”, iar calificativul „premium”, în viziunea organizatorilor, este împrumutat de la calibrul invitaților, „cei mai buni speakeri pe care putem să îi aducem [..] oameni extrem de cunoscuți, care la conferințele cele mai mari din lume, gen: TechEd sau PDC, ies constant în top 10, ca note primite după eveniment, iar noi avem patru astfel de oameni”. Focus-ul pe tehnologii Microsoft provine tocmai din această dorință de a aduce cei mai buni speakeri posibili, iar Microsoft este locul unde relațiile și experiența celor doi fondatori le permit accesul cel mai bun, „Dacă ne-am împrăștia pe mai multe zone [tehnologii] ne-ar fi mai greu să facem asta„.
cunoscut o creștere semnificativă în ceea ce privește numărul și diversitatea vorbitorilor, totalul ajungând la 34, iar distribuția variind de la nume mari internaționale, pana la vorbitori noi, de pe plan local. Aceste creșteri se datorează atât feedbackului din partea participanților de anul trecut „Da! vrem ITCamp la anul și Da! vrem să fie mai mare”, cât și strategiei pe termen mediu „Să devenim Conferința de tehnologii Microsoft din Europa Centrala și de Est. Pentru asta trebuie să depășim inclusiv niște criterii de cantitate [..] speakerii extrem de populari nu vin la conferințe relativ mici, și există un prag psihologic, undeva la 500 de participanți, pe care trebuie să îl depășim. [..] Iar ca să ai atâția oameni, evident îți trebuie și diversitate de conținut mai mare. Participanții trebuie să poată să aleagă în fiecare slot de timp ceva util pentru ei.”
ITCamp este anul acesta la a doua ediție, experiența de anul trecut putând fi rezumată în: „o conferință pilot, care să fie la nivel național definitorie pentru România în acest moment, pentru tehnologii Microsoft, iar în timp să devină definitorie pentru Europa Centrala și de Est. Obiectivul l-am atins: au venit peste 200 de participanți, am avut peste 20 de speakeri, cu o distribuție a audienței de peste 50% la nivel senior”. Tocmai acest nivel înalt al pregătirii participanților fiind una din metricile cele mai importante penIar dacă am ajuns la conținut să ne tru calitatea evenimentului, din perspectiva oprim un pic asupra tematicii și organiorganizatorilor. zării prezentărilor din cadrul conferinței. Organizatorii au ales pentru anul acesta să Față de anul trecut, ediția curentă a împartă agenda în trei track-uri principale,
TODAY SOFTWARE MAGAZINE față de două, anul trecut, alegerea fiind motivată: „numai din cauză că am avut conținut mult.” Un track este mai exact o forma de organizare, nu neapărat o temă aleasă cu grijă în prealabil, și vrea să însemne că: „în principiu în sala asta, despre asta se va vorbi”, participanții fiind liberi să își aleagă prezentări din oricare track la un moment dat. Spre deosebire de anul trecut, când tematica track-urilor a fost aleasă din perspectiva publicului țintă: dezvoltatori versus administratori, anul acesta trackurile sunt împărțite în funcție de conținutul efectiv al prezentărilor, pentru că s-a constatat o disproporție mare, numărul dezvoltatorilor dominând audiența (95%). „Primul track este despre Cloud: Public Cloud cu Windows Azure, Office 365; Private Cloud cu colocare, hosting, servere, securitate. Al doilea track este pentru programare, efectiv scris aplicații.” Ambele track-uri mai au în comun și faptul că majoritatea speakerilor sunt internaționali sau cu experiență bogată în conferințe, pe când în ultimul track: „am încercat să aducem oameni de la sponsori, care vin cu o experienta foarte adâncă pe un anumit lucru, [..] și pot să vorbească despre un anumit subiect pentru că asta au făcut în ultima vreme”. Această noutate provine și dintr-un obiectiv mai ascuns al organizatorilor și anume: „trebuie să creștem paleta de speakeri care vin la astfel de evenimente și cineva trebuie să facă primul pas”. Prezentatorii vor fi „oameni care nu sunt neapărat obișnuiți să vorbească în public, dar sunt foarte buni programatori sau arhitecți în firma lor”. Având în vedere că la ora actuală există un grup restrâns de oameni cu experiență în acest domeniu, iar cel puțin pe tehnologii Microsoft discutăm de un grup mic, bine coagulat și foarte concentrat în densitatea de MVPs (Most Valuable Professional) și Regional Directors, această deschidere spre împărtășirea experienței și creșterea numărului de speakeri este bine venită. Mai ales că experiența acumulată nu este doar tehnică, ci vine din partea unor oameni care organizează mai multe conferințe, dar și participă frecvent, atât ca speakeri, cât și ca simpli participanți la conferințe internaționale de cel mai înalt nivel.
a crescut numărul, de la 20 la 34, în al doilea rând a crescut diversitatea. Dacă anul trecut aveam doi Regional Directors și zece MVPs, anul acesta avem mai mulți din fiecare, dar și categorii noi gen: Community PM, Azure Insiders și experți locali. Înainte de a trece la o descriere individuală, aș dori să lămurim pe scurt ce înseamnă fiecare categorie: începem cu cei mai numeroși (cca. 2500 la nivel mondial), specialiștii într-o singură tehnologie specifică: MVP (Most Valuable Professional); urmați de Regional Directors, care sunt mai cunoscuți și au experiență într-o gamă mult mai largă de tehnologii, practic cunoștințele lor acoperă complet Microsoft Application Platform, prin urmare sunt și mai putini (cca. 150 la nivel mondial); un titlu mai nou: Azure Insider, care denotă un grad și mai ridicat de specializare decât un MVP și este dedicat Azure; iar în ultimul rând Community PM, un angajat al Microsoft care reprezintă interfața dintre companie și comunități, coordonând programele MVP, RD, etc. Mai multe detalii despre ce înseamnă fiecare, cum ajungi și ce beneficii ai într-o astfel de poziție vor fi date de către Alessandro Teglia (Community PM) în cadrul conferinței. Trecând la vorbitori în parte, timpul nu ne va permite să ii prezentăm pe fiecare, așa că vom alege câteva din numele mai cunoscute pe plan internațional și vom începe, respectând ierarhia în care sunt prezentați și pe site-ul conferinței. Ordinea nu este întâmplatoare: „e clar că noi, gazdele, ne-am pus ultimii și e clar că am încercat să îi punem primii pe cei pe care îi considerăm noi cei mai cunoscuți în industrie, nu neapărat cei mai buni [..], dar oameni mai vizibili.”
În primul rând începem cu Tim Huckaby un: „greu din toate punctele de vedere, [..] a fost speaker în keynoteuri cu Bill Gates și Steve Balmer, nu o dată, [..] extrem de cunoscut în zona de consultanță, iar dacă te uiți la un Grey’s Anatomy vezi în sala de operație un ecran cu Microsoft Surface, aplicație făcută de el”. El va vorbi despre Natural User Interface, un proiect dezvoltat în parteneriat cu Microsoft Research, și ne va prezenta, în cadrul keynote-ului de la ITCamp, același demo care a fost prezentat în premieră mondială în Israel acuma două luni. Tim a răspuns Pentru că tot am atins subiectul vorbi- invitației la un pahar de vin, când Mihai i-a tori, să ne oprim un pic asupra invitaților promis o excursie la castelul lui Dracula. de anul acesta la ITCamp. În primul rând
Lino Tadros este: „un om foarte tehnic, un pic mai mult decât toți [..] smart în sensul cel mai pur al unui programator [..] a fost ani de zile mâna dreaptă a lui Anders Hejlsberg (inventatorul Turbo Pascal, principal arhitect Borland Delphi și C#)”. El va vorbi mai mult despre aspecte practice legate de dezvoltarea în Windows 8 Metro și Windows Phone. Alessandro Teglia, deși nu are o intrare dedicată în agendă, va avea alocată o secțiune din keynote în care ne va vorbi despre comunități și rolul evenimentelor gen ITCamp în dezvoltarea acestora. În ultimul rând am încercat să aflam cine va face parte și ce tematică va fi acoperită în secțiunea Open Panel, atât din cauză că anul trecut, aceasta a avut mare succes și a fost una dintre cele mai interactive și interesante prezentări, dar și pentru că intră în conflict cu prezentarea despre WinRT a lui Rialdi. Conținutul secțiunii este încă indecis, pentru că organizatorii preferă să propună tematica doar după ce au luat pulsul conferinței și au ocazia să includă feedbackul participanților. Cu toate acestea, am fost asigurați că în cazul oricăror conflicte în interesele din agendă, toate conferințele sunt înregistrate și sunt puse la dispoziția participanților, pe siteul evenimentului. La început doar pentru participanți, iar după șase luni sunt disponibile publicului larg. Păstrându-ne în zona de tematică și conținut am pornit o discuție despre tehnologiile prezentate și posibile recomandări asupra conferințelor. Înainte de o discuție specifică, am dorit să filozofăm despre strategia de marketing prin care ITCamp insistă să fie cunoscută ca și o conferință axată pe tehnologii Microsoft, în condițiile în care o privire asupra agendei dezvăluie o gamă mult mai largă de tehnologii și subiecte, unele foarte generice. „Este adevărat că avem sesiuni mai puțin tehnice, de project management, proceduri, șamd. Considerăm că și acele cunoștințe fac parte din arsenalul specialiștilor IT”. Dar în rest se dorește evitarea subiectelor generice, deoarece: „riscul cu acestea este să fie puțin prea generaliste și să nu intri prea adânc în probleme.” Cu toate acestea, în condițiile în care un public IT clujean are și importante componente axate pe alte tehnologii (Java, Ruby, PHP), o astfel de poziționare poate speria un număr semnificativ de posibili participanți. „Pierdem clar, la greu, dar www.todaysoftmag.ro | nr. 3/2012
7
interviu
Interviu cu Mihai Tătăran
asta dorim: să ne focusăm. Eu îmi doresc să ultimă oră. am o conferință la care și eu învăț, practic nu considerăm că pierdem, ci ne selectăm Pe măsură ce ne apropriem de final participanții” în dorința de a menține nive- am hotărât să aruncam o privire asupra lul ridicat al prezentărilor. aspectelor organizatorice, fiind interesați de bucătăria internă a unui astfel de eveniRevenind la discuții mai practice: „sta- ment și rețeta succesului. rurile din punct de vedere buzzword sunt Windows 8, Windows Phone și HTML5. În primul rând, contează experiența Dar pentru oamenii din audiență, ei fiind acumulată prin participarea la conferințe seniori peste 50% (asta a fost distribuția de nivel înalt, iar ecosistemul Microsoft anul trecut și tinde spre 60% anul acesta), stă foarte bine la acest capitol, TechEd pentru ei nu este asa important buzzword- fiind o prezenta constantă în calendarul lui ul, pentru ei e mult mai important ce Mihai, începând cu 2003 (inițial susținut de lucrează acum și ce proiecte le vin în Microsoft Academic program, în perioada următoarele câteva luni. [..] S-ar putea să studenției, apoi ca și participant plătitor, iar ne trezim cu o prezență mult mai mare la o din 2011 „fac parte din staff-ul conferinței sesiune de aplicații foarte solicitate în ASP. [..] sunt niște standuri Technical Learning NET, chiar dacă este o chestie foarte veche.” Centers unde răspund la întrebări despre Cu toate acestea: „audiența cea mai mare Azure”), atât participant cât și speaker la va fi la speakerii cei mai ca lumea, pe care DevReach și CodeCamp Macedonia, sau i-am și sugerat”. doar participant la MVP Summit. Tudor Damian (al doilea co-fondator ITCamp) Întrebat în ce măsură publicul poate are un calendar similar. Pe lângă knowsă influențeze conținutul conferinței, gen how organizatoric aceste conferințe sunt un posibilitatea unei discuții despre topic-uri canal de comunicare de care cei doi profită care nu sunt prezente în agendă, dar sunt pentru a invita vorbitori de nivel înalt la de interes, Mihai a ținut să precizeze că ITCamp. speakerii sunt cei care vin cu conținutul, astfel se poate asigura un nivel tehnic ridiÎn a l d oi l e a r ând, c onte a z ă ș i cat al fiecărei prezentări. „Aceștia sunt experiența locală pentru a putea sincroniza speakerii pe care ne dorim să îi aducem cunoștințele organizatorice cu cultura și obligatoriu, și este o listă destul de lungă, specificul publicului și industriei esteurodin care jumate îi dorim cu orice preț. [..] pene. În această direcție sunt importante Noi știm dinainte cu ce o să vină pentru că evenimentele organizate de ei: CodeCamp ei cu asta lucrează în ultima vreme. [..] Ei (Mihai) și ITSpark (Tudor), dar și ce se lucrează pe ceva în funcție de ce este mai poate învăța de la conferințe similare din interesant, mai nou, și asta dă până la urmă regiune, cel mai important etalon fiind: și direcția industriei”. Cu toate acestea pau- „DevReach, o conferință premium (calizele de câte 30 de minute dintre prezentări tate excelentă în prezentări, diversitate, și Open Panelul sunt momente bune pen- dar și preț relativ mare pentru o pertru astfel de filozofări așa că participanții soană obișnuită). La DevReach și încet sunt încurajați să profite de ele și să și la ITCamp un participant beneficiază interacționeze cu vorbitorii. de sesiuni destul de apropiate calitativ de media celor de la TechEd, însa la costuri O ultimă curiozitate, vizavi de conținut, de 10 ori mai mici. Un alt element foarte a fost în ce măsură are șanse ITCamp să important: atât DevReach cât și ITCamp conțină lansări de tehnologii noi sau pre- sunt conferințe de comunitate, ceea ce miere mondiale. Surpriza plăcută a fost să înseamnă, printre altele, că organizatorii nu aflăm că, deși evenimentele majore sunt câștigă bani din ele. Asta ne permite o mare gestionate de departamentul de marketing flexibilitate în a face alegerile pe care le conal Microsoft, unii din prezentatori lucrează sideram cele mai bune pentru audiență, fără pe tehnologii care sunt pe cale să se lanseze presiunea de a ieși pe profit.” În momentul și au pregătite prezentări, astfel încât, în de față conferința internațională bulgară eventualitatea unui anunț oficial Microsoft „are avantajul că există de mai mult timp și ei vor scăpa de sub incidenta NDA-urilor are mai multi participanți (600 de oameni). (Non-Disclosure Agreement) și vor putea Al doilea avantaj este că are o companie în face scurte prezentări pe tehnologii de spate, pe Telerik, și are obiective clare de
8
nr. 3/2012 | www.todaysoftmag.ro
business, plus staff dedicat (patru oameni angajați full-time)”. O parte importantă a oricărui astfel de eveniment o reprezintă bugetul, așa că pentru început am dorit să aflăm suma la care se ridică, și pe ce anume se cheltuiește acesta: „Bugetul este de zeci de mii de euro și vorbim de peste 30-40 de mii de euro, depinde și de câți participanți se înscriu. Foarte mulți bani se duc pe transport, [..] o altă parte consistentă se duce pe masă și pauza de cafea, adică ceea ce plătim la hotel/restaurant, precum și cazarea speakerilor”. Există și activități adiționale, dar care: „reprezintă un cost mic, relativ la tot bugetul” și anume: „un eveniment dedicat speakerilor, organizatorilor și sponsorilor: o cină VIP și o vizită la Dracula Castle, la Bran”. Având în vedere că Mihai nu a menționat nimic de tarifele practicate de speakeri am dorit să aflăm cam la ce sume se ridică: „Fiind un eveniment de comunitate, toți speakerii vin gratuit - noi le asigurăm costurile de deplasare și încercăm să ii facem să se simtă bine.” Următoarea întrebare logică este de unde provin banii pentru a acoperi cheltuielile de mai sus și cum își gestionează practic bugetul. Mai exact ne interesează proporția între cât acoperă sponsorizările și cât acoperă taxa de participare. „Noi am făcut bugetul bazat pe costurile fixe clare (transportul și cazarea speakerilor) și celelalte costuri relative la numărul de participanți, iar în funcție de asta a ieșit costul pe om, o anumită sumă. Pe care noi am zis clar că nu putem să o cerem și că trebuie să cerem sub, așa că am apelat la sponsori”. Contribuția sponsorilor fiind detaliata astfel: „trebuie nuanțat un pic: sponsorizări pure sunt cam 33-40%, dar sponsorii trimit și oameni și atunci de fapt 85% din bani vin de la sponsori”. Restul de 15% este acoperit din taxa de participare, care are un rol de responsabilizare și barieră de intrare „și acoperă o parte consistentă [din costul individual], peste jumate din costul pe om.” Cu alte cuvinte taxa de participare (375 RON) este o sumă rezultată din cheltuielile efective, fără a fi raportată la prețul de piață al beneficiilor și calității prezentărilor. O astfel de estimare este dificil de făcut pe plan local: „Ne-am uitat și în jur, dar nu avem termen de comparație pentru că DevReach este clar mult mai scump,
TODAY SOFTWARE MAGAZINE iar pe plan local, tot ce se întâmplă este fie gratis, ceea ce facem noi, fie aproape gratis, organizat de Microsoft din când în când”. Relativ la preturile internaționale, ITCamp este mult mai ieftin decât TechED (care costa 2000+ euro), dar are și mult mai mult conținut, 4 zile ori 12-14 sloturi în paralel; sau o comparație mai potrivită ar fi o conferință de nivel doi (500-1000 participanți), care costă 500-1000 euro și este comparabilă ca și conținut sau calibrul vorbitorilor. În ambele cazuri nu intră în discuție diferențele de costuri legate de transport. În speranța că nu abuzăm de subiectul „bani” și răbdarea cititorilor, mai filozofăm un pic despre taxa de intrare și însemnătatea ei. Începem prin punerea în balanță a beneficiilor pe care le obții de la un ITCamp, exprimată prin răspunsul organizatorilor la un feedback primit destul de des din comunitate: „de ce să dau bani la ITCamp, când pot să ma duc online la TechEd și să mă uit la prezentări gratis? În primul rând că: <<o să ma uit online la prezentări>> este o poveste frumoasă, nu se întâmplă niciodată. Pe când dacă iți rezervi timp să mergi la o conferință, timpul respectiv este rezervat și ești cu mintea acolo. În al doilea rând, când ești într-o sesiune unde interacțiunea este fizică și ai șansa să vorbești cu alții care au aceeași problemă ca și tine, reții altfel. În al treilea rând faci networking și beneficiul este cu totul altul.” În continuare, am discutat obiectivul declarat al ITCamp de a creste calitatea conferințelor, conținutului și vorbitorilor: „E o problemă de mentalitate, pe care eu vreau să o schimb: lumea trebuie să dea bani la astfel de activități. Fie că dă persoana, fie că dă firma la care lucrează, este mai puțin important, dar trebuie să fim obișnuiți că nimic nu este gratis pe lumea asta, iar dacă vrei să progresezi ca și specialist și să nu fii deodată cu valul, trebuie să înveți. Iar unul din moduri e să participi la conferințe, și e normal să dai bani pentru asta. Bineînțeles există inițiative gratis și chiar noi facem ITSpark și CodeCamp, și sunt foarte binevenite și credem foarte mult în ele. Doar că nivelul unui CodeCamp de sâmbăta nu se compară cu nivelul ITCamp.. gratis nu o să poți face calitate niciodată.” O soluție propusă de mine, inspirată din parteneriatul DevReach/Telerik este: reducerea taxei prin atragerea de noi fonduri dintr-un parteneriat similar cu o companie privată. „Am luat în considerare un parteneriat, dar am zis că facem așa, pentru că
nu vrem să depindem de cineva. În mediul business se schimbă obiectivele și oamenii, iar asta reprezintă un risc.” Organizatorii își doresc păstrarea unei independente financiare, care le permite o independență organizatorică și libertatea de a alege vorbitorii și subiectele, fără compromisuri: „Nici nu vrem să fim o chestie comercială”. Pentru că am poposit destul pe aspectele economice, cel puțin din perspectiva financiară, am trecut la o ultimă întrebare cu caracter organizatoric: gestiunea conținutului și dozarea lui. Practic ne-am dorit să aflăm în ce măsură variază prezența la prezentări în timpul zilei. „Clar seara nu mai sunt la fel de multi ca dimineața. Același lucru mi se întâmplă și mie când mă duc la TechEd. Stau la 4 prezentări pe zi, iar intre timp mai povestesc cu unul altul. Tocmai de aceea am creat spațiul necesar, și fizic, și în timp ca tu să poți să stai să faci networking. [..] Surpriza anul trecut a fost că pe finalul zilelor aveam destul de mulți oameni în sală.”
muncă în IT; moștenirile epocii industriale în care toți aveau un loc de muncă și o normă asigurată; inerția specifică prin care se participă la evenimente trimis de firmă. La final, pentru Mihai, contează că: „cineva și-a dorit ca persoana să vină, fie individul, fie firma, dar pentru mine asta e important, că vine cumva. Mi-as dori ca oamenii să conștientizeze asta singuri, dar e greu, așa că o luăm pas cu pas”. O surpriză plăcută anul trecut a fost că publicul a cerut: „să creștem cantitativ, a fost un feedback foarte clar menționat, să ridicam nivelul sesiunilor, ăsta e al doilea feedback important”, dovada clară că „nivelul lor tehnic e bun” și interesul pentru aspectele practice ridicat. Prin urmare organizatorii au crescut anul acesta nivelul și au renunțat la prezentări prea generice, care nu trezesc interesul.
Înainte de încheiere am aruncat o privire în viitor: „În primul rând cu ITCamp, dorim să o poziționăm ca o conferință de reper în regiune. Pe celelalte evenimente mai micuțe vrem să le extindem ca număr de participanți și ca diversitate a speaAm considerat necesar să ne oprim un kerilor. Necesită foarte mult efort, dar pic și asupra publicului și pentru început implicând oameni noi, se întâmplă.” am vrut să aflăm de ce ITCamp la Cluj: „Mie îmi era mult mai simplu să îl fac în La final am revenit asupra rețetei unei Timișoara, dar nu e piața, nu sunt atâția conferințe de succes: „Evident mâncarea oameni, nu au de unde să îți vină atâția și cafeaua sunt foarte importante, dar clar oameni cum sunt în Cluj”. Următoarea primul este conținutul. Dacă s-a termiîntrebare ar fi ce anume îl motivează pe nat cafeaua o mai dregi un pic, dar dacă participant: „Cred că ii un pic din toate, conținutul este sub așteptări.. e nasol, mai clar îi place să facă parte dintr-o comuni- ales că lumea dă un ban și setezi altfel tate, cred că are șansa să facă networking așteptările. [..] Foarte multă lume ne-a și efectiv poate are o problemă tehnică întrebat mai direct sau mai puțin direct, de rezolvat. Să nu neglijăm aspectul ăsta. câți bani câștigăm noi din conferința asta. Respectiv exista și tendința pe care o Pe mine inițial m-a deranjat, dar apoi avem să ne comparăm unii cu alții, [..] și mi-am dat seama că este o întrebare perdacă nu mergi la astfel de evenimente nu tinentă. Chiar și sponsorii au zis că dacă poți să știi cum stai în raport cu ceilalți ne rămâne și nouă ceva este ok, că până [..] și de aceea consider că evenimentul la urmă muncim pentru conferință. Nu.. este extrem de util pentru a coagula piața nu este ok, noi nu vrem să facem bani din forței de muncă, se nasc prietenii, șanse de asta. Chiar s-a întâmplat la o conferință a colabora”. Dincolo de motivație se ridică în toamnă să rămânem cu bani (vreo 500 o problemă specifică publicului românesc: de dolari), și i-am lăsat pentru ITCamp. lipsa de interactivitate din timpul eve- Este foarte important, chiar dacă este o nimentelor. „În toată Europa de est este conferință pe bani, organizatorii nu câștigă chestia asta. [..] Toți speakerii care vin știu din asta, ba dimpotrivă, pe lângă că invesși încearcă printr-o glumă, fiind relaxați, tim timp, anul trecut am și cheltuit bani. să creeze o stare de normalitate”. Motivația Anul acesta sperăm să nu cheltuim bani, și atitudinea pasivă sunt genul de subiecte pentru că înseamnă că nu am planificat care nasc discuții filozofice interminabile, bine. Insist foarte mult pe chestia asta, e o prin urmare, odată pornită discuția, am chestie de comunitate pe care o facem că trecut în revista: influența caracterului putem să o facem, că ne place să o facem și predominant de outsourcing asupra inte- pentru că învățăm și noi foarte mult din ea. reselor tehnice ale participanților; aspecte Scopul nu sunt banii, dar fac parte din viață culturale legate de educația ca proces con- și trebuie să plătești la un moment dat.” tinuu; lipsa de motivație în dezvoltarea personală cauzată de inflația de locuri de www.todaysoftmag.ro | nr. 3/2012
9
programare
<b>A DAY IN TH E L IFE O F A S O F T WA RE DEVELOPER</b>
PHOTO COMPETITION FOR PEOPLE WITH IMAGINATION AND AN OBSESSIVE INTEREST FOR PHOTOGRAPHY | MAY 21 – JUNE 17 Geek, nerd, techie, computer expert, IT specialist, software developer... Different names for smart people with an extreme passion for technology. What is a day in their life like? Capture it in a photo and the most inspired photographer wins:
A BRAND NEW
iPad3!
With compliments from ISDC techies!
POPULARITY AWARD: SURPRISE WORTH OF
300 EURO!
Send your photo(s) (according to contest rules) at
Competition is fully covered on Facebook/ISDCTeam
ingoodcompany@isdc.eu
Partner & Judge: Photo Romania
Winner selection will take place between 18 – 22 June
ISDC IS A EUROPE AN IT SERVICES COMPANY WITH PASSION FOR CUSTOMERS, SOLUTIONS, AND TECHNOLOGY.
TODAY SOFTWARE MAGAZINE
Comunităţi locale
S
ecţiunea comunitate îşi propune să ţină evidenţa grupurilor de profesionişti relevante pentru industria IT, dar şi un calendar de evenimente şi întâlniri din acest sector. Pentru început prezentăm principalele iniţiative din mediul local, în timp intenţionând să creştem acest index până ce va conţine toate comunităţile locale, dar şi cele naţionale cu prezenţă şi activitate pe plan local. Criteriul ales pentru ordonare este o funcţie dată de numărul de membrii şi activitatea grupurilor (evenimente locale) raportate la durata de viată, astfel sperăm să obţinem o ierarhie bazată pe gradul de implicare, atât al organizatorilor, cât şi al membrilor.
Transylvania Java User Group Comunitate dedicată tehnologiilor Java. Website: http://www.transylvania-jug.org/ Data înfiinţării: 15.05.2008 / Nr. Membri: 472 / Nr. Evenimente: 37 Romanian Testing Community Comunitate dedicată QA. Website: http://www.romaniatesting.ro Data înfiinţării: 10.05.2011 / Nr. Membri: 453 / Nr. Evenimente: 1 Cluj.rb Comunitate dedicată tehnologiilor Ruby. Website: http://www.meetup.com/cluj-rb/ Data înfiinţării: 25.08.2010 / Nr. Membri: 103 / Nr. Evenimente: 24 The Cluj Napoca Agile Software Meetup Group Comunitate dedicată metodelor Agile de dezvoltare software. Website: http://www.agileworks.ro Data înfiinţării: 04.10.2010 / Nr. Membri: 187 / Nr. Evenimente: 11
Calendar Mai 24 – 27
AQTR2012 (2012 IEEE International Conference on Automation, Quality and Testing, Robotics) Contact: http://www.aqtr.ro/
Mai 28 – 29
ITCamp 2012 Contact: http://itcamp.ro/
Mai 31
Workshop: Crosscutting Architectural Concerns Contact: http://www.rabs.ro/events?ee=1
Iunie 2
OSOM Event v3.0 – Back to the roots! Contact: http://osom.ro
Cluj Semantic WEB Meetup Comunitate dedicată tehnologiilor semantice. Website: http://www.meetup.com/Cluj-Semantic-WEB/ Data înfiinţării: 08.05.2010 / Nr. Membri: 112 / Nr. Evenimente: 16
Iunie 15
Romanian Association for Better Software Comunitate dedicata oamenilor cu experienta din IT indiferent de tehnologie sau specializare. Website: http://www.rabs.ro Data înfiinţării: 10.02.2011 / Nr. Membri: 126 / Nr. Evenimente: 3
Semantic technologies applied to real world applications Contact: http://www.meetup.com/Cluj-Semantic-WEB/
Google Technology User Group Cluj-Napoca Comunitate dedicată tehnologiilor Google. Website: http://cluj-napoca.gtug.ro/ Data înfiinţării: 10.12.2011 / Nr. Membri: 25 / Nr. Evenimente: 7 Cluj Mobile Developers Comunitate dedicată tehnologiilor mobile. Website: http://www.meetup.com/Cluj-Mobile-Developers/ Data înfiinţării: 08.05.2011 / Nr. Membri: 39 / Nr. Evenimente: 2
Eclipse DemoCamp Contact: http://www.transylvania-jug.org/
Iunie 27
Menţiuni: Cluj Perl Mongers (www.cluj.pm), GeekMeet (http://geekmeet.ro/), ITSpark (http://itspark.ro/ default.aspx), CodeCamp (http://www.codecamp. ro/), CodExpert (http:// www.codexpert.ro/), PHPRomania (http://www. phpromania.net/), ARIES (http://www.aries.ro/)
www.todaysoftmag.ro | nr. 3/2012
11
programare
Cod nativ vs. cod portabil în dezvoltarea aplicaţiilor mobile
Ion Ionuț
ionut.ion@threepillarglobal.com Software developer entuziast din cadrul firmei Three Pillar Global, domeniile de interes principale fiind Web și Mobile development.
12
nr. 3/2012 | www.todaysoftmag.ro
În scurta viaţă a internetului s-a trecut iniţial prin era Web 1.0, când tendinţa generală era ca utilizatorii să intre pe un portal unde aveau acces la cât mai multe informații utile. Toată lumea era impresionată de faptul că există aceste informații adunate într-un singur loc. Utilizatorilor, în sfârșit, le era satisfăcută nevoia de acces la informații. A urmat Web 2.0 caracteristic unei noi generații de utilizatori, pentru care accesul la informație era deja un “drept”intangibil, obligatoriu și implicit. Acești utilizatori, refuzând să se mulţumească cu postura persoanei singuratice din fața calculatorului, au reclamat nevoia stringentă de a socializa în mediul virtual. Începând cu 2010 a apărut o nouă generație de utilizatori pentru care accesul la informație și socializarea virtuală sunt considerate implicite. Aceasta este generația Mobile, generaţie pentru care nu mai era suficient accesul la un calculator conectat la internet, ci era necesar ca accesul la informație și socializare să poată avea loc de oriunde şi oricând. Pentru aceasta generație mobilitatea nu înseamnă doar a deține un laptop. În plus, tot mai multe dispozitive (tablete, telefoane, televizoare, computer de bord, etc. ) devin “smart”, acest lucru însemnând că utilizatorii nu mai sunt dependenți de un anumit dispozitiv particular. Ținând cont de acest context, în cadrul firmei la care lucrez s-a adoptat o strategie denumită Mobile First, acest lucru însemnând în esenţă că proiectarea unui nou sistem informatic începe cu
componenta mobilă a acestuia, arhitectura sistemului fiind influenţată direct de această componentă.
Criterii de evaluare Având în vedere dinamica de pe acest segment precum şi multitudinea de dispozitive și sisteme de operare, nu vom putea găsi o soluţie universal valabilă în ceea ce priveşte dezvoltarea de aplicaţii. Decizia în ceea ce priveşte alegerea unei soluţii optime se ia evaluând o serie de factori cum ar fi: • Avantaje şi dezavantaje abordări existente la un moment dat; • Principalii jucători de pe piață; • Așteptările clienților; • Nevoile şi nivelul programatorilor. În urma evaluării putem trage anumite concluzii legate de cea mai convenabilă soluție. Despre cele mai importante abordări existente în acest moment, împreună cu avantajele şi dezavantajelor lor, vom discuta pe larg în secţiunile următoare. De asemenea, vom face o trecere în revistă a celor mai importanţi jucători pe piaţa dezvoltării soluţiilor mobile. În ceea ce priveşte aşteptările clienţilor, soluţia propusă este privită prin prisma următoarelor criterii: • Costuri reduse, • Flexibilitate, • Întreţinere ușoară, • Dezvoltare rapidă.
TODAY SOFTWARE MAGAZINE
Clienții sunt întotdeauna interesați să obțină o valoare cât mai mare pentru prețul pe care îl plătesc. Totodata își doresc să nu se facă rabat de la calitate, iar produsul să fie disponibil pe piață într-un timp cât mai scurt. În plus, se urmăreşte ca eventualele îmbunătățiri ale sistemelor de operare, ale browser-elor sau apariția unor dispozitive mai performante, cu mai multe opțiuni hardware să afecteze cât mai puțin produsul software existent- pe scurt, se urmăreşte o întreţinere ușoară. Mai mult decât atât, flexibilitatea este dorită pentru ca extinderea ulterioară a produsului cu noi caracteristici să se petreacă într-o manieră cât mai simplă şi rapidă.
Figura 1. Dezvoltarea şi instalarea aplicaţiilor folosind cod nativ
la dezvoltarea de aplicaţii corespunzătoare În schimb, cei implicați direct în dez- mai multor platforme mobile distincte. voltarea aplicaţiilor sunt mai degrabă Platforme, limbaje și cadre de lucru: interesaţi de: • Apple iOS - Objective C, Cocoa Touch • Control complet asupra codului, • Android - Java, Android SDK/ NDK • Eleganţă în dezvoltare, • Wi n d ow s P h o n e - C # , . N E T • Creștere profesională. Framework • Blackberry - J2ME/ BB Java NDK Cei responsabili de dezvoltarea aplicațiilor, au în general o atitudine mai Platformele listate sunt cele mai imporboemă. Ei sunt interesați să aibă un con- tante , dar nu sunt singurele. În plus, piața trol cât mai complet al codului sursă, vor este destul de dinamică în acest sector. De fi reticenți la acele unelte de “dezvoltare exemplu, Mozilla și-a anunțat intrarea in cumouse-ul” care generează automat cod segment cu un nou concept de sistem de și care nu sunt suficient de flexibile pen- operare pentru platformele mobile, Boot to tru a oferi posibilitatea unor eventuale Gecko, dezvoltat cu standardele HTML5 și modificări. Totodată, eleganţa dezvoltării CSS adăugate pe un kernel de Linux. este un alt atu din punctul de vedere al programatorilor. Alegerea unei soluții tehExistă o serie de argumente în favoarea nice care nu oferă posibilitatea de a învăța utilizării codului nativ în dezvoltarea de și experimenta lucruri noi duce la o anu- aplicaţii precum: mită rodare rezultând invariabil o dorință a • Nivel înalt de performanță; programatorilor de a părăsi proiectul. Deşi • Cadru de dezvoltare construit de autotoate acestea par a fi elemente mai puţin rul platformei; importante în contextul discuţiei prezen- • Sistem de versionare, simulare, unit testului articol, ele pot determina alegerea uni ting şi testare automată integrate; variante de dezvoltare pe termen lung. • Depanare directă; • Acces complet la API nativ; • Reacție rapidă în caz de probleme ce ţin Abordări în dezvoltarea aplicaţiilor de OS/ API; mobile • Comunitate mare de dezvoltatori.
1. Cod nativ
Evident, există şi o serie de dezavantaje Prima și cea mai naturală alternativă pe care le presupune codul nativ: este dezvoltarea produsului în cod nativ, • Efort sporit de implementare a acelorași prin acesta înţelegând codul sursă compilat funcționalități pe platforme diferite; şi executat direct de procesorul unui dispo- • Ne voi a d e a ave a d e z volt ator i zitiv particular și în multe cazuri dezvoltat specializați pentru fiecare platformă în de producător special pentru combinația parte; hardware aleasă. • Costuri mai mari; Figura 1 reprezintă schemantic care • Dificultăți de întreţinere a unor versunt paşii prin care se trece de la specificaţii siuni diferite;
• Efort de coordonare a dezvoltării noilor caracteristici; • Fiecare platformă nouă necesită dezvoltare de la 0.
2. Cod portabil interpretat/Cod hibrid Varianta utilizării codului portabil interpretat o numim şi cu cod hibrid deoarece, în general, există două părți ale unei astfel de soluţii: • o aplicație web - HTML5, CSS, JavaScript, etc. - capabilă să ruleze în orice browser; • o aplicație-container nativă, specifică fiecărui dispozitiv, ce conține în esență instanța unui browser modificat astfel încât sa aibă acces la resursele hardware ale dispozitivului și care accesează aplicaţia web (opţional). Instrumente şi limbaje: • PhoneGap (HTML / JS – disponibil pe iOS, Android, WP7, BB, Bada, Symbian, WebOS) • Adobe AIR (HTML / JS / Action Script - iOS, Android, BB) • WebWorks (HTML / JS - Blackberry) Avantaje: • Un singur cod de bază pentru toate platformele ; • Costuri scăzute de dezvoltare și întreţinere; • Permite echipei de dezvoltare să se concentreze pe logica aplicaţiei; • Exista pe piaţă o diversitate de fram e w o r k - u r i Jav a s c r i p t : E x t J S , Sproutcore etc; • Necesită doar competenţe specifice de web development. www.todaysoftmag.ro | nr. 3/2012
13
programare
Cod nativ vs. cod portabli
abordări sunt o combinaţie a precedentelor două direcţii de dezvoltare a aplicaţiilor mobile. Avantaje: • Nivel înalt de performanţă; • Un singur cod de bază pentru toate platformele ; • Procesul de instalare decurge la fel ca şi în cazul aplicaţiilor native.
Figura 2. Dezvoltarea şi instalarea aplicaţiilor folosind cod portabil interpretat/cod hibrid Dezavantaje: • Performanțe mai slabe; • Acces limitat la funcționalitățile platformei (acces la un subset API oferit de dispozitive) ; • Proces complex şi greoi de depanare; • Noile funcţionalităti introduse de un dispozitiv vor fi implementate in cadrul aplicaţiei container cu o oarecare inerţie; • Lipsesc unele controale ale interfeţei utilizator predefinite şi sunt dificil de simulat controalele pentru fiecare platformă în parte; • Dependenţa de o terţă parte ce implică o reacţie mai lentă în rezolvarea anumitor bug-uri.
asemenea folosirea unui cod comun, portabil, dar și al unui compilator care să știe să interpreteze acest cod și să îl compileze generând cod nativ pentru fiecare platformă în parte. Intrumente şi limbajele de programare utilizate: • C orona (LUA → iOS, Android, Windows Phone • Marmelade (C++ → iOS, Android, Bada, Symbian) • MonoTouch (C#, .NET → iOS, Android) • MoSync (JavaScript, HTML5 → C++ iOS, Android) • Verivo (ex-Pyxis Mobile) (visual development tool on middleware machine → iOS, Android, Blackberry) • Titanium (JavaScript, HTML5 → iOS, Android, BB)
Dezavantaje: • Dificultăţi în identificarea originii unui bug; • Imposibilitatea programatorilor de a avea acces la codul nativ generat; • Este mereu în urmă cu noile apariţii în materie de tehnologie ; • Bug-urile care apar în platforma SDK vor influenţa procesul de dezvoltare; • Dependenţa de o terţă parte.
Concluzii
Cu siguranţă nu există o variantă câștigătoare la toate capitolele. În schimb, la momentul luării deciziei, natura şi specificitatea aplicaţiei vor dicta direcţia de dezvoltare. În plus, alături de avantajele/ dezavantajele prezentate până acum, tabelul de mai jos evidenţiază şi alte criterii ce pot influenţa luarea unei astfel de decizii. Când se alege codul nativ? • Când aplicația este destul de complexă și necesită acces la resursele sistemului de operare (exemplu: citirea, deschide3. Cod portabil cu compilare multirea unui fișier, procesarea de imagini platformă etc) ; • Când contează foarte mult performanța; A treia abordare presupune de Avantajele şi dezavantajele acestei • Când clientul își dorește ca, de exemplu, aplicația de iPhone să arate ca o aplicație de iPhone, cea de Android să arate ca una de Android ș.a.m.d. În acest caz, codul nativ este cea mai bună alegere. Când se alege cod portabil? • Când este vorba despre o aplicație de dimensiuni reduse; • Când aplicația nu accesează mulți dintre senzorii sau resursele hardware sepcifice dispozitivelor mobile ; • Când se așteaptă adăugarea unui set consistent de funcţionalităţi în viitorul apropiat, într-un timp relativ scurt ; • Când avem la dispoziție un buget redus. Figura 3. Dezvoltarea şi instalarea aplicaţiilor folosind cod portabil compilat
14
nr. 3/2012 | www.todaysoftmag.ro
TODAY SOFTWARE MAGAZINE
Când se alege cod compilat multi-platformă? • Când se dorește lansarea unei aplicaţii simultan pe toate market-urile. • Când timpul dedicat dezvoltării este foarte scurt și deadline-ul este critic. • Când nu avem programatori specializaţi pentru fiecare platformă în parte.
Referinţe la produse • • • • • • • • • •
Adobe AIR (www.adobe.com/products/air.html) Corona (www.anscamobile.com) Marmelade (www.madewithmarmalade.com/) MonoTouch (xamarin.com/monotouch) MoSync (http://www.mosync.com/) PhoneGap (phonegap.com) Rhomobile (rhomobile.com) Titanium (www.appcelerator.com/) Verivo (www.verivo.com) WebWorks (bdsc.webapps.blackberry.com/html5)
Referinţe la aplicaţii mobile
• ***, “Mobile Application Development Strategies”, Uberity White Paper, 2012 (http://www.uberity.com/whitepapers/) • David DeWolf, “Mobile First Strategy” (http://www.threepillarglobal.com/blog/post/what-mobile-first-strategy), Mai, 2011 • Michael Enger “The Great Cross-Platform UI Challenge: Titanium vs. PhoneGap vs. Native” (http://blog.thelonelycoder. com/2012/02/03/the-great-cross-platform-ui-challenge-titanium-vs-phonegap-vs-native/) • Martin Fowler “Cross Platform Mobile”, 2011, (martinfowler.com/bliki/CrossPlatformMobile.html) • Julio Franco, „Mozilla’s Boot 2 Gecko mobile OS hands-on”, Techspot, March, 2012 http://www.techspot.com/news/47747-mozillasboot-2-gecko-mobile-os-hands-on.html • Perry Hoe, “Cross Compilation vs. Mobile Native Development Debate”, 2011, (blogs.perficient.com/spark/2011/04/20/ cross-compilation-vs-mobile-native-development-debate/) • Ionuț Ion, “Aplicații mobile native versus aplicații compilate”, TiMoDev ediția 14, Martie, 2012 http://ctrl-d.ro/development/ resurse-development/aplicatii-mobile-native-versus-aplicatii-compilate-ionut-ion-timo-editia-14/ • Eric Jackson „Here’s Why Google and Facebook Might Completely Disappear in the Next 5 Years”, Forbes, April, 2012 http:// www.forbes.com/sites/ericjackson/2012/04/30/heres-why-google-and-facebook-might-completely-disappear-in-the-next-5-years/
www.todaysoftmag.ro | nr. 3/2012
15
management
Metoda de estimare Function Point
Probabil că o să te întrebi, de ce este nevoie de o asemenea metodă, cu un nume aşa complicat, atât timp cât experţii (programatori, arhitecţi, ingineri de specificaţi, etc.) în producerea sistemelor informaţionale au deja metodele lor cum ar fi Expert judgement, prin care pot să estimeze cât timp le va lua cu o anumită marjă de eroare să dezvolte un produs sau un modul/componentă dintr-un produs software. Metoda are ca scop: analiza şi îmbunătăţirea productivităţii, estimarea proiectelor, controlul proiectelor, aplicând metoda la diferite momente din procesul de dezvoltare.
Aplicabilitate Ionel Mihali
Ionel.Mihali@isdc.eu QA Officer, implicat in sistemul de asigurare al calitatii la nivel de proiect si organizatie, cu peste 6 ani de experienta in domeniul informational.
16
nr. 3/2012 | www.todaysoftmag.ro
În paragrafele ce urmează, o să fac o paralelă cu un domeniu care este destul de familiar pentru fiecare dintre noi şi anume cel imobiliar. Imaginează-ţi că eşti un evaluator imobiliar. Un client iţi cere să faci o evaluare a unui imobil (clădire cu apartamente) deja existent. Care sunt paşii pe care îi urmezi? Probabil că: • Analizezi scopul/obiectul evaluării • Defineşti o metodologie de evaluare • Defineşti o metodă de evaluare • Treci la execuţia evaluării în sine: ■■ Iei in considerare o serie de caracteristici generale ale construcţiei (locaţie, structură de rezistenţă, acoperişuri, etc.) ■■ Ulterior, spargi scopul într-o serie de piese mai mici: apartamentele şi la fiecare dintre ele te uiţi la: suprafaţă, finisaje, instalaţii termice şi electrice interioare, etc. • Într-un final, în funcţie de aceste caracteristici o să acorzi fiecărui apartament un punctaj, suma punctajelor fiind numărul de puncte pe care îl acorzi întregului imobil. • În funcţie de contextul pieţei imobiliare,
acest punctaj o să fie multiplicat cu valoarea de pe piaţa/punct, din care o să rezulte o valoare totală a imobilului. Probabil că o să te întrebi ce legătură are asta cu productivitatea. Clientul evaluatorului, adică dezvoltatorul imobiliar, o să ştie câte puncte au fost atribuite imobilului, o să ştie cât timp şi de câţi bani a avut nevoie pentru construirea lui, deci printrun calcul simplu poate să spună cât îl costă în timp şi bani un punct. Dacă aplică acea metodă, adică de a evalua un proiect care planifică să-l dezvolte, o să ştie câte puncte va avea, deci implicit va şti cât o să-l coste pentru a-l duce la bun sfârşit.
Scopul metodei FPA
Aplicarea metodei Analiza Punctelor Funcţionale (Function Point Analysis - FPA) are ca rezultat, atribuirea unui număr de puncte funcţionale (function points - FP) unui produs software deja dezvoltat, pe baza produsului în sine şi/ sau a documentaţiei asociate; sau a unui produs care urmează să fie implementat pe baza cerinţelor funcţionale şi nonfuncționale specificate de către beneficiar/ client. Primul caz are ca scop determinarea
TODAY SOFTWARE MAGAZINE
Figura 1: Evoluţia metodelor FPA în timp productivităţii, pe când cel de-al doilea are ca scop estimarea produsului. Puterea metodei stă în faptul că se axează pe măsurarea cantităţii de funcţionalitate cu valoare de business pe care un sistem informaţional o oferă utilizatorului final. Deci, nu o să urmărească metoda tehnică aleasă pentru a implementa funcţionalitatea.
Istoric
Metoda are un istoric lung, a fost prima dată definită în 1979, în “A New Way of Looking at Tools” de către Allan Albrecht la IBM. (vezi: http://wikipedia.org) Ca urmare, există o serie de organizaţii, unele de nivel naţional, altele internaţional, majoritatea non-profit, care se ocupa cu optimizarea metodei şi cu adaptarea ei la cerinţele sistemelor informaţionale actuale. În anul 2012, există cinci standarde ISO, pentru această metodă. (vezi:http:// en.wikipedia.org/wiki/Function_point , http://www.iso.org/iso/iso_catalogue/ catalogue_ics/catalogue_ics_browse.htm? ICS1=35&ICS2=80&published=on&withd rawn=on ) Conceptual vorbind, nu există diferenţe între standarde dar există mici diferenţe în tehnicalitatea metodei. De asemenea, un punct funcţional rezultat prin aplicarea unui standard nu poate fi comparat cu unul rezultat prin aplicarea unui alt standard, decât dacă se aplică un factor de conversie, comparaţie/conversie pe care nu o recomandăm decât în scop ştiinţific.
NESMA Method
Am ales să prezint standardul “NESMA FPA Method: ISO/IEC 24570:2005 ” din motive de familiaritate, si având experienţă cu acest standard. Metoda are 5 tipuri de funcţii,
fiecarereprezentând o funcţionalitate sau o parte din modelul de date. Aceste funcţii, sunt o “spargere” a funcţionalităţii aplicaţiei, dupăregulile FPA şi reprezintă cel mai mic nivel de granularitate, până la care se poate merge. Paşii principali în determinarea numărului de puncte funcţionale sunt: • Colectarea documentaţiei; • Determinarea tipului de numărătoare (Function Point Count); • Determinarea graniţei (boundary); • Identificarea funcţiilor de date(data transactions sau data logical files) şi determinarea complexităţii lor; • Identificarea funcţiilor de tip utilizator şi determinarea complexităţii lor (user functions sau user transactions); Calcularea numărului de puncte funcţionale
date, modelul de domeniu, etc.) – se foloseşte pentru a determina funcţiile de date (data trasactions) ■■ e lementele care sunt conţinute în modelul de date (capacitatea de a stoca date, tabelele în sine, elementele de date conţinute de tabele) – se foloseşte pentru a determina complexitatea funcţiilor de date • Modul în care se comportă aplicaţia (Behavior). Behavior-ul se caracterizează prin: ■■ Modelul care descrie comportamentul aplicaţiei (exemplu: designfuncţional) – folosit pentru a determina user transactions ■■ Flow-ul elementelor de date şi logica de procesare folosit pentru a determina complexitatea funcţiilor utilizator Exemple: Documentele de design functional, design tehnic, arhitectură, modelul de date, aplicaţia în sine.
Determinarea tipului de numărătoare (Point Count)
În funcţie de momentul din ciclul de dezvoltare a sistemului informaţional (Software Development Lifecycle) şi nivelul de detaliu al informaţiilor pe care se baseaza măsurătoarea, se pot alege unul dintre următoarele tipuri: • Metoda indicativă (Indicative function point count) • Metoda estimativă (Estimated function point count) • Metoda detaliată (Detailed function
Figura 2: Tipurile de funcţiiînmetoda FPA
Colectarea documentaţiei necesară
Pentru a determina numărul de puncte funcţionale al unui sistem informaţional avem nevoie de informaţii care să ne indice: • Structura datelor (Structure). Structura e caracterizată: ■■ prin modelul care descrie structura datelor (se poate folosi modelul de
point count) Metodele indicativă şi estimativă din standard, se bazează pe existența unei serii de informaţii minimale despre sistem, în funcţie de care se extrag o serie de funcţii, peste care se aplică o serie de calcule rezultate din măsurători statistice (care se găsesc în literatura de specialitate sau www.todaysoftmag.ro | nr. 3/2012
17
management
diferite baze de date, unele gratis sau contra cost). Aceste tipuri sunt utilizate atunci când vrem să măsurăm un proiect/produs software în faza incipientă de dezvoltare; şi când documentația e minimă. NESMA are un whitepaper special pe acest topic, pe care îl gasesti la capitolul Referinţe. Ca orice metodă, are o marjă de eroare, mai ales dacă se foloseşte un tip mai puţin detaliat cum sunt cele două de mai sus (marjă de eroare care poate să varieze până la 50% pentru metoda indicativă); ca urmare, dacă eşti începător cu metoda, personal nu-ţi recomand să aplici aceste două tipuri. Pentru a înţelege pe deplin această metodă, trebuie să o aplici pe cea detaliată. De aceea, în continuare, am ales să detaliez acest tip de măsurătoare.
Determinarea graniţei
Acest pas din aplicarea metodei vizează identificarea interacţiunii sistemului numărat cu alte sisteme și utilizatori. Se poate face prin analiza diferitor specificaţii tehnice, interviuri cu utilizatorii, etc.Este un pas important pentru că: • Defineşte sfera de acţiune a măsurătorii; • Are un rol important în determinarea ulterioară a tipurilor de tranzacţii; Să ne imaginăm că avem de măsurat un sistem clasic, care are o bază de date şi o interfaţă cu utilizatorul. Sistemul pe care noi îl măsurăm, interacţionează cu un alt sistem, în sensul că foloseşte date care sunt stocate şi menţinute de acel sistem. E important de determinat graniţa, pentru că în acest caz, acele date o să se materializeze într-un tip de tranzactii care o să se numească fişiere de Interfeţe Externe (External Interface Files - EIF).
Metoda de estimare Function Point
o să fie un EIF. Identificarea funcţiilor de date (data Modul în care o serie de tabele transactions sau data logical files) şi sunt grupate în unul sau mai multe ILF sau determinarea complexităţii lor EIF, ţine de gradul de dependenţă logică între tabele. Exemplu: Tabela “Facturi” Un data logical file e un grup de date relaţionate cel mai probabil e dependentă de tabela: logic văzute din punct de vedere al utilizatorului “Tip_Facturi”, deci aceste două tabele o să final. fie în acelaşi ILF. Un data logical file poate fi de două tipuri: Pentru mai multe informaţii, legat de Internal logical file şi External Interface file. dependenţele între tabele, vezi standardul Un Internal Logical file (ILF) e un data logical NESMA. file care se caracterizează prin localizarea în totaDeci, în exemplul de mai sus, am litate în interiorul graniţei aplicaţiei numărate, iar indentificat trei fişiere logice de date: datele sunt menţinute de către aplicaţia care intră ILF_Facturi (conţine tabelele de facturi), în scopul măsurătorii ILF_Persoane (conţine tabelele de perUn External Interface file (EIF) e un data logi- soane) , EIF_RiskInfo (conţine datele cal file se caracterizeaza localizarea în totalitate în folosite din sitemul extern). exteriorul aplicaţiei numerate, iar datele conţinute Complexitatea fişierelor logice de de acestea sunt folosite de către aplicaţia numărată date. Pentru aceasta trebuie să mai defidoar pentru referinţe. nesc trei concepte, şi anume: Tip element de date (Data Element Type - DET), Tip Să ne imaginăm un sistem care are ca înregistrare elemente (Record Element scop mentenanţa facturilor şi a persoanelor Type - RET) şi Tip fişier referenţiat (File fizice sau juridice cu care interacţionează Type Referenced - FTR) organizaţia care foloseşte aplicaţia. Pe lângă Un RET este un subgrup de elemente de date, asta, organizaţia foloseşte informaţii dintr- recunoscut unic de către utilizator în cadrul unui un sistem extern care o ajută să determine ILF sau EIF. În exemplul nostru un RET ar fi tabela un anumit grad de risc al clienţilor care o Facturi. Un FTR este un data function, care este refesă indice cât credit (reprezentând suma rentiata de către o user transaction. Scopul FTR o fie mai bine evidenţiat la determinarea complemaximă de facturare) poate să acorde să xităţii tranzacţiilor utilizator. În exemplul nostru, unui client în funcţie de gradul de risc. Cel fiecare dintre acele trei funcţii de date este şi un mai probabil aplicaţia va folosi o serie de FTR.Un DET este un câmp unic recunoscut de către tabele care va modela modulul de facturare utilizator; nu este repetitiv şi conţine informaţii nu statice. Dacă un câmp este recursiv, (Tip_Facturi, Facturi, Articole_Facturi, dinamice, atunci este luat în considerare o singură dată. În Tip_Persoane, Persoane, Adrese, etc) exemplul nostru, numărul de DET-uri o să fie suma care le avem în tabele. Pentru că determinarea de fişierelor de coloane Notă: Există o serie de excepţii în metodă, care logice de date trebuie făcute din punct de nu fac parte din scopul acestui articol. Exemple: Nu numără ca şi DET-uri, cheile străine pentru că vedere al utilizatorului final, în acest caz o se această informaţie este deja stocată în cheile prisă avem două ILF, pe care eu o să le denu- mare, şi nu trebuie să numărăm aceeaşi informatie două ori. De asemena, nu se numără tabelele mesc: ILF_Facturi şi ILF_Persoane. Datele de care au ca şi scop doar crearea de legături între de risc care sunt “aduse” din sistemul extern alte tabele, pentru că metoda are ca regula de bază,
Figura 3. Schema funcţiilor FPA (Sursa: http://portal-management.blogspot.com)
18
nr. 3/2012 | www.todaysoftmag.ro
numărarea a doar ce are valoare pentru utilizatorul final (în FPA acestea se numesc “key-key entities”)
Revenind la complexitate, funcţiile logice de date determinate, o să aibă următoarele caracteristici: - ILF_Facturi: RET: 3 (Tip_Facturi, Facturi, Articole_Facturi), DET: presupunem că suma de coloane în aceste tabele măsurate o singură dată şi luând în considerare excepţiile metodei, este 30. - ILF_Persoane: RET: 3 (Tip_ Persoane, Persoane, Adrese), DET: presupunem că suma de coloane în aceste tabele măsurate o singură dată şi luând în considerare excepţiile metodei, este 60. - EIF_RiskInfo – metoda de determinare a RET-urilor şi DET-urilor este
TODAY SOFTWARE MAGAZINE
identică (iar în practică se pot folosi pentru aceasta descrierea interfeţelor). Să presupunem că are RET: 1 şi DET: 10. Complexitatea funcţiilor logice de date este dată de tabela din Figura 4: Mică (LowL), Medie (Average – A), Mare (High - H). În exemplul nostru, complexitatea funcţiilor noastre o să fie: ILF_Invoices: Average ILF_Persons: Average EIF_RiscInfo: Low
Identificarea funcţiilor de tip utilizator şi determinarea complexităţii lor (user functions sau user transactions) În teoria FPA există 3 tipuri de funcţii utilizator: Intrare Externă (External Inputs - EI), Ieşire externă (External Outputs - EO) şi Interogare Externă (External Inquires - EQ). Mai jos, o să dau definiţia fiecăruia şi câte un exemplu. EI este o funcţie identificată unic de către utilizator care străbate graniţa aplicaţiei dintre exterior spre interior EO este o funcţie identificată unic de către utilizator care străbate graniţa aplicaţiei dinspre interior spre exterior. De asemenea, un EO variază în mărime şi/sau diferite procesări de date este nevoie pentru aceasta. Are drept caracteristică, faptul că trebuie să fie văzută ca un proces elementar de către utilizator. EQ este o funcţie identificată unic de către utilizator, care are o combinaţie input/output. Se caracterizează prin faptul că, partea de output are o mărime fixă şi nu suferă mai multe tipuri de procesare. Şi acestă funcţie, trebuie să fie văzută de către
Figura 4. Complexitate funcţiilor logice de date. utilizator ca fiind elementară
În exemplul nostru, funcţionalitatea de a salva o persoană în sistem este un EI, iar un EO ar fi o funcţionalitate care ne returnează lista de persoane pe care o avem în sistem. Un EQ ar fi funcţionalitatea de căutare după un identificator unic de persoană. Utilizatorul introduce un identificator unic al persoanei (partea de intrare), iar sistemul returnează o singură persoană (partea de ieşire), care are o mărime fixă pentru că întotdeauna o să ne returneze un Nume, Prenume, Număr de telefon, Adresă, etc .
Complexitatea funcţiilor utilizator.
Pentru a determina complexitatea lor, se iau în calcul două elemente: DET şi FTR. Pentru a exemplifica mai bine voi reveni la
exemplul nostru descriind funcţionalitatea care o implementează, care sunt funcţiile de tip utilizator şi cum se determină complexitatea. Să ne imaginăm că sistemul nostru implementează următoarea funcţionalitate descrisă în Use Cases: UC1 . Returnează o listă de Facturi (presupunem că lista are 20 de atribute); UC2. Oferă posibilitatea de a adăuga o nouă factură în sistem (15 atribute), iar în fereastra de adăugare după alegerea persoanei, informează despre gradul de risc (1 atribut), care la salvarea facturii se salvează în baza noastră de date, într-una dintre tabelele din ILF_Facturi. Să presupunem că factura noastră o să facă referinţă şi la o persoană, de care o leagă; UC3. Oferă posibilitatea de a căuta după un identificator unic al facturii (1 atribut de intrare şi 16 de ieşire); UC4. Returnează o listă de persoane (30 de atribute); UC5. Oferă posibilitatea de a adăuga o nouă persoană în sistem (35 de atribute); UC6. Oferă posibilitatea de a căuta după un Person_id (oferă ca şi ieşire, 35 de atribute); În tabelul de mai sus, determin funcţiile utilizator şi caracteristicile lor. Aşadar, o să avem următoarele complexităţi pentru funcţiile utilizator: EO_InvoiceList – Average EI_AddInvoice – Average EQ_RiscInfo – Low EQ_SearchInvoiceById – Low EO_Persons – Average EI_AddPerson – Average EQ_SearchByPersonId – Average Complexitatea funcţiilor utilizator este dată de tabelele din Figura 5 şi Figura 6: Mică (Low- L), Medie (Average – A), Mare (High - H)
Figura 5. Complexitate EI.
Figura 6. Complexitate EO
Calcularea numărului de function points
Bazat pe tipul tranzacţiei şi pe complexitatea ei, NESMA propune un număr de function points ,vezi Figura 6 şi Figura 7, pentru fiecare tranzacţie, suma lor fiind numărul de function points pe care îl deţine sistemul din exemplul nostru. Aşadar, funcţiile noastre o să aibă aso-
Figura 7. Număr FP fişiere logice de date.
Figura 8. Număr FP funcţii utilizator. ciate numărul de puncte functionale, astfel: Fişiere logice de date: ILF_Facturi – A: 10 FP ILF_Persons – A: 10 FP EIF_RiscInfo – L: 5 FP Funcţii utilizator: EO_ListăFacturi – A: 5 FP EI_AdaugăFactură – A: 4 FP EQ_RiscInfo – L: 3 FP EQ_CautăFacturăDupăId – L: 3 FP www.todaysoftmag.ro | nr. 3/2012
19
management
EO_Persoane – A: 5 FP EI_AdaugăPersoană – A: 4 FP EQ_ CautăPersoanăDupăId – A: 4 FP Bazat pe informaţiile de mai sus, proiectul nostru o să aibă o sumă totală de 53 puncte funcţionale . Notă: Exemplul de mai sus are doar scop informativ. Deoarece această metodă de numărare are o marjă de eroare, ca orice metodă, literatura de specialitate nu recomandă aplicarea ei pentru sisteme care pot să aibă un număr mai mic de 100 puncte funcţionale.
Caracteristicile non-functionale
După cum probabil ai observat, în exemplele de mai sus nu am atins deloc caracteristicile non-functionale, care e clar că au un cuvânt important de spus în determinarea unei estimări sau a productivităţii unei echipe. În literatura de specialitate există conceptul de puncte funcţionale neajustate (unadjusted function point count) şi puncte funcţionale ajustate (adjusted function point count). În exemplul de mai sus numărul pe care l-am atribuit aplicaţiei noastre este un număr de puncte funcţionale neajustate. În teoria FPA, există o serie de 14 caracteristici generale de sistem (general sistem characteristics) care se folosesc pentru a determina numărul de FP care ar trebui să se adauge peste acele puncte funcţionale neajustate pentru a surprinde caracteristici non-funcționale; rezultând un număr total de puncte funcţionale ajustate. (vezi NESMA: http://www.nesma.nl/section/fpa/ howfpa.htm). Am ales să nu vorbesc în detaliu despre ei în acest articol. În paragrafele care urmează o voi explica de ce. S-a demonstrat în literatura de specialitate că, dacă avem un sistem foarte light, din punct de vedere non-functional, peste a cărui număr de puncte funcţionale neajustate aplicăm caracteristici minime pentru el, va avea un număr minim de puncte funcţionale ajustate = numărul de puncte funcţionale neajustate – 35 % puncte funcţionale neajustate. La fel, dacă sistemul este unul foarte heavy, peste a cărui număr puncte funcţionale neajustate aplicăm caracteristici maxime, va avea un număr maxim de puncte funcţionale ajustate = numărul de puncte funcţionale neajustate + 35 % puncte funcţionalene ajustate. Să ne gândim practic. Presupunând că avem două sisteme, având un număr
20
nr. 3/2012 | www.todaysoftmag.ro
Metoda de estimare Function Point
de puncte funcţionale neajustate egal cu 1000 FP. Primul sistem e unul care are o bază de date Access în spate, nu are nevoie de acces concurrent la date, nu trebuie să fie portabil, o să fie folosit de maxim un singur utilizator, deci un sistem foarte simplu. Conform cu literatura de specialiate o să aibă un număr de puncte funcţionale ajustate egal cu 650 FP. Cel de-al doilea sistem este unul foarte complex din punct de vedere non-funcțional, trebuie să se implementeze accesul concurrent la date, trebuie să aibă o performanţă bună cu un million de utilizatori simultan, trebuie să fie portabil, deci un sistem complex al cărui caracteristici de sistem am zice că sunt la limita maximă. Conform cu literatura de specialitate acest sistem ar avea un număr de puncte funcţionale ajustate egal cu 1350 FP. Ca urmare, crezi că ar fi real să spunem că, efortul pentru a implementa cel de-al doilea sistem e doar dublu, faţă de efortul de a implementa primul sistem? Nu prea cred. Conceptul de puncte funcţionale ajustate/neajustate a fost scos din standard-ul ISO la începutul anilor 2000, probabil acesta este motivul. Dar ce facem cu caracteristicile nonfunctionale? Dacă le luăm în considerare intră în acțiune următorul pas. Ce facem cu numărul de puncte funcţionale ? Cum îl folosim în cadrul organizaţiei? Îl vom denumi “benchmarking” şi va fi explicat în următorul capitol.
Benchmarking
Orice organizaţie care doreşte să folosească această metodă ar trebui să aplice metoda în diferite momente de dezvoltare din Software Development Lifecycle, cel puţin o dată la început (având ca scop estimativ) şi o dată la încheierea proiectului (având ca scop determinarea productivităţii la nivel de echipă/organizaţie). Productivitatea este dată de numărul de ore necesare pentru a dezvolta un punct funcțional. Aplicând metoda la sfârşitul ciclului de dezvoltare, organizaţia îşi poate crea o bază de date legat de productivitatea medie per tipuri de sisteme, echipe de dezvoltare, caracteristici non-functionale ale sistemului, tehnologii folosite în dezvoltarea lui. Având această bază de date la dispoziţie şi aplicând metoda la începutul ciclului de dezvoltare, organizaţia va putea estima un număr de ore pentru
implementarea sistemului. Aşadar, trasformarea numărului de puncte funcţionale în număr de ore trebuie văzut ca fiind parte dintr-un process continuu de îmbunătăţire a proceselor de estimare şi productivitate, în cadrul căruia datele istorice joacă un rol crucial. Precizam mai sus faptul că nu recomand aplicarea mai multor standarde în paralel, acesta este motivul. Pentru a crea o baza de date cu date istorice consistente e indicat să te raportezi la aceeaşi metodă/ standard.
Sub-metode
Pentru a fi la zi cu cerinţele sistemelor actuale, există o serie de “submetode” care au ca scop tratarea anumitor cazuri speciale, legate de: metodologia de dezvoltare a sistemelor, tehnologie, tipuri de specificaţii funcţionale, etc . Câteva exemple ar fi: - “ N 1 3 F PA f o r S o f t w a r e Enhancement (v2.2.1)” - îşi propune să trateze măsurarea unui număr de enhancement function points (EFP), pentru proiectele care au o metodologie de dezvoltare agilă. Această metodă setează numărul de EFP pentru activităţi de ştergere, modificare, adăugare de funcţionaliate din sistemul numărat. - “N24 FPA applied to UML and Use Cases(v1.0.1)” - îşi propune să trateze măsurarea unui număr de puncte funcţionale (FP) având ca informaţie de input specificaţii care descriu sistemul în stil UML (Unified Modeling Language) şi Use Cases. - “ N 2 5 F P A f o r Datawarehousing(v1.1.0)” - îşi propune să trateze măsurarea unui număr de puncte funcţionale (FP) pentru sistemele de data warehouse. - “N20 FPA în Early Phases (v2.0)” - îşi propune să trateze măsurarea unui număr de puncte funcţionale (FP) pentru sistemele care sunt în stadii incipiente de dezvoltare.
Concluzii
În concluzie, putem considera că această metodă este una indicată pentru a determina productivitatea si eventualele fluctuaţii în productivitate, pe de o parte, iar pe de altă parte, se poate aplica pentru a face estimări bazate pe productivitate. Metoda și-a dovedit până acum eficiența în cadrul unui număr considerabil de proiecte.
QA
TODAY SOFTWARE MAGAZINE
Managementul Calității Practici recomandate pentru a livra software de calitate
Dinamica actuală din industria de dezvoltare software reprezintă o adevărată provocare pentru asigurarea calității. Aceasta se datorează orientării spre livrarea rapidă și frecventă a aplicațiilor (în contextul în care gradul de complexitate al acestora s-a mărit); a numărului mare de utilizatori finali și al așteptărilor tot mai mari ale acestora, al diverselor medii de operare. Pentru că am amintit de așteptările tot mai mari ale clienților, credem că nu este un secret pentru nimeni faptul că aceștia vor calitate superioară pentru
Eugen Otavă
eotava@smallfootprint.com Release Manager Small Footprint
produsele oferite, modificari rapide ale acestora, servicii personalizate și ușor de întreținut, sisteme integrate și bineînțeles, livrari la prețuri cât mai mici, preferabil imediat. De câte ori s-a pus în discuție calitatea aplicațiilor software, de fiecare dată am subliniat că testarea software nu reprezintă singura măsură la care trebuie să ne gândim pentru a livra un produs software de calitate, așa cum mulți ar putea crede la prima vedere. De altfel, termenii folosiți, QA și testare, nu se suprapun ca semnificație. Așadar, prima idee/practică recomandată este migrarea de la ”mindset-ul” orientat pe controlul calității/testare, spre acela orientat pe asigurarea calității. Testarea pentru calitate nu reprezintă asigurarea ei, ci o metoda de control. Asigurarea calității (QA) este orientată pe procese, în timp ce controlul calității (QC) este orientat pe produs. Testing-ul ne ajută să câștigăm încredere că ceea ce livrăm este așa cum trebuie să fie, că totul funcționează conform specificațiilor și la standardele de calitate propuse, dar pe lângă aceasta, și făcând abstracție de aspectele tehnice, legate de tehnologia aleasă pentru implementare,
de procesele simple și eficiente, buna planificare, comunicarea eficientă și din timp, implicarea clientului, cerințele clare, pregătirea/instruirea adecvată a membrilor echipei, sunt de asemenea factori care trebuie considerați pentru succesul proiectului și pentru calitatea finală livrată. Inginerii QA trebuie să își asume rolul de asiguratori ai calității, în toate fazele de dezvoltare a produsului. Aceștia trebuie să observe practicile care conduc la introducerea de defecte, să analizeze din timp cerințele și procesele, să propună sugestii de îmbunătățire a produsului, să observe cât mai repede eventualele scăpări sau erori, pentru că se știe că un defect de documentație descoprit din vreme, reduce semnificativ costurile asociate cu re-implementarea târzie, dacă presupunem că acesta ar fi fost găsit doar in faza de testare. Considerând aceste procese, tendința acutală este de migrare spre metodologiile de dezvoltare iterative și incrementale Agile, în defavoarea celor mai vechi, de tip secvențial, precum Waterfall. Standish Group International Inc www.standishgroup.com este un lider binecunoscut în domeniul analizei industriei IT, prin colectarea de informații din lumea www.todaysoftmag.ro | nr. 3/2012
21
QA
reală și prin prezentarea lor în mod sistematic și statistic. Acesta în ”Chaos Research reports”, a arătat pentru anul trecut, o creștere semnificativă a ratei de succes a proiectelor i.e. 37%, comparativ cu rezultatele raportelor din anii precedenti. De asemenea în 2009 procentul era de 32%. Cel mai dramatic raport a fost cel din anul 2004, care arăta că doar 28% din totalul proiectelor, care au făcut parte din studiu, au fost finalizate cu success. Practic, după cum declara și Jim Johnson, chairmanul Standish Group, raportul pe anul 2011 prezintă rata cea mai mare de success din istoria raportelor Chaos Research. Rata de succes a proiectelor Agile este de trei ori mai mare față de proiectele non-Agile, după cum se arată în ”2011 - Chaos Manifesto – The Standish Group International”. Standish Group înțelege printr-un proiect că a fost finalizat cu succes, dacă a fost livrat la timp,
22
nr. 3/2012 | www.todaysoftmag.ro
Managementul Calității
în bugetul propus, și bineînțeles complet. Statisticile acestora, având la bază proiecte dezvoltate începând cu anul 2002 și până în anul 2012, arată ca în imaginea de mai sus. Luând în considerare datele statistice de mai sus, putem afirma că acea tendință de a deveni Agile Friendly este una pozitivă. Am fi totuși suprinși să aflăm că încă mai sunt multe companii mari care lucrează după metodologiile secvențiale vechi, sau că sunt altele care pretind ca lucrează Agile, dar încă păstrează principii străine de Agile. Nu vom recurge la descrierea acestor metodologii sau a avantajelor lor, pentru că multe sunt cunoscute, dar și pentru că în numărul trecut a fost pe larg explicat Scrum-ul. Subliniez doar provocarea pe care o aduce adoptarea metodologiilor de tip Agile pentru inginerii QA care au fost instruiți în spiritul tradiționalelor cursuri ISTQB (International Software Testing
Qualifications Board), care susțin beneficiile echipelor independente de testare, împărțirea activităților de testare in faze secvențiale, folosirea V-modelului pentru management-ul ciclului de testare, promovează scripturile de testare și mai puțin a listelor de verificare, lucruri care nu se prea aplică in Agile etc . Raportul amintit al The Standish Group, analizează și cauzele proiectelor eșuate și printre primele cauze amintite sunt: cerințe incomplete, neimplicarea clientului, probleme de comunicare etc . Vom analiza pe scurt problematica cerințelor incomplete. Fară o analiză atentă a cerințelor, riscăm să pierdem timp și bani, implementând soluții incomplete sau chiar eronate. Există o adevărată disciplină în domeniul software pe marginea cerințelor (Requirments Engineering) și implicit cursuri și certificări pe acestă temă (e.g. http:// www.certified-re.de/en/). Probabil acest subiect va putea fi tratat pe larg intr-un articol viitor, deoarece este foarte important. Înainte de prezentarea altor practici recomandate pentru a livra software de calitare, subliniez că a vorbi despre calitate este destul de dificil, atâta vreme cât nu avem o înțelegere comună a conceptului. Astfel, calitatea se poate măsura prin nivelul de satisfacție al clientului. Unii ar putea spune că, un produs de calitate este acela care răspunde cerințelor clientului, și implicit testarea asigură acest lucru. De acord, dar să nu uităm totuși de o nuanță adusă încă din anii 80’ de modelul Kano, care este o teorie a dezvoltării produsului versus satisfacţia clienţilor. Teoretizat de către profesorul japonez Noriaki Kano (1984), acest model demonstrează că satifacția clienților crește semnificativ în funcție de performanța atributelor produsului, arătând de asemenea că, atunci când sunt oferite caracteristici/componente inovative, care deși nu au fost inițial identificate prin cerințe ca nevoi explicite de către client, odata oferite, acestea aduc valoare și contribuie semnificativ la gradul de satisfacție al clientului. Acest model oferă o imagine de ansamblu asupra atributelor produsului care sunt percepute a fi importante pentru satisfacția clienţilor. Modelul Kano se concentrează pe diferenţierea caracteristicilor produsului. Prima arie, delimitată de linia diagonală din reprezentarea grafică de mai jos, reprezintă necesități explicite (scrise sau verbale). A doua arie, a satisfacerii
TODAY SOFTWARE MAGAZINE clienților/utilizatorilor, reprezintă inovația. A treia arie, cea mai semnificativă, reprezintă necesități nedeclarate, așa cum arată curba de jos, din dreapta. Clientul poate să nu știe de ele sau poate să creadă că aceste necesități vor fi automat acoperite. Modelul Kano poate fi folosit la prioritizarea cerințelor, în funcție de satisfacția clientului, iar pentru aceasta s-au identificat patru categorii: ”Surprinzătoare și încântătoare” (pot diferenția un produs față de competiție), ”Cu cât mai mult, cu atât mai bine” (cresc satisfacția utilizatorului), ”Trebuie să existe” (nu o să crească satisfacția utilizatorului, dar dacă lipsesc, o să producă insatisfacție), ”Mai bine să lipsească” (reprezintă caracteristici care produc insatifacție utilizatorului). Aceasta clasificare poate fi folosită și la împărțirea caracteristicilor în release-uri, spre exemplu, primul release ar trebui să conțină mai ales cerințele de tip ”Trebie să existe”. Se poate concluziona că, un pas cheie spre creșterea satisfacției clientului, a calității este inovația. Secretul stă în a identificarea acele atribute pe care clientul nu le-a numit explicit, dar care fac diferența. Acestea, odata oferite, pe lângă celelalte, care au fost identificate, cresc satisfacția clientului și contribuie ca produsul să se diferențieze de altele de același fel.
Concluzii
Adoptarea principiilor asigurării calității, pe toata durata de viață a unui produs, nelimitându-ne doar la testare, ca măsură de control a calității produsului reprezintă primul și cel mai important pas. De asemenea, am prezentat tendința actuală de a folosi o metodologie de dezvoltare software iterativă și incrementală de tip Agile, care după cum se arată în rapoartele oferite de către The Standish Group Inc, au o rată a succesului de trei ori mai mare decât metodologia secvențială Waterfall. Am încercat, de asemenea, să subliniez rolul pe care îl au cerințele clare pentru calitatea finală a unui produs, dar și performanța atributelor produsului, caracterul inovativ al acestora, pentru gradul de satisfacție al clientului/utilizatorului, apelând pentru aceasta la modelul Kano.
www.todaysoftmag.ro | nr. 3/2012
23
programare
Big Data Reprezentarea datelor
În numărul primul articol al seriei „Big Data” se vorbea despre trendul acestui concept în industria software. Acest articol prezintă fundamentele tehnologiilor care fac posibilă stocarea și interogarea acestor volume mari de date. Pentru a înțelege mai bine care e problema cu Big Data încep cu un mic exemplu. La un moment dat circula pe Internet umătoarea statistică:
Cătălin Roman Software Architect la Nokia, Berlin catalin.roman@nokia.com
Lucrează cu SOA și este pasionat de e-commerce
24
nr. 3/2012 | www.todaysoftmag.ro
eBay colectează zilnic 20TB de date generate de utilizatori. Facebook colectează 20TB zilnic din date genearate de utilizatori și generează încă 10TB din analizele zilnice, de asemenea scanează 135TB/zi, iar pentru a oferi serviciul de Insigts prelucrează 15PT de date. Google procesează 20PT de date pe zi și stochează 5PT zilnic. E clar că e nevoie nu doar de hardware, dar și de un nou concept software pentru a stoca acest volum de date. Sistemele RDBMS indiferent de topologia de replicare folosită devin copleșite. Apar probleme de scalabilitate, operațiile de scriere se strangulează, join-urile devin și mai lente, apar intârzieri la sincronizare. Mai mult decât atât gândiți-vă ce s-ar întâmpla daca se arde o placa de rețea sau crapă un hard-disk. Cu cât există mai mult hardware într-un deployment, cu atât crește rata de defecte hardware. De asemenea nu putem neglija nici costurile de hardware, curent electric și salariile inginerilor de sistem care să fie disponibili 24x7. Pentru a putea face față volumelor mare de date s-au adoptat sistemele distribuite. Prezentăm în continuare ce stă la baza lor. În 2000, un anume profesor Eric Brewer
de la University of California, Berkeley, introducea teorema CAP. Spre deosebire de sistemele DBMS care se bazează pe prorietățile ACID, teorema vorbea despre trei atribute cheie ale sistemelor distribuite: Consistency, Availability și Partition tolerance. Consistency se referă la consistența datelor, mai precis, ori cât de mulți clienți ar avea un sistem distribuit, la o operație de citire toți ar primi aceași versiune a datelor. Availability se referă la faptul că toți clienții acestui sistem distribuit pot în orice moment să scrie și să citească date. Par tition tolerance sistemu l funcționează chiar și atunci când noduri din sistemul distribuit nu sunt disponibile. Aceași teoremă mai spunea un lucru foarte important: este imposibil ca un sistem distribuit să le garanteze pe toate trei. Adică poți să alegi fie C-A, fie A-P ori C-P. Pornind de la această teoremă s-au dezvoltat câteva tehonologii, unele proprietare, iar altele open-source ce poarta numele de NoSQL. NoSQL nu spune un „nu” hotarat SQLului, ci mai degrabă înseamnă „not only SQL”. Acestea sunt sisteme cu arhitectură distribuită, datele sunt patiționate redundant
TODAY SOFTWARE MAGAZINE
pe mai multe calculatoare. Un astfel de sistem se poate scala orizontal adăugând mai multe calculatoare. Defectarea vreunuia dintre ele este tolerată. Pentru a obține scalabilitate orizontală, e nevoie de o puternică toleranță la partițonare, care presupune renunțarea fie la consistență, fie la disponibiliatea serviciului. Iar aceasta se obține prin relaxarea abilităților relaționare și slăbirea sau chiar eliminarea tranzacțiilor. Aceste sisteme sunt optimizate pentru operații de citire și adăugare (append). Comparativ cu RMBS, în afară de stocare, oferă mai puține functionalități, dar în schimb compensează la capitolul scalabilitate și performanță. Un l u c r u d e o s e b i t c a r e t r e buie menționat este că datele nu urmăresc o schema fixă, altfel spus sunt semi-structurate. Înainte de a detalia acest tip de date, facem o clasificare a sistemelor NoSQL.
Imaginea de mai sus ilustreză cele trei proprietăți ale sistemelor NoSQL. Sistemele RDMS apar în schema doar pentru comparație, în realitate ele nu și-ar avea locul aici. Dacă în RDBMS modelul de date era cel relaționar, în NoSQL se vorbeste cel mai des despre key-value, column-oriented și document-oriented. Sistemele key-value suportă operațiile de scriere, citire și ștergere, bazându-se pe o cheie primară. Nu există range-query, sau alt tip de „cautare” de date.
Sistemele column-oriented, folosesc în continuare tabele, dar nu oferă joinuri. Acestea stochează datele per coloană, diferit față de sistemele tradiționale unde datele sunt salvate pe rânduri. Un prim beneficiu ar fi viteza de acces la date când avem un tabel cu multe linii și multe coloane. Mai multe detalii puteți găsii aici: http://en.wikipedia.org/wiki/ Column-oriented_DBMS Sistemele document-oriented, stochează documente structurate folosing JSON sau XML, tot fară join-uri. Dacă e nevoie de join-uri acestea se implementează în aplicația care are nevoie de ele. O altă clasificare ar fi chiar după cele 3 proprietati CAP. Consistent, Available (CA), acestea au probleme cu partiționarea și încearcă să rezolve problema prin replicarea datelor: • RDBMS (relational) • Vertica (column-oriented) • Aster Data (relational)
•
Greenplum (relational)
Consistent, Partition-Tolerant (CP), au provocări cu disponibilatea serviciului, dar în schimb datele sunt consistente în toate nodurile sistemului. • BigTable (column-oriented/ tabular) • Hypertable (column-oriented/ tabular) • HBase (column-oriented/tabular) • MongoDB (document-oriented) • Terrastore (document-oriented)
• • • •
Redis (key-value) Scalaris (key-value) MemcacheDB (key-value) Berkeley DB (key-value)
Available, Partition-Tolerant (AP), serviciul e în permanență disponibil, iar toleranța la defecte este foarte ridicată, dar operațiile de scriere se vor propaga mai lent pe toate nodurile din sistem. • Dynamo (key-value) • Voldemort (key-value) • Tokyo Cabinet (key-value) • KAI (key-value) • Cassandra (column-oriented/ tabular) • CouchDB (document-oriented) • SimpleDB (document-oriented) • Riak (document-oriented) Propagarea lentă a scriierilor se mai numește „eventual consistency”. Dacă supunem un sistem AP la concurență mare la scriere, s-ar putea să nu regăsim imediat la citire valoarea pe care tocmai am scriso. Când avem o aplicație care folosește un astfel de sistem trebuie să fim conștienți de limitările acestuia și să le tratăm la nivel de aplicație. Alegem un sistem NoSQL și să facem un exercițiu... Fie un website de anunțuri de mica publicitate, unde utilizatorii pot să-și creeze un cont și să posteze anunțuri gratuite. Vizitatorii vor putea filtra anunturile după categorii și locație. Problema stocării și interogării datelor poate fi rezolvată relativ ușor cu o bază de date relațională, dar pentru a complica lucrurile, mai adaugăm faptul că portalul are 1.5 milioane de anunțuri noi pe zi, este vorba de craiglist.org. În condițiile de mai sus, se impune alegera unui sistem CAP. Pentru a exersa vom alege MongoDB. Cu MongoDB, datele sunt stocate în documente în format BSON (Binary JSON) dar pentru reprezentare se folosește JSON. Tabelul de pe pagina următoare prezintă mapparea conceptelor SQL la concepte MongoDB. În problema noastră avem de-a face cu doua entități sau altfel spus, două tipuri de documente: user și annuncement. Le putem împărții în două colecții, deși nu suntem constrânși. user: { ”_id”: ”alice”, ”email”: „alice@hotmail.com”, „createdOn”: „2012-02-02 12:12:12”, www.todaysoftmag.ro | nr. 3/2012
25
programare
„country”: „DEU”, „city”: „Berlin” } announcement: { „_id”: ObjectId(„9fd9fe0cad2f-409b-a8af-fd39b2a414f2”), „author”: „alice”, „createdOn”: „2012-02-02 13:12:12”, „subject”: „Bike for sale”, „description”: „Gorgeus bike for sale.”, „price”: „150”, „contact”: { „phone”: „151-82310373”, „email”: „alice@hotmail.com”, } „location”: { „city”: „Berlin”, „postalCode”: „13187”, „country”: „DEU”, } }
Big Data
email : „alice@hotmail.com”, createdOn: „2012-02-02 12:12:12”, country: „DEU”, city: „Berlin”})
drivere pentru celele mai populare limbaje de programare incluzand Java, C++, PHP, etc... Dacă vrem să extragem documentul Dacă v-am stârnit curiozitatea, folosind id-ul: www.mongodb.org e principala resursă pentru învățare. db.user.findOne({_id: „alice”}) O altă resursă centrală pentru a porni la Pentru a extrage toate anunțurile create drum este http://nosql-database.org/. de alice, vom folosi: Înainte de alege un sistem NoSQL, db.announcement. trebui să avem în vedere întreg contextul: find({author:”alice”}) care e numărul de clienți, care e ponderea iar dacă vrem doar titlurile scrierilor comparativ cu citirile de date. anunțurilor: Care sunt cele două proprietăți CAP priodb.annoucement. ritare și cât sunt de complexe interogările. find({author:”alice”}, {subject: Cât de des pot apărea tipuri noi de inte1}) rogări. Odată ce avem răspunsul la aceste Dacă acest tip de interogare e un caz întrebări trebuie să cunoaștem în detaliu des utilizat, atunci preferăm să fie cât mai funcționalitățiile sistemelor candidate. Dar rapid, pentru asta vom crea un index pe mai multe despre acestea în numerele viicâmpul autor, folosind: toare ale revistei... db.announcement. ensureIndex({author:1})
Pentru a obține toate anunțurile din Berlin vom folosi: Prin exemplele de mai sus tocmai am db.announcement.find({location. city=”Berlin”}) definit o schemă semi-structurată, principala caracteristică care se poate observa Rezultatele acestor interogari vor fi o este denormalizarea datelor. listă de obiecte tip JSON. Acestea sunt doar câteva exemple penPentru a crea un document de tip user tru a va face o idee despre cum se lucrează executăm: cu MongoDB. Interogăriile au fost executate intrdb.user.insert({_id : „alice”, o consola de tip shell, dar MongoDB are
26
nr. 3/2012 | www.todaysoftmag.ro
programare
TODAY SOFTWARE MAGAZINE
Microsoft Kinect - Ghid de programare Partea I - O simplă inițializare În numărul anterior am discutat despre Kinect, o tehnologie oferită de Microsoft ce poate monitoriza întreg corpul utilizatorilor în timp real. După o scurtă introducere, am inclus o secvență de cod pentru inițializarea device-ului, o inițializare simplă și potrivită pentru o aplicație introductivă, de tip Hello World. În continuare, vom parcurge secvența de cod în detaliu și vom încerca să explicăm Echipa Simplex
simplex@todaysoftmag.com
cum anume funcționează.
O inițializare simplă pentru Kinect kinectSensorChooser.KinectSensorChanged += new DependencyProperty ChangedEventHandler(kinectSensorC hooser_KinectSensorChanged);
KinectSensorChooser este un user control creat pentru exemplele oficiale de dezvoltare a unei aplicații folosind Kinect, incluse în kit-ul de instalare a SDK-ului. Deși opțională, folosirea sa simplifică mult dezvoltarea unei aplicații. Inst r u c ț iu ne a d e mai sus c re ează un event handler pentru event-ul KinectSensorChanged, care se declanșează când Kinect-ul începe să se inițializeze, este deconectat sau când starea lui se modifică în orice alt mod. De fapt un senzor Kinect se poate afla în una din cele zece stări predefinite: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Connected DeviceNotGenuine DeviceNotSupported Disconnected Error Initializing InsufficientBandwith NotPowered NotReady Undefined
Ceea ce urmărim acum e ca senzorul să fie inițializat și pregătit pentru a transmite date aplicației. În cazul în care se află într-o altă stare, de exemplu, Disconnected, obiectul KinectSensorChooser va afișa pe ecran un mesaj care înștiințează utilizatorul de starea curentă a senzorului. Deși nu obligatorie, este totuși o funcționalitate utilă, care ar fi trebuit să fie implementată manual dacă nu am fi folosit user controlul KinectSensorChooser.
KinectSensor old = (KinectSensor) e.OldValue; StopKinect(old); KinectSensor sensor = (KinectSensor)e.NewValue;
În cazul în care starea senzorului s-a schimbat, e, argumentul event handler-ului păstrează atât senzorul (de tip KinectSensor) vechi, cât și cel nou. E un lucru util, întrucât astfel putem opri vechiul senzor, urmând să lucrăm în continuare cu cel nou. var parameters = new TransformSmoothParameters { Smoothing = 0.3f, Correction = 0.0f, Prediction = 0.0f, JitterRadius = 1.0f, MaxDeviationRadius = 0.5f };
Senzorul (sensor) conține atât datele legate de cadrul RGB și de adâncime, cât și datele scheletice ce permit monitorizarea corpului utilizatorului. Datele scheletice permit o transformare de netezire. Transformarea se referă în general la acuratețea cu care sunt monitorizate încheieturile și poate fi modificată printr-un set de cinci parametri, cu valori de la 0 la 1: 1. Smoothing 2. Correction 3. Prediction 4. JitterRadius 5. MaxDeviationRadius În mod normal, cu cât scheletul utilizatorului e plasat mai precis, cu atât poziționarea acestuia necesită mai mult timp, dând senzația unei întârzieri (lag). Deci acuratețea vine cu un preț și decizia finală rămâne la adresa dezvoltatorului. Pentru o aplicație rapidă, cum ar fi un joc video, un schelet cu o viteză mare de reacție ar fi mai important decât o acuratețe foarte ridicată, în timp ce o aplicație medicală ar www.todaysoftmag.ro | nr. 3/2012
27
programare
găsi mai mult folos într-o precizie ridicată decât în timpi foarte scăzuți de răspuns. sensor.SkeletonStream. Enable(parameters); sensor.DepthStream. Enable(DepthImageFormat.Resolution640x480Fps30); sensor.ColorStream. Enable(ColorImageFormat.RgbResolution640x480Fps30);
Configurăm senzorul să transmită date RGB, de adâncime și scheletice. sensor.AllFramesReady += new Even tHandler<AllFramesReadyEventArgs> (sensor_AllFramesReady);
Eventul AllFramesReady al senzorului se activează în momentul în care trei noi cadre (RGB, de adâncime și scheletic) au fost finalizate și sunt pregătite pentru procesare în aplicație. În continuare, atașăm event-ului event handler-ul sensor_AllFrameReady. try {
Microsoft Kinect
rightEllipse.Height = 20; MainCanvas.Children. Add(rightEllipse); ScalePosition(rightEllipse, first. Joints[JointType.HandRight]);
Secvența de mai sus poziționează o elipsă roșie deasupra mâinii drepte a utilizatorului (în canvas-ul MainCanvas) și e un exemplu foarte simplu de folosire a datelor scheletice oferite de Kinect. Skeleton GetFirstSkeleton(AllFram esReadyEventArgs e){ using (SkeletonFrame skeletonFrameData = e.OpenSkeletonFrame()) { if (skeletonFrameData == null) { return null; } skeletonFrameData.CopySkeleton DataTo(allSkeletons); Skeleton first = (from s in allSkeletons where s.TrackingState == SkeletonTrackingState.Tracked
sensor.Start(); } catch (System.IO.IOException) { kinectSensorChooser.AppConflictOccurred(); }
select s).FirstOrDefault(); return first; } }
if (closing){ return; }
private void ScalePosition(FrameworkElement element, Joint joint) { Joint scaledJoint = joint.ScaleTo(1280, 720, .3f, .3f); Canvas.SetLeft(element, scaledJoint.Position.X); Canvas.SetTop(element, scaledJoint.Position.Y); }
Încercăm să pornim senzorul și tratăm eventualele excepții cu ajutorul lui KinectSensorChooser.
Odată ce Kinect-ul a trimis trei noi cadre și aplicația a intrat în event handlerul corespunzător, verificăm dacă senzorul nu a primit comanda de închidere cu puțin timp în urmă, caz în care cadrele trimise sunt inutile și hotărâm să le ignorăm. Skeleton first = GetFirstSkeleton(e); if (first == null){ return; }
Altfel, extragem primul schelet (de tip Skeleton) din argumentul e și ne asigurăm ca nu are valoarea de tip null. MainCanvas.Children.Clear(); Ellipse rightEllipse = new Ellipse(); rightEllipse.Fill = Brushes.Red; rightEllipse.Width = 20;
28
nr. 3/2012 | www.todaysoftmag.ro
Metoda getFirstSkeleton primește ca argument un obiect de tip AllFramesReadyEventArgs și returnează primul schelet (dintr-un număr de maxim șase – în funcție de câți utilizatori au fost surprinși în cadrul înregistrat de Kinect).
Metoda ScalePosition poziționează un element grafic (argumentul element, de tip FrameworkElement - în cazul nostru, o elipsă roșie transmisă din event handlerul sensor_AllFramesReady) în funcție de poziția unei încheieturi din scheletul utilizatorului (argumentul joint, de tip Joint – în cazul nostru, mâna dreaptă a utilizatorului). Un obiect de tip Joint conține date ce descriu o anumită încheietură, date ce conțin și poziția exactă a acesteia în spațiu. Poziția e stocată în joint.Position, un vector format din trei elemente (X,Y,Z),
fiecare conținând o valoare exprimată în metri. Pentru a reprezenta încheietura pe ecran, trebuie mai întâi să-i convertim poziția pe planul XoY din metri în pixeli, motiv pentru care folosim metoda ScaleTo, inclusă în dll-ul Coding4Fun, accesibil la adresa http://c4fkinect.codeplex.com/. E o variantă ușoară de conversie, perfecta pentru o aplicație simplă, cum e și cazul acum. Totuși, conversia se poate realiza și manual, după cum vom vedea în exemplele din numerele următoare. private void StopKinect(KinectSensor sensor) { if (sensor != null){ if (sensor.IsRunning){ sensor.Stop(); if (sensor.AudioSource != null) { sensor.AudioSource.Stop(); } } } }
Metoda StopKinect oprește senzorul.
private void Window_ Closing(object sender, System. ComponentModel.CancelEventArgs e) { closing = true; StopKinect(kinectSensorChooser. Kinect); }
Înainte să închidem aplicația, oprim senzorul.
Pe viitor
În articolul următor, vom include o secvență de cod ce afișează întreg scheletul utilizatorului, iar pe parcursul numerelor următoare vom adăuga alte funcționalități utile, cum ar fi decuparea corpului utilizatorului din cadrul RGB oferit de Kinect, elemente de recunoaștere a gesturilor sau procesarea manuala a datelor de adâncime obținute de senzor, pentru a urmări anumite parți ale corpului utilizatorului, independent de datele scheletice oferite de Kinect. În plus, vom include un link către proiectul ce va conține funcționalitățile implementate până atunci.
HR
TODAY SOFTWARE MAGAZINE
Tendințe în HR Se vorbește mereu despre tendințe. Până să încep să scriu acest articol, nu am avut curiozitatea să înțeleg în profunzime semnificația acestui cuvânt. Și cum mereu cea mai bună sursă este dex-ul, am început să citesc simpla și banala explicație prezentată acolo. Tendința înseamnă o dispoziție firească pentru ceva, înclinare, pornire, acțiune conștientă spre un scop determinat. O altă definiție ne spune că tendința reprezintă o evoluție a cuiva într-un anumit sens. Pornind de la această formulare m-am gândit câteva zile care ar fi conexiunea între tendință și domeniul în care lucrez – HR. Și
Andreea Pârvu
andreea.parvu@endava.com Recruiter în cadrul Endava și trainer specializat în dezvoltarea abilităților si competenețelor de leadership, comunicare și muncă în echipă
cel mai la îndemână mi-a fost să urmăresc cu atenție ce se întamplă pe piața de IT. Am observat o dispoziție firească a unor procese și sisteme de HR de a evolua spre un scop determinat, deci o tendință! În rândurile de mai jos voi rezuma, din perspectiva mea câteva tendințe, pe care le consider ca având un impact substantial în evoluția pieței. Managementul talentelor - un proces complex, ce consta in patru etape importante. Sintentizarea teoretică a procesului ar consta în atragerea, motivarea și dezvoltarea talentelor pentru obținerea unei performanțe ridicate. Practic, deși, recrutarea și selecția se face într-un ritm alert, nu se pierd din vedere competențele care joacă un rol esențial în crearea profilului candidatului perfect, care să acopere o nevoie de business, de cele mai multe ori stringentă. În contextul în care talentele sunt scumpe și nu fac referire strict la partea financiară, ci la ceea ce caută într-o companie, este dificil să te poziționezi ca fiind o companie care să fie prima opțiune a angajațiilor pe piață. Un candidat pregătit caută un
mediu organizațional stabil, care să îi valorifice talentul și care să îi ofere o stabilitate financiară, în strânsă corelație cu tendințele salariale de pe piață. Motivarea unui angajat talentat, care are alte zeci de opțiuni pe piață, este o provocare mare pentru fiecare departament sau nivel de management. Rolul departamentului de HR este inxistent dacă nu este susținut întreg procesul de fiecare șef de departament sau de fiecare reprezentant al echipei de management. Poveștile de succes din companiile cu un nume pe piața de IT te fac să crezi că se poate. Succesul acestora, din punctul meu de vedere, are legatură nu doar cu asigurarea unui venit consistent, ci și cu alți câțiva factori, uneori uitați. Orice angajat care a ajuns la un nivel de expertiză ridicat caută să i se valorifice talentul cât mai mult posibil. Dați ocazia angajaților talentați să aducă plusul de valoare în companie! Oferiți-le un plan de dezvoltare al carierei, care să-i convingă că mediul din care fac parte este cel care contribuie la dezvoltarea abilităților și competențelor lor. Cât de des v-ați gândit că în felul acesta puteți păstra și motiva talentele ? Dezvoltarea competențelor și a abilităților soft. Încerc o clarificare a conceptul de soft, în contextul prezentului articol. În limba română nu este un termen care să-i ofere aceeași semnificație pe care o are în limba engleză. Motiv pentru care am preferat păstrarea lui așa, cu explicațiile de rigoare. În viziunea mea, abilități soft se referă la cele de leadership, www.todaysoftmag.ro | nr. 3/2012
29
HR
comunicare, lucru în cadrul unei echipe, coaching, managementul timpului, etc. Se remarcă o accentuare a dezvoltarii acestor competențe și trecerea peste stereotipul conform căruia specialiștii în IT trebuie doar să dețină abilități tehnice. Până la un anumit nivel poate avea loc o acumulare și/sau o dezvoltare a cunoștintelor despre un limbaj de programare, însă de acolo încolo, se conștientizează din ce în ce mai mult faptul că lipsa abilităților soft poate îngrădi evoluția în carieră. Acest proces de HR este în strânsă concordanță cu ceea ce numim ”career development path”, adică acel drum în carieră care îți oferă un proces organizat de dezvoltare. Ce am observat până acum este că după aproximativ cinci ani de experiență există două direcții spre care se orientează specialiștii IT (am sters se concentrează): (1)direcția tehnică – software architect (am incercat să găsesc o denumire general înțeleasă) și (2) direcția oameni – team leading sau project management. În cazul al doilea, este lesne de înțeles de ce este nevoie de dezvoltarea, în prealabil, a unor abilități ce țin de coordonarea unei echipe și a unui proiect. Însă mulți se întreabă care este rolul acestor abilități în primul caz ? Răspunsul este cât se poate de simplu: comunicarea și managementul timpului. Creșterea salariilor nefundamentată, comparativ cu media celor existente. În general, pe piața de IT există câțiva jucători care au intrat pe piață cu salarii foarte mari pentru a atrage cât mai mulți angajați, cu scopul de a acoperi necesarul pe proiectele dezvoltate. Consecința principală a fost că aceste creșteri au ajuns greu de controlat. Deși există companii cu un mediu stabil, care conștientizează faptul că această consecință produce instabilitate, marea majoritate a persoanelor care participă la un interviu de angajare au așteptări financiare foarte ridicate, dorind creșteri de chiar 100% a salariilor. Paradoxul este că există o serie de companii care se adaptează la aceste expectanțe, pe când altele, pe care le numesc ”normale”, pierd persoane care chiar s-ar potrivi mediului organizațional respectiv. Ne-am întrebat de nenumărate ori : ce e mai bine ? Să te adaptezi și să intri în perioadă de criză sau să îți păstrezi ritmul de creștere și pe termen lung să supraviețuiești
30
nr. 3/2012 | www.todaysoftmag.ro
Tendințe in HR în 2012
unei piețe aflate în dezechilibru? Flexibilitatea şi adaptarea politicilor de HR pe baza nevoilor business-ului. Este una din tendințele care au inceput să prindă contur încă din 2011. Piaţa, din toate punctele ei de vedere, mai ales cea de IT, este într-o continuă evoluţie. Politicile de HR trebuie să răspundă nevoilor business-ului. Acestea trebuie să evolueze şi să se adapteze mereu pieţei. Singurul aspect care nu îți oferă flexibilitate este partea administrativă, care are la bază un set de reguli general acceptate prin votarea codului muncii. Când am gândit acest trend, mi-a fugit mintea în primă fază la procesul de recrutare. Mijloacele clasice de identificare a candidațiilor nu mai au același rezultat precum cel observat în urmă cu cativa ani. Dacă până în urmă cu 3 ani principala sursă de descoperire a candidațiilor erau site-urile deja devenite clasice, în prezent acestea ocupă un loc secund. Adaptarea la nevoile business-ului înseamnă căutarea unor mijloace mai puțin convenționale și identificarea unor instrumente care să permită accesul la cele mai bune talente. Mai mult decât atât, nevoile de business sunt în strânsă conexiune cu acceptarea unor termene limită, din ce în ce mai strânse. Deși în HR nu se folosește conceptul de Agile, consider că ar fi benefică o astfel de abordare, în care cerințele și soluțiile sunt facilitate printr-o auto-organizare și eficiența. Această metodologie încurajează adaptarea, planificarea, răspunsul rapid și flexibil de a determina o schimbare. Câteva din principii pot fi ușor adaptat chiar și pe departamentul de HR : • Interacțiunea între persoane mai presus de procese și instrumente. În limbaj de recruiter se traduce prin construirea unei relații pe termen lung cu candidații. În alte sensuri, văd relevanța acestei interacțiuni inclusiv în tot procesul de managementul performanței: definirea și atingerea unor obiective printr-un proces corect implementat de coaching sau în procesul de dezvoltare al carierei. Cu cât interacționezi mai mult cu un angajat, cu atât îl cunoști mai bine, știi ce îl motivează și ce își dorește. • Colaborarea cu clienții peste ceea ce înseamnă ”un contract sau o înțelegere scrisă”. Ca departament de HR, clientul tău
este întreaga companie. Clientul identifică o nevoie de recrutare și/sau o nevoie de dezvoltare, iar departamentul de HR, prin diversele sale arii (recrutare și selecție, training, etc) trebuie să satisfacă aceste nevoi. • Adaptarea la schimbare. Există numeroase situații în care dacă se pierde pasul schimbărilor din business, munca întregului departament de HR nu va aduce niciodată rezultatele scontate. Un exemplu cât se poate de concret este acela în care, dacă până în urmă cu câțiva ani, principala abilitate a unui recruiter in IT era să poată o serie de competențe pe parcursul unui interviu, acum acesta (am sters este necesar să aibă) trebuie să prezinte o înțelegere cât se poate de bună a business-ul și a tehnologiilor, pentru a recruta cele mai potrivite persoane. Investiția în tineri. Implicarea companiilor în diverse programe pentru studenți sau proaspăt absolvenți, care încurajează dezvoltarea acestora intr-o piață în care tendința este de ”schimb neorganizat între angajații seniori”. Sunt promovați tinerii cu potențial care, într-o perioadă determinată de timp, aduc suflu proaspăt într-un mediu de lucru. Este demonstrat că tinerii cu viziune pot schimba direcția de lucru și de dezvoltare a unei companii. Interesant este că există o tendința de adaptare a culturii organizaționale deja existente la integrarea tinerilor. Din ce în ce mai multe colaborări cu universitățile tehnice și cu organizațiile studențești oferă accesul la studenți de top. Mai mult, aceștia, dacă sunt educați întrun mediu care încurajează angajamentul, se pot atașa de companie și pot aduce rezultate pe termen lung. În partea vestică a Europei, numeroase studii susțin că angajatii cărora li se oferă posibilitatea să își dezvolte potențialul și ale căror merite sunt recunoscute, cresc rata retenției într-o companie. La fel ca în modă, tendințele vin și trec, dar angajații motivați vor rămâne mereu. Ne-am dori ca pe viitor mai multe companii de pe piața de IT din Cluj să ia în considerare măcar câteva din tendințele enumerate mai sus, pentru a putea fi observată o evoluție sănătoasă a forței de muncă din acest domeniu.
prezentare
TODAY SOFTWARE MAGAZINE
Proiectul CIVITAS – Archimedes IAȘI Proiectul Archimedes este format dintr-un amestec de măsuri inovatoare, integrate și ambițioase pentru un mediu curat, eficiența enegertică, transport urban durabil, și prin urmare, să aibă un impact semnificativ asupra politicilor în materie de energie, de transport și protejarea mediului. Arobs Transilvania Software a oferit o soluție completă – hardware și software pentru fluidizarea și crearea unui confort sporit a procesului de eliberare legitimații de călătorie pentru trasnsportul în comun, în municipiul Iași, beneficiar al acestui proiect
Sebastian Botiș
sebastian.botis@arobs.com Project Manager – CSM, CSPO Specialized in Agile Methods Arobs Transilvania Software
European.Această soluție constă în realizarea unor chioșcuri, de tip “self service”. Într-o lume modernă nu se poate ignora posibilitatea creșterii acestor mijloace de interacțiune între utilizatori și instituțiile care oferă diverse servicii societății în care trăim.
Tipuri de chioscuri:
Ce reprezintă un chiosc interactiv?
Se poate defini ca fiind un dispozitiv electronic, chiar un minicalculator, cu ajutorul căruia, utilizatorii pot accesa intrun timp foarte scurt și foarte confortabil, diverse informații sau să beneficieze de diverse servicii oferite de către autoritațile locale sau de prestatorii privați de servicii.
În zilele noastre, s-a reușit dezvoltarea de chioșcuri sub diferite forme, având în același timp și scopuri diferite. Scopul unora este doar de informare, iar altele au ca scop oferirea de servicii. Mai jos amintim câteva tipuri de chioșcuri folosite peste tot in lume: informații publice sau turistice, achiziționarea de produse (bilete la film, bilete pentru transportul in comun), realizarea și cumpărarea de fotografii, etc. Au fost amintite doar câteva dintre cele existente iar în acest articol, ne vom îndrepta atenția spre cel ce ofera posibilitatea de a fluidiza vânzarea legitimațiilor pentru transportul public.
Un pic de istorie
Descrierea soluției
Istoria chioșcurilor nu este una foarte lungă dar nici foarte recenta. În 1977, a fost dezvoltat primul chioșc interactiv, la Universitatea din Illinois de către un student numit Murray Lappe. Conținutul a fost creat pe un calculator PLATO, iar interacțiunea cu utilizatorii s-a realizat folosind un ecran tactil de tip plasmă (inventat de asemenea de aceeași universitate). Scopul inițial al acestui chioșc interactiv a fost facilitarea informării tuturor studenților și vizitatorilor despre diferitele servicii puse la dispoziție de către autoritațile locale. Însă primul chioșc comercial a fost introdus pe piață mai târziu, în anul 1985 de către o firmă din California, pentru a da posibilitatea utilizatorilor să fie informați în legătură cu stocurile de pantofi, care nu pot fi achiziționați din magazinele dedicate de tip retail. Ceva mai târziu, în 1991, firma Comdex introduce primul chioșc care are o conexiune la internet, oferind o aplicație prin care se puteau localiza copiii pierduți.
Plecând de la necesitățile locuitorilor municipiului Iași, în colaborare cu Primăria Iași și Regia Autonomă de Transport Public Iași, am reușit să formăm in prima faza, o viziune a soluției pentru fluidizarea si modernizarea vânzării legitimațiilor de călătorie pentru transportul public. Ținând cont că suntem într-o continuă dezvoltare și într-o continuă căutare și extindere a soluțiilor existente, am incercat
www.todaysoftmag.ro | nr. 3/2012
31
prezentare
Proiectul CIVITAS - Archimede Iași
ca plecând de la această viziune, să reușim să construim un sistem matur, care să poată deveni în orice moment disponibil pentru adoptarea de noi idei și extinderea funcționalității. În continuare, pentru a asigura o prezență indelungată la dispoziția utilizatorilor, un factor important deloc neglijat, a fost și procesul de întreținere a soluției, cât și protejarea contra actelor de vandalism, limitând poate, în acest sens, o exprimare mai modernă în ceea ce privește anumite aspecte de ușurința în funcționalitate și aspect.
Descrierea soluției – detalii
Pentru a putea acoperi in totalitate sau în mare parte aceste aspecte, am decis folosirea platformei Microsoft în realizarea acestei soluții, folosind modelul client-server. Aplicația-server expune trei mari aplicatii web prin care se comunica cu baza de date (SQL Server), prin Entity Framework, cât și cu clientul prin expunerea de servicii folosind WCF Data Services (inițial cunoscută sub numele de ADO.NET Data Services) fiind o componenta a .NET Frameworkului. Prin intermediul serviciilor oferite de către aplicația-server, există posibilitatea de a manipula tipul de legitimații pe care aplicația-client ar trebui să le expună, cât și restricțiile pe care aplicația-client trebuie să le îndeplinească. În acest fel există posibilitatea de a manipula foarte ușor toate tipurile de legitimații pe care Regia Autonomă de Transport Public le poate modifica și de a introduce altele noi la un moment dat. Totodată, tot prin intermediul serviciilor oferite de către aplicația-server, prin intermediul funcțiilor de back office, se poate face o atentă monitorizare a actiunilor făcute la nivelul terminalelor, atât a proceselor de vânzare a legitimațiilor cât și supraveghere video permanentă, pentru a reuși să limităm actele de vandalism prezente, din păcate, la nivel destul de mare. Având de altfel un sistem de notificare a actelor de vandalism bine pus la punct, sperăm să reușim să limităm aceste acte pe cât posibil, și să se reușească o disponibilitate online a aparatelor cât mai lungă. Tot prin intermediul serviciilor și aplicațiilor de back office oferite de către server, se poate face o atentă monitorizare a componentelor hardware, cu care terminalele de bilete au fost echipate. În acest mod,
32
nr. 3/2012 | www.todaysoftmag.ro
se poate optimiza procesul de întreținere, cât și posibilitatea de a reuși remedierea cât mai rapidă a situațiilor special apărute, pentru a putea oferi o funcționalitate permanentă. Aplicația client este prevăzută să ofere cetățenilor acces la serviciile de vânzare legitimații, oferind toata gama de tipuri de legitimații existentă la ora actuală in oferta RATP. Aplicația client a fost dezvoltată folosind tehnologii Microsoft precum WCF (Windows Communication Foundation), WPF (Windows Presentation Floundation) și Entity Framework, în cazul comunicării cu bazele de date. Modulul client, prin HAL (Hardware Abstraction Layer), realizează o continuă comunicare și monitorizare a tuturor componentelor hardware la nivel de chioșc. Am reușit să dezvoltăm driverele necesare pentru comunicarea cu aceste componente, astfel încât am putut să ne adaptăm tuturor situaților speciale și dorințelor cetățenilor, pentru a oferi o mai bună experiență în operarea acestor terminale de bilete.
Tipuri de legitimatii oferite
Cum s-a amintit mai devreme în articol, beneficiarii acestei aplicații, pot manipula cu foarte mare ușurință orice tip de legitimație, în același timp, putând introduce în orice moment, prin intermediul aplicației-server, orice tip nou de legitimații.
Inovația acestui sistem este introducerea posibilitații de a achiziționa legitimații de tip abonament atât persoanelor din Romania cât și persoanelor din afara țării. Legitimațiile de tip abonament, fiind nominale, am oferit posibilitatea ca toate aceste informații să fie “ascunse” prin utilizarea codurilor QR. Pentru a valida un astfel de abonament, controlorii vor avea, în curând, dispozitive pentru a putea citi și valida aceste coduri QR. Mai jos, in figura, se poate vedea o legitimație de tip abonament. Încă un amănunt de semnalat este faptul că, legitimațiile de tip abonament se adresează atât studenților cât și elevilor, ținându-se cont de perioadele de început și sfârșit ale anului universitar respectiv școlar.
Posibilități de plată
Un aspect, deloc de neglijat credem noi, este legat de înglobarea într-un singur terminal a tuturor modalităților existente de plată. Plata la aceste chioșcuri se poate realiza folosind următoarele modalități: cu monezi – 10 bani și 50 de bani, cu banc-
note – 1 leu, 5 lei, 10 lei si 50 lei, cât și plata cu credit card – visa & mastercard cu cip. Restul se dă, la cererea RATP, doar în monezi. Pe langă monezi, s-a introdus, pentru cazul în care nu sunt monezi disponibile pentru rest sau probleme tehnice la terminal, un cod RATP, prin care clienții îl pot folosi în rețeaua internă RATP de terminale sau își pot recupera banii de la sediul central RATP.
programare
TODAY SOFTWARE MAGAZINE
Guice
Dependency Injection-ul (DI) este o formă specializată de Inversion of Control(IoC) – un concept mai larg în care obiectele sunt cuplate la runtime de către o sursă externă – de obicei un container – deseori referit ca și IoC container. Prin DI putem selecta diferite implementări ale dependințelor la runtime, printr-un fisier de configurare spre exemplu, ceea ce constituie un avantaj major atunci cand vine vorba de unit testing. Injectarea obiectelor mock devine foarte simplă ceea ce face foarte ușoară testarea în izolare a aplicației.
Mădălin Ilie
madalin.ilie@endava.com Cluj Java Discipline Lead Endava
Cele mai întâlnite forme de DI sunt următoarele: • Tipul 1: injectare la nivel de interfață (interface injection) • Tipul 2: injectare la nivel de metoda (setter injection) • Tipul 3: injectare la nivel de constructor (constructor injection)
Ce este Guice?
Conform paginii oficiale „Guice diminuează nevoia de a folosi operatorul new și clase de tip Factory în codul Java. Gândește-te la adnotarea @Inject din Guice ca la noul new. Guice îmbrățișează natura type safe oferită de Java, mai ales când vine vorba de funcționalități introduse în Java 5 precum tipurile generice și adnotările. Te poți gândi la Guice ca la un framework care completează funcționalități lipsă din Java core. Într-o lume ideală, limbajul însuși ar trebui să furnizeze aceste funcționalități, dar până când va apărea un astfel de limbaj, te poți baza pe Guice.” Dacă ai folosit Spring sau alte
framework-uri de DI, îți sunt cunoscute ideile enumerate mai sus. Vom prezenta în acest articol cum să începi să folosești Guice într-o aplicatie non-web. Vom detalia partea web într-un articol viitor. Guice oferă toate tipurile de injectare enumerate mai sus (field, setter și constructor), spre deosebire de Spring spre exemplu care oferă doar tipurile 2 și 3.
Guice vs Spring?
Aceasta este una dintre acele discuții care pot ține la nesfârșit. Precum EJB vs Spring, Struts vs JSF ș.a.m.d. Este o chestie de gust. Pot spune un singur lucru însă: dacă ai nevoie doar de DI în aplicația ta folosește Guice. Dimensiunea librariei Guice este foarte mică, este type safe și este mai rapid decât Spring.
Folosind Guice într-o aplicație nonweb
Să presupunem că avem o aplicație desktop, iar clasa care conține metoda main se numește Application. Atunci când folosim Guice abordarea este puțin www.todaysoftmag.ro | nr. 3/2012
33
programare
schimbată.Pe lângă lansarea în execuție a aplicației avem nevoie și de o modalitate de a lansa injectarea dependințelor. Pentru a face acest lucru trebuie să declanșăm manual crearea grafului de obiecte care vor fi injectate si abia apoi să continuăm cu logica aplicației. Vom numi clasa responsabila pentru aceste două lucruri Bootstrap. Trebuie de asemenea să creăm un Module extinzând clasa AbstractModule. Cităm din Java Doc-ul interfeței Module: Un modul reunește elemente de configurare, în general legături (binding-uri) de interfețe, care vor fi folosite pentru crearea unui Injector. O aplicație bazată pe Guice este în final compusă din puțin mai mult decât un set de Module și cod de lansare in execuție (bootstrapping code). Prezentarea codului:
Clasa Bootstrap
Guice
este după cum urmează: folosește PrintingSer vice pentru a printa un String, iar serviciul de printare va folosi CachingService pentru a pune in cache acel String. Implementările acestor servicii vor fi injectate in clasa ApplicationImpl și PrintingServiceImpl folosind Guice.
Interfața PrintingService
package com.insidecoding.guice; import com.google.inject.ImplementedBy; @ImplementedBy(PrintingServiceIm pl.class) public interface PrintingService { /** * Printează un String * @param s */ void print(String s); }
package com.insidecoding.guice; import com.google.inject.Guice;
Clasa PrintingServiceImpl
import com.google.inject.Injector; /** * Clasa Bootstrap care crează obiectul rădăcină care va declanșa crearea și injectarea * grafului de obiecte */ public class Bootstrap { public static void main(String[] args) { Injector injector = Guice. createInjector(new MyModule()); Application app = injector. getInstance(Application.class); app.start(); } }
import javax.inject.Inject;
Interfața Application
import com.google.inject.ImplementedBy;
package com.insidecoding.guice; public interface Application { /** * Lansează în execuție aplicația curenta */ void start(); }
Clasa ApplicationImpl
package com.insidecoding.guice; import com.google.inject.Inject; public class ApplicationImpl implements Application { @Inject private PrintingService ip; public void start() { ip.print(„Hello from guice”); } }
Să presupunem că logica aplicației
34
nr. 3/2012 | www.todaysoftmag.ro
package com.insidecoding.guice;
public class PrintingServiceImpl implements PrintingService { @Inject private CachingService cs; @Override public void print(String s) { System.out.println(s); cs.cacheIt(s); } }
Interfața CachingService
package com.insidecoding.guice;
@ImplementedBy(CachingServiceImp l.class) public interface CachingService { /** * Pune in cache un String * @param s */ void cacheIt(String s); }
Clasa CachingServiceImpl
package com.insidecoding.guice;
public class CachingServiceImpl implements CachingService { @Override public void cacheIt(String s) { System.out.
println(„Caching: „ + s); } }
Clasa MyModule
package com.insidecoding.guice; import com.google.inject.AbstractModule; public class MyModule extends AbstractModule { @Override protected void configure() { bind(Application.class). to(ApplicationImpl.class); } }
Codul este destul de simplu si intuitiv. Pentru a compila codul de mai sus aveți nevoie de următoarele librării in classpath: • aopalliance.jar • guice-3.0.jar • javax.inject.jar Dacă arunci o privire atentă in codul de mai sus o să observi o mică diferență în ceea ce privește injectarea dependințelor: clasa ApplicationImpl folosește adnotarea com.google.inject.Inject iar clasa PrintingService folosește adnotarea javax. inject.Inject. Aceasta din cauză că Guice 3.0 este compatibil cu JSR-330. Mixarea adnotărilor JSR-330 cu cele din Guice este descurajată, asa că ramânem la @Inject din Guice.
Tipuri de injectare
Guice permite 3 tipuri de injectare: • injectare la nivel de câmp • injectare la nivel de constructor • injectare la nivel de metodă Am văzut în acțiune injectarea la nivel de câmp în codul de mai sus. Pentru a folosi injectarea la nivel de constructor vom modifica clasa PrintingServiceImpl după cum urmează: package com.insidecoding.guice; import javax.inject.Inject; public class PrintingServiceImpl implements PrintingService { private CachingService cs; @Inject public PrintingServiceImpl(Cachi ngService cachingService) { this.cs = cachingService; } @Override
TODAY SOFTWARE MAGAZINE public void print(String s) { System.out.println(s); cs.cacheIt(s); } }
Trebuie menționat că atunci când se folosește injectarea la nivel de câmp Guice va crea constructorul fără nici un argument pentru a instanția obiecte. Se poate folosi și injectarea la nivel de metodă pentru injectarea parametrilor. Guice va rezolva toate dependințele înainte de invocarea metodei. Metoda poate avea un număr oricât de mare de parametri, iar numele nu are nici un impact asupra injectării. Injectarea la nivel de metodă arată ca mai jos: @Inject public void printMe(PrintingService ps) { ps.print(„Printing with Guice method injection”); }
automată de la String la tipul întreg. • session (disponibil ca parte din Ce se întâmplă însă dacă declarăm vari- extensia de servlet) abila printersNumber de tip Integer, iar • request (disponibil ca parte din bindingul îl facem la o valoare de tip String. extensia de servlet) ... • custom public class PrintingServiceImpl Alegerea scopului ar trebui să fie desimplements PrintingService { tul de evidentă. Dacă obiectul este statefull, @Inject per -application ar fi @Singleton, per@Named(“myConstant”) private Integer printersNumber; request @RequestScoped, per-session @ SessionScoped. Dacă obiectul este stateless private Cachingși ușor de creat, scoping-ul nu este neceService cs; sar. Guice va returna instanțe noi de fiecare ... @Override dată. protected void configure() { bind(Application.class). to(ApplicationImpl.class); bindConstant(). annotatedWith(Names. named(„myConstant”)). to(„exception”); }
În codul de mai sus poți trece la singleton-uri folosind următorul cod: bind(CachingService). to(CachingServiceImpl).in(Scopes. SINGLETON)
Spuneam că există un caz special: eager singleton. Acest tip de inițializare permite construirea obiectelor de tip singleton atunci când aplicația pornește, nu atunci când este nevoie. Îți permite astfel să detecInjectarea constantelor tezi dintr-un stadiu incipient problemele de Guice ofera o sintaxă foarte intuitiva bind(Integer.class). inițializare. În funcție de stage-ul aplicației annotatedWith(name). pentru injectarea constantelor: (controlat folosing valori ale enum-ului toInstance(value); bindConstant(). Stage) există tipuri de inițializări default annotatedWith(name).to(value); În acest caz value trebuie sa aibă pentru obiectele singleton. Pentru a forța Metoda to() poate primi atât o valoare tipul Integer încă de la compile time – eager singleton in development stage se primitivă, cât și String, Enum sau un Class. bineînțeles autoboxing-ul va funcționa. folosește următoarea sintaxă: bind(CachingService). Sintaxa de mai sus nu oferă însa și type to(CachingServiceImpl).asEagerSchecking la compilare. Guice face conver- @ImplementedBy vs bind() ingleton() sie automată a valorii din metoda to() către Se poate observa în codul de mai sus tipul valorii adnotate cu name. Haideți să două modalități de a lega interfețe de vedem câteva exemple. Presupunem că implementări: @RequestScoped și @SessionScoped avem următoarea constantă definită în • anotarea interfeței cu vor fi detaliate în articolul pentru web @ImplementedBy clasa PrintingServiceImpl: applications. • folosește metoda bind() method într-un Module pentru a specifica impleAceasta este doar o introducere in ... mentarea propriu-zisă: vezi metoda Guice. Poți face mult mai multe lucruri public class PrintingServiceImpl MyModule.configure(). folosind Guice și sperăm ca v-am deschis implements PrintingService { Pentru cazuri simple și interfețe cu o apetitul pentru a descoperi tot ceea ce @Inject singură implementare poți folosi fără pro- oferă. Dacă aveți nevoie de un framework @Named(“myConstant”) private String printersNumber; bleme abordarea cu @ImplemenedBy, însă mic și rapid pentru DI, Guice este peste private CachingService cs; dacă ai nevoie de mai mult control asupra Spring „all the way”. ... legăturilor dintre interfețe și implemenPentru a injecta o valoare concreta tări sau dacă ai mai mult implementări ale variabilei printersNumber folosim în clasa unei interfețe folosește abordarea cu bind() MyModule sintaxa menționată mai sus: method. @Override protected void configure() { bind(Application.class). to(ApplicationImpl.class); bindConstant(). annotatedWith(Names. named(„myConstant”)).to(„345”); }
Probabil intuiți deja că o sa să primim o excepție. Mai exact com.google.inject. ConfigurationException. Putem forța și type checking la compilare atunci când injectăm constante folosind următoarea sintaxa:
Scoping
Un lucru important de menționat este faptul ca Guice returnează implicit o nouă instanță ori de câte ori furnizează o valoare pentru a fi injectată. Guice oferă următoarele scopuri: In cazul de față nu este nevoie de nici • prototype – cel implicit o conversie. Daca printersNumber ar fi de • singleton – caz special eager tip Integer sau int, Guice ar face conversie singleton www.todaysoftmag.ro | nr. 3/2012
35
programare
Programare concurentă modernă
Procesoarele noi continuă sa vină. Două nuclee per procesor par să fie depăşite, chiar şi pe telefonul mobil; GPU-urile se pot folosi pentru operații computaționale şi au tot mai multe nuclee, 1500+ mai nou. Cum le folosim pe toate? Care este următorul pas? Cum se poate menţine ritmul de dezvoltare cu progresul hardware -ului? Pe zi ce trece cloud-urile devin din ce în ce mai mari. Avem de a face cu processing clouds și data clouds; ele pot răspunde la mai multe cereri decât mintea umană îşi poate Béla Tibor Bartha
bartha@macadamian.com Software Engineer @ Macadamian
imagina. Avem o mulţime de utilizatori Am putea elimina blocajele făcând simultan pe un singur server, care aşteaptă camioanele independente! date. Cum răspundem la atâtea cereri? Sunt mai multe limbaje de programare care au un răspuns pentru această problemă, dar înainte de a intra în detalii, ar fi bine să vedem un exemplu simplu: cum putem muta o grămadă de cărămizi de la o locaţie la alta?
În acest fel, grămada iniţială va fi mutată de două ori mai repede, şi camioanele se mişcă independent. Putem adăuga oricâte benzi de acest tip, dar timpul de operare pentru un camion încă durează prea mult.
Cu un singur camion această operaţiSă încercăm o altă abordare. Ce se une va dura prea mult timp. Cum putem să întâmplă dacă adăugăm încă două camifacem toată operaţiunea mai rapidă? Putem oane, dar de data aceasta cu o întârziere? să adăugăm încă un camion! În acest fel fiecare camion funcţionează
independent cu puțină coordonare - comuÎn acest fel, transportul este mai rapid, nică între ei la un anumit nivel. dar vor fi blocaje la locaţia iniţială şi de destinaţie. De asemenea, avem nevoie de Putem adăuga încă un camion pentru a sincronizarea camioanelor. obţine un flux mai bun. Fiecare camion are de făcut o sarcină simplă acum, şi cu puțină sincronizare ne apropiem de un
36
nr. 3/2012 | www.todaysoftmag.ro
TODAY SOFTWARE MAGAZINE flux de patru ori mai rapid decât în designul original.
Deci, am îmbunătăţit performanţa prin adăugarea a două camioane concurente la modelul existent. Metoda de mai sus este doar un mod de a paraleliza procesul, dar putem combina cele două modele. Acest model de opt camioane va funcţiona la capacitate maximă:
Acesta este un design concurent valabil, chiar dacă numai un camion se mută într-un anumit moment – dar nu avem paralelism. Să vedem un pic diferenţele dintre concurenţă și paralelism, sau cel puţin cum le putem defini:
Paralelism • • •
Execuţia simultană de procese Se fac o mulţime de lucruri deodată Comportamentul aplicaţiei este deterministic
Concurență •
Manipularea mai multor lucruri d e o d at ă p r i n s t r u c t u r a r e a
procesului Erlang, F #, occam, Clojure, SuperPascal, Piesele pot lucra independent, Ada. coordonate doar prin comunicare • Compoziţie nedeterministică a Aceste limbaje au în comun: programelor • utilizează comunicarea în loc de sincronizare directă între Concurenţa oferă o modalitate de a threaduri. structura o soluţie pentru a rezolva o pro• thread-urile sunt înlocuite cu blemă care poate să fie (dar nu neapărat) light-weight routines, numite paralelizabilă. goroutines / procese / 1. Să luăm un alt exemplu: • acestea nu sunt neapărat mapate la • Design concurent: mouse, tastathread-urile sistemului de operare, tură, ecran, unităţi de disc acest lucru înseamnă că runtime • Design paralel: produsul scalar a -ul poate decide modul în care le doi vectori gestionează. În acest exemplu, dispozitivele pot • milioane de threaduri se pot exelucra independent, comunicând cu fluxuri cuta în acelaşi timp - de exemplu, de date, lucrează în paralel, dar nu în mod Go a fost văzut cu 1,3 milioane de necesar; pe de altă parte produsul scalar a 2 goroutines, la un moment dat. vectori este un exemplu de design paralel. Având o mulţime de rutine lightweigh, înseamnă că runtime-ul poate mapa În limbajele “vechi” (cum ar fi C / C + threaduri reale dacă este nevoie, ceea ce +, Java), vom folosi o mulţime de design înseamnă că putem folosi atâtea nuclee câte patterns pentru paralelizare, de exemplu: sunt disponibile. Double checked locking pattern, Thread pool pattern, Thread-Specific Storage, Există câteva alte limbaje care impleScheduler pattern, Active Object… Cele m e n t e a z ă c o n c u r e n ț a c a u n s u mai multe dintre acestea au ceva în comun: folosesc sincronizarea. Acesta este mai bset: mult un design paralel, dar designul con• C#, cu Task Parallel Library. curent este un pic diferit. • Obiective C, cu NSOperation şi dispatch queues. În 1978, CAR Hoare a publicat cartea • D cu lightweight threads (simplu sa: Comunicarea Proceselor Secvenţiale numite threads) şi mesagerie. (Communicating Sequential Processes). În • S t a c k l e s s P y t h o n c u această carte, el definește un limbaj penmicrothread-uri. tru a descrie modelele de interacţiune în sistemul concurent. Aceasta este baza proÎn viitorul apropiat, numărul de nuclee gramării concurente moderne. poate creşte, pentru că am ajuns la frecCâteva dintre limbajele de progra- venţă maximă de procesor cu tehnologia mare care implementează acest design: Go, actuală. Eşti pregătit? •
www.todaysoftmag.ro | nr. 3/2012
37
management
Avantajele unui MBA
Ce este și ce nu este un MBA?
Sorin Stan
sstan@softvisioninc.com Chief Strategy Officer SoftVision
MBA-ul este un program care curpinde mai multe cursuri care se întind pe o perioadă cuprinsă între un an și doi ani. Există trei tipuri de programe: MBA, EMBA (Executive MBA) și PMBA (Proffessional MBA). Persoanele care se înscriu în cadrul MBA-urilor au o experiență de minim 3 ani în câmpul muncii și fac parte din middle management. EMBA-urile se adresează în general persoanelor de peste 35 de ani care sunt pe poziții de top management. Nu prea există o diferență între cele două programe ca și conținut insă experiența mai mare in cazul persoanelor din EMBA își spune cuvântul în cadrul discuțiilor și interacțiunilor de la cursuri. PMBA-urile au aceleași materii, dar mai au și module destinate unui anumit domeniu de studiu precum marketing, finanțe, resurse umane. MBA-ul nu iți oferă o diplomă care să îți deschidă toate ușile. Angajatorii sunt atenți la rezultatele pe care le-ai avut in trecut, calitățile tale morale si intelectuale sau gradul în care te încadrezi în cultura organizațională.
De ce să fac un MBA, la ce mă ajută?
Ai o parere bună despre tine, ai făcut cam tot ce ai crezut că puteai face și totuși ai impresia că iți scapă ceva în munca cotidiană? Ai persoane pe care le coordonezi și iți iei în serios responsabilitatea de formator? Sunt multe lucruri pe care le faci din intuiție, dar parcă ai vrea să le confirmi cu cineva? MBA-ul poate oferi răspunsuri intrebărilor tale. Cursurile pe care le urmezi îți deschid
38
nr. 3/2012 | www.todaysoftmag.ro
mult mai bine perspectivele din care poți să analizezi o situație. De obicei avem o experiență într-un anumit domeniu, să spunem IT, dar o companie mai are și alte fațete: financiar, marketing, HR. În cadrul unei companii de IT din România persoanele au cam același traseu: încep ca și dezvoltator, parcurg mai multe etape pe scara ierarhică până în punctul când ajung manageri. Nu cred că e un secret, avem o părere bună despre noi ca și IT-iști, am performat din punct de vedere tehnic foarte bine, deci ce mare lucru să fii manager? Este cert că ți-ai obișnuit managerii să ai rezultate foarte bune pe vechea poziție, așteptările sunt mari, iar acum trebuie să continui la fel într-un domeniu pe care nu-l cunoști. Îți vine repede ideea adoptării aceleiași metode ca și în cadrul proiectului: să fii agile. Nu merge din prima încercare, lasă că schimbi ceva pe parcurs. Dar dacădeciziile tale afectează un departament sau o companie intreaga? Dacă cumva compania respectivă este chiar a ta?
TODAY SOFTWARE MAGAZINE Ce programe există în țară și care sunt costurile?
În țară există aproximativ 14 programe: 7 MBA, 6 EMBA si un PMBA. Unele dintre ele se mai întrerup și apar altele. Puteți căuta clasamentul făcut anul acesta de Ziarul Financiar și veți vedea care sunt cele mai importante. MBA-ul RomânoCanadian a fost anul acesta evaluat ca fiind cel mai bun din țară și confirm că este într-adevar așa, fiind absolvent anul acesta acolo. Își merită toți banii. În cazul MBA Romano-Canadian costul a fost de 11,500 de euro pentru 18 cursuri care s-au întins pe un an și jumate. Fiind clujean, am mai avut costuri cu deplasarea. Mai exista și alte programe mai scumpe în țară sau poți să te înscrii în străinătate, costurile putând ajunge la 100,000 de euro. Există o dispută în ceea ce privește alegerea unui MBA, în țară sau în exterior, cel din afară fiind văzut ca unul ce iți aduce un prestigiu mai mare. Consider ca și cel local este foarte bun, singurul lucru important este sa fii serios și să inveți. Un profesor canadian îmi spunea ca noi facem aici exact aceleași materii ca și programul susținut în Canada, doar prețul diferă: acolo este undeva la echivalentul a 80,000 euro. Am vorbit până acum de costurile vizibile. Desigur există și costuri de altă natură ce țin de timpul liber, cel petrecut cu familia și prietenii sau cel destinat muncii tale – el este simțitor afectat. Ca să pun accent pe jumătatea plină a paharului voi spune că începi să devii mult mai eficient în orice faci, inclusiv în munca pe care o depui. Știu, sună puțin ciudat să spui că eficientizezi timpul cu cei dragi, dar anumite lucruri cer puțin sacrificiu. Începutul este mai greu, o dată ce ai intrat în ritm simți că totul e normal; când ai câteva săptămâni de pauza ai impresia că ceva nu e in regula.
Cum ești admis?
Să zicem că ai trecut de partea cea mai grea: luarea deciziei de a incepe un MBA. Trebuie să mai treci un pas ca să intri în joc: admiterea. Pentru asta trebuie să iți faci un dosar care cuprinde date despre tine, CV, scrisoare de intenție, scrisori de recomandare. Trebuie să treci apoi de un test de tip GMAT. Recomandarea mea este să îl iei în serios, chiar dacă pare destul de ușor la prima vedere. Trebuie să te obișnuiești cu tipul intrebărilor și cu limita de timp în care îl vei da. Eu mi-am luat liber o săptămână ca să nu am surprize. L-aș asemăna cu examenul de conducere: nu e greu, dar trebuie sa inveți pentru el.
Cum se desfășoară, ce materii cuprinde, ce profesori ai?
aproape obligatoriu sa ai un MBA dacă vrei să ajungi pe o poziție de management. Cursurile sunt în așa fel organizate Avansăm și noi, cu puțină răbdare ne aproîncât să le poată urma o persoană care piem de acel punct. lucrează. Exista mai multe combinații: fie în timpul săptămânii după ora 17-18 și MBA in criza economica actuala în weekend, fie câteva zile consecutiv pe Criza economică a afectat piața de lună. Se primesc niște materiale (suportul MBA estimată la 4.5 milioane euro pe an. de curs, articole, cărți, acces la anumite Studenții au început să își plătească mai aplicații) în prealabil, iar la inceput de curs mult din buzunarul propriu studiile, o se explică curricula, obiectivele, modul de marjă tot mai mică fiind suportată de comnotare, colaborarea viitoare cu profesorul. paniile angajatoare. Din punct de vedere Trebuie să subliniez faptul că orice forma al necesității unui MBA aș spune că acum de copiat, plagiat sau furt intelectual atrage se justifică mai mult, pentru a putea face dupa sine excludrea din cadrul programu- diferența fată de concurența în deciziile de lui. Oricum, se presupune că dacă ai ajuns business luate. într-un asemenea cadru, scopul tău este să înveți ceva cu care să rămâi și nicidecum să Experiența personală obții o hârtie pe care să o poți pune în CV. Căutam de mai mult timp momentul Materiile sunt axate pe management, potrivit să încep un MBA, dar ca în orice finanțe, marketing și resurse umane. La decizie luată trebuie să vină și ziua în care început se pun bazele: general manage- spui: ACUM! Inițial nu eram convins dacă ment, economie, elemente de statistică, voi putea să îl fac de la Cluj, MBA-ul fiind dupa care se intră în lucruri mai complexe la București. Am avut sprijin din partea firlegate de finanțe, marketing, business mei și am agreat să vedem cum mă descurc internațional. Programul se încheie cu o în primele 3 luni. Prima lună a fost mai difisimulare de business și un proiect de grup. cilă până am început să mă obișnuiesc cu În cadrul lor îți folosești toate cunoștințele ritmul, cu Bucureștiul, oamenii, drumurile acumulate până în acel moment. Un aspect de două ori pe săptămână, munca de la sercare mi se pare foarte benefic este acela vici. După doua luni am simțit că situația că se pune accent pe munca în grup, nota este sub control și că voi reuși. Totul era finală bazandu-se între 40% si 80% pe calculat cu o lună înainte, îmi știam druefortul comun. Profesorii sunt fie români murile care trebuiau plătite, zilele în care cu experiență în businessul autohton, fie voi dormi în deplasare. Casa mea a deveprofesori de la facultăți din străinătate. nit o simplă cameră de hotel. Ritmul alert Întrebat fiind care sunt mai buni aș putea a început să mă prindă: azi eram în Cluj, spune că romanii excelează la partea teh- mâine la București, poimâine în delegație. nică, în schimb străinii se diferențiază prin Aproape că pot să spun ca îmi lipsesc zilele stilul de predare, experiența managerială acelea. Mi-am făcut prieteni noi, am avut acumulată și transmisă de-a lungul anilor. numeroase experiențe. Colegii de la MBA Cu riscul de a supăra anumite persoane devin persoane din networking-ul tău, din țară voi spune că ne aflam într-o fază unele pe care te poți baza cu adevărat. Am de pionierat în management, 50 de ani de cunoscut oameni extrem de interesanți, din comunism și-au pus amprenta într-un mod domenii foarte diverse. Cu o parte dintre ei semnificativ. Este totuși îmbucurător faptul am inceput colaborări. că tot mai multe persoane vin din exterior Mă simt extrem de câștigat după această unde au văzut cum merg lucrurile sau că experiență și voi incheia prin a spune ca a tot mai mulți fac un MBA sau lucrează într- fost cea mai buna decizie pe care am luato multinațională. o. M-a schimbat profund, văd lucrurile din mai multe perspective, iar poziția pe care Firmele caută persoane cu MBA? Care lucrez acum se datoreaza în mare parte stueste trendul la noi în țară? diilor pe care le-am acumulat. Recomand Momentan încă nu se pune accent prea cu cea mai mare căldură urmarea unui mare pe un MBA, însă recruterii sunt atenți MBA, îți aduce satisfacții imediate și te dezla acest aspect, te poziționează mai bine în voltă ca manager, dar și ca persoană. cadrul filtrării pe care o fac. Trendul este mai clar în București, unde fiind mai multe multinaționale se caută tot mai mult un MBA in CV. La nivelul întregii țări există peste 4200 de absolventi, la finele lui 2011 înscriindu-se 300 de studenîi. În SUA este www.todaysoftmag.ro | nr. 3/2012
39
startups
Startup - Hack a server
“Dacă vrei să nu munceşti toată viaţa, fă ceea ce iubeşti cel mai mult” – Confucius . Aceste cuvinte îl descriu cel mai bine pe Marius Corîci. În 2003 a început o afacere în offline înfiinţând compania ITS Group ca şi franciză pentru Romstal, cel mai mare retailer pentru instalaţii termo-hidro-sanitare din Sud-Est-ul Europei, iar în 2007 a trecut la inteligenţă artificială şi a înfiinţat Intelligentics, un grup de de specialişti pentru procesarea limbajului natural (NLP – Natural Language Processing). Cele mai importante proiecte legate de securitate la care lucrează sau este implicat
Marius Corîci
marius@intelligentics.ro Antrepenor în serie, îndragostit de inteligenta artificiala
sunt: S3ntinel, Hack Me If you Can, Hack a Server, DefCamp. Ce crede despre el? Antrepenor în serie, îndrăgostit de inteligenţă artificială (vă rog nu-i spuneţi soţiei mele iubite). Un perfecţionist perseverent, mereu în căutare de provocări care vor schimba lumea în care trăim. Cred în oameni şi echipe adevărate şi urăsc că nu reuşesc să-mi fac timp pentru a începe blogul personal.
Ce te-a determinat să schimbi direcţia către industria de software?
În afara marilor oportunităţi, sunt genul de om căruia-i plac provocările şi fac ce-mi place. Îmi place online-ul şi cred că el este viitorul.
Hacking Servers Ce este Hack a Server?
HaS (Hack a Server) este o platformă de identificare a breşelor şi vulnerabilităţilor din aplicaţiile software, bazată pe ceea ce
40
nr. 3/2012 | www.todaysoftmag.ro
americanii numesc „Crowd Source”, totul acoperit de anonimitate si confidenţialitate. Există oameni şi comunităţi întregi care iubesc să testeze şi să descopere vulnerabilităţi în aplicaţiile software. Fie ca li se spune black, grey, white hackers, crackers, skiddies sau testeri de penetrare, ei iubesc să găsească breşe şi vulnerabilităţi. Fiecare breşă, fiecare vulnerabilitate, pentru ei reprezintă o provocare. Ăsta-i adevărul. Când sistemul sau serverul de producţie va fi penetrat/compromis în viaţa reală, vă asigur că nu va fi făcut cu intenţii bune în aproape toate cazurile. Credeţi-mă, am fost în situaţia asta cănd platforma noastră a fost „testată” şi testată. Mulţumesc Celui de sus că nu ţinem absolut niciun fel de date sensibile pe platformă. Aşa că am avut această idee să construim o platforma unde să-i aducem pe cât mai mulţi dintre ei şi să fie plătiţi pentru ceea ce iubesc cel mai mult să facă: Hacking. Ca ei să poată avea acces în zona de testare (pe bani reali), „Playground Arena”, întâi trebuie să treacă un test de penetrare. Cu toţii ştim că atunci când un sistem este
TODAY SOFTWARE MAGAZINE supus testelor de penetrare, cel mai mult, cel mai important lucru, nu-l reprezintă penetrarea în sine ci raportul în care testerul explică ce şi cum a făcut, precum şi soluţiile de acoperire a breşei/vulnerabilităţii respective. Raportul de penetrare este cel mai important lucru pentru un CTO, administrator de sistem, dezvoltator de aplicaţii web iar noi ne focusăm pe reportare. Testul pe care userii noştri trebuie să-l treacă pentru a avea access (pe bani reali) pentru testarea serverelor din HaS, este la fel ca orice test pe care cineva trebuie să-l dea pentru a obţine diferite certificate de specialist în securitate cum ar fi certificatele CPTC, OSPC, CEH, CEPT, CISSP etc. Diferenţa constă în faptul că noi dăm această oportunitate oricui doreşte şi mai mult, la noi este gratis comparativ cu restul. Prin această testare, vrem să ne asigurăm că CTO, administratorii de sistem sau developerii de aplicaţii web, vor primi un Raport de Penetrare care să îndeplinească standardele în domeniu.
Cum ţi-a venit ideea pentru Hack a Server?
Mereu spun: rezolvă o problemă, după care construieşte un produs. Au fost două ingrediente care combinate m-au adus aici: Jocurile online: Urăsc jocurile pentru că pot crea dependenţă precum drogurile dacă nu eşti ponderat. Securitatea: Securitatea chiar este o problemă foarte mare, şi din ce în ce şi mai mare în condiţiile în care trendul este crescător pentru industria online (toate afacerile din offline se vor muta şi în online). Aşa că într-o zi, fiind cu fica cea mică la doctor şi aşteptând să intrăm, mă gândeam la „cum aş putea folosi jocul online astfel încât să rezolv o problemă?” Şi atunci m-a trăznit. Da, „trăznit”. Un joc de securitate online, dar altfel decât până la această ora. Folosind „Crowd Sourcing”, şi nu puncte ci bani reali. După ce mi-am făcut (acolo pe loc) o idee generală, am sunat un prieten care este administrator de sistem, l-am întrebat dacă ar folosi o astfel de platformă şi cât ar plăti. Mi-a răspuns că ar folosi şi ar plăti în jur la 1000 euro pentru un astfel de serviciu. Aşa a luat naştere HaS. Mai mult, rezolvăm şi alte probleme complementare precum „black hackers” pot începe să-şi folosească abilităţile în scopuri bune, de ajutorare/consultanţă câştigand bani cinstit. Mai mult, HaS umple un gol dintre companiile de testare manuală unde preţurile pentru astfel de servicii sunt prohibitive pentru companiile cu venituri medii si
medii spre mari (astfel de teste costă de la zeci de mii de dolari în sus). Dacă o testare la o companie specializată costa de la zeci de mii de dolari, probabil, la noi se va încadra undeva la 1000 -2000 de euro (mult mai mic decat salariul brut al unui specialist în securitate IT). Totul depinde de câte vulnerabilităţi se găsesc pe modulul testat fie că este vorba de un server complet, bază de date, sau aplicaţie web. Deci nu concurăm cu acest gen de companii de testare manuală ci le completăm.
acest gen de oameni conduşi de pasiunea pentru ceea ce fac şi nu de bani în sine. Lângă echipă, Andrei Avădănei fondatorul DefCamp şi Ionuţ Gabriel Popescu administrator al celui mai renumit site de hacking în limba română, RST Center, au avut o contribuţie semnificativă. Ei m-au ajutat la fel, din dragoste pentru proiect. Fără ei nu aş fi reuşit să strâng o comunitate în jurul platformei atât de repede. La ora asta, sunt peste 260 de useri înregistraţi. Sunt norocos? Da şi nu. Norocos pentru ca Ei m-au găsit pe mine (nu invers) şi Ei au găsit şi îndrăgit Construind produsul proiectul. Nu, pentru ca am muncit mult să mă fac cunoscut atât eu ca persoană cât Cine lucrează la platforma HaS pentru a şi proiectul. Ăsta nu-i noroc, asta-i muncă, o transforma în realitate? muncă grea. În cei peste trei ani petrecuţi Ştii vorba aia? Viziunea fără execu- până acum în industria online, am întâlnit ţie, se numeşte halucinaţie. Am încercat extrem de mulţi oameni, în schimb doar pe mulţi, am rămas câţiva. Dincolo de viziune, căţiva i-aş recomanda. dacă nu aş fi avut echipa, aş fi halucinat în continuare. Care este modelul de monetizare? Marius Chiş. El este omul cu finanţele Aici putem avea mai multe abordări dar şi mai mult, primul investitor în platformă. cel mai simplu, fiind un „market place” o să Pe lângă noi doi, am încercat mereu să aduc luăm un procent decent din partea testerioameni care întăi să iubească proiectul lor. Companiile plătesc pentru servicii către pentru că sunt genul de om care crede că, testeri, iar noi o să luăm o parte din ceea „banii reprezintă o consecinţă a unui lucru ce plătesc. Preţurile care vrem să le promobine făcut şi nu un scop în sine”. văm vor fi unele care să ducă la o adopţie în Walle. Cunoscut ca şi Andrei Nistor masă, adică căt de mici se pot, comparativ (îmi place să-i zic Walle – cred că urăşte cu ce există acum din partea companiilor nick-ul ăsta), este CTO-ul. Este cel care a specializate pe teste de penetrare. făcut cea mai mare parte a proiectului (partea de codare), câteodată ajutat şi de alţi Cine sunt clienţii? prieteni ai lui iar de mine din când în când Clienţii platformei sunt companii care masându-i spatele. vor să-şi rezolve problemele de securiAlexandru Constantinescu. Este omul tate informaţională într-un timp scurt şi care m-a impresionat cu determinarea lui. la costuri mici, rezonabile. Companii de Mi-a trimis un email spunându-mi cât software, companii de out sourcing dar şi de mult iubeşte proiectul şi că vrea să fie din offline. Spre exemplu, amicul pe care parte din el pe partea de marketing şi PR. l-am întrebat dacă ar folosi un astfel de serAm fost mai mult decât bucuros să întâl- viciu, este administrator de sistem la trei nesc oameni care să lucreze „împinşi” de mari companii din offline. Cei care decid proiect/idee care să facă doar ce le place să dacă platforma le este folositoare, sunt facă. Mi-a zis că nu este interesat de bani oamenii care deţin funcţii sau lucrează în faza asta, ştiind ce înseamnă un startup ca şi CTO, CIO, CISO, administratorii de bazat pe bootstrap si leanstartup. sistem, administratorii de baze de date, Cosmin Strîmbu. Ultimul dar chiar dezvoltatori de aplicaţii web. deloc ultimul, un tip pe care nu l-am întâlAlţi clienţi la care ne aşteptăm, sunt nit încă faţă în faţă nici măcar pe webcam specialiştii şi cercetătorii din domeniul până la ora asta când avem acest interviu. InfoSecurităţii care vor să-şi testeze sisteLa fel ca şi Alexandru, mi-a zis că vrea să mele dezvoltate de ei. fie parte din proiect. Mi-a trimis email că vrea să facă parte din proiect fără să fie plă- Ce facilităţi oferă platforma? tit. I-a plăcut ideea, potenţialul după care HaS este următorul nivel prin care echipa. E ciudat nu să nu îl întâlneşti dar companiile îşi rezolvă problemele critice de să facă parte din echipa de bază. Este fron- securitate întrun mod novativ şi distractiv tend developerul nostru, veriga lipsă care o bazat pe war game. aveam înainte de apariţia lui. Walle (Andrei Costuri reduse: Ce poate fi mai atracNistor) urăşte să scrie frontend. Iubesc tiv pentru o afacere decât puterea a mii de www.todaysoftmag.ro | nr. 3/2012
41
startups
angajaţi la un cost foarte rezonabil? Rapiditate: În câteva minute poţi face deploy la un server cu cele mai populare sisteme de operare open source. Dacă vrei să foloseşti un sistem de operare care nu este prins la noi, poţi pune ce sistem vrei pentru că soluţia de virtualizare permite. Cred că sunt 7 click-uri şi poţi avea serverul „up and running” Sigură: Testerii noştrii (hackeri, testeri) trebuie să treacă un examen care include şi completarea unui Raport de Penetrare pentru a putea să folosească platforma. Securizată: HaS încurajează userii să folosească elemente (emailuri, nicknameuri) care să nu ducă la identificarea lor reală. Inclusiv noi, cei din spatele platformei, nu vrem să ştim dacă x, y, sau z companie foloseşte platforma. Asta asigură un grad ridicat de securitate.
Ce features noi pregătiţi?
Sunt o groază de feature-uri pe care vrem să le implementăm. Avem un top 3 features care vrem să le implementăm, dar cel mai bine pentru noi, este să primim propunerile de la utilizatorii care plătesc
42
nr. 3/2012 | www.todaysoftmag.ro
Startup - Hack a server
pentru acest serviciu. Ei trebuie să decidă ce alte opţiuni doresc implementate. Dacă stau să mă gândesc avem o opţiune care vă ajută pe CTO, administratorii de sistem sau dezvoltatorii de aplicaţii web: Să găsim o cale prin care într-un timp foarte scurt să reuşim replicarea/clonarea unei maşini fizice pe platforma noastră fără datele sensibile. No, asta da, provocare şi cred că o sa o punem pe următoarea iteraţie.
Cum v-aţi propus să penetraţi piaţa?
De când am dat drumul la versiunea Alpha, am iniţiat o serie de evenimente Get Together în diferite oraşe ale ţării unde strângem hackeri etici, CTO, administratori de sistem etc şi le povestim despre produs într-un cadru relaxat. Mâncarea, băutura şi distracţia din partea casei. Facem inclusiv sesiuni de simulare. Administratorii construiesc sistemele iar hackeri încearcă să le penetreze. Mai mult, avem şi premii. Trebuie să fie distractiv, nu? Până acum astfel de evenimente am avut la Bucureşti şi la Iaşi, iar următorul va fi la Cluj-Napoca în 8 iunie la sediul ISDC. Nişte oameni minunaţi. Când le-am spus de eveniment ce şi
cum vrem să-l facem, au sărit ca şi când erau parte din proiect. Nu mă pot abţine: Iubesc astfel de oameni. Adriana Dunca, specialist marketing şi PR la ISDC e minunată. Mai multe despre evenimentul Get Together găsiţi pe blogul HaS. HaS va deveni platforma oficială pentru DefCamp, o conferinţă la nivel de expert pe teme de InfoSecuritate care se va ţine în Cluj-Napoca în 6-8 septembrie la Hotel Napoca. Partea de virtualizare am facut-o open source astfel încât dacă cineva doreşte să-şi facă o platforma de testare manuală, să o facă repede şi fără costuri. Nu am lansat oficial încă pentru că ne trebuie strategia de răspândire şi timpul necesar. Nu vreau doar să o punem sus şi gata, Dumnezeu cu mila. Modulul de virtualizare intenţionăm să-l implementam în facultăţi, astfel încât studenţii care studiază securitatea informaţională să o facă într-un mod distractiv. Acestea sunt câteva direcţii care fac parte din strategia noastră de marketing.
programare
TODAY SOFTWARE MAGAZINE
Think iCloud iCloud este un set de interfeţe şi servicii oferite de Apple, pentru schimbul de date între mai multe instanţe ale aplicaţiei care rulează pe dispozitive diferite, într-un mod uşor de utilizat şi sigur. Pe lângă faptul că reprezintă o soluție flexibilă pentru un număr mare de probleme, SDK –ul permite un acces simplu și robust din punct de vedere al dezvoltării.
Zoltán, Pap-Dávid
zpap@macadamian.com Software Engineer @ Macadamian
Pentru a putea lucra cu iCloud, avem nevoie în primul rând de un App ID configurat pentru iCloud. În Xcode, pentru proiect, trebuie să fie activat entitlements, şi de asemenea, iCloud trebuie să fie configurat pe dispozitivul destinație pentru că applicațiile iCloud nu pot fi testate pe simulator. Pașii detaliați de configurare, nu fac obiectivul acestui articol, detaliile pot fi găsite pe https://developer.apple.com. Dacă totul este configurat corect, aplicaţia, pe lângă sandbox, poate accesa un director special iCloud pe dispozitiv. Fișierele puse în acest director sunt sincronizate automat de iCloud daemon. Conținutul acestui director special se poate acesa la fel ca și orice alt director din sandbox, dar dacă vrem să lucrăm direct cu aceste fișiere, trebuie să ținem cont de faptul că sunt folosite și de iCloud daemon.
Trecerea la iCloud
Pentru a face obiectele persistente în iCloud, am putea serializa manual datele
în fişierele din directorul iCloud local prin utilizarea noilor metode NSFileManager sau NSFilePresenter respectiv clasa NSFileCoordinator. După acest moment, sincronizarea se face într-un mod automat. Totuşi, acest procedeu este destul de complex şi inutil în cele mai multe cazuri, deoarece iOS5 SDK a introdus noi clase performante. În acest fel putem accesa direct obiecte instanțiate, fără a fi nevoie de a lucra cu structuri/fișiere din spatele acestora. Din punct de vedere al dezvoltatorului, avem trei metode pentru a stoca datele în cloud: •
•
Key / Value Store este metoda recomandată când vrem să stocăm o cantitate mică de date dintr-un dicționar. Ca un caz concret de aplicație menționăm stocarea setărilor aplicației în cloud. (NSUbiquitousKeyValueStore este foarte similar cu NSUserDefaults) • S t o c a r e a o b i e c t e l or î n i C l ou d (UIDocument) • Baze de date în cloud. Se configurarează CoreData pentru a stoca datele în cloud Apple pune la dispoziție structuri simple și robuste de lucrul cu date din iCloud.
www.todaysoftmag.ro | nr. 3/2012
43
programare
Think iCloud
Dacă valoarea returnată nu este nil, totul este configurat corect și putem să Stocarea datelor tip Cheie/Valoare scriem query-uri pentru datele pe care Î n c a z u l î n c a r e v r e m s ă vrem să accesam. stocăm o cantitate mică de date reprezentate printr-un dicționar putem folosi NSMetadataQuery * query = [[NSMetadataQuery alloc] init]; NSUbiquitousKeyValueStore introdus [query setSearchScopes: [NSArray în iOS5 SDK. Datele pot fi sincronizate arrayWithObject: NSMetadataQuerydeoarece sunt încapsulate în NSString, UbiquitousDocumentsScope]]; NSDate, NSNumber, NSData, NSArray NSPredicate *pred = [NSPredicate predicateWithFormat: @”%K like sau în NSDictionary. Singura restricție este ‚EventInfo_*’”, NSMetadataItemFSîn ceea ce priveşte dimensiunea datelor NameKey]; stocate. Pentru fiecare cheie, datele stocate [query setPredicate:pred]; pot avea max 64KB şi putem avea până la [[NSNotificationCenter defaultCenter] addObserver:self 256 de intrări, iar combinate, nu trebuie să selector:@selector(queryDidFinish depăşească 64KB în total. Gathering:) De asemenea avem posibilitatea să pri- name:NSMetadataQueryDidFinishGath mim notificări când datele sunt modificate. eringNotification
Stocarea obiectelor
object:query]; [query startQuery];
Tot ceea ce trebuie să facem este să scriem un query, prin specificarea unui predicat pentru filtrarea storage-ului iCloud, UIDocument, pentru a stoca un obiect în și să executăm query-ul. Documentele iCloud. UIDocument este, practic, un mo- sunt transferate în directorul iCloud local, del de controller (MVC pattern), impleși pentru fiecare este inițializat un obiect mentează NSFilePresenter și se sincronimodel. Odată ce obiectele modelului zează automat de iCloud daemon. Clasele sunt încărcate în memorie, se trimite o ale căror instanțe vrem să le stocăm în notificare. Deoarece totul se desfășoară în iCloud, trebuie să aiba ca și clasă de bază fundal, încărcarea documentelor nu bloUIDocument. În continuare, voi numi chează aplicația. De asemenea putem primi aceste obiecte, documente. Tot ceea ce notificări dacă sunt detectate schimbări trebuie să definim, este modul de serialiasupra documentului. zare/deserializare a datelor, implementând următoarele două metode: Crearea unui document nou La crearea unei noi instanțe a unei clase - (BOOL)loadFromContents:(id)conderivate din UIDocument, trebuie să spetents ofType:(NSString *)typeName cificăm la inițializare un URL care indică error:(NSError **)outError - (id)contentsForType:(NSString o locație din directorul local iCloud. La *)typeName error:(NSError **) salvarea documentului, datele vor fi transoutError ferate în acest fișier. Prima metoda primeşte NSData sau NSURL *ubiquitousPackage = [[self.ubiq URLByAppendingPathCom NSFileWrapper (în acest fel se pot citi ponent:@”Documents”] URLByAppendi date dintr-un singur fișier sau din mai ngPathComponent:fileName]; multe) și conține deserializarea în modelul intern. A doua metodă conţine deseriali- UserInfo *doc = [[UserInfo alloc] initWithFileURL:ubiquitousPacka zarea şi trebuie să returneze NSData sau ge]; NSFileWrapper. Dacă implementăm EntityInfo * newEntity = [initWi NSCoding, implementarea acestor metode thFileURL:ubiquitousPackage]; este trivială.
Model Controller. Utilizarea documentelor În iOS5 SDK avem la dispoziție clasa
Transferarea documentelor din iCloud.
[doc saveToURL:[doc fileURL] forS aveOperation:UIDocumentSaveForCr eating completionHandler:^(BOOL success) { }];
Iniţial, directorul iCloud local de pe device nu conţine documentele pe care vrem să le accesăm. Primul pas care trebuie Stocarea documentelor în iCloud făcut este obținerea unei referințe către implică faptul că mai multe instanţe ale directorul iCloud local. aplicației pot accesa și modifica acelaşi NSURL * storage = [[NSFileMandocument. Atunci când mai multe instanţe ager defaultManager] URLForUbiqui efectuează modificări diferite pe acelaşi tyContainerIdentifier:nil]; document, pot apărea inevitabil, conflicte.
44
nr. 3/2012 | www.todaysoftmag.ro
Cea mai simplă metodă de a rezolva aceste conflicte, este de a suprascrie instanța precedentă cu instanța din ultima salvare. De asemenea, se pot defini scenarii de rezolvare ale conflictelor. Pentru a inspecta starea documentului, UIDocument conţine o proprietate documentState (există, de asemenea, o notificare pentru cazul în care starea documentului se schimbă - UIDocumentStateChangedNotification).
CoreData și iCloud
Un scenariu mai complex este necesitatea de a stoca o bază de date sqlite, în iCloud. În iOS5, CoreData aduce îmbunătăţiri pentru a sprijini integrarea eficientă a bazelor de date SQLite cu iCloud. În locul stocării bazei de date fizice în cloud, doar log-urile de tranzacții discrete (discrete transaction log files) sunt stocate în cloud. În acest fel nu este necesar transferul fișierului sqlite la fiecare tranzacție, ajunge doar transferul log-ului de tranzacție. La sincronizare, tranzacțiile sunt executate pe baza de date locală, aceste schimbări putând fi detectate de CoreData. Când vrem să folosim o bază de date sqlite în iCloud, trebuie să avem în vedere următoarele aspecte: • CoreData trebuie inițializat prin specificarea locației log-urilor tranzacționale (acesta trebuie să fie în directorul iCloud local). Pentru aceasta trebuie specificate la inițializare, valori pentru cheile:
NSPersistentStoreUbiqui tousContentNameKey și NSPer sistentStoreUbiquitousCon tentURLKey. Astfel CoreData va
ști unde să stocheze aceste loguri pentru tranzacții
• •
Dacă vrem să ștergem baza de date din cloud, trebuie să ștergem numai logurile. Fișierul sqlite trebuie stocat în așa fel încât modificările la el să nu fie sincronizate cu cloud-ul (fie în sandbox-ul aplicației fie în directorul iCloud local, într-un director cu terminația: . nosync )
Prin introducerea suportului pentru iCloud în iOS5, Apple deschide noi orizonturi pentru dezvoltatorii aplicațiilor mobile iOS. De asemenea, iOS SDK este extins astfel încât timpul de trecere la această tehnologie să fie cât mai mic, iar lucrul cu iCloud să se facă într-un mod cât mai transparent.
diverse
TODAY SOFTWARE MAGAZINE
Gogu Faceți cunoștință cu Gogu! Gogu este un personaj amuzant, cinic pe alocuri, un introvertit pentru care monologul interior reprezintă o alternativă la viața reală. Cu ajutorul lui Gogu, analizăm diferite ipostaze din viața managerului de proiect și a echipei sale și sugerăm soluții ușor de
Simona Bonghez, Ph.D.
simona.bonghez@smartprojects.ro Speaker, trainer şi consultant în managementul proiectelor, partener al TSP(smartprojects.ro) “Cred cu tărie în puterea jocului şi a metaforei şi îmi place la nebunie ca sesiunile mele de training să fie distractive şi interactive, în aşa fel încât participanţii să acumuleze informaţiile într-o manieră cât mai plăcută…”
înțeles și aplicat. Cum ar spune Gogu... - Auzi, Mişule, ăştia toţi zic, care „aproape de bun simț”. mai de care, că au experienţă şi cunoştinţe. Vă invităm să-l urmăriți pe Gogu și să-i Cum pot eu să „verific temeinic” chestia trimiteți sugestiile voastre. asta? Că nici să-i chem pe toţi la interviu nu pot... Deşi ar merita, numai să văd faţa Capul lui Gogu abia se mai iţea din lui Şefu’.. marea de CV-uri în care era scufundat proPrivirea îi căzu pe: „Certificare PMP prietarul lui; dacă nu l-ai fi auzit pufnind obţinută în 2010”. din când în când, nici n-ai fi zis că e acolo. - PMP-ul ăsta e certificarea aia - Probleme, Gogule?! Ai irosit vreo trei internaţională de la PMI, nu-i aşa? copaci printând toate CV-urile astea, nu era Realiză subit că îl întrerupse pe Mişu. mai simplu să le vizualizezi pe computer? - Păi eu ce-ţi spuneam frate, iar Ei, lasă Mişule, că te prind eu la prin- întrebi şi nu eşti atent la răspuns! Că mă ter, să-ţi dau numa’ copaci! gândi Gogu, şi enervezi... Da, măi, e exact certificarea dar se abţinu să comenteze, să nu-i dea apă aceea de nu vrei tu să ţi-o iei, mare noroc ai la moară. Rămase impasibil şi se adânci şi cu Şefu’ ăsta al nostru. mai mult în studiul hărtiilor. Mişu dădu să - Mă laşi?! O fi la modă să ai o certificare mai zică ceva, n-ar fi rezistat tentaţiei de a în domeniu, dar asta nu e deloc o garanție mai învârti puţin cuţitul în rană, dar se opri a competențelor de manager de proiect. când îl văzu intrând pe Şefu’: Un examen grilă nu poate fi concludent - Gata, Gogule? Mi-a zis HR-u’ că ţi-a pentru competentele mele. Un manager de dat CV-urile selectate, tu doar să alegi pro- proiect trebuie să știe să aplice cunoștințele ject managerii pentru interviu. Câţi avem? teoretice acumulate, să coordoneze echipa, Ei, lasă că îl prind eu şi pe HR-u’ ăsta... să gestioneze situațiile neprevăzute care Ce-o fi azi, că numa’ de şmecheri am parte?! apar pe parcursul proiectului... unde intră Ii răspunse însă Şefului: aspectele astea în examenul pentru certifi- Mai lasă-mă puţin, mi-au trimis care? Cine le verifică? 32 de CV-uri, încerc să reduc interviurile - Eşti cârcotaş ca de obicei. Ţii minte la maxim 10, e ok? că ne-a zis Şefu’ că sunt nişte condiţii pen- Dă-i bătaie, mai bine aşa decât tru eligibilitate, un anumit număr de ore data trecută când n-am primit nici un CV. de instruire plus experiență în conducerea E bine că ai mai tăiat din criterii, numai să proiectelor. Asta nu inseamna, de fapt, ca ai nu dăm acum în extrema cealaltă şi să ne dobândit și niște competențe? trezim cu unii fără studii, fără experienţă. - Ntz! N-aş crede... Da’ nu-mi fac griji, ştiu că verifici temeinic. Rotiţele începură însă să se învârtă: Stai Treci pe la mine când eşti gata. aşa, că n-or fi competenţe, dar măcar cineva Sigur că da, „verifici temeinic” îl îngână a verificat că există cunoştinţe şi experienţă. Gogu pe Şefu’. Mai citi o dată fraza la care Te pomeneşti că m-am scos... Luă la mână rămasese în CV-ul din faţa lui: „Experienţă iar toate CV-urile, le puse la o parte pe cele considerabilă în proiecte de anvergură, cu certificare internaţională. Le numără. cu rezultate excelente”. Nici că putea fi Erau cinci. Ceea ce înseamnă cinci intercineva mai vag de atât – îşi spuse – câţi viuri. Iar la interviu, verifici competenţele, ani înseamnă „considerabilă”, ce buget are mă rog, atât cât e posibil, iar Şefu’ se pricepe un proiect „de anvergură” şi pe ce bază sunt să-i învârtă pe candidaţi la interviu. Mai numite rezultatele „excelente”?! „Training adaugă încă trei CV-uri care ofereau detalii intensiv în managementul proiectelor” – concrete despre proiecte realizate şi expericiti el mai departe. Mda, dacă făcea doi bani enţă acumulată şi se declară satisfăcut. Erau trainingul ăsta intensiv al tău, dădeai nişte opt candidaţi pentru opt interviuri. Si-apoi detalii clare, nu mă abureai cu „anvergură” vedem noi dacă iese ceva. Hai că e bun şi şi „considerabil”. PMP-ul ăsta la ceva! www.todaysoftmag.ro | nr. 3/2012
45
sponsori
powered by