Aplicație social-informativă și de comunicare pentru platforma Android COORDONATOR ȘTIINȚIFIC CONF. DR. DENISA DIACONESCU ABSOLVENT GABRIEL ALEXANDRU… [305579]

UNIVERSITATEA DIN BUCUREȘTI

FACULTATEA DE MATEMATICĂ ȘI INFORMATICĂ

SPECIALIZAREA INFORMATICĂ

RATE A [anonimizat]: [anonimizat], 2018

Introducere

Ideea proiectului Rate A Job este construită pe principul întrajutorării interumane pentru a simplifica procesul de atingere al scopului dorit. Având la dispoziție o [anonimizat] a-[anonimizat], le poate schimba viața.

[anonimizat] A Job sau în traducere „Evaluează un loc de muncă”, îndeamnă oamenii care au interacționat cu un anumit loc de muncă care le-a oferit, [anonimizat], să-și împărtășească experiența dobândită din contactul cu mediul respectiv. De altfel aplicația poate avea rol de canal de feedback pentru companii prin comentariile pro și contra aduse de către persoanele cu care au interacționat. [anonimizat]-au exprimat deja un punct de vedere.

Astfel se creează o [anonimizat] a intervievatului care se va prezenta cu o bază de cunoștințe cel puțin minimă.

[anonimizat], [anonimizat] o descriere detaliată al procesului de funcționare al aplicației.

Capitolul 2 prezintă motivul dezvoltării produsului în cauză și impactul pe care îl va avea asupra utilizatorilor. [anonimizat] a-[anonimizat], în obținerea informației dorite. Tot în acest capitol sunt expuse aplicații asemănătoare existente pe piață care au rezolvat aceeași problemă dar dintr-o altă perspectivă.

În capitolul al 3-[anonimizat]. [anonimizat] – [anonimizat] – unealta care găzduiește baza de date a aplicației și care permite administrarea conturilor utilizatorilor.

Capitolul 4 descrie proiectul și modul său de funcționare sub denumirea de prezentare tehnică a aplicației. Aici se regăsesc explicații cu privire la utilitatea fiecărei funcționalități implementate în aplicație. Una dintre cele mai importante este considerată algoritmul sistemului de recomandări folosit pentru a oferi posibile opțiuni de interes pentru utilizator. [anonimizat].

[anonimizat] A Job, [anonimizat], incontrolabil, în discuțiile cu alți utilizatori.

Capitolul 1 – Prezentarea problemei

Odată cu evoluția tehnologiei, a crescut și gradul de confort al omului. Acesta a simțit nevoia de adaptare la noul mediu pentru propria bunăstare. Pentru a ține pasul, a căutat metode de acces la informație, indiferent de împrejurare. Astfel a apărut cea mai utilă unealtă de comunicare și ”entertainment” mobilă, telefonul inteligent.

Datorită faptului că educația individului s-a îmbunătățit odată cu progresul tehnologic, au apărut o multitudine de locuri de muncă ce pot varia foarte mult, din punct de vedere al cerințelor din partea angajatorului.

Având la dispoziție uneltele și informațiile necesare, fiecare persoană încearcă să găsească un loc de muncă potrivit nevoilor și cunoștințelor sale. În cazul unei conexiuni reușite dintre angajat și mediul de lucru, din cadrul unei companii, ambele părți vor avea de câștigat. Astfel că individul va putea îmbina utilul cu plăcutul, dând dovadă de productivitate, iar compania va fi capabilă de a servi produse de calitate superioară în timp util.

Analizând situația prezentată mai sus, am hotărât că pot da o mână de ajutor societății, prin crearea unei platforme de comunicare, încadrată în acest subiect. Compatibilă cu telefoanele inteligente, aceasta poate oferi mobilitatea de care utilizatorii au nevoie.

Scopul principal al aplicației prezentată în această lucrare, constă în ajutorul oferit utilizatorilor în privința alegerii unui loc de muncă, potrivit standardelor sale. Acest lucru se va realiza prin schimbul de informații cu foști sau actuali membrii din cadrul companiilor în cauză.

Conform unui studiu efectuat de către eMarketer (Fig.1), asupra utilizatorilor de telefoane inteligente din Marea Britanie, a rezultat că aceștia petrec aproximativ două ore din zi pe telefon, perioada crescând de la an la an. Acesta a fost unul dintre factorii care m-au determinat să utilizez o tehnologie ce poate livra informația necesară către utilizator mai rapid.

Fig.1 Media de timp, din zi,

petrecută pe un telefon inteligent

1.1. Platforma de dezvoltare – Android

Android ocupă în prezent locul întâi pe piața sistemelor de operare dedicate dispozitivelor mobile, depășind detașat competiția. Conform unui studiu realizat de către compania Gartner (Fig.2), Android a obținut conducerea pieței în primul semestru al anului 2011, crescând semnificativ de la an la an.

Acest lucru se datorează colaborării cu numeroși experți de nivel mondial în producerea de dispozitive hardware și componente software compatibile. Având o interfață ușor de înțeles și utilizat de către toate categoriile de vârstă, dar și un preț accesibil, fiind compatibil și cu dispozitive mai puțin performante, Android s-a răspândit foarte ușor la nivel global.

Utilizatorii acestui sistem de operare pot beneficia de o multitudine de aplicații de comunicare, media, de tip joc și nu în ultimul rând, de salvare, stocare și sincronizare a datelor între dispozitivele inteligente personale. Relația cu utilizatorii a fost constant îmbunătățită odată cu trecerea timpului. Un bun exemplu ar fi implementarea de către producătorii de software, a unor algoritmi complecși, ca recunoașterea facială, detectarea amprentei sau un sistem de inteligență artificială cu care consumatorii de produs pot comunica.

Fig.2 Cota de piață a sistemelor de operare

pentru telefoanele inteligente

Din punct de vedere al dezvoltatorului, Android reprezintă o sursă de unelte cu ajutorul cărora poate da naștere unor produse destinate unei game largi de dispozitive, din care fac parte atât telefoanele inteligente cât și televizoarele, ceasurile inteligente ș.a.m.d. Având acces la anumite configurații de sistem, aceștia pot oferi utilizatorilor posibilitatea de a-și alege modelul dorit de aplicație care să îndeplinească o anumită sarcină.

O punte de legătură dintre utilizator și dezvoltator o reprezintă aplicațiile de tip magazin, cea mai cunoscută fiind Google Play. Aceasta oferă posibilitatea publicării și achiziționării de produse tip aplicație. Utilizatorii au la dispoziție o gamă variată de aplicații împărțite pe categorii, de la aplicații de comunicare sau informative asupra anumitor domenii până la multimedia sau jocuri.

Telefonul inteligent, un dispozitiv indispensabil pentru majoritatea populației, însoțit de o multitudine de aplicații oferite de către dezvoltatori, a adunat destule dovezi pentru a demonstra că aplicațiile sociale și de comunicare ocupă majoritatea timpului unui utilizator. Subiectul a fost dezbătut într-un articol publicat de către American Press Institute (Fig.3), asupra unor statistici efectuare de către Nielsen, pe baza informațiilor obținute de la utilizatorii de telefoane inteligente din Statele Unite Ale Americii.

Fig.3 Aplicațiile de tip social media sunt cele mai populare

1.2. Aplicații similare existente pe piață

În continuare, voi prezenta câteva dintre cele mai populare aplicații care mi-au servit ca inspirație în alegerea temei pentru această lucrare. Cu o mulțime de descărcări la activ, acestea au reușit să-și atingă scopul, de a îndruma utilizatorul spre locul de muncă potrivit nevoilor sale.

1.2.1. Indeed Job Search

Indeed este aplicația cu cea mai stufoasă bază de date ce conține informații despre locuri de muncă disponibile. Aplicația poate fi folosită și fără un cont activ, dar cu funcționalități limitate (Fig.4.1.). Crearea unui cont oferă utilizatorului posibilitatea de a salva o listă cu locuri de muncă preferate, de a-și crea un Curriculum Vitae sau de a aplica pentru ocuparea unui post vacant.

Găsim ca opțiuni de înregistrare, două modalități – adresa de email și parolă sau înregistrare prin intermediul Facebook API (Fig.4.2). Cu un aspect ce oferă senzația utilizării paginii web (Fig.4.3), Indeed a reușit să strângă peste 50 de milioane de descărcări pe Google Play.

În urma căutărilor, atât ca utilizator înregistrat sau nu, aplicația va stoca local un istoric al căutărilor recente. Pe baza acestora, dar și a informațiilor utilizatorului înregistrat, dacă este cazul, Indeed pune la dispoziție un sistem de recomandări. Acesta oferă sugestii din baza de date a locurilor, libere, de muncă filtrate conform precizărilor anterioare.

Fig.4.1 Fig.4.2 Fig.4.3

1.2.2. Good&Co: Career match tests

Good&Co are în prim plan găsirea unui loc de muncă potrivit personalității utilizatorului. Pe baza unor chestionare psihologice (Fig.5.2), acesta obține un rezultat, pe care îl poate compara cu cerințele companiilor disponibile în aplicație (Fig.5.3). Astfel utilizatorul poate afla daca este compatibil atât cu o anumită companie, cât și cu angajații care o compun.

Aplicația pune la dispoziție datele necesare despre compania în cauză, dar nu asigură și procesul de aplicare pentru un loc de muncă. Condiția pentru căutarea locurilor de muncă din cadrul companiei este îndeplinită dacă utilizatorul a înregistrat profilul tehnic personal.

Cu o interfață foarte interactivă, Good&Co a reușit să strângă peste cinci sute de mii de descărcări. Aplicația necesită înregistrarea unui cont activ și oferă posibilitatea de a crea unul cu ajutorul informațiilor de pe rețelele de socializare, Facebook și Google+, sau, prin metoda clasică, email însoțit de parolă (Fig.5.1).

Fig.5.1 Fig.5.2 Fig.5.3

1.2.3. Glassdoor: Job Search, Salaries & Reviews

O aplicație mobilă care oferă detalii foarte amănunțite despre companiile servite în listele de căutare. Este împărțită în patru mari categorii – companii, locuri de muncă, salarii și interviuri (Fig.6.2). Cea mai interesantă funcționalitate o regăsim în secțiunea de opinii, oferite de către foști sau actuali angajați, asupra unei companii. Opiniile sunt împărțite la rândul lor pe diverse subcategorii, de la salarii și interviuri, până la opinii generale. (Fig.6.3)

Glassdoor nu restricționează utilizarea aplicației prin intermediul unui cont activ, dar oferă funcționalități limitate în cazul în care acesta nu există. Activarea unui cont este posibilă atât prin intermediul rețelelor de socializare populare, Facebook si Google+, dar și prin simpla utilizare a unei adrese de email însoțite de către o parolă. (Fig.6.1)

O altă funcționalitate interesantă o găsim în secțiunea de căutare a locurilor de muncă. De aici utilizatorul poate efectua căutări în funcție de abilitățile sale și orașul dorit. În plus, acesta poate salva o sesiune de căutare, pentru a reveni asupra ei după o anumită perioadă de timp sau pentru a fi notificat când sunt disponibile rezultate noi.

Aplicația de angajare nu se realizează prin intermediul Glassdoor. Apăsând pe un buton, utilizatorul este redirecționat către pagina de internet a companiei, de unde poate alege să aplice, sau nu, pentru locul de muncă respectiv. Cu toate acestea, fiind destul de populară, Glassdoor a reușit să acumuleze pe Google Play, peste cinci milioane de descărcări.

Fig.6.1 Fig.6.2 Fig.6.3 Fig.6.4

1.2.4. LinkedIn Job Search

Cu peste zece milioane de descărcări, LinkedIn Job Search oferă utilizatorului toate uneltele de care are nevoie pentru găsirea locului de muncă la care visează. Oportunitățile de lucru sunt ușor de găsit cu ajutorul funcționalității de căutare în funcție de zona geografică (Fig.7.4).

Aplicația oferă recomandări automate și notificări bazate pe istoricul de căutare al utilizatorului, locuri de muncă accesate pentru vizualizarea informațiilor, dar și pe datele obținute de la aplicația de bază, LinkedIn.

LinkedIn Job Search folosește același motor de căutare ca aplicația de bază, LinkedIn, fiind un beneficiu în rapiditatea și acuratețea rezultatelor. Filtrele sunt, de asemenea, într-un număr mare și pot sorta rezultatele în funcție de companie, locuri de muncă, experiența și multe altele.

Aplicarea la locurile de muncă oferite de către companii se poate face foarte ușor, din numai câteva mișcări, dacă utilizatorul s-a conectat cu contul existent de LinkedIn (Fig.7.3). Locurile de muncă pot fi salvate într-o listă de preferințe (Fig.7.1), iar aplicația va notifica utilizatorul cu privire la statusul acestora, odată cu apariția eventualelor modificări (Fig.7.2).

Fig.7.1 Fig.7.2 Fig.7.3 Fig.7.4

1.2.5. JOB TODAY – jobs in 24hrs

Job Today este o aplicație cu o idee destul de interesantă, care schimbă modul în care se fac angajări. Utilizatorii pot aplica foarte ușor, prin apăsarea unui singur buton, neavând nevoie de un Curriculum Vitae sau de o scrisoare de recomandare, ci doar prin completarea unui profil simplist. În urma aplicării, producătorii aplicației garantează un răspuns cererii în maximum 24 de ore.

Aplicația pune la dispoziție două tipuri de utilizatori, persoane în căutarea unui loc de muncă și companii care au nevoie de resurse umane. Companiile își postează oferta, utilizatorul aplică, iar cele două părți vor intra în contact într-un timp scurt, prin intermediul unei interfețe de comunicare unu la unu.

În prezent, ofertele de muncă, oferite prin intermediul acestei aplicații, sunt valabile doar în două orașe ale Angliei, Londra și Manchester, promițând extinderea într-un viitor apropiat. În ciuda răspândirii pe o arie destul de mică, Job Today a acumulat peste un milion de descărcări.

Fig.8.1 Fig.8.2 Fig.8.3

1.3. Impactul asupra utilizatorilor

1.3.1. Utilizarea internetului

Mediul online de recrutare al angajaților reprezintă o metodă simplă dar foarte eficientă, atât din punct de vedere al resurselor financiare dar și al timpului investit în selectarea unei persoane compatibile cu un anumit loc de muncă. Astfel, s-a creat un spațiu dedicat angajatului și angajatorului, unde aceștia pot comunica pe baza cunoștințelor dobândite în raport cu cerințele locurilor de muncă disponibile.

Beneficiul constă în varietatea opțiunilor pe care angajatul le are la dispoziție, datorate unui număr mare de companii care preferă recrutarea online. La rândul său, angajatorul are acces la profilul solicitanților pentru interviu și astfel poate decide dacă, pe lângă aptitudinile tehnice, aceștia se potrivesc și mediului social din cadrul companiei. Și totuși, această metodă poate aduce dezavantajul de interpretare greșită a personalității unei persoane.

Un studiu efectuat în anul 2015, de către Pew Research Center, evidențiază faptul că oamenii, în căutarea locurilor de muncă, preferă și folosesc internetul ca principală sursă de informare și căutare. (Fig.9) Conform majorității, este o metodă mai rapidă și mai accesibilă, indiferent de împrejurări, având chiar și avantajul utilizării unui dispozitiv mobil inteligent.

Fig.9 Studiu efectuat asupra populației Americii, referitor la

sursele de informare ale persoanelor in căutarea unui loc de muncă

1.3.2. Utilizarea unei aplicații mobile

Urmărind subiectele prezentate în secțiunile anterioare, putem observa că internetul, împreună cu utilizarea unui dispozitiv inteligent, ocupă o mare parte din timpul oamenilor. Această combinație a condus la confortul fiecăruia, de a-și organiza evenimentele de zi cu zi, prin intermediul ei.

Așadar, potrivit Jobvite, 43 din 100 de persoane, în căutarea unui loc de muncă, preferă utilizarea unui dispozitiv mobil (Fig. 10), iar 27 la sută se așteaptă ca cererea de angajare să se efectueze cu ajutorul unei aplicații mobile. Într-un număr destul de mare, ca sistem de operare, iese din nou în câștig, platforma Android.

Pentru a satisface nevoile clientului, dezvoltatorii aplicațiilor de succes, după cum putem observa în subcapitolul anterior, au avut în vedere implementarea câtorva funcționalități esențiale:

Recomandarea unor locuri de muncă potrivite cunoștințelor și nevoilor sale;

Utilizarea unor metode rapide de înregistrare, spre exemplu utilizarea informațiilor obținute prin intermediul rețelelor de socializare sau al unei sesiuni de utilizator fără cont activ, dar cu restricții asupra utilizării funcționalităților;

Asigurarea unei comunicări active, atât direct, prin intermediul aplicației, cât și indirect, prin referințe și legături (ex: pagină web, adresă de mail) între companie și persoana aflată în căutarea unui loc de muncă.

Fig.10 Raportul utilizării telefonului

mobil în cadrul căutării unui loc de muncă

1.4. Obiectiv

Pornind de la ideea creării unui mediu ambiant, de unde utilizatorul poate obține informațiile dorite, în cazul de față, detalii despre un loc de muncă, această lucrare își propune abordarea dezvoltării unei aplicații pentru platforma Android care să îndeplinească, pe cât posibil, această condiție.

Accentul va cădea asupra comunicării și actualizării informațiilor în timp real, dar mai ales pe implementarea unui sistem de recomandări, care va avea sarcina de a îndruma utilizatorul către cele mai bune opțiuni, in funcție de istoricul si preferințele sale.

Rate A Job va fi o aplicație creată pentru sistemul de operare Android, în limbaj nativ. Accesul la informațiile despre utilizatori va fi realizat prin intermediul Firebase. Acest serviciu pune la dispoziție un spațiu de stocare pentru fișierele media și o bază de date NoSQL pentru restul informațiilor.

Sistemul de recomandări va fi construit pe baza modelului hibrid, o combinație între sistemul de recomandări cu filtrare colaborativă și cel cu filtrare bazată pe conținut, pentru o mai bună acuratețe a rezultatelor. Recomandările corespunzătoare fiecărui utilizator vor fi calculate pe un server scris in limbajul Node.js, găzduit de platforma web Heroku.

Spre deosebire de alte aplicații din această categorie, Rate A Job pune accentul pe crearea unor conexiuni sociale între utilizatori. Aceste conexiuni au ca scop înrădăcinarea sentimentului de siguranță al celor în căutarea unui loc de munca, având acces la opinii direct din interior și încurajând astfel companiile să-și corecteze defectele.

1.5. Concluzie

Piața foarte mare de posesori ai unui dispozitiv Android a încurajat dezvoltatorii să-si exprime imaginația prin intermediul aplicațiilor mobile, astfel că stilul de viață al fiecăruia a fost, într-o oarecare măsură, îmbunătățit datorită lor. Multiple domenii au fost tratate ca atare și nu a fost uitată importanța relației dintre o companie și angajații săi. Așadar au fost create unelte pentru a ajuta părțile terțe în efectuarea alegerii potrivite.

Locul de muncă reprezintă o etapă importantă din viața unei persoane, iar alegerea celui potrivit nu este niciodată ușoară. Având la dispoziție un număr considerabil de tehnologii moderne, gata de a fi explorate, m-am oprit la cele pe care le-am considerat a fi potrivite pentru a crea un produs practic si ușor de utilizat.

Având ca sursă de inspirație exemplele folosite la secțiunea 2.1., am hotărât să-mi îndrept atenția asupra unei abordări diferite. Folosind resurse puține și o viteză foarte mare de actualizare a datelor, în timp real, am realizat o implementare mai ușor de înțeles și folosit de către orice tip de utilizator. Numele aplicației, Rate A Job, simbolizează unul dintre obiectivele aplicației, acela de a-i ajuta pe ceilalți împărtășindu-ți părerea personală, prin îndemnul pe care îl transmite.

Capitolul 2 – Tehnologii folosite

2.1. Android

Android este un sistem de operare, dezvoltat pentru dispozitive precum „telefoanele inteligente” , tablete, televizoare și multe altele, bazat pe nucleul Linux. Interfața vizuală interacționează cu utilizatorul prin manipulare directă, folosind acțiuni bazate pe atingere.

Aplicația urmează a fi folosită pe un dispozitiv mobil iar de aceea am ales să folosesc ca tehnologie principală pe cea oferită de către Google, Android, deoarece poate face posibil acest lucru într-un mod eficient și bine organizat.

2.1.1. Istoric

Sistemul de operare Android a fost creat de către Android Inc. și cumpărat în anul 2005 de către compania multinațională de origine americană, Google Inc.. Acest sistem de operare și-a făcut apariția pe piață pentru prima dată la data de 5 noiembrie 2007, fiind înființat odată cu lansarea sa și consorțiul comercial Open Handset Alliance, alcătuit din 48 de companii de hardware, software și de telecomunicații, consacrat dezvoltării de standarde deschise pentru dispozitive mobile.

În septembrie 2008 se pune în vânzare primul dispozitiv mobil care utilizează Android, iar în luna următoare, a aceluiași an, devine disponibil ca Open Source, sub licența Apache. Mai exact, o mare parte a codului poate fi folosită și modificată pentru a servi modului de funcționare ales de dezvoltator.

2.1.2. Interfața utilizatorului

Utilizatorul sistemului de operare Android, precum și al aplicațiilor instalate, relaționează cu acestea prin intermediul dispozitivului, cu ajutorul interfeței, care este bazată pe tehnica manipulării directe. Această tehnică se folosește de comenzi tactile ce corespund cu acțiuni reale, cum ar fi glisarea sau apăsarea, pentru a manevra obiectele desenate, de către sistem, pe ecranul dispozitivului. Android oferă posibilitatea utilizării unei tastaturi virtuale care ajută la introducerea de date de tip text.

Sistemul de operare pune la dispoziție o serie variată de componente care permit dezvoltatorului personalizarea aplicației și crearea interfeței grafice. Interfața utilizatorului pentru o aplicație Android este construită folosind o ierarhie de layout-uri (obiecte de tip ViewGoup) si widget-uri (obiecte de tip View, de exemplu, butoane sau câmpuri text). Layout-urile sunt containere invizibile care controlează așezarea copiilor, obiecte de tip View, pe ecran.

Fig.11 Aranjare a elementelor grafice, în ordine ierarhică

Schema de mai sus reprezintă un exemplu de aranjare al elementelor grafice, în ordine ierarhică. Pentru realizarea acestor grupuri de View-uri, Android pune la dispoziție un vocabular XML pentru clasele View si ViewGroup. Așadar, majoritatea fișierelor ce compun interfața grafică sunt de tip XML .

2.1.3. Java

Java este un limbaj de programare orientat pe obiecte foarte utilizat, ușor de înțeles și învățat. Apărut la mult timp după C și C++ a fost creat ca limbaj independent de platformă care folosește mașini virtuale.

Chiar dacă au fost implementate o sumedenie de funcționalități puternice ale vechilor limbaje, librăriile destinate dezvoltatorilor au modernizat procesul, micșorând timpii de dezvoltare. Este considerat unul dintre cele mai citeț scrise limbaje de programare, astfel încât acțiunile executate pot fi înțelese chiar și de o persoană fără cunoștințe în domeniu.

Acesta este un avantaj pentru platforma Android deoarece atrage mulți dezvoltatori să-și pună la încercare creativitatea.

Fiind independent de platformă, Java permite dezvoltarea Android în condiții optime indiferent de dispozitivul pe care acesta rulează. Astfel platforma Android a putut fi împărtășită lumii cu sursă deschisă.

2.1.4. Dezvoltarea unui proiect Java pentru Android

După ce un program este scris în Java pentru Android, urmează să fie transformat într-un alt format pentru a fi înțeles de către sistem. Acest proces de transformare se numește compilare, iar noul format, cod Executabil Dalvik (DEX). Partea sistemului Android care execută codul compilat, DEX, se numește Mașină Virtuală Dalvik (DVM). DVM este o componentă software, scrisă în alt limbaj, care rulează pe o versiune adaptată a sistemului de operare Linux.

Scopul DVM este acela de a ascunde complexitatea și diversitatea componentelor de hardware și software cu ajutorul cărora rulează Android, dar în același timp, de a scoate în evidență toate caracteristicile utile. Pentru ca acest lucru sa fie posibil, DVM are nevoie de acces la componentele hardware, ceea ce se întâmplă, dar permisiunea trebuie să fie, în același timp, ușor de folosit de către programator.

Producătorii de dispozitive Android și de componente pentru acestea, trebuie să se asigure ca produsele hardware oferite vor putea rula fără probleme pe sistemul de operare Linux. Modul în care DVM oferă acces dezvoltatorilor este ușor de utilizat datorită API-ului pus la dispoziție de către Android. API reprezintă un set de definiții de sub-programe, protocoale și unelte pentru programarea de aplicații și software.

Codul Java compilat, împreună cu alte resurse, vor fi împachetate într-un fișier denumit APK și trimis către DVM pentru a-l executa, astfel funcționalitățile aplicației devenind accesibile de către utilizatorul dispozitivului ce folosește Android ca sistem de operare.

Fig.12 Procesul de transformare al

codului sursă într-o aplicație Android

2.1.5. Resurse Android

Un proiect Android reprezintă mai mult decât o mulțime de cod Java. Așa cum am specificat mai sus, interfața utilizatorului necesită, la rândul său, o multitudine de alte fișiere. Aceste fișiere sunt cunoscute drept resurse Android și sunt stocate separat de cele care conțin codul Java.

Aceste resurse pot fi imagini, sunete, layout-uri pentru UI sau chiar fișiere XML care conțin informații despre anumite dimensiuni prestabilite, ale elementelor grafice, teme sau chiar coduri pentru culori.

Ele vor include, de altfel, și datele de tip text folosite în aplicație. Este recomandată păstrarea lor în fișiere diferite de cele Java, deoarece le fac ușor de modificat. Avantajul este cel mai ușor observabil în momentul în care dezvoltatorul dorește să creeze o aplicație care să poată fi folosită în mai multe limbi.

2.1.6. Baza de date – SQLite

În unele cazuri, aplicațiile Android oferă utilizatorului multiple funcționalități ce presupun jonglarea cu cantități mari de date, iar din aceasta cauză dezvoltatorul este nevoit sa recurgă la o măsură prin care să poată stoca, administra și filtra aceste informații. Android folosește sistemul de administrare al bazei de date SQLite și pune la dispoziție chiar și un API, pentru a ușura munca programatorului.

SQLite este o bază de date open source care suportă funcționalități standard ale unei baze de date relaționale, ca de exemplu, sintaxă, tranzacții și declarații SQL. Spre deosebire de majoritatea sistemelor de administrare ale unei baze de date, SQLite nu este o bază de date de tip client-server ci este încorporată în sistemele care o folosesc. Din această cauză oferă un spațiu mai mic de stocare, dar suficient pentru o aplicație Android.

SQLite este prezentă pe orice dispozitiv care rulează pe sistemul de operare Android și nu necesită intervenția dezvoltatorului de aplicații mobile pentru a o administra. Pentru a o putea utiliza, tot ce are acesta de făcut este definirea unor declarări SQL pentru crearea și actualizarea bazei de date, deoarece sistemul de operare se ocupă automat de restul operațiunilor ce asigură funcționarea ei în parametrii normali.

2.1.7. Mediul de dezvoltare

Android Studio este un mediu de dezvoltare integrat care asigură toată complexitatea compilării codului și îl corelează la JDK și API-ul Android-ului. Un mediu de dezvoltare reprezintă posibilitatea dezvoltatorului de a avea la îndemână, pregătit într-un singur loc, tot ce are nevoie pentru implementarea ideilor sale.

Pentru dezvoltarea unui proiect Android este nevoie de o mulțime de instrumente de programare și Android API. Pachetul format, în urma arhivării acestora într-un singur loc, este cunoscut sub numele de kit de dezvoltare software.

Pentru a putea începe lucrul cu acest IDE, dezvoltatorul trebuie să se asigure că există instalat și configurat JDK, pe același calculator pe care urmează să creeze proiectul Android. Odată instalat, Android Studio vine împreună cu Android SDK, pregătit pentru utilizare.

2.1.7.1 Crearea unui pachet de aplicație Android (APK) prin intermediul Gradle

Sistemul de construcție al executabilului folosit de Android compilează codul sursă și resursele aplicației pe care le împachetează într-un APK ce va fi utilizat pentru testare, instalare, semnare si distribuire. Android Studio folosește Gradle, o unealtă avansată de construire a executabilelor, pentru a automatiza și gestiona întregul proces, permițând dezvoltatorului să definească configurații personalizate flexibile.

Fiecare configurație a executabilului poate defini propriul set de cod și resurse, în timp ce refolosește părțile comune tuturor versiunilor aplicației. Extensia Android pentru Grandle funcționează cu uneltele folosite de executabil pentru a asigura procese si setări configurabile care sunt specifice pentru construirea și testarea aplicațiilor Android.

Grandle și extensia Android se execută independent de Android Studio, astfel dezvoltatorul poate realiza aplicațiile Android în afara Android Studio, liniilor de comandă de pe calculator sau sistemelor de operare unde Android Studio nu este instalat.

Flexibilitate sistemului de execuție în Android, permite realizarea configurațiilor personalizate fără să necesite modificarea fișierelor de bază ale aplicației. Procesul de creare a unui pachet de aplicație Android are loc în 4 pași (Fig.13):

Compilatorul convertește codul sursă în fișiere DEX iar pe restul în resurse compilate;

APK Packager combină fișierele DEX si compilează resursele într-un singur APK;

APK Packager semnează executabilul folosind una dintre cele două chei, de testare respectiv de lansare, cea din urmă fiind generată prin intermediul unei unelte, ale Android Studio, de către dezvoltator. Pentru ca APK-ul să fie funcțional, el trebuie obligatoriu semnat;

Înainte de generarea produsului final, este folosit un arhivator, zipalign, pentru optimizarea spațiului ocupat de APK pe dispozitiv.

Fig.13 Procesul de creare al fișierului executabil APK

cu ajutorul Gradle

2.1.8. Librării Android

Librăriile Android, sau API-urile specificat anterior, reprezintă un set de definiții de sub-programe, protocoale si unelte, cu diverse funcționalități, create pentru a ușura munca programatorului. Conform Fig.12, putem observa că există două tipuri: implementate în sistemul de operare, construite peste nucleul Linux și cele din codul sursă al proiectului.

Librăriile care fac parte din sistem, oferă funcționalitățile principale, necesare oricărei aplicații. Dintre acestea fac parte, spre exemplu, cele ce gestionează lucrul cu bazele de date, SQLite prezentate anterior, cele ce furnizează utilizarea de socket-uri securizate bazate pe protocolul SSL, dar și librăria standard C.

Cea de-a doua categorie, cuprinde un set de librării opționale, folosite doar în cazul implementării unor funcționalități care pot aduce îmbunătățiri aplicației, atât pe partea de interfața grafică, cât și la nivel de run-time. Android SDK vine la pachet cu un set de librării, denumit Support Library, create și îmbunătățite pentru utilizarea lor în funcție de versiunea platformei Android.

Cel mai mare beneficiu pe care aceste librării îl pot aduce îl constituie faptul că reduce, cu mult, timpul de dezvoltare. În continuare voi prezenta setul de librării utilizate în construirea acestei lucrări, de unde voi exclude pe cele support și pe cele utilizate pentru implementarea Firebase, despre care vom discuta in subcapitolul următor.

2.1.8.1 Iconify și Font Awesome

În primul rând, Font Awesome este un font de text scalabil, bazat pe imagini, care poate fi personalizat foarte rapid. Utilizarea acestui font pentru câmpurile de tip text cu valoarea unui cod, o va transforma în imaginea din pachetul Font Awesome corespunzătoare (Fig.13.1).

Nevoia utilizării librăriei Iconify am resimțit-o în momentul în care am avut nevoie de transformarea imaginii sub forma de text într-un obiect de tip Drawable (Fig.13.2). Iconify oferă o colecție foarte vastă de imagini vectoriale și metode intuitive pentru adăugarea și personalizarea lor într-o aplicație Android.

Fig.14.1 Utilizarea fontului Font Awesome pe un TextView

Fig.14.2 Metodă statică folosită pentru transformarea unei imagini tip text Font Awesome

într-o imagine tip Drawable, în funcție de cod si culoare

2.1.8.2 Volley

Volley este o librărie HTTP care asigură o ușoară implementare a rețelelor pentru platforma Android, dar cel mai important creștere a vitezei de efectuare a acțiunilor din cadrul acestora. O parte din avantajele pe care le oferă:

Programarea automată a solicitărilor de rețea;

Conexiuni de rețea multiple, executate simultan;

Ajutor în prioritizarea solicitărilor către server;

Ajutor în anularea apelurilor către server;

Instrumente de depanare;

Ordonare bine stabilită, care asigura o metoda ușoară de populare corectă a interfeței cu datele extrase asincron din rețea.

Motivul pentru care am folosit această librărie a fost acela de a încărca imaginile, cu valoare de tip referință web, în elementele de interfață corespunzătoare. (Fig.14)

Fig.15 Modul în care am asociat URL-ul unei imagini cu elementul de interfață

2.1.8.3 Android-Image-Cropper

Android-Image-Cropper este o librărie creată pentru a oferi dezvoltatorilor o mână de ajutor când vine vorba de decuparea unei fotografii. Poate fi implementată atât ca element de interfață în aplicație, cât și separat. Librăria poate decupa simplu sau în funcție de anumite forme personalizate și oferă posibilitatea de rotire sau apropiere a imaginii, totul într-o manieră optimă.

Utilizând aplicația pe care această lucrare urmărește a o implementa, se poate observa utilitatea acestei librării în momentul alegerii unei fotografii de profil. Procesul presupune pornirea unei activități implementate in corpul librăriei, care returnează fotografia aleasa, în funcție de proprietățile dorite. (Fig.15)

Fig.16 Pornirea unei activități de alegere și decupare a imaginii,

parte din corpul librăriei Android-Image-Cropper

2.2. Firebase

Firebase este o platformă de dezvoltare pentru aplicațiile destinate dispozitivelor mobile și web. Compania care a creat platforma a fost înființată de către Andrew Lee și James Tamplin în anul 2011 și cumpărată de Google în 2014.

Produsul inițial al Firebase oferea o bază de date actualizată în timp real care permitea dezvoltatorilor să stocheze și să sincronizeze datele între clienți multipli. Odată cu trecerea timpului a evoluat, oferind servicii multiple, cele mai importante fiind baza de date în timp real, serviciul de autentificare a aplicațiilor ce folosesc Firebase și spațiul oferit pentru găzduirea domeniilor web.

În acest proiect am folosit baza de date în timp real. În primul rând datorită timpilor foarte scurți prin care proprietățile elementelor se actualizează, chiar și atunci când mai mulți utilizatori acționează asupra lor. În al doilea rând, folosesc serviciul de înregistrare al utilizatorilor.

Important de punctat este faptul că Firebase oferă și un spațiu de stocare pentru fișierele adiționale, de exemplu imagini sau fișiere media, pe care îl folosesc în acest proiect.

2.2.1. Baza de date NoSQL

Baza de date oferită de Firebase este de tip NoSQL și salvată pe cloud. NoSQL acoperă o gamă largă și variată de tehnologii, dedicate bazelor de date, create pentru a veni în ajutorul construirii aplicațiilor moderne.

Dezvoltatorii lucrează la aplicații ce necesită actualizarea rapidă și continuă a unor volume masive de date, structurate, semi-structurate, nestructurate sau polimorfe. Aplicațiile sunt construite în echipe mici care lucrează in sprint-uri Agile, adăugând și modificând bucăți de cod, în intervale de timp relativ scurte, iar organizațiile apelează la structuri arhitecturale care folosesc software open source, servere de mărfuri și cloud computing.

Proiectele care serveau unor audiențe finite, au evoluat, devenind servicii accesibile pe o mulțime de dispozitive, de către milioane de utilizatori, astfel fiind necesară funcționarea lor în permanență. Bazele de date de tip NoSQL au apărut datorită nevoii de satisfacere a nevoilor prezentate anterior, deoarece bazele de date relaționale nu puteau face față cerințelor aplicațiilor moderne.

Majoritatea bazelor de date folosesc apeluri HTTP pentru schimbul de informații cu clientul și oferă acces asupra datelor doar atunci când este solicitat. Firebase, spre deosebire de acestea, nu comunică prin intermediul obișnuitelor apeluri HTTP, ci comunică cu clientul prin intermediul unui WebSocket. Acesta este un protocol de comunicare ce reprezintă o variantă mult mai rapidă decât HTTP, precizat anterior.

Așadar, dezvoltatorul nu este nevoit să creeze apeluri individuale către WebSocket, pentru fiecare cerință în parte, deoarece o singură conexiune la socket este de ajuns. Această conexiune asigură sincronizarea automată a tuturor datelor, la viteza maximă admisă de client, astfel că procesul se realizează aproape instantaneu.

2.2.2. Autentificarea utilizatorilor (Firebase Auth)

Aplicațiile, în cele mai multe cazuri, au nevoie de a oferi utilizatorului o experiență personalizată, indiferent de dispozitivul pe care este folosită, de către aceeași persoană.

Pentru a face acest lucru posibil, este necesară cunoașterea identității utilizatorului. Odată obținută, persoana în cauză își poate menține sincronizate datele, în timp real, pe fiecare dintre dispozitivele sale.

Serviciul de autentificare oferit de către Firebase este de tip email și parolă. Suporta, de altfel, și înregistrare cu Google, Facebook, Twitter si GitHub cu ajutorul protocolului OAuth2.

Fig.17 Reprezentare grafică a compatibilității Firebase

cu diverse rețele de socializare

În urma înregistrării, un nou câmp de tipul utilizatorului va fi înregistrat în baza de date. La fiecare autentificare, serviciul generează un token specific sesiunii în curs, cu ajutorul căruia dezvoltatorul poate utiliza informațiile necesare comunicării cu utilizatorul.

2.3. Node.js

Internetul sau Web-ul reprezintă un sistem global complex de rețele și servere interconectate, care folosesc un set de reguli standard, TCP/IP. Într-un sistem complex, interacțiunea și colaborarea dintre componentele sale prezintă principalele structuri atunci când accentul se pune pe eficiență.

Browser-ele comunică cu serverele printr-un alt protocol standard numit HTTP. Datorită dorinței rapide de comunicare în timp real și a evoluției rapide a web-ului, serverele ce utilizează HTTP au avut nevoie de o îmbunătățire. O soluție eficientă o reprezintă Node.js.

Node.js a fost scris de către Ryan Dahl in anul 2009 și lansat ca produs compatibil cu sistemele de operare Linux și Mac OSX, iar în 2011, cu ajutorul Joyent Inc., și pentru Microsoft Windows.

A fost construit pe V8 – procesor (interprotor) JavaScript, oferit de Google, deoarece este open source și sub licența BSD dar și extrem de rapid. De altfel, JavaScript, fiind un limbaj de programare foarte răspândit, a ajutat proiectul Node.js să fie ușor accesibil întregii comunități web.

Creatorul Node.js, Ryan Dahl, nu a fost, inițial, foarte impresionat de folosirea JavaScript ca limbaj de programare pentru proiectul său, el fiind programator C, dar, în urma analizării mai multor factori, a decis că era exact ceea ce avea nevoie. Principala utilizare a Node.js constă în construirea programatică a rețelelor, de exemplu serverele Web.

Există o mare diferență între Node.js și PHP. Majoritatea metodelor în PHP blochează parcurgerea către următoarele acțiuni cât timp rulează cea curentă, astfel comenzile se execută succesiv. Metodele în Node.js, pe de altă parte, au fost proiectate să fie non-blocking, comenzile executându-se în paralel și folosind callback-uri, care anunță sfârșitul executării acțiunii, cu succes sau eșec.

2.3.1. Lucrul cu thread-uri

Node.js funcționează pe un singur thread folosind, așa cum am precizat anterior, apeluri I/O (de intrare/ieșire) non-blocking (fără blocare), asincrone. Mai exact, fiecare operație adresată aplicației, cum ar fi accesul la rețea sau la un alt proces, poate avea atașată o funcție de tratare a unui eveniment specific.

Astfel permite funcționarea zecilor de mii de conexiuni concurente. Metoda de împărțire a unui singur thread între toate cererile urmărește construirea aplicațiilor foarte complexe, unde fiecare metodă care efectuează apeluri I/O să folosească un callback. Pentru acomodarea cu evenimentul repetitiv pe un singur thread, Node.js utilizează librăria libuv, care este responsabilă de o parte din operațiile I/O asincrone.

Execuția sarcinilor în paralel este manipulată de către un thread pool. Acesta este un model de proiectare software care administrează o multitudine de thread-uri ce așteaptă sarcini pentru a fi executate. O metodă comună de programare a sarcinilor este o coadă sincronizată, cunoscută și sub numele de coadă de sarcini. Aceste sarcini vor fi mutate într-o lista de sarcini efectuate după execuție.

Revenind la Node.js, când un thread își termina de executat sarcina, acesta informează thread-ul principal, prin intermediul callback-ului, pe care îl execută în consecință.

Fig.18 Exemplu de thread pool

cu sarcinile în așteptare(albastru) și cele complete(galben)

2.3.2. Heroku

Heroku este o platformă, sub forma unui serviciu, de găzduire, folosită ca model de implementare pentru aplicațiile web. A fost una dintre primele platforme de găzduire create, fiind adoptată de către dezvoltatori începând cu anul 2007. A fost fondat de către James Lindenbaum, Adam Wiggins și Orion Henry. În primă fază, serviciul era dedicat doar pentru Ruby dar a fost adaptat pe parcurs, pentru a suporta mai multe limbaje, printre care și Node.js.

Heroku este ca un loc de cazare pentru aplicații pe internet. Funcționează asemănător cu serviciile de găzduire al site-urilor web, care le păstrează în stare de funcționare, pe severele proprii, și care conferă accesibilitate utilizatorilor pentru interacțiunea cu acestea.

Codul sursă și descrierea proiectului sunt construite pe un framework, oferit de către Heroku, care le convertește într-o aplicație. Mecanismul de dependență, adică fișierele specifice fiecărei tehnologie în parte, va varia în funcție de limbajul folosit.

Procesul de execuție este unul simplu, executându-se cu ajutorul unui fișier localizat în codul sursă, pe nume Procfile. Pentru ca sistemul să știe ce trebuie executat, dezvoltatorul nu trebuie decât să introducă, în acest fișier, referințe către părțile respective ale proiectului.

Aplicațiile ce rulează de pe un server Heroku folosesc Heroku DNS Server pentru direcționarea către domeniul său. Fiecare recipient al aplicației, altfel numit, dyno, este răspândit pe o “grilă de dyno-uri” care constă în mai multe servere.

Pentru executarea aplicației, Heroku va porni un dyno, încărcat cu o copie funcțională a aplicației, și va executa comenzile declarate în fișierul Procfile. În momentul în care se actualizează aplicația cu o nouă versiune, toate dyno-urile vor fi oprite și vor porni automat unele noi, încărcate cu noua versiune a aplicației pentru a le înlocui pe cele vechi.

Fig.19 Funcționalitatea platformei Heroku

sub forma unei diagrame

2.4. Concluzie

Uneltele prezentate anterior vor fi necesare pentru dezvoltarea produsului final, subiectul acestei lucrări. Utilizarea lor va rezulta un proces de lucru în tandem, fiecare componentă având rolul său pentru o bună funcționare a aplicației.

Când vine vorba de alegerea instrumentelor necesare pentru crearea unui nou proiect, este recomandată o atenție sporită, pentru eficientizarea timpilor de răspuns rezultat din comunicarea acestora. În urma unui studiu de piață al noilor tehnologii, uzuale printre dezvoltatori, am ajuns la concluzia că cele trei enumerate mai sus pot fi alegerea potrivită nevoilor mele.

Astfel am decis ca sistemul de operare care va interacționa direct cu utilizatorul va fi Android datorită răspândirii sale, a optimizării sistemului dar și accesibilității prețului. Faptul că este compatibil cu aproape orice componentă hardware sporește rata de utilizare a aplicației printre posesorii dispozitivelor.

Firebase a fost o alegere surprinzător de plăcută datorită documentației bine structurate ce m-a ajutat să-i descopăr tainele utilizării sale. Cu o viteză mare de răspuns și a modului de lucru specific unei baze de date tip NoSQL, am reușit să integrez o aplicație cu câmpuri de date ce se actualizează în timp real.

Utilizarea Node.JS a apărut din necesitatea unei metode de calcul suplimentară pentru procesarea informațiilor utile pentru personalizarea recomandărilor specifice fiecărui utilizator. Acest server va comunica cu baza de date construită cu Firebase și va pregăti recomandările pentru a fi livrate către aplicație.

Capitolul 3 – Prezentarea tehnică a aplicației

Această lucrare are ca obiectiv crearea unei aplicații mobile, denumită Rate A Job, destinată telefoanelor inteligente care folosesc sistemul de operare Android. Implementarea se va realiza cu ajutorul tehnologiilor prezentate în capitolul precedent. Produsul final a fost urcat pe platforma magazinului de aplicații Google Play și poate fi achiziționat gratuit de către utilizatorii cu dispozitive compatibile.

În continuare voi prezenta modul de lucru, la comun, al instrumentelor folosite și funcționalitățile create cu ajutorul acestora. Printre funcționalități se numără crearea unui cont de utilizator, afișarea companiilor și a locurilor de muncă în liste de elemente, conform anumitor parametrii, actualizarea datelor în timp real și multe altele.

Un loc în subcapitolele următoare, important de precizat, îl ocupă algoritmul sistemului de recomandări. Acesta a fost creat cu scopul de a întinde o mână de ajutor utilizatorilor nehotărâți, cu privire la locul de muncă unde, probabil, s-ar integra, sau a celor interesați de mai multe oportunități echivalente unei alegeri deja luate. Modul său de lucru combină două metode de gestionare a informației pentru generarea rezultatelor, oferind astfel un răspuns mai exact.

Interfața utilizatorului cu o temă simplistă oferă o experiență plăcută fiind ușor de folosit. Elementele de design sunt intuitive pentru acțiunile pe care acestea le efectuează. Ca punte principală între utilizator și restul funcționalităților, interfața are responsabilitatea de a oferi compatibilitate între acțiunea efectuată și rezultatul obținut. Rate A Job respectă aceste condiții, fapt demonstrat în subcapitolele dezbătute în continuare.

3.1. Descriere

Rate A Job este o aplicație care se poate încadra în mai multe categorii, social-informativă și de comunicare. Acest lucru se datorează faptului că oferă utilizatorilor informații despre elementele de interes, în cazul de față companiile și locurile de muncă din cadrul acestora, dar asigură și interacțiunea atât între utilizatori construiți pe același model, cât și diferi. Mai exact utilizatorii aplicației pot fi de două feluri: utilizator tip persoană și utilizator tip companie.

Primul contact cu utilizatorul va avea în prim plan autentificarea acestuia cu un cont personal (Fig.20.1). În cazul în care acesta nu există, utilizatorul poate alege opțiunea de înregistrare. Primul pas presupune alegerea tipului de utilizator cu care intenționează să continue (Fig.20.2). După finalizarea cu succes a procesului de înregistrare, acesta va continua utilizarea aplicației conform alegerii făcute.

Fig.20.1 Fig.20.2

3.1.1. Utilizatorul tip companie

În urma deciziei de a continua ca reprezentant al unei companii, va crea un profil pentru aceasta, înregistrarea constând într-un proces simplu prin introducerea numelui, adresei de mail cu care va avea loc autentificarea și parola, de minimum 6 caractere, însoțită de o confirmare, (Fig.21.1). Introducerea cu succes a tuturor datelor necesare va face posibilă înregistrarea.

Fig.21.1 Fig.21.2 Fig.21.3

În urma înregistrării cu succes, cât și a autentificării, UTC va fi redirecționat pe pagina profilului său (Fig.21.2). În urma înregistrării, acest profil este inactiv și nu va apărea în sugestiile sau listele de căutare ale UTP.

Reprezentantul companiei va fi obligat să completeze toate detaliile obligatorii necesare activării. Pentru informare asupra acestui lucru, se poate observa în imaginea de mai sus (Fig.21.3) un mesaj de alertă, scris cu roșu, cu scopul de a evidenția pașii necesari activării.

Pentru a putea edita și actualiza cu ușurință informațiile profilului am creat un element vizual customizat, sub numele de UserInfoLayout. Acesta moștenește LinearLayout și vine cu un pachet de elemente grafice pentru a putea fi dinamic modificate, în funcție de utilitatea fiecăruia (pentru mai multe detalii consultați Anexa 1). Adăugarea sa în pagină se realizează printr-o instanță (Fig.21.4.1) în fișierul XML al părintelui în care va urma să apară.

Actualizarea detaliilor necesită editarea a două tipuri de elemente vizuale, de tip EditText. Câmpurile destinate editării de text au implementate un ascultător de tip TextWatcher cu comportament personalizat, care detectează schimbările efectuate și afișează opțiunile de actualizare sau anulare (Fig.21.4.2).

Însă există un tip de câmp diferit, cel repartizat introducerii adresei. Acesta va începe procesul de actualizare printr-un apel la Google Places, o librărie oferită de Google, folosită în acest proiect ca unealtă de ajutor pentru căutarea și completarea corectă a adresei unui utilizator. Acest apel deschide o activitate cu background transparent peste cea care este deja în uz (Fig.21.5).

Mai departe se poate observa o bară de căutare a cărei rezultate vor fi foarte precise, acestea provenind din baza de date a Google. Odată aleasă opțiunea dorită, câmpul de editare text asociat adresei va prelua valoarea aferentă.

În urma completării detaliilor de tip text, pentru efectuarea activării cu succes, UTC-ului îi rămâne de încărcat imaginea de profil. Acesta va fi redirecționat, în urma efectuării evenimentului de “click”, către pagina de selectare și editare a fotografiei preferate (Fig.21.6). Imaginea rezultată va fi redimensionată la dimensiunea de 200x200px, într-un thread separat, finalizat cu încărcarea în spațiul de stocare online al lucrării, oferit de Firebase.

Fig.21.5 Fig.21.6

Cea de-a doua componentă a profilului UTC este pagina cu locuri de muncă (Fig.22.1). Aceasta este compusă din 3 părți:

Nota finală obținută în urma voturilor acordate de către toți UTP;

Lista locurilor de muncă din cadrul companiei;

Adăugarea unui nou loc de muncă.

Notele și numărul comentariilor asociate locurilor de muncă din listă, cât și nota finală, sunt calculate și actualizate în timp real, cu ajutorul Firebase. Pentru a adăuga un nou loc de muncă, un dialog personalizat este activat (Fig.22.2). De aici pot fi selectate categoria și numele noului element, dintre opțiunile disponibile în baza de date, ce urmează a fi adăugat în listă.

Această fereastră, susnumită dialog, este un element grafic ce apare în prim plan dar cu o existență dependentă de cea a activității din care face parte, astfel că următoarele acțiuni ale utilizatorului vor fi realizate în interiorul acestuia. Dialogul nostru dispune de un buton de ieșire fără a salva modificările aduse și de unul care, intuitiv prin mesajul pe care îl transmite – ”Done” sau ”Gata” în limba română, trimite noile modificări către baza de date.

În interiorul acestuia se regăsesc două liste de elemente, înșirate orizontal. Prima este compusă din opțiunile valabile pentru alegerea unei categorii de locuri de muncă, acestea fiind încărcate ulterior în lista orizontală imediat următoare. O dată ales, locul de muncă în cauză va fi adăugat în lista cu opțiunile companiei.

Fig.22.1 Fig.22.2 Fig.22.3

Pentru a interacționa cu utilizatorii, reprezentantul companiei poate selecta unul din elementele disponibile în listă pentru a accesa pagina locului de muncă respectiv. De asemenea, UTC-ul poate șterge din locurile de muncă din listă, mai exact referința către acesta din baza de date. Locul de muncă își va păstra proprietățile și datele de legătură cu compania, pentru o eventuală realocare a sa în lista, dar nu va mai fi vizibilă utilizatorilor. Funcționează astfel pentru a nu se pierde voturile și comentariile introduse până la acel moment.

Interschimbarea stării de valabilitate a unui post este o altă acțiune posibilă direct pe elementele listei. Astfel reprezentantul companiei poate alege să permită sau nu unui UTP să aplice pentru locul de muncă respectiv. Un callback va intercepta decizia luată și va înregistra schimbarea în baza de date (Fig.22.4).

Utilizatorii care aplică pentru un post liber oferă reprezentantului companiei acces la informațiile profilului său, implicit metode de a fi contactat. Toate aplicațiile vor fi înregistrate în baza de date și primite de către UTC sub formă unei liste încărcate în fragmentul al 3-lea, componentă a profilului său (Fig.22.3).

Lista este alcătuită din antete reprezentând locurile de muncă pentru care au fost înregistrate aplicațiile, urmate de elemente asociate utilizatorilor care au solicitat ocuparea postului vacant. Accesarea unuia dintre aplicanți direcționează UTC-ul către o pagină mai detaliată a competențelor și datelor de contact ale UTP (Fig.22.4).

Pagina în cauză este împărțită în antetul cu date personale și o listă cu aptitudini ale aplicantului. Pentru a iniția un contact cu acesta, UTC are la dispoziție un meniu care, odată activat, scoate la iveală o serie de butoane de forma FloatingActionButton (Fig.22.6). Fiecărui buton îi este asociată o informație de contact și o metodă de a o folosi, de exemplu, butonul căruia îi este atribuit un număr de telefon va direcționa utilizatorul către inițierea unui apel telefonic.

În cazul unui aplicant considerat nepotrivit locului de muncă respectiv, reprezentantul companiei poate alege ștergerea aplicației pentru a nu-i mai fi afișată în listă. Cu toate acestea, în

Fig.22.5 Fig.22.6

cazul în care o persoană decide să mai aplice o dată, o poate face fără, aplicația fiind reînregistrată în opțiunile UTC.

3.1.2. Utilizatorul tip persoană

Spre deosebire de UTC, acesta beneficiază de mai multe funcționalități deoarece este „actorul principal al acestei piese” iar ideea lucrării se conturează în jurul beneficiilor aduse acestui tip de utilizator.

Înregistrarea UTP necesită același număr de parametrii ca și tipul de utilizator prezentat anterior. Procesul este unul simplu si rapid, fiind nevoie de numai 4 rânduri completate (Fig.23.1) – numele de utilizator, adresa de e-mail și o parolă introdusă de două ori pentru a evita o eventuală introducere incorectă.

Succesul înregistrării noului utilizator în baza de date îl va redirecționa către pagina principală. Aici găsim o listă compusă din două tipuri de elemente: recomandări, mai exact locuri de muncă și companii diverse, încărcate din baza de date (Fig.23.2 & Fig.23.3).

Fig.23.1 Fig.23.2 Fig.23.3 Fig.23.4

3.1.2.1. Căutarea unei companii

Pentru a accesa o anumită companie din lista principală este nevoie uneori de multă căutare manuală. Aplicația oferă utilizatorilor oportunitatea de a folosi o unealtă de căutare care va întoarce rezultatele direct din baza de date, fără a fi deja încărcate în listă.

Bara de căutare este activată în momentul selectării iconiței ce reprezintă o lupă, din bara de sus, denumită și ActionBar (Fig.24.1), moment în care poate începe tastarea.

Fig.24.1 Fig.24.2 Fig.24.3

Căutarea va începe la 500 de milisecunde după terminarea tastării cuvântului în bara de căutare (Fig.24.4). Această întârziere este folosită ca o măsură de siguranță pentru a determina momentul în care utilizatorul a terminat de introdus textul dorit. Altfel căutarea s-ar face după fiecare caracter introdus sau șters și s-ar efectua cereri inutile către baza de date.

Căutarea va returna câteva opțiuni într-un pop-up aflat imediat sub bara de căutare (Fig.24.2). Pentru afișarea tuturor rezultatelor este necesară selectarea butonului căruia îi este asociată acțiunea de finalizare a introducerii textului și începerea căutării, din colțul dreapta-jos a tastaturii.

Lista completă a rezultatelor va înlocui lista tuturor companiilor aplicând acest filtru de căutare (Fig.24.3). În momentul închiderii sesiunii de căutare aceasta va reveni la normal urmând comportamentul stabilit în momentul inițializării sale.

3.1.2.2. Lista locurilor de muncă

În momentul în care utilizatorul a selectat compania dorită din lista principală va fi redirecționat către pagina descriptivă a acesteia (Fig.25.1). Pagina este alcătuită din 3 componente: antetul, lista locurilor de muncă din cadrul acesteia și opțiunea de adăugare a unei noi meserii.

Cel dintâi, antetul, este cartea de vizită a companiei accesate de către utilizator. Conține informațiile necesare de contact pentru stabilirea unei convorbiri directe între cele două tipuri de utilizatori. Spre exemplu, numărul de telefon sau adresa de mail pot fi folosite prin intermediul altor aplicații deja instalate din sistem pentru acțiunile dorite, de apel, respectiv trimiterea unui mail. Acțiunea cea mai importantă posibila din antet, la nivelul aplicației, constă în adăugarea votului pentru companie la modul general.

Inițial, o parte din informațiile antetului sunt ascunse pentru a lăsa mai mult loc celorlalte elemente din pagină. Acestea pot fi dezvăluite cu ajutorul unui buton de forma unei săgeți, orientate în jos și care își schimbă orientarea în funcție de vizibilitatea informațiilor (Fig.25.2).

Lista locurilor de muncă este compusă din elemente de tip CardView. Fiecărui element din listă îi este asociat un callback pentru actualizarea numărului de comentarii și unul pentru actualizarea numărului de voturi, în timp real. O singură secțiune nu beneficiază de aceste callback-uri în același mod, anume elementul ”General” prezent în capătul listei cu rolul de a discuta generalități privind compania. Acesta va fi prezent pentru orice companie chiar și fără un moderator.

Voturile acestei secțiuni vor fi considerate cele globale, adică media tuturor voturilor din aduse locurilor de muncă și numărul de persoane care au votat. Acțiunea de click efectuată pe unul din elementele listei va direcționa utilizatorul către pagina de comentarii a locului de muncă respectiv.

O modificare pe care UTP o poate aduce informațiilor companiei este adăugarea unui job în lista deja existentă. Această acțiune este posibilă datorită faptului că nu toate companiile ce alcătuiesc baza de date vor avea un reprezentant. Astfel utilizatorii aplicației vor dori să-și împărtășească experiența cu postul ocupat și au nevoie ca acesta să facă parte din listă.

Adăugarea se va realiza cu ajutorul butonului plus din partea dreaptă-jos. În urma acțiunii de click acesta va declanșa un dialog cu două secțiuni principale: adăugarea locului de muncă și interacțiunea utilizatorului cu acesta (Fig.25.3). Prima parte este asemănătoare cu cea prezentă în profilul companiei, formată din două liste orizontale pentru categoriile disponibile și locurile de muncă asociate acestora.

Cea de-a doua secțiune are ca scop determinarea legăturii dintre UTP și locul de muncă pe care acesta dorește să-l adauge. Pentru finalizarea procesului de adăugare sunt obligatorii trei informații: statutul față de locul de muncă (fost angajat, actual angajat sau interesat pentru angajare), programul de lucru aferent statutului (part-time sau full-time) și nivelul cunoștințelor (junior, mid sau senior).

Adăugarea cu succes a noului element se va finaliza cu direcționarea utilizatorului către pagina locului de muncă respectiv unde poate începe să-și expună punctul de vedere.

Fig.25.1 Fig.25.2 Fig.25.3

3.1.2.3. Pagina de comentarii

Locul în care această aplicație își poate atinge scopul principal se află aici. Pagina de comentarii sau pagina unui loc de muncă întrunește ambele tipuri de utilizatori pentru discuții și împărtășire de opinii.

Ca primă condiție de utilizare a acestei zone de către un UTP este să furnizeze detalii despre modul în care a interacționat sau intenționează sa o facă cu acest loc de muncă. Astfel că pentru primul pas aplicația va servi un dialog destinat noilor utilizatori pe pagina locului de muncă respectiv din cadrul companiei selectate anterior (Fig.26.1). Informațiile necesare sunt asemănătoare cu cele furnizate în secțiunea a doua în contextul adăugării, de către un UTP, a unui nou loc de muncă pentru o companie, acțiune prezentată anterior.

Asemănător paginii anterioare găsim 3 componente folosite în alcătuirea acesteia: antetul, lista de comentarii care compun conversația și spațiul destinat creări unui comentariu.

Pornind de la antet avem votul ca acțiune principală. Pentru a da o notă, utilizatorul trebuie să apese pe elementul RatingBar din antet iar o fereastră se va deschide pentru acordarea notei dorite (Fig.26.2), un număr de la 1 la 5. Succesul înregistrării votului în baza de date va actualiza în timp real și votul general vizibil altor utilizatori. În antet se regăsesc și informații despre acest loc de muncă – abilitățile necesare și atribuțiile ce le revin angajaților (Fig.26.3).

Fig.26.1 Fig.26.2 Fig.26.3

Pentru adăugarea unui nou comentariu vom folosi elementul vizual de editare text, de tip EditText, din josul paginii. Proveniența mesajului poate fi înregistrată în trei moduri: din partea reprezentantului companiei, din partea utilizatorului de tip persoană și anonim trimis tot de către UTP.

Opțiunea trimiterii mesajului cu caracter anonim are rolul de a permite utilizatorilor care au o părere negativă să se exprime liber, fără a risca o concediere sau eventuale amenințări. Astfel că, la prima încercare de a adăuga un comentariu, de la crearea acestei activități, un mesaj automat va fi afișat (Fig.26.4). Rolul acestuia este de a înștiința utilizatorul că pentru dezvăluirea identității este nevoie de o acțiune din partea acestuia, fiind setat inițial pe mod anonim.

Lista de comentarii, de tip RecyclerView, afișează elementele orientate spre dreapta în cazul înregistrării acestuia de către utilizatorul actual al aplicației și pe partea stângă pe restul. Cele 3 tipuri de mesaje specificate anterior se vor diferenția prin diferența de culori și numărul detaliilor (Fig.26.5).

Astfel că mesajele provenite de la un reprezentant al companiei vor fi scrise pe fundal alb și fundal închis la culoare pentru recipientul părinte, însoțit întotdeauna de numele ”Company Representant”. Comentariile provenite de la UTP vor fi scrise pe fundal închis la culoare și fundal deschis pentru părinte.

Mesajele anonime vor oferi doar comentariul propriu-zis și data adăugării. Numele utilizatorului fiind înlocuit de ”Anonymous User” iar poza de profil cu o imagine semnificativă

Fig.26.4 Fig.26.5 Fig.26.6

modului anonim. Comentariul înregistrat cu identitatea dezvăluită va afișa și detaliile importante ca numele, poza de profil și interacțiunea cu acest loc de muncă ale utilizatorului.

Elementele listei sunt încărcate cu limită pentru a nu supraîncărca memoria dispozitivului, îngreunându-i procesele. Astfel comentariile primite din baza de date vor ajunge în ordinea crescătoare adăugării lor, într-un număr limitat, setat în aplicație.

În urma efectuării acțiunii de derulare a listei, callback-ul OnScrollListener, urmărește schimbările de vizibilitate a elementelor și se activează de fiecare dată când apar unele noi (Fig.26.7).

În cazul în care lista se apropie de ultimul element încărcat, se face un apel la baza de date pentru a verifica dacă mai există elemente de afișat în continuare, de asemenea cu aceeași limită. Astfel încărcare listei va fi mult mai rapidă încărcând doar necesarul de informații.

3.1.2.4. Aplicația de angajare

O funcționalitate cu impact puternic, regăsită în bara de titlu a paginii anterioare (Fig.26.6), o constituie butonul de aplicare pentru locul de muncă respectiv. Această opțiune este valabilă doar în cazul permisiunii acordate din partea companiei ofertante, așa cum s-a precizat în subcapitolul anterior. Astfel că, pentru a fi posibilă aplicarea, este necesară existența unui moderator pentru contul UTC-ului respectiv.

Acționarea acestui buton va trimite utilizatorul către o pagină încărcată cu informații extrase din profilul său (Fig.27.1). Această pagina servește ca model pentru modul în care îi va fi înfățișată reprezentantului companiei.

În antetul paginii sunt încărcate datele de contact iar imediat sub acesta se găsește o listă compusă din aptitudinile utilizatorului. Pentru evitarea posibilității efectuării unei aplicații fără date de contact, trimiterea acesteia către companie va fi restricționată în lipsa numelui, a numărului de telefon și a unei adrese de mail.

Așadar, după cum observăm în (Fig.27.2) absența informațiilor specificate anterior va conduce la afișarea unor mesaje de eroare iar utilizatorul va fi nevoit să-și actualizeze datele personale. Încercarea aplicării fără aceste detalii va activa o fereastră cu explicațiile necesare și opțiunea accesării paginii de profil pentru actualizare (Fig.27.3).

Înregistrarea cu succes a cererii va trimite utilizatorul pe pagina anterioară, însoțit de înștiințarea prin intermediul unei alerte temporare.

Fig.27.1 Fig.27.2 Fig.27.3

3.1.2.5. Pagina de profil

Pagina de profil a UTP poate fi accesată prin intermediul meniului de acțiuni ascuns in partea stângă (Fig.23.4). Dezvăluirea acestuia va oferi posibilitatea utilizării unor acțiuni diverse. Profilul utilizatorului este compus din 3 subcategorii:

Profilul propriu-zis: pagina în care se regăsesc și pot fi editate informațiile despre utilizator, inclusiv imaginea de profil (Fig.28.1). Câmpurile marcate cu steluță sunt obligatorii procesului de aplicare în vederea obținerii unui interviu, pentru un post vacant.

Pagina de activitate: aici se găsesc listate toate locurile de muncă și companiile cu care utilizatorul a interacționat, printr-un vot sau comentariu (Fig.28.2);

Aptitudinile: o listă raportată la locurile de muncă existente în baza de date. Ca parametru suplimentar al fiecărui element din listă regăsim nivelul de cunoștințe al utilizatorului în domeniul respectiv (Fig.28.3). Pentru adăugarea unei noi aptitudini se folosește butonul de adăugare din partea dreapta-sus a paginii și selectarea opțiunilor corespunzătoare noului element (Fig.28.4).

Toate detaliile care alcătuiesc profilul utilizatorului sunt esențiale pentru găsirea recomandărilor potrivite, fiind pe cât posibil diferite pentru fiecare. Informațiile personale rămân private pentru restul utilizatorilor, ele fiind accesibile doar companiilor în momentul aplicării pentru un loc de muncă.

Fig.28.1 Fig.28.2 Fig.28.3 Fig.28.4

3.2. Sistemul de recomandări

Scopul principal al aplicației este de a ajuta utilizatorii în căutarea unui loc de muncă. Alegerea poate fi dificilă dacă presupune o căutare manuală prin lista companiilor returnate din baza de date, apoi prin locurile de muncă ale fiecăreia în parte. Această acțiune se poate încheia adesea fără rezultate mulțumitoare și poate crea impresia unei aplicații inutile, determinând utilizatorii să renunțe la utilizarea ei.

Pentru a rezolva această problemă am decis să implementez un sistem de recomandări bazat pe interese comune și activitatea utilizatorilor în contextul Rate A Job. Astfel orice acțiune devine o componentă a profilului analizat ulterior pentru a găsi potriviri și a genera recomandări dinamice și personalizate.

Metoda implementată în acest scop constă în utilizarea tehnicii MinHash și a Similarității Jaccard. Aceasta soluție urmărește transformarea informațiilor deținute despre utilizatori în seturi de caracteristici pentru a găsi corelările necesare.

Sistemul de recomandări este predominant construit ca sistem bazat pe filtrare colaborativă deoarece se bazează, în principal, pe informațiile procurate direct sau indirect de către utilizator. Datorită faptului că se păstrează un profil de recomandare, folosit ulterior pentru sporirea timpului de execuție a generării rezultatelor, putem încadra soluția folosită pentru această lucrare ca fiind bazată și pe filtrarea conținutului. Astfel putem considera metoda utilizată ca parte din categoria sistemelor de recomandare hibride.

3.2.1. MinHash

În urma unor cercetări amănunțite am descoperit că utilizarea seturilor cu semnătura MinHash poate genera recomandări cu o acuratețe sporită în timp O(n). În general funcționalitatea MinHash este folosită pentru eficientizarea stocării unei cantități mari de date. Eu m-am inspirat din principiile acestei tehnici pentru a transforma activitatea utilizatorilor în mulțimi de date reprezentative.

În demonstrația ce urmează voi nota locul de muncă cu JOB. Acesta este piesa de rezistență a aplicației având câte o referință legată de fiecare acțiune a utilizatorului. Detaliile despre utilizator în raport cu un loc de muncă, care vor contribui la determinarea recomandărilor, sunt în număr de 5. Elementele care vor compune mulțimea unui JOB pot avea și valoare nulă, în cazul în care acestea nu există. Aceste elemente vor fi extrase din mulțimea valorilor posibile informației respective, din mulțimile prezentate în continuare.

Ca prim parametru putem extrage o particularitate a abilităților utilizatorului, și anume nivelul de cunoștințe, din mulțimea notată cu KLV:

KLV = {n, J, M, S},

unde n reprezintă valoarea inexistentă iar celelalte reprezintă cele 3 nivele de stăpânire a aptitudinilor – J = junior (începător), M = mid (mediu), S = senior (profesionist).

Un al doilea element pentru mulțimea unui JOB îl găsim în urma verificării interacțiunii utilizatorului cu locul de muncă respectiv, informație oferită în interiorul aplicației, în momentul adăugării unui loc de muncă pentru o companie sau la prima accesare a unui loc de muncă din cadrul unei companii.

Această interacțiune procură mulțimea care determină timpul de lucru, notat WT:

WT = {n, PT, FT},

având ca elemente pe n – valoarea nulă, PT- valoarea care indică un program de lucru scurt (part-time) iar FT – valoarea unui program întreg de lucru, ca număr de ore (full-time). Pe lângă WT’ mai găsim ca proprietate un al doilea KLV’. Ca valoare finală pentru mulțimea JOB-ului, reprezentând nivelul de cunoștințe, KLV’ va fi ales cel cu indicele nivelului de experiență mai avansat.

Comentariile și voturile vor lua și ele parte la determinarea recomandărilor. Voturile reprezentate de valoare notei acordate de către utilizator iar comentariile prin validarea existenței. Astfel avem mulțimea notată cu S compusă din valorile posibile pe care nota le poate lua:

S = {s | 0 ≤ s ≤ 5, s ∈ ℕ};

Mulțimea existenței comentariilor, notată COM este compusă din doi membri:

COM = {0, 1},

astfel că 0 reprezintă lipsa introducerii vreunui comentariu de către utilizatorul în cauză iar 1 faptul că a participat activ în conversațiile din cadrul locului de muncă.

Cea mai importantă componentă din mulțimea unui JOB care determină o valoare mai precisă rezultatului recomandării, o extragem din mulțimea atribuită unei companii, mulțime notată cu C și compusă din două elemente:

C = {n, Cid},

cu n valoarea nulă și Cid codul unic de identificare al companiei, un șir de caractere. Acest id împreună cu cel al JOB-ului vor avea rol de referință către compania, respectiv locul de muncă, care va contura un element de tip recomandare.

În acest punct dispunem de toate mulțimile necesare construirii JOB-ului. Vom nota cu J mulțimea de cinci elemente care definesc interacțiunea dintre un loc de muncă și un utilizator de tip persoană.

J = {klv, wt, s, com, c},

unde klv ∈ KLV, wt ∈ WT, s ∈ S, com ∈ COM și c ∈ C.

Pentru a adăuga o doză de unicitate membrilor mulțimii nou create vom adăuga fiecărui element al lui J codul unic de identificare al JOB-ului. În urma preluării fiecărui id al unui JOB și determinarea mulțimilor care-l compun, acesta urmează a fi adăugat în mulțimea de locuri de muncă a utilizatorului. Notăm această mulțime cu U și este alcătuită din reuniunea produselor carteziene dintre mulțimea JOB-urilor și id-ul, corespunzător.

U =

Așadar un utilizator U va fi compus din n rezultate ale interacțiunii sale cu un loc de muncă, diferențiate prin codul unic al JOB-ului.

3.2.3. Similaritatea Jaccard

Între similaritatea Jaccard și MinHash există o legătură impresionantă astfel încât probabilitatea ca o funcție de minhash pentru o permutare aleatoare de linii să producă aceeași valoare pentru două seturi este egală cu similaritatea Jaccard a mulțimii respective.

Așadar continuăm prin parcurgerea a n utilizatori în căutarea unei potriviri de minimum 60%, cu o valoare de minimum 0.6 a indexului Jaccard. Am decis că o potrivire de peste 60% reprezintă o valoare destul de mare încât să fie luată în calcul. Pentru a verifica această valoare determinăm raportul dintre intersecția si reuniunea mulțimii utilizatorului care așteaptă recomandări și a utilizatorului cu care se încearcă o potrivire:

unde U reprezintă mulțimea utilizatorului pentru care se caută pereche iar Ux potențialul utilizator pereche.

Rezultatul raportului reprezintă indexul Jaccard cuprins întotdeauna între 0 și 1. Procentajul de potrivire crește dinspre 0 spre 1, astfel că indexul 0 ne spune că nu există elemente comune între mulțimile verificate, cu potrivire 0%, iar 1 că mulțimile sunt identice.

Pentru fiecare utilizator din baza de date se verifica potrivirea cu utilizatorul care are nevoie de recomandări până în momentul găsirii a maximum 10 elemente. Indexul cu valoarea de minimum 0,6 este considerat o potrivire și se continuă cu procesul de generare a recomandărilor.

Acestea vor fi, în esență, id-urile companiilor găsite în mulțimea elementelor care apar doar Ux. În situația în care acest id este inexistent rezultă faptul că nici unul dintre utilizatori nu a interacționat cu una dintre companiile prezente în aplicație. Pentru a genera mulțimea recomandărilor din elementele unice ale Ux , căutam toate elementele de forma produsului cartezian dintre C și id-ul JOB-ului care aparțin diferenței dintre Ux și U și notăm cu R mulțimea rezultată:

R = {r | r ∈ (C × J), r ∈ (Ux \ U)}

În cazul unui număr mai mic de 10 elemente rezultate algoritmul va căuta în continuare încă un utilizator. Membrii mulțimii sunt de forma unei perechi ordonate compuse din două șiruri de caractere, id-ul locului de muncă și cel al companiei.

Această listă de recomandări se actualizează la fiecare schimbare a unuia dintre elementele de profil ale utilizatorului care influențează recomandările sau o dată pe zi, la inițializarea listei de companii.

3.3. Structura bazei de date

Structura NoSQL utilizată de Firebase este construită în format JSON iar orice schimbare asupra datelor înștiințează dispozitivele și platformele active ce creează o sincronizare în timp real.

Arborele JSON rezultat în urma colectării informațiilor trebuie planificat astfel încât să fie evitate „cuiburile” de informații.

În momentul accesării unui nod al arborelui, sunt primite ca rezultat toate nivelurile sale, fapt care ar putea îngreuna timpul de răspuns în cazul numărului mare de noduri care alcătuiesc „cuibul ”. De altfel reprezintă și o breșă de securitate deoarece oferă acces la o cantitate mare de date.

Observăm în Fig.29.1 corpul unui comentariu acordat de către un utilizator – identificat prin „userId”, unui loc de muncă – identificat prin „jobId”, parte componentă a unei companii – identificată prin „companyId”.

Am preferat să folosesc referințe către nodurile de legătură ale arborelui pentru a obține detaliile necesare. În cazul în care aș fi încărcat toți parametrii nodurilor respective s-ar fi creat „cuiburi” de noduri în interiorul fiecărui comentariu și ar fi îngreunat fluiditatea aplicației în momentul apelului pentru obținerea listei de mesaje.

Așadar flexibilitatea acestui model de bază de date conferă posibilitatea de a naviga foarte ușor prin nodurile principale, în număr de 10 (Fig.29.2). Fiecare componentă a aplicației are propriul nod în arbore, ca parte a nodului părinte. Astfel cunoscând codul unic al unei componente si numele nodului părinte putem obține toate informațiile ce o compun.

Extragem, la nivel teoretic, ca noduri principale nodurile corespunzătoare utilizatorilor și domeniilor companiilor, „users” respectiv „domains„ (Fig.29.3). Această opinie poate fi ușor observată și aprobată deoarece aceste noduri ating cele două artere principale ale proiectului – utilizatorii aplicației și obiectul care determină scopul lor de a utiliza aplicația.

Nodul „domains” apare ca nod principal deoarece reprezintă legătura directa cu lista companiilor si a locurilor de muncă. Lucrarea acoperă numai domeniul informatic, folosind cheia „software”. Pentru mai multe detalii asupra motivului consultați subcapitolul 3.4.2.

Fig.29.2 Fig.29.3

Pentru a accesa elementele bazei de date, din interiorul aplicației, este necesară crearea unei instanțe a DatabaseReference (Fig.29.5), o referință către baza de date. Putem adăuga acestei referințe un set de interogări pentru a returna elementele într-o anumită ordine sau număr și un callback pentru a asculta și prelucra răspunsul primit (Fig.29.6). Sistemul interogărilor este mult mai limitat față de cel al bazelor de date SQL, dar reușește să satisfacă nevoile apelurilor efectuate pentru obținerea informațiilor necesare aplicației.

Beneficiile aduse de acest tip de callback, ValueEventListener, constau în faptul că ascultă modificările aduse informațiilor de care este răspunzător pe toată durata sa de viață. Astfel continuă să primească rezultate prin intermediul metodei onDataChange, parte a interfeței ValueEventListener prezentă în Fig.29.6. Pentru a închide un astfel de ascultător trebuie disociat referinței căreia i-a fost alocat.

La fel de importantă ca citirea datelor este și actualizarea lor care, în acest context, are rol și de adăugare. Instanța unui obiect Comment este convertită într-un HashMap, format acceptat de către Firebase pentru a completa câmpurile lipsă ale întregului obiect sau pentru a le adăugă în cazul în care acestea nu există. De altfel pot fi actualizați sau adăugați și parametrii separat.

Acțiunea de adăugare se realizează de asemenea cu o referință a bazei de date și poate efectua mai multe adăugări și actualizări în același timp (Fig.29.7). Răspunsul va fii interpretat de către un ascultător pentru a determina dacă înregistrarea a fost efectuată cu succes.

3.4. Planuri de viitor pentru îmbunătățirea aplicației

Având o structură complexă, aplicația poate beneficia de îmbunătățiri și ca orice gigant de pe piață, nu poate atinge niciodată forma finală. Așadar fiecare sesiune de lucru generează o nouă versiune a aplicației însoțită de îmbunătățiri și fixuri.

Versiunea codului prezentată în această lucrare este prima și poartă numele de „1.0”. Ca plan de viitor pentru următoarea versiune am luat în considerare implementarea unor noi funcționalități care vor îmbunătăți experiența utilizatorului.

Printre acestea se numără implementarea a mai multor domenii de lucru. Motivul utilizării unui singur domeniu se datorează cunoștințelor personale limitate pentru alte domenii, iar implementarea acestora va necesita asistența unei persoane specializate într-o altă arie de lucru

O altă funcționalitate importantă de implementat pe viitor o reprezintă implementarea unui sistem de monitorizare a utilizatorilor rău intenționați. Pentru realizarea acestui serviciu este necesar un moderator care să analizeze comportamentul utilizatorilor raportați.

Pentru recunoașterea utilizatorilor am în plan integrarea rețelelor sociale ca metode de înregistrare și autentificare. De altfel voi adăuga și o secțiune de utilizator neînregistrat, cu acces limitat la funcționalitățile aplicației. Pentru construirea acestui proiect am considerat suficientă metoda de înregistrare și conectare prin email și parolă.

Concluzie

Un proiect de succes are nevoie de o idee bună, de motivație și pasiune din partea dezvoltatorului. Consider că întregul proces de învățare și toate etapele care au condus la varianta finală a acestui proiect se datorează dorinței mele de cunoaștere și explorare a acestui domeniu de dezvoltare.

Îmi doresc ca produsul dezvoltat ca rezultat al acestei lucrări să-și atingă scopul de a ajuta și îndruma utilizatorii în căutarea unui loc de muncă pe baza cunoștințelor personale și a așteptărilor sale față de angajator.

Algoritmul sistemului de recomandări va aduce un bonus de confort în momentele în care utilizatorii se vor simți nesiguri în privința alegerii corecte și își va juca rolul de a genera rezultate potrivite prin compararea profilurilor asemănătoare în rândul utilizatorilor.

Rate A Job dispune de funcționalități utile utilizatorilor săi și creează un mediu stabil din punct de vedere al comunicării, oferind libertate în exprimarea punctului de vedere. Cu o interfață simplistă și o paletă de culori confortabilă, utilizatorii vor avea parte de o experiență plăcută pe parcursul interacțiunii cu aplicația mobilă.

Anexe

Anexa 1

Fișierul „widget_lly_user_info.xml”:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingBottom="@dimen/default_padding_half"
android:paddingLeft="@dimen/default_padding"
android:paddingRight="@dimen/default_padding"
android:paddingTop="@dimen/default_padding_half">

<TextView
android:id="@+id/tv_user_info_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/default_no_title"
android:textColor="@color/theme_gunmetal"
android:textSize="@dimen/text_xsmall" />

<TextView
android:id="@+id/tv_update_success"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/update_success"
android:textColor="@color/theme_forest_green"
android:textSize="@dimen/text_xxsmall"
android:visibility="invisible" />

<ProgressBar
android:id="@+id/pb_update"
android:layout_width="@dimen/text_xsmall"
android:layout_height="@dimen/text_xsmall"
android:indeterminate="true"
android:visibility="gone" />

</LinearLayout>

<android.support.v7.widget.CardView
android:id="@+id/cv_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/default_padding_half"
android:layout_marginLeft="@dimen/default_padding"
android:layout_marginRight="@dimen/default_padding">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingLeft="@dimen/default_padding"
android:paddingRight="@dimen/default_padding">

<EditText
android:id="@+id/edt_add_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@android:color/transparent"
android:hint="@string/default_no_hint"
android:imeOptions="actionDone"
android:maxLines="1"
android:paddingBottom="@dimen/default_padding"
android:paddingTop="@dimen/default_padding"
android:textColor="@color/theme_gunmetal"
android:textSize="@dimen/text_xsmall" />

<bdg.gabriel.rateajob.widgets.FontAwesomeTextView
android:id="@+id/tv_edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/selector_gray_green"
android:padding="@dimen/default_padding_half"
android:text="@string/fa_pencil"
android:textSize="@dimen/text_xmedium" />

<bdg.gabriel.rateajob.widgets.FontAwesomeTextView
android:id="@+id/tv_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/default_padding_half"
android:padding="@dimen/default_padding_half"
android:text="@string/fa_times"
android:textSize="@dimen/text_small" />

<bdg.gabriel.rateajob.widgets.FontAwesomeTextView
android:id="@+id/tv_update"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="@dimen/default_padding_half"
android:text="@string/fa_check_circle"
android:textColor="@color/theme_forest_green"
android:textSize="@dimen/text_xmedium" />

</LinearLayout>

</android.support.v7.widget.CardView>

</LinearLayout>

Similar Posts