Davide O. Zhu

Sviluppatore backend freelance. API, integrazioni, pipeline di dati e sistemi con IA.

Dal 2021 lavoro su software che deve stare in piedi in produzione: microservizi per la grande distribuzione, applicazioni di un'utility energetica, piattaforme costruite da zero. Quando qualcosa non torna, continuo a chiedermi perché finché non trovo la causa.

Valuto nuovi progetti da freelance e posizioni da remoto. Lavoro in italiano e in inglese.

Fino alla causa

Un guasto vero, sul server che tengo in casa con le stesse regole di un ambiente di produzione. Il metodo è quello che uso sul lavoro: il primo errore è solo il punto da cui si comincia a scendere.

  1. Il sintomo

    Dopo un riavvio del server, due servizi non ripartono: l'archivio delle foto e le automazioni. Tutto il resto funziona, compresi altri servizi che usano la stessa GPU.

  2. Perché? primo

    I due container si fermano con NVML: Driver Not Loaded. Ma il driver era caricato: sull'host nvidia-smi rispondeva.

  3. Perché? secondo

    Dentro i container, /dev/nvidia* non erano dispositivi ma file vuoti. /dev/nvidiactl mancava del tutto.

  4. Perché? terzo

    I container erano partiti prima che l'host creasse i dispositivi della GPU. Il mount opzionale, non trovandoli, aveva creato dei segnaposto.

  5. Perché? quarto

    Niente stabiliva un ordine tra la GPU e l'avvio automatico dei container. A ogni boot vinceva chi arrivava prima, per questo alcuni servizi si salvavano.

  6. L'intervento

    Un servizio di sistema che inizializza la GPU prima di qualsiasi container: nvidia-persistenced con Before=pve-guests.service.

    Ho usato il binario fornito con il driver installato (580) e non il pacchetto della distribuzione, fermo alla 550, che sarebbe andato in conflitto. Poi ho scritto come riconoscere il problema in un minuto, se dovesse tornare.

Cosa faccio

Backend e integrazioni

API REST e microservizi in Node.js (Fastify) e Java (Spring Boot). Collego sistemi nuovi a quelli che ci sono già, anche a eventi con Kafka, senza fermare chi li usa.

Dati e IA

Pipeline in Python che raccolgono e ripuliscono dati non strutturati. Assistenti basati su modelli linguistici, con retrieval su database vettoriali e a grafo (Qdrant, Neo4j).

Applicazioni in produzione

Presa in carico di software esistente: ticket, analisi della causa, fix, refactoring del codice legacy con test. Docker, Kubernetes, CI/CD con Jenkins, server Linux.

Dove ho lavorato

  1. Dal 2026

    SaaS B2B per la conformità normativa

    Nel team che sviluppa un assistente IA per verificare ingredienti cosmetici e alimentari rispetto alle normative: retrieval su database vettoriali e a grafo, pulizia del corpus documentale, modello dei dati.

    Python, Qdrant, Neo4j

  2. Dal 2026

    Duemme Dental, Nerviano

    Il CRM dello studio dentistico, sviluppato con un collega: pazienti, questionario anamnestico e odontogramma ricalcati sui moduli cartacei dello studio, preventivi e agenda.

    React, Spring Boot, Java 21, PostgreSQL

  3. 2024–2025

    Consulente freelance per ATS S.p.A.

    • Unicoop, grande distribuzione. Microservizi in Node.js e Fastify; sincronizzazione in tempo reale da Oracle a MongoDB con Kafka durante la migrazione.
    • A2A, energia. Gestione autonoma dei ticket di produzione su Jira, analisi della causa e hotfix in TypeScript.
    • BitQ. Refactoring di una codebase Java/Spring Boot con molto debito tecnico, guidato dai test (JUnit, Mockito); containerizzazione con Docker e Kubernetes.
  4. 2021–2023

    Expandi Group e Account Insight

    Full stack e poi lead developer. Una piattaforma proprietaria in Java/Spring Boot, dai requisiti alla produzione; pipeline CI/CD con Jenkins e Docker su AWS; procedure Python e SQL per l'analisi dei dati.

Laurea in Informatica in corso all'Università degli Studi di Milano.

Fuori orario

A casa gestisco un piccolo datacenter: Proxmox con una decina tra container e macchine virtuali, una GPU condivisa per i modelli linguistici in locale, monitoraggio con avvisi su Telegram, controllo dei dischi e backup notturni. Lo tratto come un ambiente di produzione, quindi ogni tanto si rompe davvero. Altri due guasti risolti:

  • Load a 30 e sembrava RAM esaurita. Era una conversione di container da unprivileged a privileged che aveva lasciato tutti i file con gli UID spostati di 100000: nove container Docker in crash continuo. Backup, proprietari riallineati su tutto il filesystem, quattordici container di nuovo su.
  • Thin pool quasi pieno: decine di GB recuperati abilitando discard e fstrim.

E qualche strumento per conto mio: un wrapper Python per API multimodali con gestione di token e rate limit, e una pipeline che trasforma thread di Reddit in video verticali senza intervento manuale.

Scrivimi

davide.ouxiang.zhu@gmail.com

Raccontami cosa c'è da costruire o cosa non torna. Lavoro da remoto, in italiano e in inglese. Il CV completo te lo mando su richiesta.