Creo applicazioni web moderne e strumenti digitali personalizzati per aiutare le attività a crescere attraverso l'innovazione tecnologica. La mia passione è unire informatica ed economia per generare valore reale.
La mia passione per l'informatica è nata tra i banchi dell'Istituto Tecnico Commerciale di Maglie, dove ho scoperto il potere della programmazione e il fascino di creare soluzioni digitali. Fin da subito, ho capito che l'informatica non era solo codice, ma uno strumento straordinario per trasformare idee in realtà.
Durante gli studi superiori in Sistemi Informativi Aziendali, ho iniziato a intrecciare informatica ed economia, comprendendo come la tecnologia possa essere il motore della crescita per qualsiasi attività. Questa visione mi ha accompagnato all'Università degli Studi di Bari, dove ho conseguito la Laurea in Informatica, approfondendo le mie competenze tecniche e la mia passione per lo sviluppo software.
Oggi metto questa esperienza al servizio di imprese, professionisti e startup, creando soluzioni digitali su misura che automatizzano processi, ottimizzano risorse e aprono nuove opportunità di business. Perché la vera innovazione inizia quando la tecnologia incontra le esigenze reali delle persone.
Le Mie Competenze
Analisi Dati & Modelli Previsionali
Trasformo i dati in insights strategici con analisi approfondite e modelli predittivi per decisioni informate
Automazione Processi
Creo strumenti personalizzati che automatizzano operazioni ripetitive e liberano tempo per attività a valore aggiunto
Sistemi Custom
Sviluppo sistemi software su misura, dalle integrazioni tra piattaforme alle dashboard personalizzate
Credo fermamente che l'informatica sia lo strumento più potente per trasformare le idee in realtà e migliorare la vita delle persone.
Democratizzare la Tecnologia
La mia missione è rendere l'informatica accessibile a tutti: dalle piccole imprese locali alle startup innovative, fino ai professionisti che vogliono digitalizzare la propria attività. Ogni realtà merita di sfruttare le potenzialità del digitale.
Unire Informatica ed Economia
Non è solo questione di scrivere codice: è capire come la tecnologia possa generare valore reale. Intrecciando competenze informatiche e visione economica, aiuto le attività a crescere, ottimizzare processi e raggiungere nuovi traguardi di efficienza e redditività.
Creare Soluzioni su Misura
Ogni attività è unica, e così devono esserlo le soluzioni. Sviluppo strumenti personalizzati che rispondono alle esigenze specifiche di ciascun cliente, automatizzando processi ripetitivi e liberando tempo per ciò che conta davvero: far crescere il business.
Trasforma la Tua Attività con la Tecnologia
Che tu gestisca un negozio, uno studio professionale o un'azienda, posso aiutarti a sfruttare le potenzialità dell'informatica per lavorare meglio, più velocemente e in modo più intelligente.
Il mio percorso accademico e le tecnologie che padroneggio
Certificazioni Professionali
8 certificazioni conseguite
Nuovo
Visualizza
Reinvention With Agentic AI Learning Program
Anthropic
Dicembre 2024
Nuovo
Visualizza
Agentic AI Fluency
Anthropic
Dicembre 2024
Nuovo
Visualizza
AI Fluency for Students
Anthropic
Dicembre 2024
Nuovo
Visualizza
AI Fluency: Framework and Foundations
Anthropic
Dicembre 2024
Nuovo
Visualizza
Claude with the Anthropic API
Anthropic
Dicembre 2024
Visualizza
Master SQL
RoadMap.sh
Novembre 2024
Visualizza
Oracle Certified Foundations Associate
Oracle
Ottobre 2024
Visualizza
People Leadership Credential
Connect
Settembre 2024
Linguaggi & Tecnologie
Java
Python
JavaScript
Angular
React
TypeScript
SQL
PHP
CSS/SCSS
Node.js
Docker
Git
💼
12/2024 - Presente
Custom Software Engineering Analyst
Accenture
Bari, Puglia, Italia · Ibrida
Analisi e sviluppo di sistemi informatici attraverso l'utilizzo di Java e Quarkus in Health and Public Sector. Formazione continua su tecnologie moderne per la creazione di soluzioni software personalizzate ed efficienti e sugli agenti.
💼
06/2022 - 12/2024
Analista software e Back End Developer Associate Consultant
Links Management and Technology SpA
Esperienza nell'analisi di sistemi software as-is e flussi ETL utilizzando PowerCenter. Formazione completata su Spring Boot per lo sviluppo di applicazioni backend moderne e scalabili. Sviluppatore Backend specializzato in Spring Boot, con esperienza in progettazione di database, analisi, sviluppo e testing dei task assegnati.
💼
02/2021 - 10/2021
Programmatore software
Adesso.it (prima era WebScience srl)
Esperienza nell'analisi AS-IS e TO-BE, evoluzioni SEO ed evoluzioni website per migliorare le performance e l'engagement degli utenti.
🎓
2018 - 2025
Laurea in Informatica
Università degli Studi di Bari Aldo Moro
Bachelor's degree in Computer Science, focusing on software engineering, algorithms, and modern development practices.
📚
2013 - 2018
Diploma - Sistemi Informativi Aziendali
Istituto Tecnico Commerciale di Maglie
Technical diploma specializing in Business Information Systems, combining IT knowledge with business management.
Contattami
Hai un progetto in mente? Parliamone! Compila il form qui sotto e ti risponderò al più presto.
* Campi obbligatori. I tuoi dati saranno utilizzati solo per rispondere alla tua richiesta.
Polimorfismo: Una Interfaccia, Molti Comportamenti
Il polimorfismo (dal greco "molte forme") è la capacità di oggetti di classi diverse
di rispondere allo stesso messaggio in modi differenti. È uno dei pilastri della OOP che permette di
scrivere codice flessibile, estensibile e manutenibile. Con il polimorfismo, scriviamo codice che
lavora con interfacce astratte, non con implementazioni concrete.
💡 Concetti Chiave
Polimorfismo di sottotipo: Trattare oggetti di classi derivate come oggetti della classe base
Method overriding: Ridefinire comportamenti nelle sottoclassi
Duck typing: "Se cammina come un'anatra e starnazza come un'anatra, allora è un'anatra"
Interfacce: Contratti che garantiscono comportamenti comuni
Polimorfismo di Sottotipo
Il polimorfismo di sottotipo permette di usare un oggetto di una classe derivata ovunque sia
atteso un oggetto della classe base. Questo è possibile grazie all'ereditarietà.
#123;{ '{' }}this.name{{ '}' }} fa un suono generico`);
{{ '}' }}
{{ '}' }}
class Dog extends Animal {{ '{' }}
// Override del metodo makeSound
makeSound(): void {{ '{' }}
console.log(`#123;{ '{' }}this.name{{ '}' }} abbaia: Woof!`);
{{ '}' }}
{{ '}' }}
class Cat extends Animal {{ '{' }}
makeSound(): void {{ '{' }}
console.log(`#123;{ '{' }}this.name{{ '}' }} miagola: Meow!`);
{{ '}' }}
{{ '}' }}
// Polimorfismo in azione: stesso metodo, comportamenti diversi
function playWithAnimal(animal: Animal): void {{ '{' }}
animal.makeSound(); // Non sappiamo quale animale sia!
{{ '}' }}
const animals: Animal[] = [
new Dog("Rex"),
new Cat("Whiskers"),
new Dog("Buddy")
];
animals.forEach(animal => playWithAnimal(animal));
// Output:
// Rex abbaia: Woof!
// Whiskers miagola: Meow!
// Buddy abbaia: Woof!
Il metodo playWithAnimal accetta un Animal, ma funziona correttamente
con Dog e Cat perché sono sottotipi di Animal. Il metodo
corretto viene chiamato a runtime in base al tipo reale dell'oggetto.
Polimorfismo con Interfacce
Le interfacce definiscono contratti che le classi devono rispettare. Classi completamente diverse
possono implementare la stessa interfaccia, permettendo polimorfismo senza ereditarietà.
L'override permette alle sottoclassi di ridefinire metodi ereditati, mentre
super consente di accedere all'implementazione della classe padre.
TypeScript - Override e Super
class Logger {{ '{' }}
log(message: string): void {{ '{' }}
console.log(`[LOG] #123;{ '{' }}message{{ '}' }}`);
{{ '}' }}
{{ '}' }}
class TimestampedLogger extends Logger {{ '{' }}
// Override con funzionalità aggiuntiva
override log(message: string): void {{ '{' }}
const timestamp = new Date().toISOString();
// Chiama il metodo del padre e aggiunge timestamp
super.log(`[#123;{ '{' }}timestamp{{ '}' }}] #123;{ '{' }}message{{ '}' }}`);
{{ '}' }}
{{ '}' }}
class ColoredLogger extends Logger {{ '{' }}
override log(message: string): void {{ '{' }}
// Comportamento completamente diverso
console.log(`\x1b[32m[LOG] #123;{ '{' }}message{{ '}' }}\x1b[0m`);
{{ '}' }}
{{ '}' }}
function logMessage(logger: Logger, msg: string): void {{ '{' }}
logger.log(msg);
{{ '}' }}
const basicLogger = new Logger();
const timeLogger = new TimestampedLogger();
const colorLogger = new ColoredLogger();
logMessage(basicLogger, "Messaggio base");
// [LOG] Messaggio base
logMessage(timeLogger, "Messaggio con timestamp");
// [LOG] [2024-12-26T10:30:00.000Z] Messaggio con timestamp
logMessage(colorLogger, "Messaggio colorato");
// [LOG] Messaggio colorato (in verde)
Duck Typing in TypeScript
TypeScript usa structural typing (duck typing): se un oggetto ha le proprietà
e i metodi richiesti, è compatibile con un tipo, anche senza implementare esplicitamente
un'interfaccia.
TypeScript - Duck Typing
interface Quackable {{ '{' }}
quack(): void;
{{ '}' }}
class Duck {{ '{' }}
quack(): void {{ '{' }}
console.log("Quack!");
{{ '}' }}
{{ '}' }}
class Person {{ '{' }}
name: string;
constructor(name: string) {{ '{' }}
this.name = name;
{{ '}' }}
// Person ha un metodo quack, quindi è compatibile con Quackable!
quack(): void {{ '{' }}
console.log(`#123;{ '{' }}this.name{{ '}' }} imita un'anatra: Quack!`);
{{ '}' }}
{{ '}' }}
// Accetta qualsiasi oggetto con metodo quack()
function makeItQuack(quacker: Quackable): void {{ '{' }}
quacker.quack();
{{ '}' }}
const duck = new Duck();
const person = new Person("Mario");
makeItQuack(duck); // "Quack!"
makeItQuack(person); // "Mario imita un'anatra: Quack!"
// Anche oggetti literal funzionano!
makeItQuack({{ '{' }}
quack: () => console.log("Oggetto anonimo: Quack!")
{{ '}' }});
// "Oggetto anonimo: Quack!"
Polimorfismo Parametrico (Generics)
I generics permettono di scrivere codice che funziona con tipi diversi
mantenendo type safety. È una forma di polimorfismo a tempo di compilazione.
Il polimorfismo è fondamentale in molti design pattern. Vediamo lo Strategy Pattern:
Strategy Pattern con Polimorfismo
// Interfaccia comune per tutte le strategie
interface SortStrategy {{ '{' }}
sort(data: number[]): number[];
{{ '}' }}
class BubbleSort implements SortStrategy {{ '{' }}
sort(data: number[]): number[] {{ '{' }}
console.log("Ordinamento con Bubble Sort");
const arr = [...data];
// Implementazione bubble sort (semplificata)
for (let i = 0; i < arr.length; i++) {{ '{' }}
for (let j = 0; j < arr.length - i - 1; j++) {{ '{' }}
if (arr[j] > arr[j + 1]) {{ '{' }}
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
{{ '}' }}
{{ '}' }}
{{ '}' }}
return arr;
{{ '}' }}
{{ '}' }}
class QuickSort implements SortStrategy {{ '{' }}
sort(data: number[]): number[] {{ '{' }}
console.log("Ordinamento con Quick Sort");
// Implementazione quick sort (semplificata con sort nativo)
return [...data].sort((a, b) => a - b);
{{ '}' }}
{{ '}' }}
class DataSorter {{ '{' }}
private strategy!: SortStrategy;
// Cambia strategia a runtime (polimorfismo!)
setStrategy(strategy: SortStrategy): void {{ '{' }}
this.strategy = strategy;
{{ '}' }}
sortData(data: number[]): number[] {{ '{' }}
if (!this.strategy) {{ '{' }}
throw new Error("Strategia non impostata");
{{ '}' }}
return this.strategy.sort(data);
{{ '}' }}
{{ '}' }}
const sorter = new DataSorter();
const data = [5, 2, 8, 1, 9];
sorter.setStrategy(new BubbleSort());
console.log(sorter.sortData(data));
// "Ordinamento con Bubble Sort"
// [1, 2, 5, 8, 9]
sorter.setStrategy(new QuickSort());
console.log(sorter.sortData(data));
// "Ordinamento con Quick Sort"
// [1, 2, 5, 8, 9]
Vantaggi del Polimorfismo
✅ Benefici
Estensibilità: Aggiungi nuove classi senza modificare codice esistente
Manutenibilità: Codice più pulito e organizzato
Riutilizzo: Stesse funzioni per tipi diversi
Testabilità: Mock e stub tramite interfacce
Flessibilità: Cambia comportamenti a runtime
Conclusione
Il polimorfismo è il meccanismo che rende la OOP davvero potente. Ci permette di scrivere
codice generico che lavora con astrazioni, non con implementazioni concrete. Che sia attraverso
ereditarietà, interfacce, duck typing o generics, il polimorfismo rende il software flessibile,
estensibile e manutenibile.