Nº 1/2012 .NET Performance Interviu - echipa românească finalistă Microsoft Imagine Cup De la o idee la un produs Compensarea creativă Startups - Mintaka Research Informaţia, de la teorie la strategii ale spaţiului public
6 Performanţa în aplicaţiile .NET Flaviu Măţan
14 Problema efectelor secundare
Ovidiu Deac
16 The Good, the Bad and teh Ugly
Ovidiu Deac
22 Interviu cu echipa românească finalistă Microsoft Imagine Cup Marius Mornea
26 Startup Mintaka Research
Marius Mornea
30 De la o idee la un produs Ovidiu Măţan
33 Compensarea creativă Ioana Fane
36 5 diferenţe dintre un şef şi un lider Aristotel Dascăl
38 10 vs. 1700 Presto - Allegro ma non troppo Aurel Popârţac
40 Informaţia, de la teorie la strategii ale spaţiului public Sebastian Big
editorial
Conectarea punctelor Salut,
Ovidiu Măţan, PMP În prezent coordonează echipa Gemini Solutions Cluj, a fost timp de 3 ani Product Manager Nokia pentru serviciul de synchronizare al Ovi.com, fondator Today Software Magazine.
4
no. 1/2012 | www.todaysoftmag.ro
Am plăcerea sa vă prezint primul număr al revistei Today Software Magazine, www.todaysoftmag.ro. Ideea a pornit de la faptul că fiind o comunitate numeroasă în Cluj, precum și în celelalte mari orașe din România, programatori sunt conectați profesional în marea majoritate a timpului la evenimentele din cadrul firmei. Studiul tehnologiilor sau a limbajelor noi se desfășoară individual, folosind date globale, lipsind informațiile și trendurile locale, o modalitate prin care aflăm părerile celor din jurul nostru. Al doilea punct de la care am pornit este absența companiilor românești care dezvoltă produse proprii. Este un paradox faptul că 99% dintre acestea execută doar task-uri de outsourcing sau servicii locale ale unor multinaționale. Pentru a duce o idee la capăt și a crea un produs competitiv este nevoie de multă muncă, profesionalism, dedicație. Probabil este nevoie de un mic imbold, motivare și sprijin, iar TSM va fi un aliat. Tot ce vă cerem este să ne spuneți despre startup-ul vostru iar noi vom aloca un spațiu pentru el, în secțiunea dedicată. Al treilea scop al revistei este de a publica rezultatele celor câțiva care reprezintă elita din domeniu. În fiecare număr va apărea un interviu cu o persoană sau o echipa care a obținut rezultate remarcabile. Vom crea un grup de profesioniști în domeniu care vor deveni cunoscuți prin publicarea constantă în cadrul revistei. Avem deja o parte din ei dar numărul lor va crește în viitor. Dacă crezi că ai ceva de spus, dă-ne un semn sau trimite-ne un exemplu de articol iar noi îl vom publica într-unul din numerele viitoare. Vom încerca să acoperim toate ariile de activități implicate, începând cu software development, QA, automation și până la management/HR. O particularitate este secțiunea de filozofie. Adunând toate aceste lucruri, scopul nostru final este de a avea o revistă pentru programatori, o lectură plăcută și interesantă, care, să sperăm, va naște întrebări și va învăța lucruri noi. Lansăm și o invitație de a comenta articolele pe site-ul nostru și de a lua parte la concursurile organizate. Lansarea primului număr al revistei în format tipărit și online, de astăzi, 6 februarie, în cadrul evenimentului Gemini Solutions Open Day, reprezintă primul pas, urmând ca în următoarea perioada să își facă apariția versiunea în limba engleză disponibilă pe Apple Store și Android Market.
Redacţie Fondator / Editor in chief: Ovidiu Mățan / ovidiu.matan@todaysoftmag.ro Graphic designer / Editor (filozofie): Sebastian Big / big.sebastian@todaysoftmag.ro Graphic designer: Dan Hădărău / dan.hadarau@todaysoftmag.ro Editor (limbaje de programare): Ovidiu Deac / ovidiu.deac@todaysoftmag.ro Editor (startups și interviuri): Marius Mornea / marius.mornea@todaysoftmag.ro Colaborator: Ioana Fane / ioana.fane@todaysoftmag.ro Colaborator: Flaviu Mățan / flaviu.matan@todaysoftmag.ro Colaborator: Aurel Popârţac / aurel.popartac@todaysoftmag.ro Colaborator: Aristotel Dascal / aristotel.dascal@todaysoftmag.ro Reviewer: Romulus Pașca / romulus.pasca@todaysoftmag.ro Adresa de contact contact@todaysoftmag.ro +40749152170 www.todaysoftmag.ro www.facebook.com/todaysoftmag twitter.com/todaysoftmag ISSN 2284-6360
www.todaysoftmag.ro | no. 1/2012
5
programare
Performanţa în aplicaţiile .NET
Flaviu Măţan Principal Software Engineer at Ixia
Dinamica modernă a dezvoltării de aplicaţii software cu focus pe livrări frecvente de cod funcţional face ca performanţa să fie un aspect adesea trecut cu vederea. Cu toate că abordarea de genul “fă-l să meargă întâi după aceea refactorizam” are avantaje demonstrate cum ar fi adaptarea uşoara şi rapidă la modificările de cerinţe, ea deschide uşa adesea codului scris neglijent care afectează performanţa într-un mod negativ. Fie că este inclusă din start în ciclul de dezvoltare, sau este cauzată de situaţii cum ar fi descoperirea de operaţii foarte lente sau o degradare abruptă de performanţa în anumite scenarii (ex. creşterea numărului de puncte de intrare cum ar fi numărul de useri care folosesc un sistem etc.) sau ca un pas premergator unui task de scalabilitate, măsurarea performanţei aplicaţiilor devine un pas din ce în ce mai important în viaţa unei aplicaţii. Acesta este primul dintr-o serie de articole despre performanţa în aplicaţiile .NET şi acoperă partea de alegere a profiler-ului potrivit. Al doilea articol din serie va fi un studiu de caz în care vor fi analizate câteva surse comune de degradare de performanţa precum şi posibile soluţii la aceste probleme.
Alegerea profiler-ului potrivit
Detectarea problemelor de performanţă ale unei aplicaţii se poate face prin diferite metode, de la caz la caz, începând cu folosirea ceasului de mână pentru a măsura timpul de execuţie al unor operaţii, adăugarea de timere în cod în jurul operaţiilor suspecte de probleme de performanţă şi logarea acestora în fişiere pâna la folosirea aplicaţiilor dedicate, aşa-zisele profiler-e, care furnizează date complexe colectate la rularea aplicaţiei pe baza cărora programatorii pot să identifice zonele cu probleme reale de performanţă cu un efort relativ mic. Prima variantă este folosită cu succes de către managementul superior pentru evaluarea aplicaţiei dpdv al performanţei. A doua variantă în care se folosesc timer-e presarăte prin codul sursa funcţionează bine atunci când problema de performanţa este ştiută şi relativ localizata şi se vrea obtinerea mai exacta a cauzei acesteia. Procedeul este de obicei unul secvential, în mai multi pasi care duce într-un final la identificarea codului problema. În prima parte a acestei serii de articole dedicate performanţei în aplicaţiile .NET vom discuta despre a treia variantă de investigare, cea în care se folosesc aplicaţii de tip performance profiler deoarece acestea pun la dispozitia programatorilor date şi unelte ce facilitează identificarea, fixarea şi reevaluarea problemelor
6
no. 1/2012 | www.todaysoftmag.ro
de performanţa. În plus devii automat un programator cool, daca le folosesti. În continuare vom pune faţă în faţă două dintre cele mai folosite profiler-e comerciale pentru aplicaţii .NET şi anume ANTS Performance Profiler de la Redgate respectiv dotTrace Performance de la JetBrains. Cautarea în google dupa „.net performance profiler” va întoarce cele două profiler-e în primele 2 rezultate. Le vom evalua în funcţie de o serie de criterii între care: uşurinţa în folosire, acurateţea măsuratorilor, analiza rezultatelor, preţ etc.
1. Uşurinţa în folosire
Ambele aplicaţii sunt foarte similare în ce priveste partea de inițiere a sesiunii de profiling. Fiecare oferă posibilitatea de a alege tipul aplicaţiei de analizat (standalone, silverlight, web etc.) şi optiunile legate de nivelul de detaliu al datelor colectate (la nivel de linie, metoda sau sampling). În continuare sunt descrise cele mai importante optiuni de profiling. Majoritatea sunt prezente sub o denumire sau alta în ambele aplicaţii: 1. Modul de profiling: Sampling - este o metoda de măsurare de mica acurateţe prin care o data la un anumit interval de timp se suspendă toate threadurile aplicaţiei analizate şi profiler-ul obtine call stack-ul fiecărui thread. Pe baza call stackurilor colectate în timp profiler-ul va putea estima duratele apelurilor prezente în stack-uri la diferite momente de timp. Avantajul acestei metode este ca influentează cel mai putin aplicaţia analizata, aceasta funcţionand foarte apropiat de performanţele ei normale. Dezavantajele sunt acurateţea mică a măsurătorilor şi lipsa hitcount-ului pentru funcţii. Opțiunea este prezentă în ambele profiler-e. Tracing sau la nivel de metoda aceasta este cea mai folosita metoda în care măsuratorile se fac pe baza notificărilor venite din partea CLR (Common Language Runtime) la intrarea respectiv ieșirea din funcţii. Avantajele includ o acurateţe foarte
Initiere sesiune profiling pentru aplicatii standalone, ANTS Performance Profiler 6.3
Initiere sesiune profiling pentru aplicatii standalone, dotTrace Performance 4.5.1
www.todaysoftmag.ro | no. 1/2012
7
programare
mare a măsurării timpului petrecut în funcţii şi prezenta hitcount-ului pentru toate funcţiile. Dezavantajul major este că influentează într-o măsura destul de mare performanţa aplicaţiei analizate.Opțiunea este prezenta în ambele profiler-e. Notă: ANTS Performance Profiler are o optiune (activa by default) prin care se ajustează automat durata funcţiilor scăzând influenta estimată a profiler-ului asupra executiei acestor funcţii. La nivel de linie - acest mod produce cele mai detaliate rezultate ce conțin informații legate de durata şi hitcount la nivel de linie de cod executată. Principalul dezavantaj este influenta majora adusă aplicaţiei analizate. Optiunea este prezenta în ambele profiler-e. 2. Metoda de măsurare: Wall time - reprezintă timpul total scurs între intrarea şi iesirea dintr-o funcţie. Acest mod înregistrează inclusiv timpul în care thread-ul îl petrece în operaţii de sleep, wait, join etc. CPU time (sau thread time) - în acest mod se înregistrează doar timpul în care un thread consuma efectiv procesor. Timpul petrecut în operaţii de sleep, wait, join nu sunt incluse în măsurătoarea finala a funcţiei. 3. Alte opțiuni Ajustarea timpilor pentru a compensa influenta profiler-ului - daca opțiunea este activă, din durata măsurată a funcţiilor se scade automat durata estimată a influenței profiler-ului asupra executiei. Nota asupra notatiei din tabel: Da* înseamna preferința autorului între cele două oferte.
Obtinerea rezultatelor
Cele două applicații au moduri diferite pentru a obtine datele de profiling între două momente de timp: ANTS Performance Profiler 6.3 are notiunea de timeline (linie a timpului), iar dotTrace Performance folosește noțiunea de snapshot.
Performanţa în aplicaţiile .NET
ANTS Profiler timeline
Timeline-ul trebuie să recunoaștem că este un control sofisticat şi spectaculos. Acesta se actualizează în timp real pe măsura ce aplicaţia analizată rulează şi ofera informatii cum ar fi graficul încărcării procesorului, citiri/scrieri I/O, excepții şi evenimente UI ce au avut loc pe parcursul rularii. Timeline-ul este interactiv, permițând selectarea de ferestre, zoom in/out, click pe exceptii şi evenimente pentru a obține informatii adiționale despre acesta cât şi salvarea selecțiilor (ferestrelor) sub forma de bookmark-uri.
Ferestre
Selectarea unei ferestre pe timeline va actualiza datele colectate din fereastra de analiza pe intervalul determinat de fereastra. Ferestrele se pot construi astfel încât să cuprinda o anumita operaţie, un spike CPU sau intreaga fereastra. Selectarea unei ferestre în jurul unei anumite operaţii poate fi mai complicată decât pare, deoarece presupune memorarea/identificarea punctului în care a început operaţia. Succesiunea de acțiuni ar fi după cum urmeaza: suntem pe cale să executam o operaţie în aplicaţia analizată pentru care dorim să colectăm date de profiling,
marcăm timeline-ul (vizual sau cu o fereastra temporara de ex.) chiar înainte de a porni operaţia, dăm drumul la operaţie, la finalul acesteia trasam fereastra de la punctul de pornire stabilit anterior pâna la sfârșitul timeline-ului (dacă marcarea punctului de început s-a făcut folosind o fereastra temporară, aceasta se poate extinde pâna la punctul final folosind mouse-ul). O singură fereastra poate fi selectată la un moment dat. Dimensiunea acesteia poate cuprinde orice subset din timeline.
Bookmark-uri
Acestea se salvează împreună cu salvarea datelor de profiling. Bookmark-urile sunt foarte utile atunci când vrem să revenim asupra unor rezultate de profiling salvate anterior şi dorim să revedem datele de profiling pentru anumite operaţii sau zone interesante. În absenta bookmark-urilor ar trebui să refacem selectiile (ferestrele) corespunzătoare operaţiilor căutate pe baza informatiilor din timeline (grafic CPU, evenimente etc.). Folosind bookmark-uri pentru a marca ferestrele relevante la momentul în care le selectam pentru prima dată ne permite refacerea ferestrelor cu un singur click pe timeline în suprafata bookmark-ului. Cei de la JetBrains au rezolvat problema asta folosind notiunea de “snapshot” care structurează în mod autoANTS Performance Profiler 6.3
dotTrace Performance 4.5.1
Sampling
Da
Da
La nivel de metoda
Da
Da
La nivel de metoda (doar module cu cod sursa)
Da
Nu
La nivel de linie
Da
Da
La nivel de linie (doar module cu cod sursa)
Da
Nu
Ajustarea timpilor pentru a elimina influenta estimata a profiler-ului
Da
Da
Wall time
Da
Da
Thread time
Da
Da
Tabela cu optiunile disponibile pentru cele doua profiler-e
8
no. 1/2012 | www.todaysoftmag.ro
Selectare sectiune din timeline pentru a obtine datele pentru intervalul respectiv mat datele colectate pe intervale stabilite de către utilizator. Pro şi Contra Avantajele timeline-ului includ: flexibilitate maxima în selectarea ferestrelor de timp de orice dimensiune, informatii aditionale gen exceptii şi evenimente. Dintre dezavantaje: - greu de trasat ferestre în jurul unor operaţii bine delimitate - colectarea de date este activa pe tot parcursul rularii (influentand performanţa aplicaţiei analizate).
dotTrace snapshot
dotTrace Performance are un mod mai simplu de colectare a datelor sub forma de capturi (snapshot-uri). Astfel programatorul alege momentul exact în care începe colectarea datelor de profiling şi momentul în care se opreste, rezultatul reprezentand un snapshot (captura). Un snapshot este de sine statator şi nu poate fi combinat cu alte snapshoturi. Pro şi Contra Avantaje: - colectarea datelor este activă doar pe durata capturii reducand astfel impactul asupra performanţei aplicaţiei analizate (notă: Impactul asupra aplicaţiei analizate în perioadele în care nu exista snapshot activ nu sunt zero. Procesul este instrumentat şi toate hook-urile active, doar colectarea şi structurarea datelor de profiling este sistata). - colectarea de date pentru anumite operaţii se face usor (start/stop snapshot)
rului un arsenal de funcţionalități care să faciliteze gasirea problemelor de performanţe ale aplicaţiilor analizate. Exista elemente de bază, comune celor două profiler-e cum ar fi folosirea aceluiasi set de metrici (numar de apeluri, durata metodelor incluzând sau nu duratele funcţiilor apelate în cadrul lor), evidențierea celor mai costisitoare metode, filtrarea metodelor cu impact foarte mic, mapare la codul sursa etc. şi există elemente distincte şi utile de-o parte şi de alta în ce priveste modurile de prezentare şi grupare a metodelor, posibilitatile de căutare şi adnotare etc.
2.1 Moduri de vizualizare al rezultatelor
start colectare date
Ambele aplicaţii pun la dispoziția utilizato-
Definiții: Call stacks - pentru fiecare thread sunt înregistrate toate call stack-urile exercitate de-a lungul executiei în cadrul acelui thread. Notă: ambele profiler-e filtrează metodele irelevante (cu durată foarte mica) din stack-urile afisate. Utilizatorul poate opta pentru suspendarea filtrarii în ambele cazuri. Procent - aportul unei metode la durata totala a thread-ului, exprimat în procente. Procentul metodei cuprinde durata acelei metode plus durata tuturor metodelor apelate de aceasta. Notă: La dotTrace acest procentaj apare intotdeauna în afisarea arborescenta. În cazul profiler-ului de la ANTS exista o coloana care se numeste “Time with children” iar valorile ei pot fi exprimate la alegere în procent, milisecunde sau secunde. Timpul metodei (time) - reprezinta durata proprie a unei metode fara a lua în calcul şi eventualele metode pe care le apeleaza. Notă: în vizualizarea sub forma arborescenta doar ANTS Performance Profiler are această coloana.
Dezavantaje: - snapshot-urile nu pot fi extinse sau restranse (ca şi la timeline)
2. Analiza rezultatelor
Grupate per thread Ambele aplicaţii afișează by default stack trace-urile sub forma arborescenta, per thread, ordonate descendent dupa durata. Se poate observa ca cele două reprezentari sunt similare dpdv al structurii informatilor (funcţii, durata, hitcount) cat şi al continutului, cele două profilere afisând aproximativ acelasi stack (aceeași succesiune de metode).
stop colectare date
Timpul impreuna cu metodele apelate (time with children) - vezi descrierea de la Procent mai sus.
www.todaysoftmag.ro | no. 1/2012
9
programare
Performanţa în aplicaţiile .NET
rezultatele de profiling sub forma arborescenta per thread, ANTS Performance Profiler 6.3
rezultatele de profiling sub forma arborescenta per thread, dotTrace Performance 4.5.1 Hitcount - reprezintă de câte ori a fost apelată o metoda într-un anumit stack. Daca o metoda apare în stack-uri diferite ea va avea foarte probabil valori diferite. Pe lângă modul default cu grupare per thread, sub forma arborescentă prezentat mai sus, fiecare profiler mai are şi alte moduri de prezentare/grupare al funcţiilor din rezultate. Flat List Ambele au modul flat list în care funcţiile nu mai sunt grupate după vreun criteriu (cum ar fi per thread), ci sunt listate şi sortate după un anumit crtiteriu (ex. descrescător după durata, hitcount, nume). În acest mod se pot afla funcţiile cele mai costisitoare dpdv a duratei şi al apelurilor. Dacă o anumita metoda este apelată în mai multe stack-uri (thread-uri), în vizualizarea flat list metoda va apărea o singura dată şi va avea durata şi numarul de apeluri cumulat pentru toate contextele în care este apelată.
10
no. 1/2012 | www.todaysoftmag.ro
2.2 Drill down
Odată identificată o funcţie suspectă vom dori să “săpam” pâna ajungem la cauza principala a duratei acelei metode. În modul arborescent per thread se permite navigarea în jos deschizând rând pe rând funcţiile apelate. Este o operaţie foarte comună ce poate deveni frustrantă dacă trebuie să mergem “din click în click” mai ales în situațiile în care stack-ul este foarte adanc. Cei de la ANTS au rezolvat simplu problema oferind o optiune de expandare automată a celei mai costisitoare cale din stack pornind de la funcţia selectata. Din păcate, în dotTrace Performance 4.5.1 nu exista o astfel de opțiune fiind nevoit să transpiri ceva mai mult pentru a ajunge jos, la baza stack-ului. În ANTS Performance Profiler 6.3 pentru o anumită funcţie putem deschide modul grafic de reprezentare arborelui de apeluri avand metoda de pornire ca şi rădăcina.
Acest mod de vizualizare oferit de profiler-ul de la ANTS este unul care pe langa ca arată foarte bine, este şi foarte util în gasirea problemelor de performanţa. în plus este şi foare prietenos dpdv al modului de folosire, expandarea unui nod în funcţiile apelate din acesta facandu-se cu un singur click. Modul grafic este lansat dintr-una dintre celelalte două vizualizari (cel grupat per thread respectiv cel de tip lista) prin selectarea unei metode şi alegerea reprezentarii de tip call graph din meniul contextual. Pornind de la funcţia selectata, arborele de apeluri de metode poate fi expandat atat în jos inspre funcţiile apelate cat şi în sus afisand metodele apelante. O optiune foarte utila va expanda automat în jos arborele celor mai costisitoare funcţii apelate permitand analiza celui mai costisitor sub-stack. Exista şi în aceasta vizualizare filtrare asupra metodelor cu impact mic dpdv al timpului ocupat, dar este mai permisiv decat în varianta de vizualizare arborescenta
rezultatele de profiling ĂŽn modul flat list, ANTS Performance Profiler 6.3
rezultatele de profiling ĂŽn modul flat list, dotTrace Performance 4.5.1
Modul grafic (doar la ANTS)
www.todaysoftmag.ro | no. 1/2012
11
programare
per thread. Adică metode care apar în arborele grafic de funcţii pot lipsi din varianta per thread. Acest lucru face ca de cele mai multe ori analiza să ajungă în acest mod. Un alt aspect foarte important al acestei variante de afisare este faptul că există optiunea de a exporta graficul în format pdf sau imagine oferind un mod foarte facil de a împărtăși rezultatele altor persoane. Echivalentul în dotTrace Performance ar deschiderea unei metode într-un tab nou, dedicat acesteia. Ambele abordari (si cea de la ANTS şi cea de la JetBrains) prezintă aceleasi informații şi duc în mod normal la aceleasi rezultate. Varianta de la ANTS face totuși arborele de apeluri mai usor de navigat (mai ales în cazul unor ierarhii stufoase) prin optiunile de “expandare cale costisitoare” şi posibilitatea de zoom in/out oferită. Căutarea Cautarea unei metode este o funcţie destul de folosita pe parcursul analizei rezultatelor de profiling în special atunci când stim exact ce metoda urmarim sau când dorim să vedem efectele optimizărilor efectuate asupra anumitor metode. La acest capitol dotTrace sta mai bine oferind un control de search avansat care prezintă o lista de sugestii de metode pe
Performanţa în aplicaţiile .NET
măsura ce se tastează numele funcţiei cautate: ANTS a preferat un control simplist, fără sugestii, fără cautare bazată pe namespace. Comparare de rezultate Doar dotTrace Performance 4.5.1 oferă posibilitatea de a compara rezultatele obținute în două sesiuni de profiling diferite prin funcţia de comparare a două snapshoturi. Este o funcţionalitate pe care trebuie să recunosc că am folosit-o foarte rar (o dată sau de două ori) din cauză că pentru a avea o comparatie relevantă şi ușor de interpretat ar trebui ca cele două snapshot-uri să fie cât mai apropiate dpdv al succesiunii de apeluri precum şi al numărului de apeluri. În conditii optime rezultatul comparatiei poate fi foarte util în a determina efectele unei eventuale optimizari asupra performanţei. Posibilitati de adnotare/marcare O alta funcţionalitate oferită doar de dotTrace Performance este cea de adnotare/ marcare a metodelor. Utilizatorul poate adăuga comentarii pentru anumite metode şi poate scoate în evidență< o anumita metoda prin schimbarea formatarii şi culorii. ANTS Performance Profiler 6.3
dotTrace Performance 4.5.1
Afisare rezultate arborescenta per thread
Da*
Da
Afisare rezultate de tip lista
Da
Da
Capabilitati de formatare si adnotare metode
Nu
Da
Drill down la nivel de metoda
Da*
Da
Cautare
Da
Da*
Comparare de rezultate
Nu
Da
Filtrare metode cu impact neglijabil
Da
Da
Posibilitatea exportarii rezultatelor in formate usor de transportat
Da
Nu
Ajustarea duratei unei metode pentru a simula o optimizare
Nu
Da
12
no. 1/2012 | www.todaysoftmag.ro
Doar profiler-ul de la JetBrains ofera o astfel de funcţionalitate prin intermediul funcţiei de Adjust Time din meniul contextual pentru o metodă. Ajustarea se poate face reducand durata de la 100% la un procent care reprezintă durata estimată a metodei în urma unei eventuale optimizări. Ajustarea se poate aplica doar la stack-ul curent sau la toate stack-urile în care apare metoda respectivă.
3. Afectarea performanţei aplicaţiei analizate
Ambele profiler-e influențează aplicaţia pe care o analizează în funcţie de modul de profiling folosit atat în termeni de performanţa cat şi de memorie. În tabelul din dreapta se gasesc măsuratori de performanţa facute asupra unei aplicaţii de test (aplicaţia Demo din kitul de dotTrace Performance 4.5.1) Din măsuratorile din tabel se pot trage câteva concluzii evidente: - în modul sampling ambele profiler-e influentează nesemnificativ aplicaţia analizata - în modul tracing (sau la nivel de metoda) rularea cu dotTrace este durează ceva mai mult decat cu ANTS. - cu modul de profiling la nivel de metoda lucrurile stau foarte diferit, rularea cu dotTrace fiind de mai bine de 3 ori mai lenta. De notat faptul ca se pot aplica filtre prin care se specifica ce module/clase/funcţii sunt incluse sau excluse din analiza la nivel de linie. - urmatoarele două moduri sunt disponibile doar la dotTrace Performance Profiler şi sunt foarte importante atunci când se doreste analiza unei anumite operaţii. În acest scenariu se poate opta pentru pornirea aplicaţiei în profiler fără însă a porni colectarea de date de profiling. Acest lucru face ca aplicaţia analizată să se “miște” mult mai bine (in modul tracing fiind semnificativ mai rapid decat ANTS). Avantajul acestui mod este şi mai evident atunci când pâna să se ajungă să se execute operaţia dorita au loc niste operaţii costisitoare ca timp de procesare (deschiderea unui fișier mare). Influența asupra memoriei folosite de catre procesul analizat este şi ea semnifica-
tiva putând să ajungă la până de 3 ori mai mare decat în varianta fără profiler atașat. Asta inseamnă că profiling-ul aplicaţiilor mari consumatoare de memorie se poate termina cu excepții de tip Out Of Memory. Amble profilere au influență asupra memoriei apropiata. O alta influență (nedocumentata) pe care profiler-ele o au asupra aplicaţiilor analizate este asupra timing-ului threadurilor şi anume, pot să scoată la iveala bug-uri de sincronizare de thread-uri (cum ar fi race conditions şi dead locks) care până atunci nu s-au manifestat.
4. Complexitatea aplicaţiilor analizate
Din experienta cu ambele profiler-e pot spune ca ANTS Performance Profiler 6.3 este mai limitat decât dotTrace Performance 4.5.1 în sensul că la anliza unor aplicaţii desktop foarte complexe (din punct de vedere a memoriei consumate şi utilizare CPU), interfata utilizator (în special partea de timeline) raspunde din ce în ce mai greu la interacțiunea utilizatorului. De asemnea, în cazul aplicaţiilor complexe, profiler-ul de la ANTS ajunge câteodată să nu mai afiseze corect controalele din interfața (afisand un X roșu mare). A trebuit să recurg la dotTrace pentru a face profiling pe o astfel de aplicaţie.
5. Alte Criterii
Profiling I/O şi SQL - doar la ANTS Performance Profiler 6.3. Funcţionalitatea este oferita doar pentru sisteme de operare mai noi decat Windows XP şi doar în varianta Professional Portabilitatea rezultatelor şi analiza ulterioara - ANTS oferă posibilitatea de a exporta un set intreg de rezultate de profiling în formatele html şi xml. Se poate de asemenea exporta reprezentarea grafică a arborelui unei metode - dacă se dorește transportarea rezultatelor în formatul binar pentru a putea fi deschise pe alte masini, probabil că acesta va fi mai usor pentru rezultatele obtinute cu dotTrace deoarece fiecare snapshot se salvează în fisier separat spre deosebire de
Tipul Operatiei analizate fara profiler atasat: 10s
ANTS Performance Profiler 6.3
dotTrace Performance 4.5.1
Sampling
10,1 sec
11,7 sec
Nivel de metoda
50 sec
1:13 min
Nivel de linie
4:20 min
14:38 min
Nivel de metoda (fara colectare de date)
N/A
36 sec
Nivel de linie (fara colectare de date)
N/A
7:08 min
Influența asupra aplicaţiei analizate în diferitele moduri de profiling ANTS unde întreaga sesiune de profiling se salvează într-un singur fisier. Desigur că cele două pot deveni echivalente în cazul în care avem un singur snapshot mare în cazul dotTrace ce corespunde intregii sesiuni de profiling. De obicei nu este cazul. Abilitatea de atasare la un proces - ANTS Performance Profiler 6.3 ofera optiunea atasarii la un proces ce rulează .NET Framework 4.0. dotTrace Performance 4.5.1 nu are din păcate opțiuni de atașare. Integrare cu Visual Studio - ambele profilere se integrează cu Visual Studio permitând lansarea sesiunii de profiling direct din IDE
6. Concluzie
ANTS Performance Profiler 6.3 - 17 puncte dotTrace Performance 4.5 - 16 puncte Ambele profiler-e vă vor ajuta cu suc-
ces să rezolvați problemele de performanţă din aplicaţiile dumneavoastra. Fiecare are puncte ei forte care nu se găsesc la cealaltă şi oferă funcţionalitatea de bază la nivele egale. În funcţie de specificul aplicaţiei de analizat va veti putea orienta către una sau către cealaltă. Sfatul meu este să le incercati pe amândouă pentru a va face o idee mai buna despre ce ofera fiecare şi care vi s-ar potrivi cel mai bine. Puteti descarcă versiunile trial pentru cele două profiler-e de la locațiile de mai jos: dotTrace Performance Profiler 4.5: http:// www.jetbrains.com/profiler/download/index.html ANTS Performance Profiler 6.3: http:// www.red-gate.com/products/dotnet-development/ants-performance-profiler/
ANTS Performance Profiler 6.3
dotTrace Performance 4.5.1
Profiling I/O si SQL
Da
Nu
Portabilitatea rezultatelor si analiza ulterioara
Da
Da*
Export html/xml al intregului rezultat
Da
Nu
Abilitatea de atasare la un proces
Da
Nu
Integrare cu Visual Studio
Da
Da*
Pret
595 EUR
569 EUR
www.todaysoftmag.ro | no. 1/2012
13
programare
Problema efectelor secundare
Ovidiu Deac este un consultant software independent specializat în metode de dezvoltare agile şi limbaje funcţionale. În timpul liber practică înotul, alpinismul şi motocrossul.
Cunoscută şi sub acronimul OOP, programarea obiectuală a fost introdusă în anii ‘60, cu apariţia limbajului Simula67. E paradigma folosită de majoritatea firmelor de software. Limbaje cum ar fi Java, C#, C++, Python, Ruby sunt în topul preferinţele iar stilul de lucru “orientat pe obiecte” este cel mai popular. OOP este o paradigma imperativă adică programul descrie felul în care se modifica starea sistemului pe parcursul rulării aplicaţiei. Sistemul este modelat prin clase de obiecte. Fiecare clasa descrie ce variabile de stare au obiectele de tipul respectiv, ce proprietăţi au şi ce acţiuni putem face asupra lor. Prin încapsulare ascundem detaliile de implementare şi astfel utilizatorul clasei este interesat exclusiv de interfaţa expusă de clasa respectivă. Putem modela astfel toate lucrurile din jurul nostru. Pare o abordare foarte naturală, dar totuşi sunt câteva probleme majore cu aceasta. Problemele pornesc de la faptul că, în afara metodelor constante, funcţiile membru produc efecte secundare pentru ca ele modifica starea obiectului pe care sunt apelate sau stările altor obiecte la care au acces. Majoritatea codului OOP este scris astfel. O funcţie ar trebui să returneze o valoare dar uneori aceasta produce efecte secundare care pot fi: modificarea unor structuri de date din afara funcţiei, interacţiune cu sistemul de operare/maşina virtuală (creare de fişiere, procese sau fire de execuţie), alocare sau dealocare de resurse, aruncarea excepţiilor etc. O funcţie care nu produce efecte secundare şi nu e influenţată de exterior se numeşte “funcţie pură” si rezultatul ei depinde exclusiv de parametrii de intrare. În cele ce urmează voi discuta despre problemele puse de funcţiile “impure” şi voi încerca sa arăt avantajele construirii aplicatiilor in principal pe funcţiilor pure.
Testarea
Variabilele globale mutabile folosite în cod sunt, în general, o sursa de probleme. Indiferent ca ele sunt simple variabile globale sau obiecte singleton, în esenţă reprezintă acelaşi lucru: date mutabile accesibile din mai multe locuri. Acest cod este foarte greu de testat şi de înţeles pentru ca valoarea unei variabile se poate schimba pe neaşteptate. Astfel pot apărea nenumărate căi de execuţie care nu sunt evidente şi pe care pentru a le putea înţelege trebuie sa parcurgem cod din afara funcţiei respective. Mai mult, putem spune că, în general, o funcţie care are efecte secundare este greu de testat deoarece comportamentul sistemului depinde de ordinea în care sunt produse efectele secundare deci pentru a testa funcţia trebuie sa o testăm în toate scenariile posibile în care ar putea fi apelată alături de celelalte funcţii care produc efecte secundare de tipul respectiv. Îmbunătăţirea testabilităţii sistemului se poate face folosind predominant funcţii pure. Acestea sunt de multe ori trivial de testat pentru că nu necesita un set-
14
no. 1/2012 | www.todaysoftmag.ro
up/teardown pentru că nu depind de componente externe. Rezultatul produs depinde exclusiv de parametrii de intrare.
Paralelismul
În momentul în care un obiect este accesat concurent din mai multe fire de execuţie avem nevoie de un mecanism de sincronizare. Ideal ar fi ca firele de execuţie să fie total independente, altfel sincronizarea va face ca sistemul sa nu fie folosit la capacitate maximă. Orice interacţiune între ele încetineşte sistemul. Alta problema este coerenţa cache-urilor în cazul în care procesoare diferite împart date mutabile. Mai mult, dacă avem un sistem distribuit problema e şi mai dificilă deoarece costurile de sincronizare sunt foarte mari. Un alt aspect este dificultatea de a scrie şi de a înţelege un cod care rulează pe mai multe fire de execuţie. Bugurile de sincronizare sunt poate cele mai dificile fiind sunt de multe ori surprinzătoare şi greu de reprodus. Ideal ar fi ca obiectele folosite din mai multe fire de execuţie sa fie imutabile iar datele transmise thread-ului prin mesaje asincrone. Astfel programatorul nu se loveşte de complexitatea lucrului cu primitivele de sincronizare ci lucrează la un nivel mai înalt şi mai uşor de înţeles. Paternul acesta este cunoscut sub numele de “thread pool pattern”. Fiecare worker-thread primeşte un mesaj care descrie jobul pe care îl are de făcut, şi returnează un rezultat pe care îl pune în alta coada. Este esenţial ca thread-ul sa nu modifice date din exterior ci sa producă un rezultat pe care să îl pună într-o coada de rezultate. Folosind o coada de mesaje standard a limbajului folosit, problemele noastre sunt rezolvate. Putem scrie relativ uşor o aplicaţie paralelă sau una distribuită, datorită în primul rând faptului ca workerul nostru nu produce efecte secundare. El produce doar un rezultat. Să mergem mai departe şi să presupunem ca worker-ul respectiv are acces în exterior doar la date imutabile. Asta înseamnă ca la pornire îşi poate face o copie a datelor respective nu va avea nevoie de sincronizare. Referitor la paralelismul ma-
siv faptul că nu trebuie sincronizate firele de executie constituie un avantaj important.
Execuţia asincronă
În multe situaţii avem nevoie să executăm o anumită secvenţă asincron. Apelul asincron va primi pe lângă parametrii normali şi o funcţie care va procesa rezultatele. Acest stil de lucru este destul de dificil în paradigma imperativă. Problema vine de la faptul ca în stilul imperativ e foarte importantă ordinea în care se execută operaţiile. Ordinea este importantă tocmai din cauza faptului ca funcţiile cu care se lucrează au efecte secundare iar ordinea în care sunt produse efectele secundare e importantă. În lipsa efectelor secundare problema se transforma în a stabili felul în care datele depind unele de altele. Nu ne interesează cât durează calculul şi nici ordinea în care se fac calculele respective atâta timp cât rezultatele sunt disponibile când e nevoie de ele. Astfel în cazul unui apel asincron obţinem un rezultat de tip “promisiune” (future) care va fi folosit probabil pentru calculul unui alt future etc.
Optimizarea
Teoria spune ca optimizarea ar trebui făcută după ce funcţionalitatea dorită e implementată dar unele optimizări sunt foarte dificil de făcut dacă codul scris se bazează pe efecte secundare. În urma măsurătorilor tragem concluzia că se justifică sa apelăm o funcţie f în paralel. Dacă implementarea funcţia f este pură schimbarea din execuţie secvenţială în execuţie paralelă este mult mai simple comparativ cu situatia cand f produce efecte secundare. De asemenea, funcţiile pure ne dau posibilitatea de schimba relativ uşor anumite calcule din sincron în asincron faze târzii ale dezvoltării aplicaţiei. Pe lângă paralelizare şi execuţie asincronă putem face uşor şi alte optimizări cum ar fi execuţie lazy sau memoizare.
Dacă încărcarea modulului produce efecte secundare aceasta optimizare poate fi dificil sau chiar imposibil de făcut. În concluzie pentru a face un anumit calcul lazy în fazele târzii ale scrierii aplicaţiei, mai exact în faza de optimizare, este esenţial ca acesta sa nu producă efecte secundare deci calculul respectiv să fie făcut de o funcţie pură. Memoizarea O alta optimizare frecvent întâlnită este “memoizarea”. Aceasta se aplică în cazuri în care o anumită funcţie e apelată de multe ori cu aceeaşi parametrii. Memoizarea se face prin stocarea rezultatelor calculate şi la apelul următor făcut cu aceeaşi parametrii în loc să refacem calculul returnăm rezultatul calculat anterior. Aceasta optimizare poate fi convenabilă în situaţiile în care apelurile se fac repetat cu un anumit set de parametrii iar căutarea rezultatului între rezultatele calculate anterior este considerabil mai rapidă decât calculul respectiv. Dacă funcţia care face calculul cu pricina are efecte secundare memoizarea nu se poate face. În schimb în cazul unei funcţii pure aceasta este aproape trivială.
Concluzie
Problema programării orientate obiect vine de la filozofia ei că obiectele îşi modifica starea în timp. Aplicaţiile sunt construite în mare parte pe funcţii care produc efecte secundare, întregul concept de efect secundar fiind tratat superficial în OOP şi în programarea imperativă în general. Dacă s-ar da atenţie mai mare efectelor secundare produse de funcţii codul rezultat ar fi mai simplu, mai robust, mai uşor de paralelizat şi de optimizat. În articolele următoare din serie vom discuta despre programarea funcţională care diferă de programarea imperativă tocmai prin felul în care abordează problema efectelor secundare.
Execuţia “lazy” În unele situaţii dorim să nu executăm un anumit calcul decât dacă este într-adevăr nevoie de acesta, de exemplu încărcarea unui modul să fie facută doar la nevoie (adică “evaluare lazy”).
www.todaysoftmag.ro | no. 1/2012
15
programare
The Good, the Bad and the Ugly
Ovidiu Deac este un consultant software independent specializat în metode de dezvoltare agile şi limbaje funcţionale. În timpul liber practică înotul, alpinismul şi motocrossul.
Această serie de articole se vrea o comparație între diverse limbaje de programare. În fiecare număr al revistei voi incerca să acopar un spectru cât mai larg și să arăt mici probleme rezolvate în limbaje diferite. Problemele alese vor fi relativ simple, scopul fiind sa ne concentrăm asupra posibilitaților diferitelor limbaje comparându-le intre ele. Chiar dacă sintaxa unui limbaj sau altul vă este nefamiliară, ideea este să intelegeți modul de abordare al problemei, specific fiecărui limbaj în parte. Astfel le putem pune în balanța plusurile și minusurile. În numărul acesta vom rezolva problema folosind Java, Python 3 și Haskell. Alegerea limbajelor a fost facută astfel încât să fie cat mai diferite. Primul dintre ele este Java, un limbaj imperativ orientat-obiect, static typed. Este poate cel mai folosit limbaj în momentul de față și, fără îndoială, un limbaj de referință. Al doilea limbaj pe care îl vom folosi astăzi este Python 3, care cu toate că este tot un limbaj imperativ, prin faptul că e dynamic-typed și prin tehnicile de programare funcțională pe care ni le pune la dispoziție, combinate cu cele orientate-obiect ne dă o perspectiva diferită. Al treilea pe listă, fără sa fie cel din urmă, este Haskell. Acesta e totul și cu totul diferit de celelalte două. În primul rând este un limbaj pur funcțional, efectele secundare produse de funcții fiind specificate în tipul acestora. Apoi este un limbaj static-typed dar cu type-inference. Aceasta înseamnă ca în majoritatea cazurilor declarațiile de tipuri pot lipsi.
Problema
Să se scrie un interpretor de comenzi minimal care să citească de la standard input comenzi și să afișeze rezultatul lor. Comenzile acceptate sunt ls și cat ls
• • • cat
• •
listează conținutul directorului afișează un mesaj de eroare dacă primește mai mult de un parametru dacă nu primește parametrii listează directorul curent - dacă nu primește nici un parametru afișează mesaj de eroare - dacă primește unul sau mai mulți parametrii afișează conținutul fișierelor primite astfel fișier1:... fișier2:...
Programul se va termina când utilizatorul apasă Ctrl+C sau când va închide fișierul de intrare (Ctrl+Z pe windows respectiv Ctrl+D pe Linux)
16
no. 1/2012 | www.todaysoftmag.ro
Java
Urmează implementarea problemei folosind Java. Codul are cca 3000 de caractere pe 110 linii. A fost rulat pe Ubuntu Linux 11.10, folosind openjdk 1.6.0 cu comanda $ javac Shell.java && java Shell
Fiind un limbaj foarte cunoscut, comentariile referitoare la sintaxă nu cred ca sunt necesare. Urmează codul sursa din care lipsește doar secțiunea import.
public class Shell { public static void main(final String[] args) { try { final BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String s; System.out.print(“>”); while ((s = in.readLine()) != null && s.length() != 0) { try { final String output = execute(s); System.out.println(output); } catch(Exception ex) { System.out.println(ex.getMessage()); }
}
System.out.print(“>”); } System.out.println(); } catch (IOException ex) { System.err.println(ex); }
private static Map<String, Command> CMD_MAP; static { final Map<String, Command> tmpMap = new HashMap<String, Command>(); tmpMap.put(“ls”, new Ls()); tmpMap.put(“cat”, new Cat()); CMD_MAP = Collections.unmodifiableMap(tmpMap); } private static String execute(final String cmd) { final String[] splitCmd = cmd.split(“ “); final String cmdName = splitCmd[0]; if (!CMD_MAP.containsKey(cmdName) ) { throw new RuntimeException(“Bad command: “ + cmdName); } else { final Command commandObject = CMD_MAP.get(cmdName); final String[] params = Arrays.copyOfRange(splitCmd, 1, splitCmd.length); return commandObject.execute(params); } }
}
Clasa următoare este necesară deoarece biblioteca standard nu are o funcție care să facă join la o lista de String. Funcții similare există în biblioteci third-party dar m-am limitat doar la biblioteca standard.
www.todaysoftmag.ro | no. 1/2012
17
programare
The Good, the Bad and the Ugly
class Util { public static String join(final Object[] items, final String sep) { final StringBuilder sb = new StringBuilder(); int index = 0; for (final Object item: items) { sb.append(item.toString()); if (++index < items.length) { sb.append(“\n”); } } return sb.toString(); } }
Mai jos urmează interfața Command și implementarea ei pentru ls respectiv cat. interface Command { public String execute(String[] params); } class Ls implements Command { @Override public String execute(final String[] params) { if (params.length > 1) { throw new RuntimeException(“Too many parameters”); } else if (params.length == 0) { return executeImpl(“.”); } else { return executeImpl(params[0]); } } private String executeImpl(String dir) { final String[] files = new File(dir).list(); return Util.join(files, “\n”); }
}
class Cat implements Command { @Override public String execute(final String[] params) { final List<String> list = new LinkedList<String>(); if (params.length == 0) { throw new RuntimeException(“No files to cat.”); } for (final String file: params) { list.add(catOneFile(file)); } }
return Util.join(list.toArray(), “\n”);
private String catOneFile(final String file) { try { final String contents = new Scanner( new File(file) ).useDelimiter(“\\Z”).next(); return file + “:\n” + contents; } catch (Exception ex) { return “Could not open file ‘” + file + “’”; } }
}
18
no. 1/2012 | www.todaysoftmag.ro
Python 3
Implementarea în Python a fost rulată cu CPython 3.2.2 și are cca 1250 de caractere pe 65 de linii. Am ales versiunea 3 a limbajului doar pentru a promova ultima versiune. Codul este în mare parte compatibil cu versiunea 2.7, singura diferență importantă fiind felul în care se face citirea din stdin în bucla “for line în stdin”. Urmează codul cu comentarii în zonele în care am considerat ca sunt expresii sintactice mai puțin clare. În primul rând, pentru că e un script executabil fișierul incepe cu #! ca orice script linux executabil. Astfel scriptul îl putem rula din linie de comandă în felul următor: $ ./shell.py
...iar interpretorul de comenzi va știi că la rularea scriputul trebuie să folosească python3 instalat pe mașina respectiva. #!/usr/bin/env python3
PROMPT = “>” Mai jos e funcția main care iterează peste liniile din stdin. Observați că funcția prompt este inner în cadrul main, deoarece este singurul loc în care e folosită. Pentru a evita coliziunile de nume, e bine să limităm scopul funcțiilor. def main(): from sys import stdout,stdin def prompt(): print (PROMPT, end=””) stdout.flush() print(“Ctrl+C to exit”) prompt() for cmd in stdin: try: print(execute(cmd)) except Exception as ex: print(ex) prompt() print()
Mai jos funcția split_cmd returnează un tuplu cu două valori care sunt despachetate de către apelator. În continuare se face o căutare în dicționarul CMD_MAP după numele comenzii. Dacă acesta e găsit în CMD_MAP se obține funcția care e apelată cu parametrii comenzii și se returnează valoarea rezultată. def execute(cmd): def split_cmd(): cmd_parts = cmd.split() return cmd_parts[0], cmd_parts[1:] command_name, params = split_cmd() if command_name in CMD_MAP: command_function = CMD_MAP[command_name] return command_function (*params) else: raise Exception(“Bad command: %s” % command_name)
Funcția ls primește *args ceea ce înseamnă că variabila args este un tuplu și va conține un număr variabil de elemente, care vor fi parametrii cu care a fost apelata funcția. def ls(*args): from os import listdir if not args: return ls(“.”) elif len(args) > 1: raise Exception(“Too many parameters”) else: dir_content = listdir(args[0]) return “\n”.join(dir_content)
Funcția join a clasei string, care e apelată mai sus, unește o listă de stringuri folosind un separator dat. Exemplu: “,”.join([“a”, “b”, “c”]) va returna “a,b,c” def cat(*path_list): if not path_list: raise Exception(“No files to cat.”) def cat_one_file(path): try: with open(path) as f: content = f.read() return “%s:\n%s” % (path, content) except: return “Could not open file ‘%s’” % path contents = [cat_one_file(path) for path in path_list] return “\n”.join(contents) CMD_MAP = {“ls”: ls, “cat”: cat}
Mai sus CMD_MAP este un dicționar în care cu cheia “ls” e asociata funcția ls iar cu cheia “cat” e asociată funcția cat. Se vede că funcțiile sunt folosite ca și niște variabile normale. În momentul în care sunt apelate se folosește sintaxa “nume_functie(param1, param2, param3)”. try: main() except KeyboardInterrupt: print() exit(1)
Codul de mai sus face apelul la funcția main și tratează Ctrl+C și returnează codul 1 dacă s-a ieșit cu Ctrl+C. Faptul că l-am pus în afara funcției main e doar o chestie de preferințe. Eu prefer sț lucrez așa pentru că funcția exit închide programul imediat și prefer să limitez folosirea lui exit în afara funcției main
Haskell
Codul Haskell a fost scris folosind “Glasgow Haskell Compilator” GHC 7.0.3 pe Ubuntu Linux. Acesta se poate instala foarte ușor folosind comanda $sudo apt-get install haskell-platform
...iar ca editor am folosit Geany care se instalează $sudo apt-get install geany
www.todaysoftmag.ro | no. 1/2012
19
programare
The Good, the Bad and the Ugly
Codul Haskell rezultat conține cca 1200 caractere împărțite pe 45 linii de cod. În continuare urmează codul, pe care îl voi explica unde voi considera că e nevoie. Pentru a genera un executabil compilatorul are nevoie de un modul Main care să conțină o funcție main: module Main where import import import import
System.IO Data.List Data.String.Utils System.Directory
Aceasta e funcția main, care are implicit tipul “IO () adica nu returnează nimic ci doar produce efecte secundare de tip IO”. După cum se vede funcția este o înșiruire de acţiuni, separate prin unul dintre operatorii >> sau >>=. Diferența intre cei doi operatori este că >>= ia rezultatul acțiunii anterioare și îl pasează acțiunii următoare ca și parametru de intrare, în stil “pipeline”. Deci mai jos spunem că funcția main se obține prin compunerea funcțiilor următoare, putStrLn, prompt, getLines, mapM_, putStrLn. Având în vedere că acestea sunt “actiuni”, deci produc efecte secundare, operatorii >> respectiv >>= le compun astfel încât să țină seama de ordinea de execuție. O funcție interesantă care apare în main este funcția getLines. Ea nu primește zero parametrii și returnează o listă de linii citite de la tastatură. E foarte important faptul ca, că majoritatea funcțiilor din haskell, sunt funcții “lazy”. Aceasta înseamnă că nu așteaptă să citeasca toate liniile din stdin ci fiecare linie citita e dată mai departe pentru procesare. Ar mai fi de comentat asupra funcției mapM_. Aceasta este o funcție din familia map și primește doi parametrii: o acțiune și o listă de obiecte. Acțiunea este executată pentru fiecare element din listă. Primul parametru al funcției mapM este funcția process iar al doilea este listă de linii returnată de getLines. main = putStrLn “Ctrl+C to exit” >> prompt >> getLines >>= mapM_ process >> putStrLn “”
Mai jos e declarată funcția process ca fiind o compunere de funcții. Sintaxa run.word.strip, exact ca și compunerea din matematică, înseamnă că funcția strip se apelează cu un parametru de intrare , funcția words se apelează cu rezultatul returnat de strip iar apoi funcția run se apelează cu rezultatul returnat de words. Funcția process nu are nici un tip declarat, dar fiind o functie compusă tipul se poate deduce ușor. Primește la intrare aceiași parametrii ca funcția strip și returnează ce returnează funcția run. În concluzie process primește un string și nu returnează nici o
20
no. 1/2012 | www.todaysoftmag.ro
valoare pentru ca run are tipul “IO ()”. În schimb știm că are un efect de tip IO. Deci semnătura funcției process este “process :: String -> IO ()”. În cod, pentru ca nu am considerat că e nevoie de semnatură pentru a înțelege funcția am ales să nu o declar și să las compilatorul să facă inferența de tipuri. process = run.words.strip
Funcția getLines se compune oarecum asemănător cu funcția main. Diferența este că de data aceasta avem funcția lines, care e o funcție pură, pe care o apelăm peste rezultatul unei acţiuni, funcția getLines. Funcția getContents, fiind o funcție cu efecte de tip IO se execută “în monada IO”. Rezultatul ei nu poate fi pasat funcției lines pentru că aceasta este în afara monadei IO, fiind o funcție pura. Pentru a putea face apelul compunem funcția lines cu funcția return, obtinând astfel o funcție în monada IO care poate primi rezultatul funcției getContents. getLines = getContents >>= (return.lines) prompt = putStr “>” >> hFlush stdout
După cum se vede pentru funcția run am considerat că semnatura ei ar face codul mai ușor lizibil așa că funcția e insoțită de declarația de tip. run :: [String] -> IO () run cmd = execute cmd >>= putStrLn >> prompt
Funcția joinLines, după cum se vede primește un parametru de tip listă de String și returnează un string. Totuși în declarația functiei nu apare nici un parametru. Motivul este faptul că funcția join primește doi parametrii. Primul dintre ei este separatorul și al doilea este lista de șiruri care sunt alăturate. Daca join este apelată partial cu un singur parametru obținem o funcție care așteaptă al doilea parametru și apoi face apelul efectiv la join. joinLines :: [String] -> String joinLines = join “\n”
Mai jos e definita funcția “execute” printr-o serie de ecuații care acoperă diverse condiții de apelare a funcției. Sintaxa aceasta se poate folosi ca alternativă la instructiunea if. Așadar, dacă parametrul apelat se potrivește cu unul dintre cele 3 pattern-uri se va executa ecuația corespunzătoare. După cum se vede, avem 3 cazuri: în care primul element din lista este “ls”, situația în care primul element este “cat” și restul. execute execute execute execute
:: [String] -> IO String (“ls”:params) = ls params (“cat”:params) = cat params _other = return “Bad command”
Funcția ls se definește la fel ca execuție, cu mai multe ecuaţiile. Cazul în care e apelată cu o lista goală, cazul în care e apelată cu o lista cu un singur element și cazul în care e apelată cu mai mult de un element. Pentru că ecuaţiile sunt încercate în ordine ecuaţia a treia este executată doar când celelalte doua nu s-au potrivit.
Ar mai fi de notat funcția catch care primeste doi parametrii: o functie de executat și un handler de excepții. Ea executa funcția și în caz ca s-a aruncat o eroare de tip IOError execută handlerul. În cazul nostru handlerul este o funcție anonimă, numita și “funcție lambda”. Sintaxa pentru definirea funcțiilor lambda este “\ param1, param2, ...,paramN -> cod”. Deoarece nu ne interesează ce excepție s-a prins parametrul de intrare este _ ls :: [String] -> IO String ls [] = ls [“.”] ls [dir] = catch (getDirectoryContents dir >>= return.joinLines.sort) (\_ -> return $ “Could not read ‘” ++ dir ++ “’.”) ls (dir:extraParams) = return “Too many parameters.”
În funcţia cat, fiind mai complexă avem nevoie sa definim nişte funcţii locale sau funcţii “inner”. Acestea sunt definite în clauza where. Blocul where este delimitat tot prin indentare. După cum se vede și funcţiile inner pot avea la rândul lor blocuri where. Funcţiile inner au acces la toate numele definite în namespace-ul funcţiei părinte. Astfel funcţia formatOutput are acces la parametrul path al funcţiei părinte catOneFile. De asemenea ar putea avea acces și la parametrul files al funcţiei bunic cat la nevoie. cat :: [String] -> IO String cat [] = return “No files to cat.” cat files = mapM catOneFile files >>= return.joinLines where catOneFile :: String -> IO String catOneFile path = catch (readFile path >>= return.formatOutput) (\_ -> return $ “Could not open file ‘” ++ path ++ “’.”) where formatOutput content = path ++ “:\n” ++ content
Încheiere
Aștept ca cititorii să trimită părerea lor pe email la ovidiu.deac@todaysoftmag.ro, să comenteze și să voteze pentru fiecare soluție cu unul dintre cele trei tipuri de voturi: good, bad, ugly.
www.todaysoftmag.ro | no. 1/2012
21
interviu
Interviu echipa românească finalistă Microsoft Imagine Cup
Marius Mornea Fost senior software developer in cadrul Nokia, în prezent fondatorul platformei Mintaka Research
22
no. 1/2012 | www.todaysoftmag.ro
Rubrica „Interviu” din primul număr al revistei ne-a dat ocazia să întâlnim şi să cunoaştem mai bine o echipă de tineri studenţi clujeni, campioni naţionali şi finalişti internaţionali în competiţia Microsoft Imagine Cup. Numele echipei este Simplex, membrii ei sunt Alina Călin, Andrei Cantea, Andrei Dascălu, Cosmin Mihaiu şi mentorul acestora Lect. Dr. Dan Suciu. Pe parcursul a două întâlniri, am discutat ce înseamnă această competiţie, cum au ajuns să participe, ce au realizat și cine i-a susţinut, au împărtăşit momente memorabile, întâlniri impresionante, modul în care au crescut personal şi profesional. Mai mult, am avut ocazia să vedem o demonstraţie a proiectului lor şi să le descoperim latura de dezvoltatori şi antreprenori, aflaţi la început de drum, hotărâţi să concretizeze iniţiativa lor într-un produs real pe piaţă. Acest articol îşi propune să prezinte succint competiţia şi experienţa Imagine Cup, urmând să insistăm mai mult pe detalii despre proiect, planurile de viitor şi evoluţia către mediul de business. Dacă doriţi să aflaţi mai multe, vă invităm să ii urmăriţi mai pe larg într-un interviu video la adresa: www.todaysoftmag.ro Imagine Cup este cea mai mare competiţie internaţională pentru studenţi, organizată de către Microsoft şi are scopul declarat: „Imagine a world where technology helps solve the toughest problems” (eng. „Imaginează-ţi o lume în care tehnologia ajută la rezolvarea celor mai grele probleme”). Aflată la a noua ediţie, impresionează prin dimensiune: 358.000 de studenţi participanţi din 183 de ţări/ regiuni, dintre care peste 400 de finalişti din 70 de ţări. România este o prezentă de tradiţie, iar anul acesta a ocupat locul cinci în lume, ca şi număr, cu peste 800 de participanţi, împărţiţi pe secţiuni: 120 participanţi (IT Challenge); 3 echipe (Digital Media); 4 echipe (Embedded Development); 3 echipe (Windows Phone 7); 3 echipe (Game Design). Nu doar numărul, ci şi performanţele de anii trecuţi: Software Design - echipa Sytech - aur în 2009; IT Challenge - Cosmin Ilie: bronz în 2007, argint în 2008 şi aur în 2009 - Valy Greavu - argint în 2006; Embedded Development - Echipa Aether - argint în 2007, au recomandat echipele din ţara noastră pentru ediţia 2011, iar acestea au confirmat cu bronz – echipa Endeavour_Design (Emmbedded Development), aur echipa M.N.A (Digital Media) şi un loc în primele 6 finaliste din runda finală a secţiunii principale a competiţiei, Software Design, pentru echipa Simplex. Prezenţa şi performanţele constante se datorează excelentei promovări făcută de Microsoft la nivel naţional prin programul academic, susţinerii din interiorul universităţilor prin implicarea mentorilor şi în primul rând nivelului, ridicat calitativ, impus de echipele participante. După cum declarau şi membrii echipei Simplex: “chiar a fost bine organizat concursul local [..] şi multe echipe erau încurajate să participe” (Andrei Cantea), “faza naţională a impus un standard destul de
ridicat” (Andrei Dascălu), “echipa de pe locul doi a fost poate mai bună decât alte echipe de la mondiale” (Andrei Cantea), iar feedback-ul constant din partea juriului şi mentorului, care prin sfaturile sale i-a ajutat “să nu luăm chiar toate deciziile greşite” (Cosmin Mihaiu), construiesc o atmosferă ce încurajează performanţa şi calitatea, ingrediente ce vor asigura cu siguranţă succese viitoare. Sunt succese ce merită tot efortul depus, ne asigură membrii echipei Simplex, care ne povestesc entuziasmaţi câteva din momentele memorabile ale experienței. Pornind de la aterizarea la New York şi cazarea la hotelul Mariot din Times Square (toate aspectele logistice fiind asigurate de către Microsoft), pană la întâlnirea cu Steve Balmer (CEO Microsoft), căruia cei patru au avut norocul să ii facă o demonstraţie personală a proiectului, interacţiunea cu alte nume mari din industrie (Jonathan Perera, fost GM Microsoft, actualmente VP Adobe), cina şi drumul cu limuzina în compania altor doi VP Microsoft, dar şi recompense materiale (câte un Windows Phone 7 şi o licenţă BizSpark menită să susţină startup-urile cu toate produsele Microsoft necesare), premiile de 25000$, 15000$ şi 5000$ pentru locurile 1, 2, 3. O experiență bogată în trăiri şi amintiri unice, ce i-a ajutat să crească foarte mult atât individual, cât şi ca echipă. Cu toate acestea, experienţa Imagine Cup nu se termină odată cu competiţia, din contră pare să fie abia primul pas. Să aruncăm în continuare o privire mai detaliată asupra aplicaţiei şi asupra paşilor următori: Ce este MIRA? „Medical Interactive Recovery Assistant” (eng. Asistent Medical de Interactiv de Recuperare) cu care vrem să ajutăm persoane care suferă de handicap locomotor temporar, persoane care de exemplu au avut un atac cerebral, sau o fractură a mâinii, a unui membru, să treacă prin perioada de recuperare, de redobândire a reflexelor şi a mişcărilor care într-o vreme erau foarte simple, mult mai uşor şi mai interactiv. Pentru asta am folosit un device (eng. dispozitiv) nou, la vremea respectivă, de la Microsoft, şi anume Kinect, cu care să îl implicăm
pe utilizator, practic un pacient, în jocuri simple, dar cu scop de recuperare.” Cosmin Mihaiu „MIRA de fapt este compusă din două părţi, partea destinată doctorului şi partea destinată pacienţilor care se recuperează. Doctorul, are următoarele beneficii prin această aplicaţie : managementul pacienţilor, managementul programărilor şi cea mai importantă parte sunt statisticile, prin care poate să vadă evoluţia pacienţilor. Când vine pacientul să se recupereze, doctorul îi porneşte o aplicaţie şi pacientul se joacă, dar în acelaşi timp face exerciţii de recuperare. Pacientul poate nici nu observă, dar se stochează fiecare mişcare şi asa doctorul poate să vadă evoluţia.” Andrei Dascălu Competiţia s-a terminat, dar voi ce planuri de viitor aveţi cu aplicaţia? Alternative ar fi ca şi plan de carieră: să începeţi pe cont propriu (să faceţi o firmă), să vă angajaţi la o firmă pe plan local, să mergeţi undeva afară, cu Imagine Cup pe CV aţi putea face şi asta.. cam ce alegeţi voi să faceţi? „La finala mondială s-a ridicat întrebarea asta, [..] ce facem? Era îndrumătorul nostru, domnul Dan Suciu cu noi, mai erau şi alte persoane, şi am ajuns la un moment dat să avem discuţia că: acuma ne putem angaja, să stăm doi ani într-o companie, vedem cam cum stau lucrurile, şi după aia dacă nu ne convine ne reîntâlnim, ne facem un business, noi pe cont propriu.. sau a doua variantă, să începem să facem un startup, să ne dezvoltăm produsul, să îl lansăm pe piaţă, să vedem ce se întâmplă. Majoritatea persoanelor au zis că <<sunteţi la vârsta la care vă puteţi permite să faceţi asta, adică acuma ii vremea să riscaţi, că nu aveţi nimic de pierdut>>” Cosmin Mihaiu „Am zis că încercăm, să vedem ce iese. Acum muncim ca să ajungem pană la prima versiune, să intrăm în faza de testare clinică, să vedem ce impact are aplicaţia asupra pacienţilor, să vedem dacă întradevăr din statistici reiese o evoluţie în recuperarea lor şi dacă ne iese continuăm, dacă nu urmăm un alt drum. [..] Bineînţeles suntem motivaţi şi acuma, mai ales că de vreo două săptămâni am şi testat aplicaţia pentru vreo
două zile, la un spital din Bucureşti, şi chiar am fost motivaţi să vedem multi copii jucându-se şi fiind fericiţi” Andrei Dascălu Pomeneaţi de teste clinice, voi aveţi nevoie de o validare din partea medicilor ca să dovediţi că merge procesul. Ce feedback aveţi pană acuma? „Feedback pozitiv, [..] toţi doctorii sau kinetoterapeuții ne-au dat feedback pozitiv şi ne-au spus că suntem pe drumul cel bun. [..] toţi au fost plăcut surprinşi şi neau dat feedback ce ar avea nevoie, ce să mai facem în plus. Microsoft România nu ne-a uitat după faza naţională şi ne susţine, şi prin intermediul lor am ajuns la centrul de recuperare din Bucureşti. Avem norocul că şi acolo este un doctor, Adrian Oprea, care este foarte entuziasmat de soluţia noastră şi ne ajută. Vrea să ajungem departe cu ea şi cu el tot vorbim şi colaborăm, iar pentru că avem o persoană care ne ajută nu vrem să trecem la mai multe spitale, pentru că s-ar putea să primim prea mult feedback şi să nu facem nimic.” Cosmin Mihaiu „Si să nu uităm că spitalul chiar a primit din partea Microsoft România un laptop şi un Kinect, şi am instalat programul nostru, pe dispozitivul respectiv, urmând ca ei să înceapă recuperarea.” Andrei Dascălu În ideea în care ştiu că alţi câştigători au avut ocazia să prezinte: preşedintelui, parlamentului european, etc, mă întrebam dacă similar aţi fost la conferinţe de presă sau alte asemenea ocazii? „Imediat după ce ne-am întors de la Imagine Cup am fost contactaţi de presa din România, am apărut şi la ProTV şi la TVR, dar la începutul lui decembrie Microsoft România a organizat o conferinţă: „Competiţia în IT”, la care au venit şi persoane din politică, angajate la guvern, şi s-a vorbit foarte mult despre competiţia IT în România, iar noi am fost o aplicaţie practică, o demonstraţie a faptului că încă există idei software care pleacă din România, nu vin din străinătate” Cosmin Mihaiu.
Pe când v-aţi planificat să aveţi un re-
www.todaysoftmag.ro | no. 1/2012
23
programare
Interviu echipa românească finalistă Microsoft Imagine Cup
lease (eng. lansare pe piaţă)? „Când simţim că am ajuns la un produs care poate fi întradevăr pus în spitale pentru recuperare [..] noi susținem că în toamnă să putem intra pe piaţă.” Cosmin Mihaiu
iţi prezinţi ideea în faţa unor persoane care ştiu ce înseamnă business, atât din punct de vedere IT, cât şi din punct de vedere al unui startup. Deci pe toate planurile ajungi să lucrezi.” Cosmin Mihaiu
Sună bine şi experienţa, sună bine şi dezvoltarea ulterioară, se pare că v-aţi găsit o preocupare pentru următorii ani, cel puţin [..] aveţi sfaturi pentru studenţii care vin din urmă, către următoarele generaţii? „Merită! Da! Definitiv! Noi anul trecut pe vremea asta ştiam că vrem să participăm, nu neapărat să ajungem să avem un produs în care să credem 100% că va ajuta o mulţime de oameni, ci vroiam să ajungem la New York.” Cosmin Mihaiu „Să avem ceva în istoria noastră de studenţi, să nu creadă că am trecut prin facultate şi nu am făcut nimic. Am zis că încercăm.” Andrei Dascălu „Exact! Și în timp ce dezvolţi aplicaţia, şi cu Caregamer a fost asa, şi cu MIRA a fost așa, în timp ce o dezvolţi să ajungi să crezi în ea.. să crezi că aplicaţia ta poate avea un impact.[..] După aia scopul s-a schimbat şi să ajungem să ne punem produsul pe piaţă.” Cosmin Mihaiu
Care ar fi cele mai importante trei lucruri la care trebuie să fie atenţi sau să şi le pregătească cel mai bine? „Locul trei pun timpul, trebuie gestionat cumva să iţi impui toate lucrurile şi să treci prin toate la timpul lor. Trebuie să creadă în soluţie, dacă unul din membrii nu crede în soluţie, atunci toată echipa poate să cadă, pentru că toţi trebuie să lucreze ca o echipa. E ca la o maşină cu patru roți, dacă o roata nu există.. degeaba.” Cosmin Mihaiu „Prezentarea are cea mai mare influență asupra juriului, 80% din notă este prezentarea.” Andrei Dascălu „Ii ciudat pentru că ii tehnic produsul, într-un fel poate ii nedrept, dar juriul nu ii tot timpul tehnic şi dacă vii cu detalii despre algoritmi nu prea ii surprinzi bine, trebuie să vi cu prezentarea făcută bine.” Andrei Cantea
Și în afară de faptul că merită, putem să ii ajutăm cu ceva sfaturi, care abilităţi le-aţi dezvoltat între timp sau le-aţi folosit cel mai mult în competiţie? „În competiţia Imagine Cup ei pot să înveţe ce înseamnă echipa, ce înseamnă competiţia, ce înseamnă prezentarea, pot să descopere fel de fel de medii de dezvoltare pe care pot să le folosească în viitor, în carieră, şi de asemenea prin toată competiţia înveţi să crezi în ideile tale şi te motivează ca să ţi le pui în practică.” Andrei Dascălu „Imagine Cup prin definiţie e un concurs care iţi dezvoltă toate abilităţile, lucrul în echipă, trebuie să ştii să faci o prezentare, trebuie să ştii cum să lucrezi, să iţi organizezi timpul, pentru că cu siguranţă cel mai mare inamic al concursului e timpul. Niciodată nu reuşeşti să dezvolţi aplicaţia așa cum vrei şi să iţi ajungă şi timpul, şi atunci trebuie să începi să iţi gestionezi priorităţile astfel încât să te încadrezi în timpul necesar pentru fiecare deadline. [..] Ajungi efectiv să te gândeşti şi din punct de vedere business, pentru că la urma urmei tu trebuie să
24
no. 1/2012 | www.todaysoftmag.ro
Ce v-a unit ca o echipă? „Faptul că suntem toţi diverşi. Fiecare are ceva din domeniul lui la care ii bun şi cred că, de fapt nu cred.. ştiu că nici una din deciziile majore ale proiectului nu a fost luată fără să se discute cu ceilalţi. Am lucrat şi vom lucra în continuare ca o echipă, pentru că până acum asta ne-a adus succesul şi nu are rost să renunţăm la ea.” Cosmin Mihaiu Până la urmă asta e Imagine Cup, se formează echipe care pot să rămână şi în viitor să dezvolte şi alte aplicaţii de succes. Sperăm!” Andrei Dascălu „Credinţa!” Andrei Cantea In concluzie Imagine Cup este ocazia perfectă de a face cunoştinţă cu lumea de business, de a construi o echipă şi de a învăţa cum să duci la capăt un proiect în care crezi şi pe care ai ocazia să îl prezinţi în faţa unor nume mari din industrie. Mai mult, ulterior interviului, am aflat de pe blogul competiţiei, că Microsoft lansează programul Imagine Cup Grants, care cu un buget de 3 milioane de dolari, pe următorii 3 ani de zile, îşi propune să susţină finan-
ciar startup-uri din rândul proiectelor finaliste. Patru echipe au primit deja finanţare şi au avut ocazia să îşi prezinte proiectele într-o întâlnire cu Bill Gates şi Brad Smith. De aceea recomandăm tuturor studenţilor să profite de această ocazie, Imagine Cup dovedindu-se în egală măsură o experiență minunată, dar şi o rampă de lansare în carieră şi mediul de afaceri.
www.todaysoftmag.ro | no. 1/2012
25
startups
StartUps Mintaka Research
Marius Mornea Fost senior software developer in cadrul Nokia, în prezent fondatorul platformei Mintaka Research
26
no. 1/2012 | www.todaysoftmag.ro
Mintaka Research este, pe scurt, o platformă colaborativă online de cercetare şi dezvoltare interdisciplinară, având scopul declarat de a reuni cercetarea, mediul de afaceri şi educaţia într-un efort comun şi de a oferii servicii menite sa faciliteze cooperarea, construirea de relaţii şi comunicarea între competenţe din medii şi domenii diferite. Scopul principal este de a construi o comunitate de cercetare şi un set de unelte care permit inovarea în diferite domenii, dar şi posibilitatea de a împărtăşi cunoştinţele acumulate cu mediul academic şi cel de afaceri, asigurând în acest fel atât continuitate, cât şi noi oportunităţi de a introduce inovaţiile din cercetare în viata de zi cu zi. Filozofia centrala este promovarea efortului colaborativ, în locul celui individual, ajutat de un set de unelte şi servicii care permit abordarea unor proiecte tot mai grele şi crearea de plus valoare. Pentru a înţelege mai bine conceptul începem cu ideile de la care a pornit totul şi contextul în care au luat naştere acestea. Prima idee a plecat de la o nevoie deseori întâlnită în mediul de afaceri IT: nevoia de specialişti. Aceştia sunt o resursă care ridică o serie de dificultăţi manageriale: în primul rând costul financiar ridicat şi durata extinsa necesară recrutării sau pregătirii lor (în cazul în care piaţa muncii nu oferă resurse în domeniul de interes); în al doilea rând nivelul de utilizare fluctuant (în general specialiştii sunt necesari în faza de concepţie şi arhitectură, precum şi în soluţii de optimizare şi performantă), perioadele de angajament maxim alternând cu perioade lipsite de activitate. Ca urmare a acestor dificultăţi predomină două abordări: angajarea/pregătirea unui specialist şi folosirea lui pe durate scurte la capacitate maximă, în rest fiind alocat pe activităţi de rutină; sau asumarea rolului de specialist de către un membru al echipei, ceea ce duce de cele mai multe ori la creşterea duratei necesare şi o scădere a nivelului calitativ. O a treia soluţie, mai puţin prezentă pe piaţa locală, este antrenarea specialiştilor în servicii de consultantă, lucru ce duce la soluţionarea dificultăţilor de mai sus atât din perspectiva angajatorului cât şi al specialistului. Fără a intra într-o dezbatere, presupunem că lipsa serviciilor de consultantă se datorează atât nivelului de maturitate relativ scăzut al pieţei, cât şi caracterului predominat executoriu al unui mediu IT dominat de outsourcing. Rezultatul este o lipsă de specialişti pe piaţa muncii, fie datorită blocării lor în poziţii fixe, lipsite de vizibilitate, fie exodului acestora ca urmare a cererii locale fluctuante comparativ cu alte pieţe. În acest context a luat naştere prima idee şi anume crearea unei structuri care să permită atât localizarea cât şi mobilitatea specialiştilor pe piaţa locală. Evoluţia ideii spre soluţii practice de atingere a celor două obiective ne-a condus la: crearea unei comunităţi de specialişti, pentru a reuşi localizarea acestora şi la crearea unui cadru ce sa permită mobilitatea şi stabilizarea la un nivel constant al angajamentului.
În cazul primei soluţii, există semne pozitive în mediul local prin existenţa şi apariţia de noi iniţiative similare cum ar fi: TJUG (Transylvania Java User Group), GTUG Cluj-Napoca (Google Technologies User Group), RTC (Romanian Testing Community), AgileWorks Romania, Semantic Web meetup group, Today Software Magazine etc. Merită menţionate şi iniţiative exterioare mediului ITC, cum ar fi cele două organizaţii TEDx înfiinţate pe plan local. Toate aceste organizaţii confirmă nevoia şi deschiderea mediului local spre comunităţi ce să permită colaborarea şi împărtăşirea cunoştinţelor de nivel înalt, specializate. A doua soluţie se dovedeşte un pic mai dificilă din cauza lipsei unei cereri constante de competente de nivel înalt. Aceste fluctuaţii au ca efect atât absenţa unui venit constant cât şi dificultăţi în menţinerea nivelului ridicat de pregătire al specialistului. Cu alte cuvinte trebuie găsită o modalitate de ocupare a timpilor morţi dintre proiecte. Propunerea noastră este implicarea în cercetare, iar pentru argumentarea ei prezentăm mai jos contextul şi formularea celei de a doua idei. Cercetarea în ultimul deceniu în România a cunoscut evoluţii spectaculoase, de la încercări de revigorare o dată cu aderarea la strategiile europene de cercetare de la Barcelona 2002, urmate de formalizarea unor abordări unitare la Lisabona 2005, cu efecte pozitive pe plan local în perioada 2007-2008, până la reduceri drastice în perioada de criză şi modificări birocratice ce fac greu accesibile o mare parte din fonduri. Drept urmare a perioadei de aliniere europeană a luat naştere în România o generaţie de cercetători cu rezultate reale, nivel ridicat de specializare şi contracte internaţionale. Cu toate acestea exista o dependentă mult prea mare intre cercetare şi educaţie, implicit intre cercetare şi mediul politic. Cercetarea privată este la un nivel scăzut, cu câteva excepţii producţia de IP (Proprietate Intelectuala) fiind redusă, statisticile europene arătând o evoluţie a investiţiilor în cercetare în anul 2008 în funcţie de provenienţă: business 45.4%→23.3%, guvern 47.6%→70.1%, străine 5.5%→4.0%. Rezultatul este blocarea
unei întregi generaţii de specialişti într-un mediu care prin natura hibridă, cercetare/ educaţie, împiedică concentrarea asupra cercetării, de cele mai multe ori calitatea ambelor activităţi fiind afectată, dar şi printro birocraţie excesivă scade mobilitatea specialiştilor legându-i de mediul academic şi instituţiile statului. Cu toate acestea există şi iniţiative private precum: Coneural, RIST (Romanian Institute of Technology), Ad Astra, etc; ce încearcă să ofere o alternativă privată şi să creeze un mediu de cercetare lipsit de birocraţie, politică şi separat de procesul educational, pentru a permite focalizarea exclusiv pe cercetare şi atingerea potenţialului maxim. În acest context ia naştere a doua idee şi anume crearea unui centru de cercetare privat care să ofere un mediu propice cercetării şi să se constituie ca o alternativă instituţiilor statului, permiţând în acelaşi timp atât cercetătorilor din mediul academic, cât şi specialiştilor din mediul privat să colaboreze pe diferite proiecte ocupând timpii morţi generaţi de fluctuaţia cererii pe piaţă. Rolul centrului este atragerea de proiecte şi investiţii, atât din mediul de afaceri, cât şi finanţare europeană sau guvernamentală, permiţând colaborarea orientată spre proiect şi favorizând astfel mobilitatea şi evitând blocarea resurselor în poziţii fixe. Ultima idee este legată de educaţie şi rolul ei în asigurarea continuităţii. În condiţiile în care primele două concepte se ocupă de identificarea şi implicarea specialiştilor existenţi, se pune problema în ce măsură competenţele existente pe piaţă acoperă cererea, atât ca spectru cât şi volum. Prin urmare este necesară o implicare activă în procesul de educaţie prin împărtăşirea experientei acumulate şi prin eforturi active de a îmbogăţi mediul academic cu activităţi extracurriculare sau chiar găsirea unor modalităţi de mapare a programei de învăţământ pe nevoile din mediul de afaceri. Aceasta ramură oferă posibilitatea specialiştilor de a colabora cu mediul academic pentru a creste nivelul calitativ al materialului didactic şi implicit interesul şi performanţele studenţilor. La un nivel mult mai practic iniţiative similare există implementate cu succes, de exemplu institutul Hagenberg din Austria sau compania Neu-
soft, au făcut un pas mai departe înfiinţând instituţii de învăţământ superior al căror rol este de a produce specialişti direct mapaţi pe nevoile de cercetare şi business cerute de către cele două organizaţii. Cele trei idei de mai sus reunite alcătuiesc contextul în care a luat naştere, iar după rafinări succesive, a ajuns în forma actuală conceptul de platformă colaborativă de cercetare şi dezvoltare interdisciplinară. În continuare vom arunca o privire asupra ofertei de servicii, organizarea şi rolul lor în cadrul platformei.
Platforma
În practică, pentru a putea susţine comunitatea şi a răspunde nevoilor unui grup ţintă heterogen, atât din punct de vedere al mediului de provenienţă, cât chiar şi geografic, oferim o platformă online care va conţine un set de unelte şi servicii împărţite în patru mari categorii: comunitate, canale de comunicare, depozit de cunoştinţe şi scientometrie. Conţinutul este divizat în două: accesibil tuturor sau restricţionat pe bază de utilizator. În continuare prezentăm cele patru mari categorii. Comunitatea Această componentă de business se ocupă cu toate serviciile şi tipurile de interacţiune necesare comunităţii. Blocul de bază este colecţia de competente: o bază de date în care sunt centralizate toate competentele accesibile prin intermediul platformei. Baza de date se va construi prin agregarea informaţiei din profilurile tuturor colaboratorilor, plecând de la specialişti individuali, pană la echipe sau organizaţii. Competentele sunt clasificate pe baza mai multor criterii: cercetare (domeniu, tehnologie, fundamentală, aplicată), dezvoltare (domeniu, tehnologie, capacitate), comunicare (canale, audienţă), business (finanţe, HR, management), etc. Modelul de business: fiecare utilizator poate accesa colecţia de competenţe şi folosind o unealtă poate constitui o echipă de competenţe menită să colaboreze pentru îndeplinirea unui obiectiv comun. Dacă comunitatea are disponibile resursele pentru a atinge obiectivul, utilizatorul poate finaliza www.todaysoftmag.ro | no. 1/2012
27
startups
echipa prin definirea detaliată a obiectivului şi publicarea acestuia sub forma unui proiect în cadrul comunităţii. Toţi ceilalţi utilizatori, care au în profil competentele necesare proiectului, vor fi notificaţi de către sistem, având opţiunea să îşi arate interesul. Când toate poziţiile sunt ocupate, iniţiatorul proiectului şi colaboratorii înscrişi, vor semna un document de colaborare prin care stabilesc termenii şi condiţiile. Odată finalizat acordul, fiecare membru implicat va putea să vadă datele de contact ale celorlalţi membrii ai echipei şi proiectul poate fi demarat. Acest model de colaborare generic, orientat pe competenţe, permite o mare varietate de interacţiuni şi maximizarea implicării tuturor resurselor pentru a atinge toate căile descrise în diagrama Venn. Canalele de comunicare Aceasta componentă de business este compusă dintr-un set de unelte ce facilitează comunicarea. Spre deosebire de competentele de comunicare din cadrul comunităţii, ce deservesc individual proiecte, setul de instrumente din această secţiune este disponibil tuturor utilizatorilor, atât individual cât şi echipelor care colaborează pe proiecte, şi au ca scop principal creşterea vizibilităţii, promovarea diferitelor iniţiative, rezultate sau realizări şi permit comunicarea deschisă între toţi membrii comunităţii. Având în vedere că aceste servicii sunt oferite de platformă, nu de comunitate, ele vor fi disponibile gratis în interiorul comunităţii, dar promovarea externă şi canalele naţionale sau internaţionale (guvern, asociaţii şi organizaţii internaţionale) vor fi disponibile contra unui preţ fix sau doar utilizatorilor cu pachete contra cost. Cele mai importante canale, cu rol strategic, menite sa ofere avantaje competitive sunt: guvernamentale (METCS#, ANCS#, UEFISCDI#), centre internaţionale (Hagenberg), asociaţii internaţionale (ACM, IEEE, RSA).Cele mai importante canale, cu rol strategic, menite să ofere avantaje competitive sunt: guvernamentale (METCS1, ANCS2, UEFISCDI3), centre internaţionale (Hagenberg), asociaţii internaţionale (ACM, IEEE, RSA). Depozitul de cunoştinţe
28
no. 1/2012 | www.todaysoftmag.ro
StartUp Mintaka Research
Îndeplineşte rolul de stocare şi acces la cunoştinţe disponibile atât comunităţii, cât şi clienţilor externi. Conţinutul poate proveni atât din comunitate, cât şi acumulat intern de platformă, dar în ambele cazuri are ca şi trăsătură comună faptul că se află în proprietatea intelectuală a Mintaka Research, fiind organizat în categoriile: articole, prototipuri, procese, metodologii, patente, pachete de training etc. Accesul va fi împărţit pe nivele, plecând de la conţinut liber accesibil, chiar open source, pană la conţinut cu acces plătit sau accesibil doar intern. Exemple de conţinut pus la dispoziţie: un glosar de metodologii de cercetare şi o colecţie de tehnici şi procese de management al tehnologiilor. Acestea se constituie în două dintre punctele forte, cu rol strategic, în care organizaţia îşi propune sa investească. Cu toate că depozitul de cunoştinţe nu este un scop în sine, el fiind rezultatul unui proces cumulativ continuu, o dată ce va depăşi o masă critică se va declanşa un alt proces de capitalizare format din două componente principale: prima cu rol de consultanţă şi transfer de cunoştinţe, iar a doua cu rol de a cauta noi aplicaţii şi noi posibilităţi de dezvoltare şi parteneriate în industrie. Cele două componente se vor uni într-un efort comun de a reinvesti cunoştinţele acumulate înapoi în mediul de afaceri. Scientometrie Aceasta componentă este responsabilă cu măsurarea şi analiza tuturor iniţiativelor ştiinţifice. De la simple operaţii de revizuire ale articolelor, pană la măsurări şi compararea rezultatelor cu standardele din industrie, analiza impactului, metrici şi bibliometrie. Serviciile se împart şi în acest caz în funcţie de provenienţă (comunitate, platforma, servicii externe), nivel de prestigiu (intern, universităţi locale, evaluare naţională sau internaţională), rezultând într-o plajă adaptată de preturi. Exista două abordări principale: în primul rând o ofertă substanţială de servicii gratuite, cu rol în promovarea şi asigurarea unui nivel înalt de calitate în cadrul comunităţii, atât individual cât şi colectiv; iar în al doilea rând o oferta de servicii de nivel înalt, ce asigură metrici şi evaluări obiective celor mai
exigente proiecte, disponibile contra cost iniţiativelor de dimensiuni mari. Pentru implementarea acestor servicii vom căuta parteneriate cu CENAPOSS# şi organizaţia non-profit Ad Astra, ambele desfăşurând eforturi în domeniu.
Echipa de cercetare
În afară de efortul construirii comunităţii şi al platformei cu oferta de servicii, intenţionăm să constituim şi o echipa de cercetare al cărei principal obiect de interes va fi: Autonomic Computing (software autonom). Acest lucru ne va permite să devenim un membru al comunităţii, contribuind la creşterea, testarea serviciilor şi în acelaşi timp asigurând o sursă de venit necesară susţinerii şi creşterii platformei. Pe lângă cercetarea în sine, această ramură a organizaţiei aderă la filozofia generală de promovare şi stabilire de noi standarde înalte în comunitatea locală de cercetare şi îndeplineşte acest obiectiv prin crearea unui mediu independent de cercetare. Credem că cercetarea ar trebui sa aibă ocazia de a se desfăşura complet independent de instituţiile de învăţământ superior, câştigând astfel focus şi libertate, scăpând de birocraţia excesivă a sistemului de stat. De asemenea creează un ecosistem competitiv în care succesul se bazează pe calitatea cercetării şi capacitatea de a atrage finanţare, eliminând dependenţa fată de bugetul, politicile şi politica guvernamentală. În concluzie dorim să construim o platformă ce oferă: - posibilitatea creării de echipe de competente dintr-o gamă variată de discipline, din diferite domenii, - facilitând accesul la canale de comunicare cu instituţii guvernamentale, programe europene şi parteneri din mediul de afaceri pentru a accesa finanţare, - asigurând suport continuu pe toată durata de viată a proiectului în oricare din domeniile: Managementul Tehnologiilor, Metodologii de Cercetare, Proprietate Intelectuala; - dar şi ajutor practic în: revizuirea şi evaluarea rezultatelor, alocarea de resurse din comunitate în caz de urgentă, etc;
- în final intermediind contactul cu asociaţii internaţionale precum: IEEE, ACM, RSA pentru a face vizibile rezultatele şi a le împărtăşii cu restul lumii. În încheiere am dori să ne depărtăm de aspectele practice ale implementării iniţiativei şi să prezentăm câteva din motivaţiile uşor filozofice. În primul rând am dori să schimbăm mentalitatea generală conform căreia cercetătorii, sau chiar şi specialiştii sunt percepuţi ca şi indivizi retraşi în laboratoare obscure, manevrând instrumente şi formule complicate. Istoria arată că majoritatea oamenilor de ştiinţă de calibru colaborau, interacţionau şi dezbăteau activ cu cei din jurul lor şi erau de cele mai multe ori figuri publice. Până şi Albert Einstein, prezentat de multe ori ca o apariţie surprinzătoare din anonimat pe scena ştiinţifică, revoluţionând fizica
din senin, a format împreună cu un grup restrâns de prieteni (printre care Maurice Solovine, un tânăr student român şi Conrad Habicht, un matematician elveţian) Olympia Academy, o adunare informală care se întâlnea regulat şi discuta ultimele descoperiri ştiinţifice, lucrări proprii sau chiar filozofie şi literatură. Asta avea loc cu doi ani înainte de anul denumit „anul miraculos” marcat de publicarea celor mai vestite lucrări ale lui. Cu alte cuvinte inovaţia şi descoperirile provin în aceeaşi măsură din muncă solitară, dar şi din colaborarea şi schimbul de idei şi rezultate. În momentul de faţă există o breşă în comunicarea între mediul de cercetare, educaţie şi mediul de afaceri, iar iniţiativa noastră îşi propune să o adreseze prin promovarea efortului colaborativ intre specialiştii din diferite domenii şi medii, colaborare ce poate aduce creştere individuală pentru fiecare parte
implicată, dar şi noi tipuri de interacţiuni şi oportunităţi de creştere comună. Vrem să construim o comunitate activă de specialişti şi să promovăm: parteneriate cu mediul de afaceri local pentru a aplica ultimele tehnologii în efortul de a îmbunătăţii viata de zi cu zi; parteneriate cu sistemul educational pentru a creste calitatea procesului de învăţământ, a îmbogăţii programa şi a creste interesul şi motivarea studenţilor, asigurând în acest fel continuitatea comunităţii; parteneriate intre specialiştii din domenii diferite pentru a crea noi oportunităţi şi plus valoare, prin combinarea şi complementarea competentelor. Credem că există deschiderea şi dorinţa pentru a realiza cele de mai sus şi suntem încrezători că vom găsi parteneri şi colaboratori cu care să construim comunitatea şi cu care să împărţim acelaşi set de valori.
www.todaysoftmag.ro | no. 1/2012
29
management
De la o idee la un produs Avem cu toții idei inovative despre cum să facem lumea din jurul nostru mai bună si bineînțeles cum am putea avea niste beneficii de pe urma lor. Din păcate exista un drum lung de la ideea initiala si până la lansarea unui produs sau serviciu pe piață. În seria de articole pe care o încep acum, vom trece peste acest proces și va fi prezentat modul în care putem fi eficienți. Target-ul principal vor fi companiile mici care vor sa lanseze un produs sau chiar persoanele individuale care vor sa pornească o afacere. Nu vom acoperi toate etapele si aprobarile care au loc intr-o companie multinațională, scopul nostru fiind de a fi simplifica procesul și de a-l adapta nevoilor practice. Începem seria noastră cu un exemplu luat din actualitate: rețelele sociale.
Ideea iniţială
Ovidiu Măţan, PMP În prezent coordonează echipa Gemini Solutions Cluj, a fost timp de 3 ani Product Manager Nokia pentru serviciul de synchronizare al Ovi.com, fondator Today Software Magazine.
30
no. 1/2012 | www.todaysoftmag.ro
Crearea unei reţele sociale in care oamenii din vecinătatea noastră iși publică serviciile, evenimente sau pot să vândă diverse lucruri. In felul acesta, fiecare va putea să îşi cunoască mai bine vecinii, sa participe si sa fie informaţi de evenimentele din cadrul comunităţii. De asemenea vor avea o legatură mai bună cu autoritățiile locale. Sumar Enumerăm mai jos ansamblul de procese ce va fi aplicat, cu comentariul că uneori unele dintre procese se întrepătrund. Viziunea companiei - Viziunea de dezvoltare a companiei, in fucție de aceasta este definită și strategia firmei. Business case - Documentul de justificare a investiției. Aprobarea acestuia este obligatorie înainte de a trece la pașii următori. Market requirements (MRD) - Contine elementele de marketing ce vor susține produsul. Va include planul pentru reclame, materiale promoționale si strategia de distribuție a produsului pe diferite canale. Use cases - Definirea modului in care produsul va interacționa cu utilizatorii și a pașilor de funcționare Features matrix - Matricea capabilităților produsului. Este foarte utila pentru compararea acestuia cu diferite alte produse existente si pentru poziționarea sa. Product roadmap - Planul de dezvoltare a produsului pe termen scurt (1 an) si lung (5 ani). In funcție de modificările pieței, a preferințelor utilizatorilor sau alte constrângeri interne/externe, acesta va suferi modificări pentru a reflecta noua stare a lucrurilor. Servește ca și imagine de ansamblu asupra posibilei evoluții a produsului în intervalul următor. Product requirements (PRD) - Bazat pe Marketing Requirements(MRD) și considerând use case-urile definite, setează requirements-urile produsului, stabilește
framework-ul în care acesta va funcționa, asteptările in ceea ce provește performanța, scalalbilitatea si securitatea acestuia. Reprezintă specificațiile pe baza cărora echipa de dezvoltare va implementa produsul. Poziționarea produsului - Poziționarea produsului pe piață relativ la oferta existentă considerând features matrix. Pricing model - Definirea prețului produsului in funcție de poziționarea acestuia Launch plan - Planul de lansare a produsului pe piață Dezvoltarea de noi produse - Modul în care planificăm lansarea urmatoarelor produse, benificiind acum de piata produsului deja lansat, de skill-urile și competențele existente.
Viziunea
Crearea de produse si servicii noi au sens atâta timp cât se știe unde se vrea să se ajungă. Strategia de dezvoltare a unui produs are sens daca urmarește viziunea companiei iar acestă viziune trebuie sa țină cont de evoluția tehnologiei și a pieței. Ca să va dau un exemplu, până la momentul lansării iPhoneului, Nokia era lider-ul telefoanelor mobile si a smartphone-urilor. Viziunea lor nu includea interactiunea tactila cu ecranul telefonului, aceasta era făcută doar cu ajutorul unui pen. Lansarea iPhone-ului la începutul lui 2007 si marele său success au schimbat piața. Problema pentru Nokia a fost viteza de reacție care a durat câțiva ani, suficient de mult astfel încât sa devină necompetitivi pe piața de smartphone-uri. Pentru revenirea pe piață sacrificiile făcute au fost uriașe și aici mă refer la renunțarea dezvoltarii sistemului de operare Symbian si trecerea la Windows Mobile. O greșeală frecventă este confuzia intre viziune si strategie. Strategia se definește în funcție de viziunea companiei. În continuare vom trece prin principalele strategii de definire a viziunii: 1. Viziunea 20/20- Termenul vine de la testul de măsurare a acuității vizuale (http:// www.allaboutvision.com/eye-test/) bazat pe șablonul creat de doctorul Hermann Snellen în 1860 și reprezintă citirea acestuia de la 20 picioare //6 metrii. Pentru o companie IT,
această viziune înseamnă ca sunt foarte clari pașii ce trebuiesc parcurși pentru a ajunge de la starea actuală la cea dorită având o foarte bună înțelegere a evoluției tehnologice si a oportunităților de pe piață 2. Viziunea periferica - Compania este mai mult interesată de trend-urile din jurul ei, de noile oportunități, mai mult decât alte companii. În anii 1970-1980, Wang Laboratories, produceau calculatoare desktop pentru procesarea testului iar lipsa viziunii periferice i-a adus falimentul in anii 90 din cauza că a ignorat trend-ul PC creat de IBM. 3. Clarviziune - Capabilitatea de a vedea oportunități viitoare care nu sunt văzute de către concureți. Exemplificăm prin produsele Apple iPhone/iPod sau viziunea lui Bill Gates de a crea software pentru PC-uri. Pentru crearea unor produse de succes, este necesar ca viziunea companiei să aiba focus, să fie clară, să fie completă și să poate fi implementată. Sunt 3 întrebări la care trebuie răspuns: 1. Unde vrem sa mergem? 2. Cum vom ajunge acolo? 3. De ce vom avea succes? Revenind la exemplul nostru, definim viziunea astfel: Recunoastem evoluția rețelelor sociale iar prin produsele noastre vom crea un ecosistem de comunicare pentru comunitățile locale. Vom folosi cunoștințele noastre actuale pentru a crea produse accesibile tuturor. Rețelele sociale vor avea un nou înțeles, integrand viața reală în cea virtuală.
Business Case
Acest document reprezintă baza proiectului nostru, definește noului produs și va fi folosit ca și referință pentru urmatoarele documente. In practică vom avea un document și o prezentare pentru etapa de aprobare a proiectului. Conform PMBOK, business caseul este documentul ce contine informația necesară pentru a se putea lua o decizie legată de investiția în acest proiect. În mod normal, există în cadrul său o analiză cost beneficii pentru justificarea proiectul. În final, totul se reduce la analiza potențialului profit, ținând cont de riscurile implicate în implementarea,
vânazarea și mentenanța produsului. Business case-ul este creat ca urmare a uneia sau mai multe din următoarele cerințe: - cererea pieței - nevoi organizaționale - cererea unui client - avans tehnologic - cereri legale - impact ecologic - nevoi sociale Business case-ul este revizuit periodic pentru a verifica ca proiectul continuă să urmărească scopul inițial, de asemenea se va urmări faptul ca produsul sau serviciul final este încă necesar. Este greșit să spunem că odată terminat, business case-ul este pus pe un raft. Un alt document care poate fi creat înainte de începerea unui proiect este Statement of Work (SOW), acesta descrie produsele și serviciile ce vor fi livrate. În cazul în care implementarea se va face de către o altă companie, documentul servește ca și bază legală pentru serviciile ce vor fi livrate. În practică, contractul și SOW-ul sunt documentele principale, pe baza cărora se agreează începerea lucrului la un proiect. Revenind la business case, pentru scrierea acestuia este recomandată folosirea unui template și/sau dacă este disponibil, folosirea ca și exemplu al unui business case de la un alt proiect aprobat din cadrul companiei. Un foarte bun exemplu îl puteți gasi aici http://www.blackblot.com/files/pmtk/ Blackblot_PMTK_Evaluation_40/PMTK/ PMTK_Product_Marketing/Business_Case/ PMTK_Business_Case_40.pdf Simplificând structura pattern-ului este recomandabil să se pună accept pe următoarele aspecte:
•
• •
Sumar executiv - va conține data începeri proiectului, prinicipalii stakeholderi ce vor beneficia de pe urma proiectului, costurile totale și costurile pe termen scurt (6 luni), data de finalizare a proiectului Descrierea proiectului și încadrarea acestuia în cadrul larg al tehnologiei și a pieței existente Scopul - definirea clară a scopului
www.todaysoftmag.ro | no. 1/2012
31
management
• • • • • • • •
32
proiectului prin evidențierea a 3 dintre cele mai importante aspecte Obiectivele pe termen scurt si lung Return of investment (ROI) - beneficiile interne/externe a implementării proiectului Modul de implementarea proiectului incluzând resursele ce vor fi folosite pentru aceasta Costul implementării (vezi exemplul) Durata estimată a proiectului Analiza de risc Pașii următori care vor urma aprobării proiectului Materialul de backup va conține toate detaliile proiectului care nu au fost prezentate în documentul principal, dar care pot fi referite pentru un nivel mai mare de detalii. Aici pot fi incluse de exemplu, detalii legate de costurile proiectului, pentru a justifica un anu-
no. 1/2012 | www.todaysoftmag.ro
De la o idee la un produs
mit furnizor de servicii, modul de lucru, detalii referitoare la milestone-urile proiectului, modalitățile de comunicare în cadrul proiectului, modul de publicare a status-ului proiectului etc. Multe din punctele de mai sus, pot face subiectul unui nou articol, iar în timp vom încerca să acoperi subiecte cum ar fi Estimarea corectă a duratei unui proiect, analiza riscului, analiza de pieța, modalități de lucru în cadrul proiectului și stabilirea scopului pe termen lung și scurt. În următorul număr vom analiza un exemplu de business case pentru cazul nostru. Vă încurajez să scrieți un business case pentru exemplul nostru iar în articolul următor vor fi analizate. Adresa de email pe care le puteți trimite este ovidiu.matan@todaysoftmag.ro
HR
Compensarea creativă
Ioana Fane HR Specialist Ullink Cluj Napoca
Conceptul de bază al managementului compensării este destul de simplu: angajații îndeplinesc sarcini pentru angajator, iar companiile plătesc salariile angajaţilor pentru obiectivele realizate. În consecinţă, compensarea este un schimb sau o tranzacţie, de care ambele părţi - angajator şi angajat - beneficiaza: ambele părţi primesc ceva pentru a oferi ceva. Cu toate acestea, beneficiile, implică mult mai mult decât această tranzacţie simplă. Din punctul de vedere al angajatorului, compensarea este o problemă atât de accesibilitate cat si de motivare a angajaţilor. Efectul perioadei de criză a inceput sa fie simțit in anul 2009, când majoritatea companiilor de IT au făcut trecerea de la acordarea unui salariu fix mai atractiv, la a-și îndrepta atenția asupra dezvoltării și creării unor pachete de compensații și beneficii cât mai atractive pentru exterior dar și cu menirea de a menține actualii angajați motivați. Aceste pachete - care sunt de multe ori AS - ul din mâneca oricarui specialist de resurse umane, trebuie gândite si adaptate pe nevoile personale ale angajatului și apoi implementate, in funcție de bugetul acordat din partea managementului companiei. Pachetul de compensații si beneficii este acel subiect transparent și cu o mai mare vizibilitate in cadrul ofertei de angajare și asta nu doar datorită înclinației spre un beneficiu non - financiar, dar și datorită unei prognoze de stagnare a economiei si implicit a salariilor. Din perspectiva companiilor este mai la indemână și mai ieftin sa iși păstreze angajații in interiorul companiei și să încerce sa își adapteze politicile de motivare la nevoile acestora, decât sa angajeze și să instruiasca alți noi angajați. In stabilirea politicilor de beneficii și de motivare a angajaților companiile iau in calcul mai multe repere:
• • • • • •
Pachetele de beneficii oferite de companiile similare angajaților lor; Cuantumul valoric al beneficiilor oferite pe piață; Numarul total al angajaților; Ponderea pe nivelurile ierarhice; Facilitățile fiscale de care beneficiază; Media de vârstă in cadrul companiei.
Există mai multe moduri de a măsura succesul unui antreprenor: prin numărul de idei noi lansate, veniturile şi profiturile obţinute, precum şi modul în care el sau ea serveşte o industrie sau o comunitate. Dar poate că cel mai important dintre acestea este impactul pe care antreprenorul este în măsură să il exercite asupra vieţii angajaţilor. Dincolo de recompense tangibile, cum ar fi plata și cele intangibile cum ar fi consilierea, un manager poate creiona profund viaţa unui angajat, prin
www.todaysoftmag.ro | no. 1/2012
33
HR
furnizarea unui pachet generos de beneficii. Într-adevăr, mulţi antreprenori recunosc că efectul pe care îl au asupra vieţii angajaților este unul dintre aspectele, cele mai pline de satisfacţii. De asemenea, are potenţialul de ne ţine treji noaptea. Asta pentru că, în scopul de a oferi beneficii generoase, trebuie să fie practicată in primul rand o planificare financiară riguroasă. Cele mai multe pachete de beneficii nu sunt ieftine şi costurile pot creşte exponenţial atunci cand compania se extinde. În plus, odată ce compania ofera un beneficiu, este ciudat să-l anuleze odata ce economia se află in scădere. Altfel spus, în cazul în care o companie in IT&C devine cunoscută pentru oferirea de prestaţii bune, în general, este mai uşor să recruteze angajaţi talentaţi şi va putea vedea chiar şi unele efecte secundare pozitive cu privire la marketing și vanzari. Cum sa negociați dvs. cel mai bun pachet de compensare? Toate aspectele legate de fiecare ofertă de locuri de muncă sunt negociabile. Negocierea salariului şi al altor beneficii este o abilitate vitală pe care toţi profesioniştii IT de succes trebuie să o posede. Cheia pentru negocieri de succes este că trebuie sa ințelegeti care sunt priorităţile, nevoile şi apoi să poată fi legată și de nevoile angajatorului. Domeniul IT&C aduce cu sine o discrepanță intre cererea enormă pe piața de specialitate și calitatea & cantitatea oferită de sistemul de invățământ din România. Drept urmare salariile sunt mult peste nivelul altor industrii de pe piata românească iar pachetele devin indrăznețe și încearcă să alunge orice urmă de insatisfacție din partea unui angajat, sa îi creeze un mod de viață modern și relaxant. Firmele mici oferă un pachet salarial mai generos decat cele de dimensiuni mari sau multinaționale. Lipsa notorietații brand-ului și lipsa unor sisteme riguroase in elaborarea pachetului de salarii si beneficii, le ofera posibilitatea sa fie mult mai flexibile și mai atractive pentru piata de recrutare. Pe de alta parte, pachetul de beneficii in companiile de IT sunt cele mai creative și mai generoase. Deși pachetele salariale și de ben-
34
no. 1/2012 | www.todaysoftmag.ro
Compensarea Creativă
eficii sunt din ce in ce mai complexe, performanțele angajaților și rezultatele muncii potențialilor candidați sunt în scădere. Se întâmplă asa datorită fluctuației de personal crescute, care determină scăderea performanțelor individuale și organizaționale și posibilitatea angajaților de a se specializa. Este cunoscut faptul că timpul minim in care un angajat ajunge sa performeze la maximum este de 1 an. Mulți dintre specialistii din industrie devin deja atenți la noi oferte și locuri de muncă, imediat după această perioadă. Unele companii se situează sub media pieței ca nivel salarial și angajează persoane tinere, care acceptă un salariu scăzut față de nivelului pieței, dar au siguranța faptului că trainingurile oferite din partea angajaților seniori sau certificările suportate de companie, le vor da posibilitatea de a se lansa în carieră și vor putea deveni în curând acel candidat pe care toate companiile îl doresc. De asemenea poziționarea deasupra mediei salariale a pieței, va determina îndreptarea HR-ului către candidați cu experiență, care au rezultate promițătoare încă de la începutul angajării. Intrebarea rămâne cum s-ar putea minimiza disproporția intre compensațiile angajaților vechi in cadrul companiei, care s-au dezvoltat mai lent și angajații nou veniți, care in mod firesc au salariul la nivelul actual al pieței. Este bine stiut faptul că, in momentul negocierii și evaluării salariilor, managerii nu iau in considerare nivelul pieței la nivel local sau national ci doar nivelul salariilor din interiorul firmei. O analiză sumară a costurilor arată însă că fluctuația de personal aduce cu sine costuri de trei ori mai mari: costul recrutarii, cel al pierderii din productivitate și cel al specializării si trainingului noului angajat. Trebuie sa recunoastem că beneficiile acordate de către companii in vederea motivării propriilor angajați reprezintă pe de altă parte, instrumente de management al personalului care sunt și în interesul angajatorului. Iată cateva exemple de beneficii acordate de companii in domeniul IT&C din Romania, angajaților:
1. tichetele de masă - instrumente de motivare, in altă formă decat bănească, ce sunt scutite de taxe; 2. prima de vacanță - care poate varia între jumătate de salariu și un salariu întreg; 3. prima de sărbători (sărbătorile Pascale si Crăciun) - care poate varia intre 0,25% și 100% din nivelul salarial net; 4. al 13 - lea salariu - acordat inaintea sărbătorilor de Revelion; 5. prima de ajutor - acodate tuturor angajaților la nașterea unui copil sau, in cazuri nefericite, la decesul unei rude de gradul I; 6. asigurări servicii medicale pentru angajați - cuantumul acestor asigurari poate varia si in funcție de pozitia ierarhica a angajatului respectiv; 7. asigurare medicală pentru membri familiei; 8. asigurari servicii stomatologice - și in acest caz cuantumul poate varia in functie de poziția ierarhică a angajatului respectiv; 9. asigurare de pensie facultativă; 10. asigurare de viață; 11. abonamente la centre de sport și relaxare 12. telefon și cartelă telefonică - acestea sunt considerate beneficii in măsura in care limită alocată depăseste cuantumul necesar realizarii sarcinilor de serviciu - altfel este doar un instrument de lucru 13. programul flexibil de lucru - oferit de obicei angajațiilor aflati in pozitii manageriale evaluate mai degrabă pe baza rezultatelor, nu conform timpului petrecut efectiv la birou; Pachetele de compensații și beneficii depind de structura afacerii, recrutarea angajaţilor, de retenţie, motivaţie, performanţă, feedback și satisfactia la locul de munca. Compensarea este de obicei printre primele lucruri pe care potenţialii angajaţi il iau în considerare atunci când caută un nou loc de muncă. In final, pentru angajaţi, pachetul de compensatii și beneficii este oglindirea nu numai a modului in care sunt remunerati cât și a modului in care sunt acestia evaluați de către angajator.
1
CALL FOR SPEAKERS Romania Testing Community is offering 2 slots, 30 minutes each, for domestic speakers to share their experience to the Testing Community. The event will take place on March 7th, 2012 at Hotel Opera Plaza, in Cluj Napoca.
2
VOTE THE BEST PRESENTATION Send your proposal at CONTACT@ROMANIATESTING.RO containing the Topic, the subject and a short description of what you want to present. All submissions will be available for voting on Romanian Testing Community site. Deadline for submitting your presentation is February 22nd, 2012. The voting starts on February 23rd and ends on the 1st of March
3
THE MOMENT OF TRUTH First two, most voted topics will have the opportunity to step-up and hold the presentation in front of everyone.
management
5 diferenţe dintre un şef şi un lider Am întâlnit până acum, în diverse circumstanţe şi organizaţii, manageri operaţionali şi manageri de proiect, însă doar unii într-adevăr emanau în jurul lor o aromă relaţională specială, atrăgătoare, motivantă, care făcea de dorit prezenţa lor. Aş vrea să prezint câteva din lucrurile intrate în reflexul unul lider şi care lipsesc de obicei sau sunt total opus abordate de către un manager poziţional (are funcţia de manager prin delegare oficială).
1. Liderul se prezintă ca parte din echipă
Aristotel Dascăl, PMP Motivational speaker. Spiritual explorer.
Sunt câteva expresii pe care sigur le-ai auzit, şi care direct sau subtil transmit o separare între manager şi subordonat, o treaptă pe care unii vor să o sublinieze ca semn al autorităţii lor într-o organizaţie. În general aceste expresii trag o linie între manager şi echipă, managerul fiind văzut ca cel ce are cerinţele iar echipa constituită din cei ce execută cu stricteţe. Expresii de genul: “Tu trebuie să îţi vezi de treaba ta”, “Deocamdată eu sunt la conducere aşă că faci cum îţi spun eu”, dar şi altele, exemplifică această ruptură între manager şi echipă. Liderul prezintă un proiect ca o muncă comună, în care fiecare îşi are rolul său, şi încurajează sugestiile şi exprimarea opiniilor faţă de munca oricăruia din echipă, inclusiv a sa. Liderul se supune aceluiaşi tratament ca toţi ceilalţi. Inclusiv aprecierea şi mulţumirea exprimată de manageri uneori întăreşte această ruptură, făcând echipa să simtă că a prestat servicii managerului, în loc să prezinte reuşita ca fiind în egală masură datorată muncii comune a managerului cât şi a celorlalţi. De aceea în loc de un “mulţumesc pentru cât de bine v-aţi făcut treaba” un lider spune “mă bucur că am reuşit împreună să ne atingem scopul”. Simţi diferenţa?
2. Liderul ascultă autentic
Ţi s-a întâmplat să simţi doar ca şi o formalitate evaluarea personală sau întâlnirile regulate de dezvoltare profesională cu managerul? Un lider ascultă atent şi îşi notează dorinţele tale, viziunea ta, pune întrebări cerând clarificări şi împreună cu tine face un plan de dezvoltare. Tot el, în mod proactiv, din dorinţa de a-şi dezvolta echipa, te intreabă regulat de progresul angajamentului luat de tine, şi îţi oferă timpul şi resursele de care dispune să te ajute. Un simplu manager dă din cap când tu povesteşti, aşteptând doar pauza când să îţi spună părerea lui. La orice abordare a problemelor pe care o vede greşită la tine te corectează spunând: “Dar nu trebuie să privesti aşa…”, ” dar tu eşti de vină…”, “dar tu trebuie să îţi dai interesul, să fii proactiv”. Deşi sunt sugestii bune în sine, aceasta este o abordare reactivă, care te inhibă, te face să te simţi acuzat mai degrabă decât încurajat. Liderul spune “dă-mi nişte exemple ca să înţeleg mai bine” şi “hai să facem împreună un plan”, managerul spune “fă o listă cu ce crezi că trebuie schimbat la tine şi hai apoi la mine”. Liderul este em-
36
no. 1/2012 | www.todaysoftmag.ro
patic, luându-te de la nivelul la care eşti, aşa cum eşti. Managerului îi place să se audă pe sine şi să arunce soluţiile ca pe nişte pastile.
3. Liderul oferă înainte să ceară
Un manager poate să ceară în mod oficial executarea unor activităţi, fără a avea nicio relaţie cu echipa. Însă un lider ştie că persoanele pe care le conduce au nevoie de o motivaţie, iar conform lui Maslow, în partea superioară a piramidei ierarhiei nevoilor personale se află imaginea de sine, şi chiar în vârf edificarea personală. Cu alte cuvinte liderul este văzut în mod constant interesat de înţelegerea şi satisfacerea nevoilor individuale, oferă sprijin şi ascultă autentic înainte de a cere dedicare şi executare din partea echipei.
4. Liderul nu e ameninţat de succesul celorlalţi
Liderul are o imagine de sine şi stimă de sine realistă şi solidă. Nu se identifică prin poziţia sa, ci prin abilităţile sale şi prin cât de eficient le practică. De aceea nu evită să facă o “munca de jos”, de executant când
asta ar creşte eficienţa proiectului la un moment dat. Ba chiar o consideră cheia în influenţa sa ca lider: a veni alături de echipă în munca de zi cu zi, şi a creşte abilităţile de conducere în cei din echipă care doresc asta ( sau care au abilităţi dar nu sunt poate conştienţi de ele). Liderul încurajează creşterea vizibilităţii tale în organizaţie, nu se pune ca şi graniţă între tine şi potenţialul tău succes. Managerii sunt des speriaţi că dezvoltându-te le vei “fura” locul, dar liderul ştie că particularităţile lui îşi vor găsi mereu locul potrivit, şi se implică proactiv în dezvoltarea ta de dragul creşterii organizaţiei.
5. Liderul este urmat de bunăvoie
Cea mai evidentă modalitate prin care poţi recunoaşte un lider este că echipa sa îl urmează de bunăvoie. Îl citează, îi confirmă ideile şi principiile în discuţii chiar şi când acesta nu este prezent. Un simplu manager menţine o atmosferă încordată, rece, în care ceilalţi vorbesc doar forţaţi, şi în particular vorbesc cel mai des denigrator despre manager. Bineînţeles că urmezi cu entuziasm o viziune pe care ţi-ai însuşit-o,
care te împlineşte şi în procesul căreia şi tu te dezvolţi. Însă doar un lider poate insufla asta echipei sale. Sunt 3 cărţi pe care le-aş sugera dacă consideri că ai nevoie să te dezvolţi ca şi lider. Personal le recomand a fi studiate în aceasta ordine: Eficienta in 7 trepte, de Stephen Covey (Învaţă să te raportezi corect la tine şi la cei din jurul tău, însuţindu-ţi principii sănătoase şi prioritizând activitaţi zilnice). Cum să devii o persoană cu influenta, de Jim Dornan & John Maxwell (Prima şi cea mai relevantă calitate a unui lider este influenţa. Înţelege-o şi începe să o practici înainte de a conduce pe alţii). Dezvoltă liderul din tine, de John Maxwell (Primii paşi în dezvoltarea unui caracter de lider însoţit de multe exemple practice). Este o imprimare unică în caracterul tău, în abilităţile tale. Găseşte-o şi exploreaz-o. După cum zicea Zig Ziglar: “Eşti singura persoană de pe pământ care poate folosi abilităţile tale”.
www.todaysoftmag.ro | no. 1/2012
37
filozofie
10 vs. 1700 Presto - Allegro ma non troppo
Aurel Popârţac Programator,deținător de micro afacere în IT
38
no. 1/2012 | www.todaysoftmag.ro
Muncind pe meleaguri îndepărtate patriei, peste o mare şi 5 ţări, aşa am început să meditez la chestiunea în cauză – vă rog staţi în tihnă! Obiectul muncii era, într-un mod destul de direct, răspândirea suitei de servicii online folosite cu drag comatic de către fraţii în suferinţă pe planetă. Mă refer la Google, Facebook, Twitter, Youtube, Picasa, Skype, şi prea multe altele. Chestiunea în cauză, aşadar, e capabilitatea omului de a sta în continuu, în primul rând din punct de vedere emoţional, sub cascada frenetică de informaţie. Umăr la umăr cu o ceată de “tehnicieni” aleşi pe sprânceană la început , am făcut pe dracu-n patru şi am “inovat” câtuşi de puţin - una din cerinţele de bază. Am inovat în sensul că după multă gândire şi planificare nu foarte asiduă am dezvoltat un pertinent, spun eu, sistem de operare pentru telefoane deştepte. Clasic, soft-ul a fost instalat pe dispositive cu touchscreen şi aruncat pe piaţă. Capodopera era şi este dotată desigur cu un agregat de aplicaţii de comunicat cu şi informat pe ceilalţi. Ca să nu rămână lauda dezbracată, povestea lungă şi să înaintăm spre un sens, în ce a constat de fapt noutatea? Pe langă construcţia de aplicaţii specifice pentru fiecare din furnizorii de servicii pomeniţi mai sus, am integrat linia simplă proprie unui asemenea sistem – Telefon, Mesagerie, Galerie foto/video - cu serviciile oferite de furnizori. În funcţie de foloasele puse la dispozitie de aceştia, şi conturile create pe dispozitiv, stăpânul utilizator are la dispoziţie diverse şi diferite opţiuni. De exemplu după crearea unor conturi Facebook, Youtube şi Skype, aplicaţiile care ajută la impărtaşirea informaţiei – ştiri, poze, video – oferă direct posibilitatea de upload pe Facebook sau Youtube, mesageria lucrează selectiv cu SMS, MMS, Skype şi Facebook, iar telefonul în aceeaşi manieră ofera servicii GSM şi Skype Call. Detaliile menţionate nu importă într-atât de mult. Per ansamblu, “comunicarea” devine mai facilă; totul se întamplă mai rapid. Am făcut încă un pas spre “mai bine”; împuşcă, omoară, mănâncă funcţionează în continuare la parametri îmbunătăţiţi. The Show Must Go On! În adâncul sufletului nu sunt un individ prea tehnic, aşa că o să descind subit înspre latura boemă a lucrurilor. Eram la o cabană, parţial din cauza trecerii dintre ani, şi mi s-a spus fără ocolişuri şi politeţuri de prisos că nu fac parte din generaţia “Smart”. Nu fac, deoarece nu folosesc un telefon deştept care să-mi permită să subscriu trend-ului informaţional. Pe de-o parte hora convenabilă de “prieteni” blocaţi cu nasu-n plasa colorată. Pe de-o altă parte, întocmirea fişei detaliate a existenţei personale, folosind desigur diferitele condici online puse cu grijă la dispoziţia cetăţeanului de către fratele mai mare.
Nu m-am supărat prea tare, deşi am fost catalogat ca înapoiat şi nu prea priceput “la internet şi din astea”. Am trecut uşor peste necaz doar ca să mă găsesc într-un altul în timpul porţiei săptămânale de otravă prin birturile oraşului. Amicul de lângă şi concubina dumnealui m-au ceartat de data asta pentru neparticiparea la o petrecere. Vina, să mă înţelegeţi, era în totalitate la mine-n gospodărie – nu făceam parte din grupul căruia i s-a expediat invitaţia, ba chiar mai rău, nu aveam nici cont. Argumentarea deşi solidă – “Pe Facebook găseşti gagici şi poţi să afli tot ce se întâmplă la tine în oraş, chefuri publice/private, şi să ştii că de exemplu fetele care au venit, şi-au format o părere despre fiecare din baieţii de la party aşa… Şi când au venit ştiau deja cu cine vor să fie!” s.a.m.d. – prin tonul ei m-a făcut să mă simt puţin rătăcit prin peisaj. Am început mintal să concretizez, mai serios, cu liniuţă, de ce nu agreez aste forme de interacţionat cu realitatea. Am continuat aşadar meditaţia. Mititel fiind, mă bucuram tare mult de pârâiaşul ce curgea pe uliţa de la ţară, de capătul de la deal al grădinii şi de lipsa concretului relativ la lucrările de dincolo munţilor la care nu prea era cu putinţă să ajung. Sentimentul era împărtăşit cu un grup restrâns de alţi feciori şi fecioare care purtau cu vrednicie titulatura de prieteni; să fi fost vreo 10.
În contrast cu tabloul de mai sus, anul trecut, caldă toamnă, după sărbătorirea fastuoasă, dar intimă, a zilei de naştere a unui amic din timpurile prezente, primesc o altă informaţie. Respectivul îmi relatează existenta a 1700 de “prieteni” online. Grimasa lui m-a scos din tăcere, iar replica mea de fiu de contabil a fost: “Omule, ai atâţia prieteni câţi au fost ieri la ziua ta si atâţia amici câţi ţi-or ura la mulţi ani daca iţi ştergi data de naştere de pe profil”. În fine, lăcomia face parte din natura umană, iar ciolanul nu trebuie să fie neapărat de porc. Nu am “autorizaţie de generalizare” şi nici nu ştiu de unde aş putea obţine aşa ceva, dar îmi permit sa fac unele mărunte observaţii. Pe prietenii mei, număraţi pe degete, ca pe o mică guerilla amicală de spartani, îi consider veritabili. În fapt aceşti puţini oameni mă ajută să trec cu bine peste multele zile apatice şi transele urbane la care până la urmă, recunosc, mă supun eu însumi. Totuşi, şi în aceste condiţii ajung cu greu să petrec cu fiecare dintre ei timpul necesar pentru schimbul in tihnă, darămite dacă m-aş mândri cu o mie, două… Cu toţii părem să ne grăbim undeva, dar nu ştim unde. Dorim ceva, dar nu ştim ce. Citim foarte multe dar nu reţinem nimic. Acelaşi nimic ne marchează plimbarea de la o instituţie la alta. Experienţele sunt lipsite de sacru, iar până si frigul sau
căldura de afară nu mai creează nici o stare, decât probabil un disconfort pasager. Suntem obosiţi de artificial şi asta pe mulţi ne face să ne simţim prost. Nu cred ca e sfârşitul lumii – sau cine ştie?! – aşadar până la urmă nu e o atât de mare dramă. Nici nu intenţionez să o lungesc cu apologetica comunicării ca necesitate umană vs. inversul sintagmei, dar din ce am înţeles până acum despre fenomen, e oricum greu de trăit in sihăstrie. Cu sau fără calculatoare, şi o nebuloasă de servicii de nerămas singur, într-un mod sau altul, cred că o să ne descurcăm până la urmă. Totuşi, relativ la contactul interuman, cumva spontaneitatea, verbalitatea în cele mai multe dintre cazuri şi bineînţes limbajul trupului sunt sarea şi piperul. Parcă de cele mai multe ori tastatura devine un scaun cu rotile pentru o societate de paralizaţi emoţional, iar telefoanele deştepte ne ajută sa ne purtăm perfuzia după noi. E un fel de spital de nebuni, iar personal simt nevoia să-mi aerisesc creierii. Decât să muncesc mai repede să pot să mă distrez mai repede, să mă odihnesc mai repede, şi tot aşa să şi trec apa intr-o zi, mai bine cu puţină iarbă, flori, copaci şi poveşti redundante despre un nimic plăcut. Mă duc la o plimbare!
www.todaysoftmag.ro | no. 1/2012
39
filozofie
Informaţia, de la teorie la strategii ale spaţiului public
Sebastian Big Pe la începutul filmului Matrix, după follow the rabbit, knock knock neo, Keanu le vinde băieţilor și fetelor un minidisc pe care îl ţine într-o carte numită „Simulacra and Simulation”. Sebastian Big este autorul traducerii acestei cărţi în limba română.
Perspectiva conform căreia situarea de partea informaţiei înseamnă triumful formei asupra conţinutului subestimează importanţa comunicării şi a teoriei informaţiei în înţelegerea unui spaţiu public în care dinamicile informaţionale câştigă teren în faţa producţiei de semnificaţii. Post-structuralismul e una din teoriile care surprinde şi anticipează această dezvoltare (primatul reţelelor de informaţie asupra reţelelor de semnificaţie) atunci când descrie modernitatea târzie ca fiind o civilizaţie a ”semnificanţilor flotanţi”, semne care au pierdut legătura cu reţelele de semnificaţie. Semnificaţia nu a dispărut pur şi simplu în sfera informaţiei ci s-a multiplicat şi a proliferat în interfaţa în continuă schimbare a spaţiului public, dând naştere la noi clase, genuri, sexualităţi, etnii, rase etc. E din ce în ce mai prezent imperativul de a adapta această proliferare şi dispersie a semnificaţiei la o nouă dimensiune a spaţiului public contemporan, una care nu mai e structurată în jurul codificării şi decodificării de semnificaţie şi a articulării acesteia în practici sociale, ci e o dimensiune supusă unui imperativ cu o dinamică de un alt ordin. Acest imperativ proclamă faptul că o mai multă şi mai bună comunicare sânt soluţia ultimă a problemelor din spaţiul public şi că că dinamica specifică acestei comunicări are de-a face mai mult cu transparenţa unui ”spaţiu al circulaţiei” decât cu soliditatea unui ”spaţiu al locurilor”. Nu mai e vorba de semnificaţii care sânt codificate şi decodificate în texte ci de includere şi de excludere, conectare şi deconectare, război informaţional, noi forme de cunoaştere şi putere (de la relaţii publice la comunicare publică şi management al percepţiilor), care implică nu atât jocul semnificaţiilor cât dinamica de ansamblu a unui mediu informaţional deschis. Ân cele ce urmează voi evalua felul în care conceptul de informaţie poate fi folosit in discuţia privitoare la spaţiul public. Voi porni de la teoria (post)structuralistă şi teoria informaţiei, arătând limitările amândurora în ceea ce priveşte conceptul de informaţie. Voi schiţa la final o perspectivă în care informaţia poate constitui o unealtă importantă în alcătuirea modulară a spaţiului public.
Producţia de semnificaţie şi informaţia alibi
Importanţa informaţiei ca forţă subiacentă spaţiului public constituie o temă recurentă în discuţia de pe scena intelectuală încă din anii 60. Filosofi, sociologi şi economişti din diferite şcoli şi cu diferite orientări politice au încercat să surprindă valoarea informaţiei, atât ca marfă cât şi ca mod de producţie. în vreme ce economiştii vorbesc în special de rolul informaţiei în dinamica pieţii, filosofii şi sociologii resping de cele mai multe ori importanţa informaţiei ca factor definitoriu în schimbarea socială.
40
no. 1/2012 | www.todaysoftmag.ro
Structuralismul afirmă că informaţia nu e decât un nivel de bază al semnificaţiei, furnizând condiţiile minime pentru emergenţa semnificaţiilor sociale. Din această perspectivă, informaţia e nivelul zero al semnificaţiei, o condiţie minimă a producţiei de semnificaţie. Pentru ca această teorie să fie funcţională, comunicarea trebuie să fie mai mult decât o simplă transmisie de informaţie, implicând şi reţele sociale şi culturale de semnificaţii, care mobilizează un întreg sistem cultural de referinţe. Informaţia e văzută ca un soi de alibi pentru comunicarea semnificaţiilor sociale, teren pe care au loc ”adevăratele” strategii ale spaţiul public. Repetitivitatea şi mobilizarea neâncetată a identităţilor şi prejudecăţilor reciclate în procesul de producţie de semnificaţie suprasaturează spaţiul public, făcând dificil însă cu atât mai necesar un nou mod de raportare/comunicare în/ cu acest spaţiu. Intervenţia în mediul informaţional nu înseamnă doar producţia de contrainformaţie ci şi o înţelegere a dinamicii difuzării informaţiei (deschiderea de noi canale, conexiuni transversale, guerilla informaţională etc.). Se pune problema interacţiunii dintre transformările modurilor de producţie şi noile forme de cunoaştere şi putere în câmpul dinamicii informaţionale. Din punct de vedere hermeneutic, semnificaţiile exprimate şi diseminate de cei care folosesc mediile oficiale nu sânt noi sau originale. Zona în care politicul şi socialul au suferit o mutaţie e aceea a tacticilor şi tehnicilor prin care e comunicată şi filtrată informaţia. De fiecare dată când o anumită informaţie e comunicată, e folosită o întreagă serie de tehnici şi tactici pentru care transmisia de semnificaţie e numai un obiectiv parţial al unei campanii mai largi. întregul spaţiu public a devenit obiectul unei reţele de metode, tactici şi strategii corespunzătoare hipermanagementului opiniei publice. Nu e însă vorba doar de o metodă mai sofisticată de manipulare a publicului de către o nouă rasă de ingineri sociali, cărora li se opun audienţe refractare sau semnificaţii contradictorii. Relaţia dintre profesioniştii comunicării şi audienţele lor
are loc într-un mediu specific, în care dinamica informaţiei are precedenţă în faţa dinamicii semnificaţiei. O înţelegere mai clară a informaţiei şi a dinamicii informaţiei e importantă în înţelegerea condiţiilor care cer o nouă raportare la spaţiul public, înţeles ca interacţiune între reţele de comunicare
Teoria informaţiei, de la canal la mediu informaţional
Teoria informaţiei, în special lucrarea lui Claude E. Shannon despre teoria matematică a comunicării oferă câteva desluşiri importante în legătură cu dinamica informaţiei. Lucrarea ”Teoria matematică a comunicării” a fost un punct de cotitură în teoria informaţiei, domeniu apărut prin convergenţa nou-născutei industrii a telecomunicaţiilor (telegraf, telefon, radio, televiziune) şi a aplicaţiilor ei militare (sisteme de comandă şi control şi criptare), cu implicaţii în înţelegerea comunicării ca proces fizic pe care dezvoltarea tehnologică se baza, reinventându-l. Una din supoziţiile de bază ale teoriei informaţiei e aceea că informaţia nu poate fi definită decât ca un raport între semnal şi zgomot (paraziţi, bruiaj), descriere născută din necesitate tehnică. De fiecare dată când ceea ce denumim o informaţie e transmis de la un emiţător la un receptor, se pune problema canalului, e necesar ca acea informaţie să fie transmisă cât mai acurat. Canalul de comunicare nu are capacitatea de a recunoaşte existenţa sau lipsa semnificaţiei; el nu poate interpreta mesajul. Mai mult, nu orice informaţie are semnificaţie. Dat fiind faptul că acel canal nu are capacitatea umană de a interpreta semnificaţie, el se bazează pe o formulă matematică ce îi permite să facă diferenţa între informaţie şi zgomot. Caracterul de informaţie îi e dat acesteia de existenţa unui pattern sau a unei frecvenţe care îi permite canalului să o deosebească de zgomot. Pentru urechea umană, informaţia conţinută în biţii criptaţi sună a fluierături şi zgomote (sunetul modemului conectându-se la internet). Şi totuşi, atunci când există comunicare printr-un canal, acest zgomot conţine şi informaţie, un pattern sau o frecvenţă care pot fi codificate într-
un semnal, care la rândul lui poate fi codificat în ceea ce va apărea pe monitor ca o pagină web. în acest sens, dacă acceptăm această teoria a informaţiei, ea nu implică semnificaţie ci doar patternuri statistice şi frecvenţe de modulare semnal-zgomot. Shannon s-a ocupat de problema modulării unui semnal cu şanse de supravieţuire în faţa efectelor zgomotolui care periclitează orice comunicare, a interferenţelor şi bruiajului care ameninţă să anuleze transmisia. El a ajuns să marcheze minimele condiţii ale comunicării. înainte ca ceva să fie comunicat, e nevoie de un canal liber, ceea ce implică suspendarea zgomotului exterior. Un canal liber e condiţia de bază a comunicării, în măsura în care scopul comunicării e transmiterea unui mesaj, indiferent de semnificaţie. Acest scenariu se îndepărtează de concepţia modernă a comunicării, în care existenţa sferei publice garantează desfăşurarea transparentă a vieţii democratice. Nu mai există un subiect care semnifică, nici măcar o audienţă; nu există o retorică ci un set minimal de patternuri, care reduce comunicarea la existenţa unui canal liber. Din perspectiva teoriei informaţiei, comunicarea nu e nici un argument raţional nici o experienţă antagonistă, bazată pe capacitatea unui vorbitor de a codifica/decodifica o semnificaţie presupus comună. Scopul fluxului de informaţie e stabilirea unui contact între emiţător şi receptor prin excluderea oricărei interferenţe. Emiţătorii şi receptorii nu au o situare opozitorie, ca în concepţia jocului dialectic ci se presupune că se află de aceeaşi parte. Opoziţia dintre emiţător şi receptor nu mai e una subiectivă ci una obiectivă şi externă, care ia forma unui zgomot lipsit de semnificaţie. Problematica informaţională e legată de conceperea comunicării ca o chestiune operaţională dominată de imperativele canalului şi nu de o exigenţă a semnificaţiei, a unei etici a adevărului sau a unei confruntări retorice. Strategiile informaţionale se desfăşoară deci într-un mediu de comunicare instrumentalizat, redus la problema lui fundamentală (sau la condiţiile lui minime): realizarea cu succes a unui contact, suprimarea oricăror bruiaje şi filtrarea
www.todaysoftmag.ro | no. 1/2012
41
filozofie
oricărei parazitări a mesajului aflat în tranzit. Nu există nimic implicit tehnologic aici, dacă prin tehnologie înţelegem un Frankenstein tehnocrat care se întoarce împotriva creatorilor lui. E vorba mai degrabă de tehnici şi moduri de cunoaştere şi putere care se întretaie printr-o varietate de medii şi canale pe terenul societăţii informaţiei. Strategiile de amplificare, încercarea de control sau de monopolizare a comunicării prin metode tradiţionale sânt subvertite de continua repoziţionare non-lineară a reacţiilor şi canalelor de transmisie ale publicului sau pur şi simplu de entropia socială, care face non-lineară transmisia mesajelor. Aceasta e una din limitările teoriei lui Shannon. El porneşte de la o concepţie lineară a comunicării (modelată pe configuraţia tehnică a industriei telecomunicaţiilor din epocă) ce presupune un circuit simplu, care leagă un emiţător de un receptor printr-un canal de transmisie, a cărui simplitate şi lipsă de ramificaţii permite reducerea facilă a zgomotului şi neutralizarea bruiajelor. Ce se întâmplă atunci când comunicarea nu e liniară, când informaţia nu e transmisă simplu printr-un canal de la un punct A la un punct B, ci se transformă într-un flux care circulă liber între noduri, suferă mutaţii, se multiplică de la canal la canal, de la reţea la reţea? Ce se întâmplă atunci când nu se mai pune problema unui canal sau a unei colecţii de canale ci a unui mediu informaţional?
Dinamica realităţii, între reprezentare şi informaţie
S-ar putea obiecta că relaţia dinamică dintre informaţie şi realitate, semnal şi zgomot, patern şi hazard care animă mediul comunicării umane nu atinge problema esenţială a informaţiei şi a caracterului ei real. Nu e dificil de observat că felul în care este gestionată sfera publică implică o grijă fundamentală pentru accesul la informaţie şi că tehnicile de transmisie din mediul plin de zgomot al comunicării de azi au devenit extrem de complexe. Asta nu rezolvă însă problema relaţiei dintre emiţător şi receptor. Am putea obiecta şi că acest ceva de comunicat nu poate fi un simplu pattern ci, în
42
no. 1/2012 | www.todaysoftmag.ro
Informaţia, de la teorie la strategii ale spaţiului public
ultimă instanţă el trebuie să fie un mod de reprezentare a realităţii. O ştire nu e în fond decât o anumită reprezentare a unui eveniment, transmisă unei audienţe. în această ordine de idei, putem spune că informaţia se supune în cele din urmă regulilor semnificării şi ale înţelegerii, cu alte cuvinte, că are o dimensiune semantică, fiind supusă interpretării. O ştire poate fi analizată pe baza producţiei discursive a evenimentului reprezentat, aşa cum e codificată şi decodificată de producători pentru consumatori. Asta nu rezolvă însă problema relaţiei dintre informaţie şi realitate. Conform abordărilor post-structuraliste ale limbajului reprezentarea nu îşi trage semnificaţia din realitate ci din alte reprezentări, adică din ţesutul de moduri de semnificare din care se naşte înţelegerea comună a realităţii. Sfera publică este construită prin limbaj şi nu e de conceput sau accesibilă fără el. în acest context, conceptul de informaţie aduce o schimbare radicală; ca şi configuraţie de date el are legătură cu ceea ce reprezintă. Acest concept nu e specific doar teoriei comunicării ci şi fizicii, ştiinţelor naturii, ciberneticii. Informaţia nu e o simplă reprezentare ci o tehnică de comprimare a datelor care ne uşurează interacţiunea cu indeterminarea şi complexitatea proceselor realităţii. Informaţia e întotdeauna, după formula lui Shannon, o măsură a incertitudinii în cunoaşterea unei stări, a unui proces sau a unui eveniment. Teoria matematică a comunicării presupune şi faptul că, fiind un mijloc statistic, informaţia e inerentă realităţii fizice, însă doar ca măsură a ireductibilei indertitudini care caracterizează cunoaşterea stărilor fizice. Ântr-un sens tehnic şi ştiinţific, informaţia înseamnă reprezentarea unei stări fizice, care nu presupune însă existenţa unei relaţii de simplă asemănare între reprezentare şi stările pe care o asemenea informaţie le descrie. Această relaţie se clădeşte în termeni care subminează perspectiva în care reprezentarea e o copie a realităţii. Aşa cum insistă Baudrillard, am ieşit demult din regimul originalului şi al copiei.
Teoria informaţiei confirmă faptul că o stare sau un element complex al realităţii care poate fi reprezentat printr-un număr sau o descriere (temperatură medie, identitate) nu are o relaţie deterministă sau lineară cu multiplicitatea de stări microscopice care o definesc (particulele şi viteza lor, diferitele singularităţi ale unei identităţi). Informaţia descrie o distribuţie de probabilităţi (sau o serie de parametri) mai degrabă decât o proprietate esenţială care defineşte o fiinţă. Teoria informaţiei rezolvă problema acestei indeterminări (sau zgomot) printr-o compresie a datelor. La fel ca în astronomie şi fizică, tehnologia informaţiei are ca sarcină distilarea unor numere prea mari pentru înţelegerea umană. Ele pot fi aduse la un nivel de înţelegere prin folosirea unei curbe matematice denumite logaritm natural. Ca tehnică de comprimare de date, teoria informaţiei foloseşte logaritmul pentru a reduce incertitudinea, care nu e altceva decât un efect al magnitudinii datelor produse de realitate. El mediază între o lume care poate fi pătrunsă de simţuri şi acele procese care sânt prea complexe pentru înţelegere, procese care se schimbă geometric sau exponenţial: probabilităţi, dobânzi, populaţii, conexiuni neuronale sau multitudinea de procese care au loc între indivizi în şi cu spaţiul public. Astfel logaritmul imită felul în care funcţionează simţurile umane.
Spaţiul public, între clişee propagandistice şi dinamici sociale
Făcând posibilă înţelegerea magnitudinii şi a incertitudinii realităţii, informaţia ne deschide ochii asupra caracterului aproximativ al oricărei cunoaşteri şi al oricărui fel de comunicare. Fie că e vorba de etern contradictoriile şi schimbătoarele sondaje ale opinie publice sau de bazele de date în continuă creştere, tehnologiile informaţiei contribuie la descrierea/recompunere a spaţiului public, comprimând variaţiile de gusturi, orare, direcţii, trecând peste autoevidenţa şi suficienţa subiectului modern, trecând de la mase la populaţii de unităţi individuale de informaţie. Genul, rasa, sexualitatea nu mai sânt tratate ca fiind specifice unor subiecţi statici, observaţiile
microvariaţiilor lor sânt recompuse pe o suprafaţă de modelare care se mişcă în ritmul mişcărilor spaţiului public. Asta nu înseamnă că identităţile, diferenţele şi reprezentările au devenit irelevante sau şi-au pierdut puterea de identificare sau funcţia în spaţiul public, însă componentele lor perimate sânt marcate sau neutralizate de tehnologiile informaţionale. Dimensiunea informaţională scoate la lumină vârtejul de singularităţi sau esenţe singulare, anomalii care merg mult mai departe decât jocul postmodern al identităţii şi al diferenţei. Informaţia operează cu reguli diferite de acelea ale semnificaţiei. Diferenţa nu mai e văzută ca relaţională şi structurală ci ca marcată de probabilistică şi incertitudine. Ea se aplică la procesele unei realităţi aflate într-o discontinuă transformare. Conceptul de informaţie surprinde dinamica realităţii şi a spaţiului public fără a face abstracţie de caracterul lor fluid şi discontinuu. Ea implică o înţelegere nedeterministă şi nereducţionistă a proceselor realităţii. Informaţia nu poate defini complet procesele realităţii, ea nu poate decât cuantifica unele din dimensiunele realităţii, spre deosebire de reprezentări, identităţi şi semnificaţie, care aruncă adevărate plase asupra jocului singularităţilor, comunicând un tip de informaţie nu atât neadevărat cât extrem de rudimentar, retrasând parcă în sens invers drumul de la mythos la logos. Conceptul de informaţie nu are de oferit analizei spaţiului public doar o repunere în scenă mai nuanţată a relaţiei dintre semne şi fluxurile realităţii ci o unealtă intuitivă şi pragmatică în mod imediat. Deşi munca specialiştilor în comunicare e una de modulare a acestui mediu de comunicare la comenzi economice şi politice, canalele pe care ei le trasează sânt deschise şi altor moduri de folosire, care nu ţin cont de respectivele comenzi. Suprafaţa zgomotoasă a comunicării, proliferarea confuziei care zdruncină şi reconfigurează asimetric spaţiul public nu se adresează unei mase statice servile ci unui spaţiu public probabilistic, discontinuu, supus unei schimbări din ce în ce mai rapide. Conceptul de informaţie implică existenţa unor procese probabilistice şi
variabile care nu pot fi atât reprezentate cât observate şi experimentate. Dedesubtul peliculei de clişee propagandistice a căror diseminare e pusă în practică de specialiştii în comunicare clocoteşte o dinamică socială în continuă reconfigurare. Relaţia dintre dinamica informaţională şi comunicarea în spaţiul public a fost ocultată parţial de predominanţa mediilor de comunicare lineare în modernitate şi modernitatea târzie. Sântem obişnuiţi să considerăm comunicarea ca fiind ceva care ţine de mesaj (informaţie, semnificaţie, reprezentare) transmise de un emiţător către un receptor printr-un canal. Am ajuns astfel să acordăm o importanţă nemeritată imaginilor mintale sau reprezentărilor comunicării, ca şi cum informaţia ar fi doar un alt nume pentru Ideile care curg dinspre un centru panoptic spre periferia unei majorităţi pasive, întrun spaţiu public static. Multiplicarea canalelor de comunicare şi a mediilor ne atrage însă atenţia asupra importanţei dinamicilor nonlineare în desfăşurarea interacţiunilor în spaţiul public. Nu există un loc în care informaţia să nu prolifereze, rezoneze, recombine şi interfereze şi e din ce în ce mai clar că ea nu e nici semnificaţie nici formă imaterială. Comunicarea de informaţie implică întotdeauna rezolvarea unei tensiuni datorate incompatibilităţii dintre diferitele dimensiuni ale unei parcele de realitate. Informaţia nu e un conţinut de comunicare ci un vector, care determină direcţia unor viitoare actualizări. De aceea, orice comunicare de informaţie, aşa cum bine ştiu ciberneticienii e şi o formă de control a fluctuaţiilor unui mediu fizic instabil. Informaţia nu face din receptor doar un subiect al acţiunii emiţătorului (acceptare/ negociere/ respingere a unei semnificaţii) ci implică şi o sumă de parametri cuantificabili de fluxul de informaţie, care au puterea de a provoca schimbări reale de stare. Nici o comunicare nu poate fi ruptă de efectul combinat al tensiunilor şi instabilităţilor; actul de a intra în contact nu poate fi redus la injectarea de informaţie în receptorii individuali, asta după ce, în prealabil, terenul a fost curăţat de zgomot. Dimpotrivă, dimensiunea
informaţională a comunicării pare să implice un potenţial real de transformări dinamice, punerea în mişcare a unui proces de constituire la care nu au acces nici canalele media dirijate nici cinismul specialiştilor în relaţii publice. Strategiile informaţionale în spaţiul public au de-a face atât cu dezvoltarea formelor de cunoaştere cât şi cu aceea a formelor de putere, al căror teren de joacă nu e numai comunicarea ci şi evenimentul, care erupe din circuitul închis al comunicării. în acest sens, strategiile informaţionale implică nu doar interferenţa sau metisajul cultural ci şi analiza activă şi experimentarea unor tactici adecvate non-linearităţii fluxurilor de informaţie şi instabilităţii realităţii cu care au de-a face.
www.todaysoftmag.ro | no. 1/2012
43
powered by