1. Introduci la tua esperienza professionale dall’università fino all’ingresso in ORBYTA.

Subito dopo la laurea triennale in Architettura, conseguita ad Instabul, ho iniziato a lavorare come architetto presso un’azienda di ristutturazione edilizia. Mi è sempre balenato in testa il desiderio di voler continuare a studiare, così ho inziato a guardarmi attorno ed ho trovato un percorso di studi in Italia, al Politecnico di Milano. Nonostante la lontananza e l’ostacolo della lingua, decisi di intraprendere questo viaggio e di iscriviermi ugualmente.

E’ stata la scelta migliore che potessi fare!

Durante il percorso ho avuto modo di specializzarmi nell’innovazione urbana, avendo una prospettiva più centrata sulle città ‘intelligenti’ e sulla progettazione. Al termine della Laurea Magistrale ho trovato lavoro come architetto in un piccolo studio milanese in cui ho iniziato a progettare in BIM. Orbyta è stato un incontro casuale che mi ha dato l’occasione di diventare una professionista, ed oggi sono più di 2 anni che lavoro in questa grande e bellissima realtà.

2. Di cosa ti occupi e che valore porti all’azienda?

In Orbyta sono BIM Manager, progetto modelli che consentono visualizzazioni 3D, riuniscono dati, disegni e pianificazioni, in modo da renderli sinergici nella fase di progettazione e costruzione di un progetto.

3. Perché ti piace lavorare in ORBYTA?

In Orbyta viene data una grande opporunità di crescita delle nostre potenzialità, decidere quale percorso professionale e formativo intraprendere mi permette di lavorare su ciò che mi piace di più mettendoci tanta passione. Orbyta mi ha dato tutti gli strumenti per diventare BIM Manager e mi ha reso chiara la crescita per il mio futuro, aiutandomi a migliorare le mie compentenze attraverso corsi e certificazioni.

Essere in Orbyta significa essere parte di un flusso dinamico che permette di lavorare bene e senza limiti!

#jointherevolution

1.Introduci la tua esperienza professionale dall’università fino all’ingresso in ORBYTA

Inizio la mia esperienza professionale nel lontano 2003 quando i siti web venivano fatti ancora in Flash. Dopo 10 anni di collaborazioni tra diverse agenzie creative del torinese, decido di intraprendere la strada da freelancer. Negli ultimi anni mi sono occupato di consulenze di design digitale per aziende tecnologiche fino ad approdare in Orbyta.

2.Di cosa ti occupi e che valore porti all’azienda?

In Orbyta mi occupo di Digital Design, a partire dalla strategia di comunicazione e Brand Identity di prodotti e servizi fino alla User Experience e prototipazione di interfacce. Mi sono approcciato da poco alla sperimentazione delle potenzialità del Web3 e ho iniziato a definire una strategia per introdurre Orbyta al Metaverso.

Credo nell’ottimizzazione delle metodologie Design Thinking in Orbyta, questo permette di aumentare la capacità di prendere decisioni efficaci sfruttando il coinvolgimento di vari stakeholder, interni ed esterni, mettendo il team nelle condizioni di sviluppare il pensiero creativo, in cui la visione dei problemi si sposa con l’individuazione di potenziali soluzioni innovative.

3.Perchè ti piace lavorare in Orbyta?

Orbyta è un ambiente che lascia spazio all’autonomia e alla sperimentazione, ricettivo alle nuove proposte e capace di trasmettere il valore della propria vision aziendale.

#jointherevolution

  1. Introduci la tua esperienza professionale dall’università fino all’ingresso in ORBYTA .

Ho iniziato la mia carriera lavorativa nel 2006 dopo aver conseguito il diploma in Economia Aziendale in varie ditte svolgendo attività prettamente amministrative e contabili. Nel 2008 ho avuto la mia prima esperienza in uno studio commercialista ed è allora che ho capito di essere nata per quello. Ero l’unica impiegata e come tale ho avuto modo di conoscere tutte le sfaccettature di questa realtà, capendo così di essere nata per questo. Ho poi proseguito la mia carriera lavorativa in uno studio commercialista di medie dimensioni , dove ho approfondito le mie conoscenze e acquisito nuove competenze.

Nel 2018 ho deciso di cambiare nuovamente studio perché ero sicura di avere ancora molto da imparare. Ed è così che ho iniziato nello studio del Dott. Esposito, amico d’infanzia dai tempi delle elementari, il quale fin da subito mi ha dato fiducia facendomi ricoprire ruoli molto gratificanti. E’ così iniziata una collaborazione proficua che migliora e si solidifica ogni giorno che passa!

Con l’entrata del nostro studio nel gruppo ORBYTA, realtà giovane che punta molto sulla formazione dei propri dipendenti, posso dire di aver trovato il mio posto!

2. Di cosa ti occupi e che valore porti all’azienda?

In Orbyta ricopro il ruolo di responsabile tecnico della sede di Orbassano della società Orbyta Tax & Finance , le mie mansioni sono varie e molteplici, dalla pura gestione contabile delle aziende, alla mia specializzazione che riguarda l’assistenza ai clienti nelle loro pratiche camerali e comunali, e la redazione delle loro dichiarazioni dei redditi.

Credo che la mia esperienza lavorativa , e la continua formazione che la società mi permette di effettuare , mi permetta di essere un punto di riferimento per le mie colleghe e per i miei colleghi,  per quanto riguarda la risoluzione delle problematiche che ogni giorno si presentano. 

3. Perché ti piace lavorare in Orbyta?

Mi piace molto la mentalità aziendale che punta molto sui giovani e ,come detto prima, sulla loro formazione. E’ un ambiente molto dinamico e stimolante che ti da la possibilità , lavorando con serietà e professionalità, di crescere sempre di più, sia personalmente ma soprattutto lavorativamente.

#jointherevolution

Premessa

Questo articolo nasce dagli appunti del mio “diario di bordo” riguardo la mia più nuova e recente avventura nel mondo dei Game Engine e di conseguenza ne erediterà la scrittura caratteristica personale. In fin dei conti penso che almeno una volta nella vita di tutti gli sviluppatori è nata quella voglia di creare e plasmare forme di intrattenimento con il loro codice, e non soltanto di muovere qualche finestra/container e riempirlo di campi, pulsanti e tanta altra roba noiosa.

L’articolo si compone di due macro-parti:

  • Introduzione al Game Engine GODOT
  • Esempio pratico della realizzazione di un gioco 2D
  •  

Non peccherò di superbia, poiché essendo un novello dell’ambiente il mio codice e le mie tecniche potrebbero far storcere il naso ai più skillati in materia. Ma per me il tutto funziona come dovrebbe, il codice è leggibile e soprattutto adoro il pensiero del “less is more”.

 Insomma, le porzioni di codice che incontreremo più avanti sono state fatte DA e PER uno sviluppatore che muove i primi passi con questo Game Engine, rimanendo tuttavia una solida base per studi ed espansioni personali.

Introducing GODOT

Le circostanze del mio avvicinamento a GODOT sono al quanto bizzare

Da avido utilizzatore della piattaforma/forum Reddit, sono solito frequentare categorie tecniche relative alla programmazione, all’hardware e assemblaggio di PC ed al PC Gaming in generale.

Il caldo insopportabile di quest’anno (2022) legato alla cappa costante tipica romana hanno in quel periodo fatto nuovamente tornare alla mia mente la voglia di approcciarmi per una volta e seriamente ad un motore di sviluppo di giochi.

Ed ecco il punto di svolta, nella categoria dello sviluppo gaming di Reddit leggo in alcuni post di un nuovo nome, a me completamente sconosciuto: GODOT. Incuriosito decido di andare a dare uno sguardo alla sua community, la cui attività è spesso e volentieri un buon indice di prima valutazione per qualsiasi prodotto informatico/framework.

Ebbene, mentre i colossi competitor nel mondo del Game Engine (Unreal Engine e Unity) rilasciavano le loro nuove major release con features spaziali e le rispettive community portavano avanti discussioni su possibili miglioramenti, nuove strategie, fix per le performance…la community di GODOT sfornava nell’80%+ dei propri post questo:

“Godette”. La mia prima reazione è stata ovviamente che “ogni giorno ci allontaniamo sempre di più da Dio”. Siamo dunque SICURAMENTE davanti ad un prodotto che o è estremamente nuovo ed è ancora alla ricerca di una sua identità/logo/mascotte oppure che non ha al momento problemi tecnici più seri di cui dover discutere…

Nonostante tutto rimango colpito da una sua tanto proclamata caratteristica: questo motore è LIGHT, leggero, performante, anche su macchine meno recenti.  Vi basti pensare che l’intero motore è racchiuso in unico download da ~70MB. Ed io che in quel momento a casa avevo soltanto tra le mani un vecchio portatile i3/4GB RAM del 2011 ho voluto mettere alla prova questa loro tanto decantata feature.

Mentre il mio povero laptop crashava per surriscaldamento al solo sussurro delle parole Unreal e Unity, ecco che scarico, lancio l’eseguibile ed avvio GODOT nel giro di pochi secondi, al limite del miracolo. Riuscendo a sopportare una prima ora di smanettamenti caotici senza crash, decido che questo prodigioso game engine sarebbe stato mio compagno per questa mia prima impresa.

Breve Panoramica

  • Prima release pubblica nel 2014
  • Autori Argentini Juan Linietsky e Ariel Manzur
  • Free (MIT License)
  • Open Source (https://github.com/godotengine/godot)
  • Cross Platform (Windows, Linux, macOS, …)
  • 2D/3D/VR e Cross Platform (Desktop, Mobile, Web)
  • Ultima Versione stabile 3.5 (di Agosto 2022)

SA questo punto che son state fatte le prime presentazioni mi piace fare un gioco di persuasione inverso…Sarebbe semplice entrare nel dettaglio del cosa rende GODOT unico e migliore rispetto ai competitors ma questa volta preferire cominciare dal punto di vista contrario.

  • La maggior parte delle offerte di lavoro si basano ancora su Unity e Unreal Engine

  • Impossibilità di esportare per le piattaforme console, o almeno non senza cacciar fuori qualche soldo :'(

  • Lo store degli assets in GODOT offre soltanto elementi gratuiti
    (a discapito della loro qualità)

  • Nei giochi 3D le performance non sono delle migliori…

  • E’ un motore “giovane”, quindi con minori risorse e materiale online da cui attingere come riferimento/studio

Insomma, uno scenario abbastanza pesante e negativo, ma se ci pensate bene qualunque framework ed engine ha pur iniziato da qualche parte, ed in prospettiva, le feature sviluppate e a disposizione su GODOT nel giro di 8 anni dalla sua prima release sono di gran lunga superiori per numero e qualità a quelle dei due big brothers UE e Unity.

Se ancora non vi ho scoraggiato direi possiamo proseguire con una lista più rosea e positiva.

  • Ripeto: è FREE, e non prende commissioni sui giochi realizzati
  • LIGHT: con i suoi 70MB di eseguibile, GODOT probabilmente potrebbe girare anche sul forno a microonde di casa (assieme a Doom ovviamente)
  • Open Source con un attività esponenzialmente crescente
  • Beginner-friendly (sia grazie all’UI intuitiva che alla semplicità del suo linguaggio GDScript
  • Ottima documentazione (Link)
  • Alta riusabilità degli elementi/codice

Tornando a noi ho deciso di non includere un’altra feature tanto decantata in questa lista, ovvero la possibilità di usare il C# al posto del proprietario GDScript. Il motivo è semplice la versione 3 è stata la prima a supportare anche il C#, sicuramente con una base di sviluppatori già affermata nel mondo professionale, ma la sua implementazione nell’engine è a mio parere ancora acerba ed incompleta.

Ma non disperate, la sua finalizzazione in GODOT avverrà con enorme probabilità con il rilascio della versione 4, già in sviluppo parallelo alle 3 da quasi due anni. Tuttavia, trascorse queste prime settimane con l’engine posso affermare di non essermi trovato affatto male con il linguaggio proprietario GDScript: con una sintassi simile a Python, parliamo di un linguaggio di alto livello semplice ed immediato, ottimizzato per il motore. Mentre nei miei scarsi tentativi con C# mi son presto reso conto che il micromanagement necessario per una corretta gestione delle risorse uccideva completamente il mio tempo e la perfomance dei miei prodotti.

Altra feature che ho volontariamente omesso nella lista dei vantaggi è la possibilità di sviluppare usando la modalità Visual Scripting, già presente su Unreal Engine (Flow Control).

Diciamo semplicemente che questa roba non fa per me, o comunque immagino che qualsiasi sviluppatore anche junior potrebbe scrivere e mantenere del codice in GODOT molto meglio di quanto prodotto dallo strumento di Visual Scripting.

Feature simpatica, sicuramente una risposta diretta al Flow Control di UE e rivolta ad un pubblico che ancora si deve affacciare al mondo della programmazione, ma ci vuole davvero poco per rendersi indipendenti ed autonomi, passando direttamente all’editor classico di codice.

Struttura a Nodi & Scene

Anche un neofita come me apprezzerà l’altissima riusabilità e gestione delle risorse dovute all’ingegnoso sistema a nodi e scene di GODOT:

  • In GODOT un gioco può essere visto come un ALBERO di SCENE

  • Ed ogni SCENA è paragonabile ad un ALBERO di NODI

  • I NODI sono l’unità fondamentale e più piccola dei nostri giochi

  • Ci sono tantissimi NODI in GODOT specializzati in precise funzioni (musica, suoni, animazione, pulsanti, collisioni, …)

  • Un gruppo di NODI può essere infine salvato come SCENA per essere facilmente riutilizzato in…altre SCENE

Ed ora…lo creiamo o no questo giochino?

Mi rendo conto solo dopo svariati tentativi che mettere per iscritto una cosa così VISIVA come l’uso di un game engine sia davvero un’ardua impresa.

Di seguito cercherò di mostrarvi e descrivervi tutte le schermate che ci porteranno alla creazione di un giochino alla Flappy Bird (link video per chi non lo conoscesse). Poiché non sarà possibile descrivere ogni singolo incremento del codice ho deciso di mostrarvi fin dal principio l’intera scaletta del nostro sviluppo per poi entrare nel dettaglio di tutte le maggiori entità.

Ecco dunque di seguito le risorse che vi metto a disposizione:

Scaletta “Floppy Bird”

  • MenuNode con button START e CAMERA
  • WorldNode con button BACK e CAMERA
  • PlayerNode (sprite, collision) e aggiungiamolo al WorldNode
  • PlayerNode (gravity)
  • PlayerNode (FLAP)
  • WallNode (sprite, collision, movement) e aggiungiamolo al WorldNode
  • Arriviamo fino a 5 WallNode
  • Integriamo la logica di collisione del PlayerNode col body del WallNode
  • Creiamo la classe GLOBALE “Globals.gd” e aggiungiamola all’ AUTO LOAD del progetto
  • Aggiungiamo la PointArea al WallNod
  • Integriamo la logica di collisione del PlayerNode con la PointArea del WallNode
  • Mostriamo i vari score durante la partita con una Label
  • Quando muoio, salvo eventualmente il BEST SCORE
  • Creiamo una “reset area” per riposizionare e creare un loop di muri
  • Salviamo l’eventuale best score in un file quando moriamo
  • Quando si auto carica GLOBALS.gd leggiamo il best score nel file
  • A questo punto aggiungiamo il BEST SCORE anche nel menu iniziale
  • Aggiungiamo una fonte di luce (Light2D) al WorldNode
  • Aggiungiamo degli occlusori di luce al nostro WallNode
  • Cambio dello sprite del player con un ANIMATED SPRITE flying bird
  • ANIMATED SPRITE Infuocata quando supero il best score
  • MovingWall

Globals.gd (scritp)

Script nella root del progetto. Conterrà i nostri elementi “globali” come ad esempio lo score attuale ed il best score. Per essere caricato automaticamente all’avvio del gioco dovremo impostarlo nella sezione AutoLoad del progetto

Come ultimo passaggio per completare il grafo di esempio che vogliamo riprodurre ho creato e popolato in modo del tutto analogo anche la tabella arco che rappresenta il legame tra due persone, chiamata AmicoDi ovvero un arco che collega la tabella Persone a sé stessa (stavolta senza attributi).

A questo punto abbiamo ricreato esattamente la struttura che volevamo, e possiamo eseguire qualche query per renderci conto di come estrarre informazioni dal sistema appena costruito.

StartMenuNode.tscn (SCENA)CH

Scena aggiunta alla folder “scenarios”. Leggerà da un file il best score registrato (letto da Globals) ed il pulsante start ci porterà al vero e proprio gioco. Di seguito lo script associato alla scena e che regola i suddetti comportamenti.

StartMenuNode.gd (script)

WallNode.tscn (SCENA)

La scena del nostro muro è posizionata nella folder entities e si compone di 3 parti: porzione superiore, porzione inferiore del muro (il contatto col player indicherà il fine/reset partita) e l’area centrale denominata PointArea. Il player che entra in una PointArea incrementerà il suo punteggio di 1. Il muro dovrà muoversi a velocità costante verso la parte sinistra dello schermo, mentre il giocatore potrà “volare” verticalmente rimanendo sempre al centro.

WallBody.gd (script)

PlayerNode.tscn (SCENA)

La scena del nostro player è posizionata nella folder entities ed è formato principalmente da un corpo principale (con sprite), un’area leggermente più grande di lui per registrare le collisioni ed un’eventuale sprite animata che si attiva al superamento del best score. Il player viene sempre attirato giù da una costante gravità e l’unico modo che avrà di volare sarà quello di sbattere le ali premendo il comando FLAP che legheremo al pulsante spazio nelle impostazioni di progetto.

PlayerBody.gd (script)

WorldNode.tscn (SCENA)

La scena del nostro mostro di gioco è posizionata nella folder scenarios.

Gli elementi che la compongono saranno il player, delle copie di muri statici, un muro mobile, un’area di reset dei muri (per riportali a sinistra senza generarne di nuovi all’infinito) ed un pulsante per tornare al menù iniziale. Immancabile ovviamente la label a centro schermo per indicare i vari score.

WorldNode.gd (script)

Che aspettate? Premete F5 per avviare la compilazione del tutto ed avviare la vostra personalissima copia di Floppy Bird!

Articolo a cura di Luca Cerini, Senior Developer in Orbyta Tech, 23/08/2022

#jointherevolution

1. Introduci la tua esperienza professionale dall’università fino all’ingresso in ORBYTA. 

Dopo aver conseguito il diploma scientifico al liceo Piero Gobetti – nel 2013 – decido di intraprendere un percorso formativo biennale in design e sviluppo frequentando il corso di Mobile App Design dell’ITS ICT di Piazza dei Mestieri. Grazie a degli ottimi insegnanti, spesso liberi professionisti, acquisisco nozioni di digital marketing, digital branding, user experience, user interface, tipografia, sviluppo web e sviluppo mobile nativo. Nel 2015 inizio a lavorare in una web agency ma subito mi rendo conto che il lavoro non rispecchia le mie aspettative. Così qualche mese dopo decido di aprire partita IVA e di prendere una scrivania nel coworking di Talent Garden per dedicarmi a progetti più stimolanti. La mia esperienza in Talent Garden durerà ben cinque anni, anni nei quali ho conosciuto dozzine di realtà, professionisti e startup differenti. Lavorando su molti progetti, spesso in team con altri freelance, sono maturato molto velocemente in differenti ambiti. Lo sviluppo del codice è solo l’ultimo tassello di un processo ben più ampio fatto di analisi progettuali e di scelte commerciali da concordare con i clienti. Finalmente sono libero di scegliere gli stack tecnologici più innovativi e interessanti, ma soprattutto mi diverto come un matto. Questa esperienza mi ha regalato uno dei migliori periodi della mia vita, forse perché mi ha obbligato a mettermi alla prova fino in fondo. Sapendo di non aver nessun capo, nessun orario da rispettare ed al tempo stesso nessun stipendio assicurato a fine mese, ho sviluppato la consapevolezza che l’unico valore aggiunto che si può portare a un cliente è l’eccellenza e la propria bravura. Nel 2020, durante il lockdown, ho deciso di chiudere partita IVA. La mia scelta è stata di nuovo motivata dalla volontà di continuare a crescere professionalmente e sperimentarmi in un ambito più strutturato. In quei mesi effettuo il mio primo colloquio con Orbyta e Antonio riesce a stimolarmi al punto di farmi poi accettare con grande entusiasmo. 

2. Di cosa ti occupi e che valore porti all’azienda? 

In Orbyta mi occupo di analisi e sviluppo software. Lavoro su vari progetti per differenti clienti, su alcuni gestisco anche la parte di account e project management. Seguo inoltre diversi sviluppatori junior nei loro rispettivi percorsi di crescita. Per me è davvero importante instaurare dei rapporti professionali basati sulla fiducia reciproca e sulla volontà di essere utili per chi ci è a fianco. Cerco di non dare mai per scontata la qualità che le persone mettono nel loro lavoro. Per esperienza so che si lavora meglio quando si adotta un approccio orizzontale all’interno del team, creando partecipazione attorno agli obiettivi da raggiungere, responsabilizzando ed incoraggiando le persone a migliorare. 

3. Perché ti piace lavorare in ORBYTA? 

Orbyta è un’azienda in cui si respira un’aria dinamica, piena di entusiasmo. Perché siamo giovani e siamo bravi nel lavoro che facciamo. Perché ben poche cose vengono lasciate al caso e c’è molta attenzione verso i dipendenti. Abbiamo la libertà di scegliere Il nostro percorso professionale sapendo che l’azienda ci aiuterà a realizzarlo, fornendoci tutti gli strumenti per conseguire le certificazioni e i corsi che ci interessano. Sappiamo che se siamo in difficoltà non siamo soli, che se abbiamo una richiesta c’è sempre qualcuno disposto a valutarla. Tra le persone che ci lavorano c’è quella giusta sinergia che serve per essere soddisfatti e lavorare bene. Orbyta è una comunità di persone che vogliono incidere positivamente insieme. 

#jointherevolution

  1. Introduci la tua esperienza professionale dall’università fino all’ingresso in ORBYTA.

Conclusi gli studi in Intermediazione Finanziaria presso l’università di Siena, la forte vena imprenditoriale mi ha portato a preferire al lavoro finanziario o bancario, l’avvio di una attività in proprio con l’obiettivo di provare sul campo ciò che fino a quel momento avevo trovato solo sui libri. 18 mesi dopo, tra gestione della piccola attività e avvio di tirocinio professionale ho conseguito l’abilitazione come Commercialista. A quel punto era obbligatorio fare una scelta e dopo 2 anni di attività di consulenza fiscale a Catania, l’1 marzo 2022 ha avuto inizio la mia storia con Orbyta.



2. Di cosa ti occupi e che valore porti all’azienda?

In Orbyta lavoro come commercialista mi occupo insieme al resto del Team di dare supporto fiscale e tributario ai clienti sia privati che aziende. La struttura organizzata del settore Tax & Finance di Orbyta mi permette di concentrarmi sulla parte consulenziale che preferisco, lo sviluppo delle idee e la consulenza aziendale, soprattutto nel mondo delle startup.



3. Perché ti piace lavorare in ORBYTA?

Quando si pensa al Commercialista si pensa ad un lavoro triste, noioso e vecchio, spesso è cosi, ma in Orbyta la musica cambia e il Commercialista diventa Rock. I clienti appartenenti ai settori più disparati, i ritmi di lavoro serrati e i colleghi con un’età media di poco più di 30 anni, rendono Orbyta davvero diversa.

Entri in questa galassia e ti senti di averne fatto sempre parte.

#jointherevolution

1. Introduci la tua esperienza professionale dall’università fino all’ingresso in ORBYTA.

Ho iniziato la mia carriera lavorativa all’età di 20 anni in amministrazione e contabilità. Grazie alla giovane età, la curiosità e la voglia di imparare mi hanno spinta a mettermi sempre in gioco e posso dire che, a distanza di 10 anni ho maturato molta esperienza e padronanza nella materia.
Dal 2012 ad oggi, ho fatto tantissima strada ed il mio percorso mi ha portato ad entrare in Orbyta a gennaio 2020. Da allora sono passati 2 anni ed io sono sempre più convinta della mia scelta!

2. Di cosa ti occupi e che valore porti all’azienda?

Oggi in Orbyta ricopro il ruolo di responsabile dell’ufficio Finance & Administration. Siamo un team di tre persone che lavorano con energia ed entusiasmo raggiungendo gli obiettivi prefissati in modo efficace. Sono convinta che la mia crescita professionale sia frutto non solo del raggiungimento degli obiettivi lavorativi ma anche della mia attitudine al lavoro in team che mi porta a cercare sempre un confronto con le colleghe e con gli altri uffici trasmettendo loro la mia passione (e chissà magari qualche conoscenza).

3. Perché ti piace lavorare in ORBYTA?

Sono una persona molto socievole, amo le sfide e mi piace lavorare in un’ ambiente così giovane e dinamico. La nostra crescita professionale viene promossa e valorizzata perché in Orbyta condividiamo un progetto, abbiamo una visione comune e questo porta alla costante crescita di tutto il gruppo senza distaccare mai lo sguardo dal singolo.

#jointherevolution

1. Introduci la tua esperienza professionale dall’università fino all’ingresso in ORBYTA.

Subito dopo aver conseguito a pieni voti la laurea specialistica in Economia e Direzione delle Imprese, ho iniziato il mio percorso lavorativo nel mondo della consulenza aziendale, operando per alcune tra le più importanti aziende multinazionali d’Italia tra cui Ferrero, Stellantis (ex FCA), Magneti Marelli ed Enel.

Durante i primi otto anni di carriera ho avuto la fortuna di viaggiare molto in Italia e all’estero, e di collaborare con persone che mi hanno insegnato molto, sia a livello professionale che umano. Conservo, tra gli altri, splendidi ricordi del mio ultimo viaggio in Sud Africa, durante il quale ho avuto il piacere di occuparmi del go-live di un sistema gestionale, ma soprattutto di conoscere un Paese stupendo dalle mille sfaccettature accompagnata dalle persone del posto, cosa che difficilmente avrei potuto fare da semplice turista.

Nel 2016 divento mamma di Luca e nel 2018 colgo l’opportunità di entrare in Orbyta per occuparmi di Project Management in ambito bancario, un settore che ancora non avevo avuto modo di conoscere.

2. Di cosa ti occupi e che valore porti all’azienda?

Attualmente ricopro il ruolo di Product Manager presso Axerve, leader nel settore dei pagamenti e-commerce e parte del gruppo Sella.

Ad oggi lavoro ad un progetto sfidante con l’obiettivo di offrire sempre maggiore innovazione ai clienti del settore e-commerce, e mi impegno ogni giorno per supportare al meglio i colleghi con precisione ed entusiasmo.

3. Perché ti piace lavorare in ORBYTA?

In Orbyta, in un contesto fortemente dinamico ed in continua crescita, ho da subito percepito il valore che viene attribuito alle persone in quanto tali. Qualsiasi sia la tematica da affrontare, si può esser certi che si troverà chi saprà ascoltare ed aiutare al meglio. E poi, come non parlare del forte spirito di gruppo e di appartenenza creato dagli eventi e dalle iniziative di team building? Unici.

#jointherevolution

1. Introduci la tua esperienza professionale dall’università fino all’ingresso in ORBYTA.

Da sempre interessata al mondo delle risorse umane, ho conseguito la laurea magistrale in Psicologia del Lavoro e del Benessere nelle Organizzazioni presso l’Università degli Studi di Torino. 

Ho iniziato le mie esperienze lavorative durante il percorso universitario occupandomi del reclutamento e della selezione di personale tecnico-informatico presso un’azienda operante nel settore ICT. Al fine di ampliare le mie competenze e conoscenze, ho voluto svolgere il tirocinio professionalizzante post-lauream nell’ambito della formazione aziendale per poi proseguire la mia crescita professionale in un contesto innovativo e stimolante: a gennaio 2020 è iniziata la mia avventura in ORBYTA!


2. Di cosa ti occupi e che valore porti all’azienda?


Ad oggi faccio parte del team Business Development e ricopro il ruolo di Talent Acquisition & Business Support per le BU Data Analytics e Business Consulting. Nello specifico, mi occupo della ricerca e della selezione di profili ICT ed Engineering per progettualità interne o per opportunità su realtà clienti, del supporto a 360° ai Business Lead e ai Tech Lead con un focus sul monitoraggio e l’aggiornamento degli strumenti aziendali. 

Nel corso degli anni, ho potuto sviluppare competenze di settore e trasversali che mi hanno permesso di raggiungere gli obiettivi prefissati e collaborare in maniera efficace con i diversi team di lavoro. Il mio impegno quotidiano è quello di portare in ORBYTA l’entusiasmo, la precisione e la dedizione per supportare al meglio le attività aziendali.


3. Perché ti piace lavorare in 
ORBYTA?

Appassionata di innovazione digitale e sviluppo tecnologico, entrare a far parte di una realtà dinamica, giovane e smart come ORBYTA mi ha dato la possibilità di mettermi alla prova, di sperimentare e di imparare ogni giorno qualcosa di nuovo. Il confronto con colleghi competenti, disponibili e appassionati è prezioso così come lo sono le attività quotidiane di cui si è pienamente responsabilizzati. 

Gli Orbyters sono il motore dell’azienda, ognuno con le proprie competenze e peculiarità, ognuno con il proprio valore aggiunto. 

#jointherevolution

Introduzione

Molti di voi probabilmente conosceranno già il concetto di database a grafo, un’alternativa al classico modello di database relazionale che risulta particolarmente efficiente quando si ha a che fare con delle relazioni complesse, mutevoli e gerarchicamente strutturate tra le entità, come potrebbero essere i dati tipici di un social media. L’aspetto forse un po’ meno noto è che anche Management Studio, dalla sua versione del 2017, supporta la creazione di un DB a grafo completamente integrato nel SQL Engine, nonostante da tempo già ci fossero delle soluzioni che in qualche modo cercavano mimarne il comportamento, come le CTE ricorsive o il tipo HierarchyId.

In un DB relazionale abbiamo righe, tabelle, chiavi esterne e relazioni, mentre le entità tipiche del DB a grafo sono note come nodi (nodes) e archi (edges). Mentre i nodi non sono dissimili dal concetto di tabella come la potremmo incontrare in un normale DB, l’entità più interessante sono proprio gli archi, delle specie di relazioni “arricchite” che definiscono il rapporto tra i nodi e che sono contraddistinte a loro volta da attributi e proprietà. Per usare una definizione intuitiva, anche se non troppo precisa, possiamo considerare i nodi come “oggetti” (prodotti, luoghi, clienti etc.), e gli archi come “azioni” (vive a, comprato a, lavora per).

Ecco un esempio di DB a grafo molto semplice ma che rende già l’idea

La peculiarità del DB a grafo è proprio la possibilità di associare degli attributi direttamente alla relazione (cioè all’arco), che in questo modo supera il suo semplice compito di mettere in rapporto una tabella con un’altra, diventando dato essa stessa. Sfruttando questa struttura possiamo scrivere delle query dall’aspetto molto sintetico, che utilizzando un DB relazionale sarebbero estremamente più complesse e di difficile lettura. Grazie alle peculiarità del DB a grafo potremo tradurre in poche righe di codice interrogazioni come questa: “Trova tutte le persone nate a Torino nel 1990 che hanno valutato 5 stelle il McDonald di piazza dell’VIII Agosto di Bologna e hanno un amico, tifoso dei Los Angeles Lakers, che vive a Cagliari”.

Un esempio pratico

Non c’è cosa migliore per entrare nel vivo della questione che vedere un esempio pratico e cominciare a fare qualche prova. Se creiamo su SSMS un nuovo database ed espandiamo il menu delle tabelle, possiamo notare la presenza dell’entità Graph Tables, sotto alla quale troveremo tutte le tabelle create nel perimetro del nostro DB a grafo (il che comprende sia i nodi sia gli archi).

Per questo esempio prenderemo in considerazione una porzione ridotta del diagramma mostrato all’inizio dell’articolo, ovvero quella che coinvolge i soli nodi Persone e Ristoranti (con relativi archi); questo esempio, per quanto semplice, ci permetterà già di indagare diversi aspetti interessanti di questa funzionalità di SSMS.

Creiamo e popoliamo le entità nodi

Come prima entità creiamo una tabella nodo, in tutto e per tutto simile alla creazione di una classica tabella, se non fosse per l’aggiunta finale della dicitura “AS NODE”.

L’inserimento dei dati in questa tabella è invece del tutto indistinguibile dalla classica insert che potremmo eseguire per popolare una tabella normale.

Se eseguiamo una semplice SELECT * della tabella appena creata, possiamo già notare una prima differenza rispetto ad una tabella classica: le tabelle di tipo nodo vengono difatti equipaggiate con una colonna aggiuntiva generata automaticamente, chiamata $node_id (seguito da una stringa esadecimale).

Si tratta di una pseudo colonna utilizzabile nelle query, ed è possibile interrogarla anche omettendo la parte esadecimale, come possiamo notare nell’esempio seguente.

Il contenuto di questa particolare colonna è un JSON (anche questo generato automaticamente) che ci servirà per creare gli archi che connetteranno due tabelle nodo tra loro.

Creiamo e popoliamo allo stesso modo la tabella nodo “Ristoranti”, di cui per brevità vi mostro solo l’aspetto finale

Creiamo e popoliamo le entità archi

La sintassi per la creazione di un arco è identica alla creazione delle tabelle nodo, con la differenza che la specifica “AS NODE” sarà sostituita da “AS EDGE”

Questa relazione, che mette in rapporto le persone con i ristoranti, annovera tra i suoi attributi la valutazione che ciascuna persona ha espresso nei confronti di quel ristorante. Possiamo quindi visualizzare questa relazione tra due dati di esempio come

dove le ellissi sono i dati ospitati nei nodi Persone e Ristoranti, il connettore è la relazione rappresentata dall’arco AmaMangiareDa, e la parola tra parentesi quadre è l’attributo “Valutazione” dell’arco stesso, come lo abbiamo definito nel passaggio precedente.

Finora non abbiamo ancora collegato tra loro in nessun modo le persone e i ristoranti, quindi il prossimo passaggio consisterà nell’aggiungere dati alla tabella arco in questo modo:

Così facendo ho recuperato un record dalla tabella delle persone ovvero “Franz Liszt”, un record dalla tabella dei ristoranti, ovvero “Osteria Francescana”, e ho aggiunto la valutazione di cinque stelle che Franz Liszt ha assegnato a tale ristorante.

Se proviamo adesso ad interrogare la tabella appena popolata, otteniamo questo risultato

Esattamente come era avvenuto per le tabelle nodo, viene aggiunta automaticamente una colonna contenente un JSON, chiamata $edge_id. Possiamo anche notare la presenza delle due colonne che puntano ai nodi collegati da questo arco (praticamente delle chiavi esterne), una riferita alla tabella di partenza (quella delle persone), cioè $from_id, e una riferita alla tabella di destinazione (quella dei ristoranti), cioè $to_id, popolate con il contenuto delle rispettive colonne $node_id che avevamo recuperato al momento di inserire i dati nell’arco. Anche in questo caso il nome “vero” delle colonne generate automaticamente è seguito da una stringa esadecimale, ma analogamente a quanto avveniva per le tabelle nodo, possiamo interrogarle omettendo il suffisso.

Volendo pensare in termini relazionali alla struttura appena creata, non abbiamo fatto qualcosa di molto diverso rispetto al creare una tabella molti a molti tra la tabella Persone e la tabella Ristoranti.

Se adesso riapriamo il menu delle Graph Tables su Management studio, troviamo le tre entità create finora.

Guardando l’icona a sinistra del nome è possibile distinguere tra tabelle nodo e tabelle arco, essendo le prime contraddistinte da un pallino pieno, mentre le seconde da un connettore che unisce tra di loro due pallini vuoti.

È importante osservare che di default tutti gli archi creati sono bidirezionali; ciò significa che, se non imponiamo nessun vincolo, potremmo inserire un record in cui un ristorante recensisce un utente, che costituirebbe uno scenario un po’ strano.

Per proteggerci da questa eventualità possiamo aggiungere un vincolo sull’arco che connette le persone ai ristoranti, in modo da imporre la direzionalità delle recensioni solo dalla persona verso il ristorante.

Come ultimo passaggio per completare il grafo di esempio che vogliamo riprodurre ho creato e popolato in modo del tutto analogo anche la tabella arco che rappresenta il legame tra due persone, chiamata AmicoDi ovvero un arco che collega la tabella Persone a sé stessa (stavolta senza attributi).

A questo punto abbiamo ricreato esattamente la struttura che volevamo, e possiamo eseguire qualche query per renderci conto di come estrarre informazioni dal sistema appena costruito.

La funzione MATCH

Come primo esempio vorrei trovare quali ristoranti il signor Wagner ha valutato con più di tre stelle: la forma della query sarà la seguente

L’aspetto più significativo di questa query è sicuramente la presenza della funzione MATCH e dell’indicazione che segue (P-(A)->R).

Quello che stiamo facendo nella FROM è sostanzialmente un prodotto cartesiano tra le tabelle Persone, Ristoranti e AmaMangiareDa: la funzione Match invece si preoccupa di stabilire la gerarchia tra queste entità, mostrando con una sintassi che riproduce in modo quasi visuale la relazione tra le tabelle considerando che il nostro scopo è quello di scoprire quale persona (P) ama mangiare (A) in quale ristorante (R).

Volendo possiamo complicare un po’ di più la cosa aggiungendo il livello della relazione tra le persone. Proviamo quindi a ricavare tutti i ristoranti con valutazione uguale a 5 recensiti dagli amici del signor Wagner.

Da questo comando è possibile notare che le tabelle nodo vanno specificate nella FROM n volte, una per ogni occorrenza nel MATCH, mentre all’interno del MATCH stesso abbiamo semplicemente aggiunto degli anelli alla catena per coinvolgere nella query anche le relazioni tra persona e persona.

La funzione SHORTEST_PATH

Abbiamo detto che i DB a grafo sono molto adatti per rappresentare i legami e le relazioni tipiche di un sistema come un social network; immaginiamo quindi che la nostra tabella Persone rappresenti un mini social network di compositori ottocenteschi, i cui membri siano relazionati in questo modo

Ricordiamo che abbiamo strutturato l’arco che referenzia la tabella “Persone” con sé stessa in modo che sia bidirezionale e che non sia pesato: Richard è amico di Clara esattamente come lei lo è di lui e l’amicizia tra loro due vale esattamente come l’amicizia tra qualunque altra coppia di membri direttamente connessi di questo diagramma.

La nostra esigenza in questo momento è quella di capire qual è il minimo percorso possibile per andare da una persona all’altra, per esempio da Felix Mendelssohn (in alto a sinistra) ad Anton Bruckner (in basso a destra).

A differenza di quanto si potrebbe credere questa operazione nasconde una certa complessità, dato che stabilire dei percorsi tra i nodi è un’operazione molto costosa, come scopriremo tra poco a nostre spese. La soluzione consisterà nell’intendere ciascun percorso come una serie di nodi raggruppati, un approccio che sarà determinante nel cercare di minimizzare i passaggi tra un nodo e l’altro.

Lanciamoci in una veloce disamina di questa query, a partire dalla FROM.

L’espressione FOR PATH che segue l’arco e il nodo di destinazione ricorda in qualche modo una GROUP BY, dato che il suo scopo sarà quello di raggruppare i nodi che costituiscono il percorso minimo tra il nodo di partenza e quello di arrivo.

La funzione STRING_AGG è stata di recente aggiunta in SQL Server ed è una semplice concatenazione tra stringhe, che permette di collegare il set di nomi nella colonna Friends con i caratteri voluti (nel nostro caso, ‘->’), mentre la LAST_VALUE restituisce l’ultimo valore di un certo set (ovvero del nodo di destinazione).

Infine nella WHERE troviamo, all’interno della MATCH che abbiamo già visto, la dicitura “SHORTEST_PATH”, che ricerca il percorso più breve tra un nodo e l’altro del diagramma. Alla sintassi ormai nota per specificare a quali nodi e quali archi siamo interessati (Person1(-(fo)->Person2) abbiamo in aggiunta un segno ‘+’ che sta ad indicare che vogliamo le informazioni riguardo all’intero percorso tra ciascun membro del nodo di partenza e di quello di destinazione, senza limitare il numero dei singoli passaggi. Ogni volta che la query viene eseguita, il risultato dell’esecuzione di questo modello sarà una raccolta ordinata di nodi e archi attraversati lungo il percorso, dal nodo iniziale al nodo finale.

Questa funzionalità merita alcune riflessioni. La prima è che, se eseguiamo solamente la CTE della query esposta in precedenza, otterremo come risultato i percorsi più brevi tra il nodo Mendelssohn e tutti gli altri nodi del grafico.

Questa considerazione deve sicuramente far scattare un campanello d’allarme dal punto di vista delle performance: se già in uno schema semplice come questo abbiamo così tante ramificazioni, sicuramente per una realtà più complessa le risorse impiegate per sfornare i risultati possono esplodere facilmente. Teniamo anche in considerazione che avevamo specificato esplicitamente il nodo di partenza, cioè Mendelssohn, nella condizione WHERE: non l’avessimo fatto avremmo ottenuto i percorsi che collegano tutti i nodi dello schema con tutti gli altri nodi.

Un’azione che sicuramente aiuta a migliorare le performance in uno scenario come questo consiste nell’aggiunta un indice sulle colonne $from_id e $to_id

Proprio per limitare il dispendio di risorse, anche se ci sono due o più percorsi che portano da un nodo ad un altro con lo stesso numero di passaggi, SQL Server ne mostrerà sempre e solo uno (scelto in base al primo trovato). Prendiamo ad esempio il percorso che viene mostrato come il più breve per andare da Mendelssohn a Bruch: ci viene mostrato il corretto cammino Mendelssohn->Wagner->Schumann-> Bruch, ma al tempo stesso viene ignorato quello del tutto equipollente Mendelssohn->Wagner->Schubert-> Bruch.

Un altro aspetto interessante da notare è che di default non c’è vincolo che escluda il nodo di partenza dai nodi di arrivo, troviamo infatti alla sesta riga il loop Mendelssohn -> Wagner -> Mendelssohn.

Purtroppo al momento la funzione SHORTEST_PATH non è in grado di essere parametrizzata in modo esplicito con i nodi di partenza e di arrivo; la conseguenza di ciò è che il filtraggio dei risultati deve essere eseguito in un secondo momento tramite opportune clausole WHERE, come in questo caso: una interna alla CTE per definire il nodo di partenza e una esterna per definire il nodo di arrivo.

Come ultimo esempio possiamo indagare una sintassi alternativa al ‘+’ visto nella MATCH dell’esempio precedente, che ci permette di specificare a che livello di profondità fermare la nostra ricerca sui nodi.

In questa query abbiamo pertanto estratto tutte le persone ad un minimo di uno e un massimo di due livelli di distanza da Richard Wagner e che abbiano lasciato una recensione a MacDonalds. La prima condizione è fornita dal segmento di codice {1,2} che ha sostituito il segno ‘+’ visto in precedenza, il vincolo sulla presenza della recensione è invece espresso dalla seconda condizione all’interno della MATCH.

Conclusioni

Alla luce di queste considerazioni possiamo chiederci quando effettivamente possa convenire utilizzare un DB a grafo su SQL Server.

Attualmente SSMS non è ancora in grado di competere con tecnologie sviluppate appositamente, come Neo4j, OrientDB o HyperGraph DB, specie se teniamo presenti alcune limitazioni piuttosto importanti, ad esempio

  • Non è permesso eseguire operazioni di UPDATE sulle colonne degli archi
  • Tabelle temporanee e tabelle temporanee globali non sono supportate
  • Non è possibile eseguire query cross-database
  • Non c’è un modo diretto per convertire tabelle normali in tabelle di un DB a grafo
  • Non esiste GUI: per visualizzare il grafo dobbiamo appoggiarci a strumenti esterni come Power BI

Se però la nostra esigenza è di sviluppare un DB a grafo non eccessivamente complesso e performante senza cambiare tecnologia, sicuramente questa funzionalità già completamente integrata in SQL Server può essere di grande aiuto.

Nota

Tutto il codice utilizzato nell’articolo è disponibile a questo link

https://drive.google.com/drive/folders/1DQo4CioViLCcNylA88T02aZeLRo9q40D?usp=sharing

Sitografia

https://docs.microsoft.com/en-us/sql/relational-databases/graphs/sql-graph-architecture?view=sql-server-ver15

https://docs.microsoft.com/en-us/sql/relational-databases/graphs/sql-graph-sample?view=sql-server-ver15

https://docs.microsoft.com/en-us/sql/relational-databases/graphs/sql-graph-shortest-path?view=sql-server-ver15

https://docs.microsoft.com/en-us/sql/relational-databases/graphs/sql-graph-overview?view=sql-server-ver15

https://docs.microsoft.com/it-it/sql/relational-databases/graphs/sql-graph-shortest-path?view=sql-server-ver15

https://medium.com/swlh/how-to-make-use-of-sql-server-graph-database-features-946ce38190cc

https://novacontext.com/getting-started-with-sql-server-graph/index.html

https://www.red-gate.com/simple-talk/databases/sql-server/t-sql-programming-sql-server/sql-server-2019-graph-database-and-shortest_path/

https://www.sqlshack.com/graph-database-features-in-sql-server-2019-part-1/

#jointherevolution