Blog Rubynetti

Come uso l'intelligenza artificale per scrivere codice ruby on rails

Questo articolo vuole raccontare alcune esperienze concrete di coding assistito dall'intelligenza artificiale. Per un programmatore non è banale trovare un equilibrio tra ciò che l'ia produce in modo spontaneo e ciò che effettivamente è da ritenersi valido e mantenibile nel tempo come qualità della scrittura.

Di seguito racconto la mia esperienza più recente che nella sua semplicità rappresenta per me un buon punto di equilibrio almeno per quanto riguarda le due attività svolte.

Da Crono a Sidekiq con l'aiuto dell'IA: +10x performance in un controller Rails (e Sinner che vince Wimbledon 🎾)

Negli ultimi anni, l'intelligenza artificiale è diventata una compagna sempre più presente nel lavoro quotidiano degli sviluppatori. Ma cosa succede quando la combini a buone pratiche legate a Rails, una codebase reale e una domenica pomeriggio di sport? Succede che mentre Sinner vince per la prima volta Wimbledon il tuo controller rails gira 10 volte più veloce.

Il contesto

Nella mia attività quotidiana con Rubynetti.it, lavoriamo spesso su codebase esistenti e complesse. Una di queste aveva un controller critico, legato alla generazione di valori di cache per calcolare fantamedia, gol, voti, ecc. Il sito è fantacalcio.dev. Il tutto orchestrato tramite Crono, una gemma utile per lo scheduling ma ormai inadatta a gestire volumi e logiche più sofisticate.

Ho deciso di sostituirla con Sidekiq, ma senza perdere ore in refactoring arbitrario: volevo un intervento minimale, coerente con i principi REST e le convenzioni Rails.

Ed è qui che entra in gioco GitHub Copilot, con un file copilot-instructions.md. Ero al corrente di questa possibilità ma prima di domenica non ne avevo fatto uso. In seguito a varie indicazioni e discussioni con colleghi sono arrivato al momento a questa sintesi:

Cerca di fare interventi minimali quando possibile.
In generale fai sempre riferimento all'intera #codebase per avere una visione di insieme.
Uso docker-compose per avviare i servizi.
Analizza il docker-compose.yml e docker-compose.override.yml per comprendere la configurazione dei servizi.
Cerca di essere rest nei ragionamenti e nelle risposte e di rispettare ove possibile le convenzioni di rails; come riferimento principe https://thoughtbot.com/blog/in-relentless-pursuit-of-rest-ish-routing.

Questo ha trasformato Copilot da "suggeritore generico" a "collaboratore intelligente calibrato su cosa è importante per me in una codebase rails".

Il prima: un metodo pesante, con molte query e scarsa ottimizzazione

Il vecchio metodo values_current_season eseguiva molte query in loop e operazioni select su oggetti ActiveRecord caricati interamente in memoria. Ecco un estratto chiave:

def values_current_season
  match_played = season.matches.played.size
  limit = match_played < 150 ? 2 : 10
  PlayerInSeason.includes(:player, :season)
                .where(season: season)
                .select{|pis| pis.count_performances >= limit}
end

Il problema? Ogni count_performances generava query ripetute per ogni PlayerInSeason, con costi esponenziali in termini di velocità.

Il dopo: una singola query ottimizzata, +10x più veloce

Grazie a Copilot, al contesto fornito, e a una regia umana chiara, abbiamo sostituito tutto con una versione ottimizzata:

def values_current_season_fast
  match_ids = season.matches.played.pluck(:id)
  return [] if match_ids.empty?

  result = Performance.where(match_id: match_ids)
                      .group(:player_id)
                      .having('COUNT(*) >= ?', match_ids.size < 150 ? 2 : 10)
                      .pluck(:player_id)

  PlayerInSeason.where(season: season, player_id: result)
end

Risultato:

  • Una sola query al database per ottenere i player rilevanti
  • Nessun caricamento di oggetti superflui
  • Performance migliorata di oltre 10 volte
  • Controller ora fluido anche sotto carico

Sidekiq al posto di Crono: una transizione senza dolore

Parallelamente, ho sostituito Crono con Sidekiq per schedulare i job di aggiornamento delle cache. Con pochi job ben definiti, queue separate e Redis già configurato via Docker Compose, tutto è filato liscio. Questa operazione che fatta dall'ia è apparsa banale in solitaria probabilmente mi avrebbe portato via l'intera giornata.

Conclusioni (e un consiglio)

Questa esperienza mi ha ricordato che l'IA è potentissima, se guidata con il giusto contesto. Non si tratta di "delegare" all'intelligenza artificiale, ma di metterla in condizione di aiutarti davvero, come farebbe un buon junior developer molto veloce e ben istruito.

Il tutto mentre Sinner conquistava Wimbledon. Una bella giornata, insomma.

Vuoi ottimizzare la tua codebase Rails?

Il team di Rubynetti lavora proprio su questo: migliorare, mantenere e far evolvere software complessi, con attenzione al codice, alle performance e alle persone. Se la tua app arranca, parliamone.

Chi siamo?

Rubynetti è una squadra di designer, sviluppatori e programmatori specializzata in applicazioni web. Il nostro focus è portare valore e automazione nei processi umani e aziendali attraverso l'uso delle tecnologie del web.

Operiamo da più di 20 anni nel settore e siamo specializzati su Vue.js, Nuxt, Rails e React.

Lavoriamo per lo più da Venezia centro storico.

Contatti

Se hai bisogno di una mano per portare avanti o creare dal nulla un progetto digitale siamo a disposizione.