ROQuiz

Il Progetto
ROQuiz è un’applicazione multipiattaforma a quiz, che ho sviluppato per ripassare la teoria del corso Ricerca Operativa M, all’Alma Mater Studiorum, Università di Bologna.
Ho scritto la prima versione in Java/JavaFX in mezza giornata, pochi giorni prima dell’esame. Poi, una volta sostenuto l’esame, l’ho riscritta da zero in Dart, approfittandone per imparare lo sviluppo di app mobile con Flutter. Da lì il progetto è diventato pian piano un piccolo progetto di comunità: altri studenti hanno aperto issue e pull request con bug fixing e nuove domande, e il pool è cresciuto dalle ~90 domande iniziali alle 119 attualmente distribuite con l’app.
L’applicazione gira su Android, Windows, Linux e direttamente nel browser, ed è rilasciata con licenza CC BY-NC-SA 4.0.


Come Funziona
L’applicazione simula un quiz d’esame: pesca in modo casuale un insieme di domande a risposta multipla da un pool e concede un tempo limitato per rispondere. I valori di default rispecchiano le condizioni d’esame — 16 domande, 5 risposte ciascuna e un timer di 18 minuti — ma sia il numero di domande che il timer si possono modificare dalle impostazioni, e le risposte possono essere mescolate.
Durante il quiz è possibile navigare avanti e indietro tra le domande e cambiare le risposte date; il timer diventa giallo, arancione e rosso man mano che il tempo scade. Alla consegna (o allo scadere del tempo) l’app mostra le risposte corrette e un riepilogo con risposte giuste/sbagliate e il voto del quiz. Dato che il voto d’esame è una media pesata tra prova scritta e quiz, si può anche inserire il voto dello scritto e far calcolare all’app la stima del voto finale:
voto quiz = round(corrette / totali * 16) * 2
voto finale = scritto * 2/3 + voto quiz / 3
Le domande sono raggruppate per argomento: dalla schermata Argomenti si sceglie quali includere nel pool, abilitando o disabilitando interi argomenti oppure impostando quante domande pescare da ciascuno. L’elenco completo delle domande è consultabile direttamente dall’app, con una barra di ricerca per trovare una domanda specifica tramite keyword.
L’app si mantiene aggiornata da sola: all’avvio (o su richiesta, dalle impostazioni) interroga le API di GitHub per verificare se è disponibile una nuova release e se il file delle domande è stato modificato dall’ultimo download — in tal caso scarica il nuovo Domande.txt dalla repository. È questo che rende davvero utile un pool di domande crowdsourced: quando un collega aggiunge una domanda, arriva a tutti senza reinstallare nulla.
Il File delle Domande
Le domande non sono hardcoded, ma vengono caricate da un file di testo (Domande.txt) con un formato volutamente semplice — una riga di argomento che inizia con @, poi, per ogni domanda, una riga per il testo, 5 righe per le risposte, una riga con la lettera della risposta corretta e una riga vuota come separatore:
@Programmazione Matematica ==========================================
Dato un insieme F, un intorno è
A. L'insieme di tutti i sottoinsiemi di F
B. L'insieme dei punti di F a distanza minore di epsilon da un punto x di F
C. Una funzione N: F -> 2^F
D. Una combinazione convessa di due punti x e y di F
E. Nessuna di queste
C
@Dualità ============================================================
Se un problema di programmazione lineare (primale) ha soluzione ottima finita, allora:
A. Il suo duale non è detto che abbia soluzione ottima finita.
B. Anche il suo duale ha soluzione ottima finita e i valori delle soluzioni coincidono.
C. Anche il duale ha soluzione ottima finita, ma non è detto che i valori delle soluzioni coincidano.
D. Anche il duale ha soluzione ottima finita, ma i valori delle due soluzioni non coincidono.
E. Nessuna di queste
B
Il formato è abbastanza semplice da permettere a chiunque di aggiungere domande con un editor di testo; inoltre il file si può modificare da dentro l’applicazione, oppure sostituire con uno esterno — il che significa che ROQuiz si può usare per qualsiasi altro esame a risposta multipla, non solo per Ricerca Operativa.
Il pool attuale contiene 119 domande, suddivise in 6 argomenti:
| Argomento | Domande |
|---|---|
| Programmazione Matematica | 9 |
| Programmazione Lineare | 28 |
| Algoritmo del Simplesso | 28 |
| Dualità | 23 |
| Programmazione Lineare Intera | 18 |
| Complessità | 13 |
Dato che il file è l’unica fonte di verità per tutte le piattaforme, un workflow GitHub Actions ne valida il contenuto ad ogni modifica (codifica, struttura, numero di risposte, lettere delle risposte corrette), mentre un altro tiene aggiornati il conteggio delle domande e la lista dei contributor nel README.
Funzionalità
L’applicazione include le seguenti funzionalità:
- simulazione di un quiz in condizioni d’esame (timer, domande casuali, risultati e stima del voto);
- caricamento dinamico delle domande da file di testo (attualmente 119 domande);
- scelta degli argomenti, con possibilità di limitare il numero di domande per argomento;
- lista delle domande consultabile in-app, con ricerca per keyword;
- modifica del file delle domande dall’applicazione, o caricamento di un file esterno;
- controllo automatico/manuale della presenza di nuove versioni dell’app;
- controllo automatico/manuale della presenza di nuove domande;
- impostazioni persistenti: numero di domande, timer, mescolamento delle risposte, alert di conferma, tema scuro.
Storia del Progetto
Nel gruppo Telegram del corso, qualcuno aveva condiviso un’app Android con qualche esempio di quiz: paolopiano1997/QuizRicercaOperativa. Era in parte utile, perché conteneva alcuni esempi completi di domande e risposte, ma l’applicazione era piuttosto buggata e limitata. Poco prima dell’esame, un altro studente aveva pubblicato un insieme di domande più completo in un Google Form: quasi 90 domande, ma non personalizzabile e senza alcun modo di simulare un quiz senza ricorrere ad altri strumenti. Per questi motivi ho deciso di sviluppare un primo prototipo in JavaFX di un’applicazione “““migliore”””, che io e mio fratello gemello abbiamo testato prima di condividerla con gli altri studenti.
Dopo l’esame, dato che l’applicazione si era rivelata estremamente utile, ho iniziato a estenderla, aggiungendo sempre più funzionalità, finché ho deciso di crearne una versione mobile.
Perché?
La lista delle motivazioni è lunga: adoro i side project e lo sviluppo open-source; non avevo praticamente esperienza di sviluppo mobile e, da studente di ingegneria informatica, mi sembrava una competenza importante da aggiungere alla cassetta degli attrezzi; adoro imparare cose nuove; e, in ultima analisi, volevo creare qualcosa di davvero utile, e un’applicazione mobile mi sembrava un ottimo esercizio, dato che lo smartphone lo si porta ovunque.
Con questo in mente, ho iniziato a esplorare diverse tecnologie e framework, finché mi sono imbattuto in Flutter — un framework relativamente nuovo (rilasciato nel 2017; all’epoca era il 2021) che ha attirato la mia attenzione perché offriva un ottimo supporto allo sviluppo multipiattaforma. Al tempo Kotlin Multiplatform non era ancora molto conosciuto, per cui Flutter mi sembrava incredibilmente rivoluzionario, anche perché sviluppato da Google e open source.
Dopo essermi immerso nella documentazione (che, come per la maggior parte dei prodotti Google, era fatta molto bene), sono riuscito a creare un prototipo semplice e funzionante, che ho rilasciato come ROQuiz v1.3-mobile_beta.
Da lì l’app è cresciuta release dopo release, fino all’attuale v1.11.5, che copre Android, Windows, Linux e web. L’applicazione desktop originale in Java/JavaFX esiste ancora, ma non è più mantenuta: sia quella che la prima app Flutter si trovano ora nella directory legacy/ della repository.
Contributi
La cosa che mi piace di più di questo progetto è che è sopravvissuto al mio esame per anni, perché altri studenti lo hanno tenuto in vita. Finora hanno contribuito in nove, per lo più aggiungendo o correggendo domande, e per rendere la cosa il più semplice possibile la repository mette a disposizione dei template di issue per segnalare una risposta sbagliata, proporre una nuova domanda, segnalare un bug o richiedere una feature — così contribuire non richiede nemmeno di saper usare Git.
Una menzione speciale va a Lorenzo di Palma e Filippo Veronesi, che hanno scritto un documento con la spiegazione della maggior parte delle domande, distribuito insieme all’app.
Sviluppi Futuri
Il progetto è attualmente in fase di refactoring verso la v2.0. L’obiettivo principale è fare pulizia nel codice e renderlo più leggibile e mantenibile — l’app originale l’ho scritta mentre imparavo Flutter, e si vede — ma la nuova versione porterà anche nuove funzionalità, tra cui lo storico dei quiz, le statistiche e impostazioni aggiuntive.
La beta è già giocabile nel browser: si può provare a questo link.
Disclaimer: l’obiettivo dell’applicazione è esercitarsi coi quiz dopo aver studiato la teoria (molto meglio se dal libro). Non mi assumo responsabilità di alcun tipo nel caso di errori nelle domande o nelle risposte, né tantomeno nel caso di bocciature potenti. Fatene un buon uso e buona fortuna con l’esame <3
operational research flutter dart java javafx windows linux android web
1420 parole
2021-07-10 08:00