Document

annuncio pubblicitario
Università degli Studi di Padova
Dipartimento di Matematica
Laurea in Informatica
Realizzazione di un'applicazione gestionale
per tablet Android ed iOS
Candidato:
Sturaro Agostino, 612088
Relatore:
De Giovanni Luigi
Anno Accademico 2011/2012
1
Indice
1 Progetto aziendale.............................................................................................................................4
1.1 L'azienda ospitante.....................................................................................................................4
1.2 Prodotti aziendali.......................................................................................................................4
1.3 Esigenze degli utenti..................................................................................................................5
1.4 Soluzioni cartacee......................................................................................................................5
1.5 Soluzioni digitali classiche........................................................................................................5
1.6 Nuove soluzioni su tablet...........................................................................................................6
1.7 Funzioni del prodotto.................................................................................................................7
1.8 Risk management.......................................................................................................................7
1.8.1 Identificazione e valutazione dei rischi..............................................................................9
1.8.2 Controllo dei rischi.............................................................................................................9
1.8.3 Strategie proposte.............................................................................................................10
2 Analisi dei requisiti..........................................................................................................................11
2.1 Piattaforma d'esecuzione..........................................................................................................11
2.2 Vincoli generali........................................................................................................................11
2.3 Assunzioni e dipendenze..........................................................................................................11
2.4 Casi d'uso.................................................................................................................................11
2.4.1 Autenticazione utente.......................................................................................................12
2.4.2 Gestione documenti..........................................................................................................13
2.4.3 Consultazione dettagli clienti...........................................................................................15
2.4.4 Consultazione catalogo....................................................................................................15
2.4.5 Gestione giri.....................................................................................................................15
2.4.6 Logout..............................................................................................................................16
3 Design e progettazione....................................................................................................................18
3.1 Vincoli per la distribuzione......................................................................................................18
3.2 Concetti di base........................................................................................................................18
3.3 Navigazione.............................................................................................................................18
3.4 Impostazione visiva generale...................................................................................................19
3.5 Interfaccia del programma.......................................................................................................21
3.5.1 Sezioni di autenticazione..................................................................................................22
3.5.2 Sezione documenti clienti................................................................................................24
3.5.3 Sezioni elenco clienti e calcolo giri.................................................................................29
3.5.4 Sezione catalogo articoli..................................................................................................33
4 Strumenti impiegati.........................................................................................................................38
4.1 Microsoft SQL Server 2008 r2................................................................................................38
4.2 Instant Developer.....................................................................................................................38
4.3 Database aziendale...................................................................................................................40
4.3.1 Situazione vigente all'inizio dei lavori.............................................................................40
4.3.2 Rielaborazione strutturale attuata.....................................................................................41
5 Sviluppo...........................................................................................................................................47
5.1 La sincronizzazione.................................................................................................................47
5.1.1 Utilizzo della soluzione integrata.....................................................................................47
5.1.2 Problemi di interoperabilità.............................................................................................48
5.1.3 Studio di soluzioni indipendenti......................................................................................49
5.2 Implementazione dei giri.........................................................................................................51
5.2.1 Soluzioni esistenti............................................................................................................52
5.2.2 Scelta e descrizione dell'algoritmo...................................................................................52
5.2.3 Problemi tecnici...............................................................................................................53
2
5.2.4 Problemi con i dati salvati................................................................................................53
5.3 Altre limitazioni riscontrate.....................................................................................................54
5.3.1 Limitazioni all'uso di widget............................................................................................54
5.3.2 Limitazioni sui valori di default.......................................................................................54
5.3.3 Limitazioni sulle tabelle aggregate..................................................................................55
6 Conclusioni......................................................................................................................................57
7 Riferimenti bibliografici..................................................................................................................58
3
1 Progetto aziendale
1.1 L'azienda ospitante
L'azienda per cui ho lavorato, la Vision Software Gestionale S.r.l., il cui logo è rappresentato
nell'Illustrazione 1, è un'azienda informatica che si occupa dello sviluppo di software gestionale e
della fornitura dei servizi di implementazione e supporto che ne favoriscono l'uso da parte dei
propri clienti.
Illustrazione 1: logo aziendale
Le origini dell'azienda risalgono al 1981, anno in cui i suoi soci svolgevano varie attività di
assistenza ad aziende, enti pubblici, studi professionali e centri elaborazione dati, e si è poi andata
specializzando nel settore degli applicativi gestionali.i
Inizialmente l'azienda si chiamava Nikezadit, poi, al fine di riflettere alcuni cambiamenti avvenuti
al proprio interno, ha cambiato nome in Vision Software House, fino ad assumere l'attuale nome di
Vision Software Gestionale.
L'azienda ha sede in a Pernumia, in provincia di Padova, ed opera sia sul Nord Est, tramite rete
diretta, che sull'intero territorio nazionale, tramite rete indiretta.
Vision fa parte da anni della Microsoft Partner Network: è certificata con una competenza silverii,
ed adotta delle certificazioni di qualità Microsoft per tutti i suoi prodotti destinati alle piattaforme
Microsoft.
Il suo slogan è “software gestionale per aziende italiane competitive nel mondo”.
1.2 Prodotti aziendali
L'azienda Vision Software Gestionale produce e mantiene diversi prodotti, ciascuno dei quali
studiato per risolvere un determinato insieme di problemi gestionali. Questi prodotti hanno dei
database strutturalmente molto simili, abbinati ad interfacce grafiche diverse a seconda del tipo di
esigenze che mirano a soddisfare. Su richiesta dei clienti, l'azienda si è disponibile a personalizzare
i propri prodotti per assecondare le varie necessità particolari che essi possono portare in rilievo.
Tra i prodotti aziendali possiamo citareiii:
VISIONERP, dedicato alle PMI
VISIONCANTIERI, dedicato alle imprese di costruzione
VISIONENERGY, dedicato alla distribuzione all'ingrosso di prodotti petroliferi
4
VISIONFRESH, dedicato alla distribuzione all'ingrosso di prodotti ortofrutticoli e ittici
VISIONTRASPORTI, dedicato agli autotrasportatori di merci e persone
1.3 Esigenze degli utenti
L'applicazione che ci è stato chiesto di realizzare doveva soddisfare le esigenze di due tipi di utenza:
i tecnici manutentori e gli agenti commerciali di aziende che operano nel settore della distribuzione
e dei servizi.
Il primo si occupa di trovare nuovi clienti e di vendere prodotti, mentre il secondo si occupa dei
clienti già acquisiti che necessitano di assistenza per i prodotti venduti.
Entrambe queste figure professionali hanno bisogno di effettuare frequenti spostamenti, e di
possedere informazioni aggiornate sempre a portata di mano. Hanno necessità di raccogliere dati in
maniera efficace e poterli comunicare anche in viaggio.
Ogni giorno il tecnico deve conoscere la propria lista degli impegni giornalieri, in gran parte
interventi di ordinaria manutenzione che possono essere programmati dall'azienda anche diversi
giorni prima. Necessita quindi un modo per tener traccia di tutte le proprie tappe, e documentare il
lavoro svolto.
L'agente può decidere in autonomia come organizzare i propri impegni giornalieri per raggiungere
gli obiettivi assegnatigli dall'azienda.
Spesso, per evitare che i propri commerciali competano tra loro per gli stessi clienti, rischiando di
visitare le stesse persone senza saperlo, l'azienda assegna ai propri commerciali delle diverse zone
geografiche di competenza. Vengono quindi messe a disposizione le informazioni sui potenziali
clienti residenti nelle zone loro assegnate.
Compito dell'agente è occuparsi della vendita dei prodotti ed i servizi proposti dall'azienda,
cercando di incrementarne il volume d'affari. A tal fine, ogni giorno organizza un insieme di visite
ai clienti che gli sono stati assegnati, e procede a contattarli per pubblicizzare e cercare di vendere i
prodotti disponibili sul proprio catalogo. In gergo, l'insieme delle visite che il commerciale compie
in un giorno viene detto “giro”.
1.4 Soluzioni cartacee
Questo è un problema che è stato in passato risolto stampando tutto su carta: l'indirizzo dei luoghi
da visitare, i dettagli dell'intervento da eseguire. In seguito veniva eseguita a mano la stesura del
rapporto d'intervento, ed eventualmente raccolta la firma del cliente.
Dobbiamo tuttavia tenere conto che il materiale stampato, oltre a non essere particolarmente
maneggevole, occupa volume anche dopo l'uso, giacendo in archivio. Inoltre risulta scomodo da
consultare per studi statistici. Pertanto, ove non siano presenti firme con valore legale, può rivelarsi
conveniente copiare i dati, salvarli in forma elettronica, e mandare tutto al macero. Per cui lo spreco
è doppio, e si compone della carta stampata e del tempo di copiatura.
1.5 Soluzioni digitali classiche
Sebbene gestire i documenti in forma digitale lungo tutto il loro ciclo di vita potesse sembrare la
soluzione più conveniente, questo approccio all'atto pratico risultava piuttosto scomodo. Infatti, fino
a poco fa, i mezzi più adatti a gestire i dati durante gli spostamenti, erano il notebook e lo
5
smartphone. Nessuno dei due rispecchiava in particolar modo le esigenze di maneggevolezza e
facilità d'uso richieste dalla clientela.
Leggere documenti complessi sullo schermo di uno smartphone può essere difficoltosoiv, date le
ridotte dimensioni dello schermo, grande al più 4 pollici. Inoltre, molto spesso questi dispositivi
montano solo tastiere di tipo touch, le cui dimensioni sono necessariamente costrette all'interno di
quelle dello schermo. Compilare un rapporto d'intervento con una tastiera digitale utilizzabile al più
con due dita può risultare più scomodo che scriverlo su carta.
Un discorso simile vale per i portatili, che sono stati pensati per essere utilizzati da seduti, e che
richiedono quindi un solido piano d'appoggio, sia per il loro peso, che per ridurre i rischi di caduta
accidentale.
1.6 Nuove soluzioni su tablet
Un dispositivo che, per il proprio form factor, si rende più adatto alla lettura ed all'utilizzo in
movimento è il tablet. Questo tipo di dispositivo era presente sul mercato fin dal 2000, ma ha avuto
una grande diffusione solo di recente, a seguito dell'introduzione dell'iPad nell'anno 2010. Da allora
si stima che la sola Apple abbia venduto più di 100 milioni di dispositivi di questo tipov.
Illustrazione 2: previsioni sulla percentuale di utilizzo del
traffico via etere da parte dei tablet. Fonte: Goldman Sachs
Research
Un tablet occupa all'incirca lo spazio di un quaderno, come è possibile notare dall'Illustrazione 3, e
pesa meno di 700 gvi. Può quindi essere trasportato nella 24 ore di un commerciale, o, se
opportunamente protetto, nella valigia degli attrezzi di un tecnico.
La rapida diffusione che questi dispositivi hanno avuto sul mercato, e le sue ampie prospettive di
crescita sono state il motore che ha spinto molte aziende verso lo sviluppo di nuovo software a loro
dedicato.
6
Illustrazione 3: dimensioni dell'iPad 3.
Fonte: sito ufficiale Apple
1.7 Funzioni del prodotto
Il prodotto deve permettere ad un utente di:
- autenticarsi in maniera sicura sul tablet aziendale
- recuperare i propri dati e la propria configurazione dopo l'accesso
- consultare le informazioni sui clienti assegnatigli dall'azienda
- creare e modificare documenti di compra-vendita
In particolare, deve permettere agli agenti commerciali di:
- consultare il catalogo dei prodotti trattati dall'azienda
- organizzare le proprie visite giornaliere
1.8 Risk management
Al momento di iniziare un nuovo progetto aziendale, oltre a delineare gli obiettivi da raggiungere,
bisogna premurarsi di quello che potrebbe potrebbe comprometterne il raggiungimento. Specie nei
progetti complessi, l'avanzamento dei lavori può incontrare diversi problemi, ed aver studiato un
modo per affrontarli può fare la differenza tra il successo ed il fallimento. Certi problemi si pongono
come ostacoli che possono essere identificati in partenza ed evitati tramite un'accorta pianificazione.
Altri ostacoli si incontrano solo cammin facendo, ma possono essere avvistati in tempo ed aggirati
tramite piccole correzioni di percorso, se si possiedono prontezza di riflessi ed adeguate capacità di
manovra.
Esistono però eventualità il cui verificarsi non è del tutto prevedibile, e quindi rischi che non
sempre è possibile evitare, e che, in una certa misura, bisogna quindi correre. Identificandoli è
tuttavia possibile adoperarsi per ridurre l'impatto causato dall'avverarsi delle minacce da loro poste.
Indiscutibilmente, quando si avvia un progetto esistono anche eventualità il cui verificarsi non è del
tutto prevedibile, e quindi rischi che non sempre è possibile evitare. L'importante è conoscere questi
7
rischi, in modo da prendere adeguate contromisure. Così come prima di attraversare una strada ci si
guarda bene attorno, e ci si muove in modo da ridurre la probabilità di essere investiti, prima di
cominciare un progetto bisogna guardarsi attorno per capire con quali difficoltà ci si potrebbe
scontrare.
Una gestione dei rischi per essere chiara dovrebbe prevedere esplicitamente i seguenti punti:
- identificazione dei rischi, scoprire le potenziali minacciare al normale svolgimento dei lavori
- valutazione dell'impatto che i rischi identificati avrebbero se si abbattessero sul progetto
- valutazione della probabilità che i rischi identificati si concretizzino
- ricerca di soluzioni per ridurre la portata delle minacce identificate, agendo sulla riduzione delle
probabilità e dell'impatto
- stesura di una strategia di abbattimento del rischio che affronti per prime le minacce più importanti
- applicazione della strategia e controllo della sua efficacia
Questi punti si trovano variamente raggruppati all'interno di fasi che formano il processo di risk
management aziendalevii, e possono essere completati da altri accorgimenti viii ma devono comunque
essere tutti presenti.
Illustrazione 4: Un esempio di processo che
comprende i punti sopra presentati. Fonte: sito web
della Borsa Italiana
È possibile agire in via preventiva, abbattendo la probabilità che un problema si verifichi. A volte è
preferibile intervenire invece sulla preparazione, riducendo il danno che questo potrebbe apportare.
In ogni caso, è importante costruire sistemi di controllo per monitorare i rischi e rilevare
l'avvicinarsi dei possibili problemi in maniera precoce, o quanto meno tempestiva, al fine di essere
in tempo per prendere misure correttive.
8
1.8.1 Identificazione e valutazione dei rischi
L'impianto del progetto era completamente nuovo rispetto a quelli già portati avanti dall'azienda, ed
era piuttosto nuovo sia per noi stagisti che per l'azienda. Identificare a priori i possibili rischi non è
stato quindi semplice, né sempre possibile, vista la poca esperienza.
Durante un progetto universitario, c'era stata occasione, per gli studenti, di lavorare su alcuni aspetti
della sincronizzazione su dispositivi mobili. Le conoscenze così acquisite hanno portato a guardare
particolare accortezza a quello specifico aspetto, la cui complessità era intuibile anche dal fatto che
essa era fondamentalmente l'unica funzionalità a richiedere una simbiosi con le applicazioni
preesistenti.
La realizzazione della sincronizzazione ha modalità che dipendono fortemente dall'ambiente di
sviluppo, fissato all'inizio del progetto, e presenta:
- la natura chiusa del suo codice proprietario, e la sua forte integrazione nel software, avrebbero
potuto compromettere le possibilità di intervenire in maniera correttiva in caso di bisogno
- la trasparenza con cui veniva nascosta la complessità delle operazioni di sincronizzazione
avrebbe potuto concedere minori margini di manovra di fronte all'insorgenza di eventuali problemi
1.8.2 Controllo dei rischi
Il continuo verificarsi di imprevisti è un elemento tipico di progetti in cui l'identificazione dei rischi
è stata poco efficace, e può avvenire più facilmente qualora ci si muova in ambienti nuovi. La
mancanza di esperienza non è tuttavia l'unico fattore a giocare un ruolo importante in questi casi.
Sapersi muovere con prudenza è sempre importante: se, per velocizzare la tabella di marcia, non si
pianificano dei controlli di percorso, la velocità così guadagnata può trasformarsi in incidenti
abbastanza gravi da portare ad un arresto completo, e quindi ad un maggior dispendio di tempo.
D'altro canto, nemmeno i continui controlli da soli bastano a garantire uno scorrevole svolgimento
dei lavori: a volte sono anzi loro stessi causa di continue interruzioni.
Per evitare di allarmare i supervisori, o di incorrere in lungaggini burocratiche, si preferisce quindi
affrontare al più presto l'emergere delle problematicità senza tenerne traccia. Si operano così
soluzioni sbrigative che curano i sintomi immediati, senza preoccuparsi di scoprirne le cause
storiche. Quando non viene tenuta traccia dei problemi e delle soluzioni adottate, nel caso la
problematica di fondo si manifestasse di nuovo, richiedendo altri interventi, c'è il rischio di
ritentare, senza saperlo, soluzioni precedentemente fallite, o di compiere interventi non coerenti con
quanto fatto in precedenza. Inoltre, soluzioni superficiali rischiano di presentare problemi aggiuntivi
che possono sommarsi a quelli originari, confondendo ulteriormente le acque.
Le conoscenze tecniche e storiche sui vari aspetti di un progetto possono essere trasmesse di
persona in persona, da chi ci se n'è occupato a chi se ne deve occupare. Tuttavia, col passare del
tempo, alcune di queste conoscenze potrebbero andare perse per dimenticanza, nel caso non ne
venisse tenuta una traccia scritta. Gli stessi partecipanti al progetto potrebbero avere difficoltà a
ricordare determinati dettagli, dopo averli lasciati in disparte per diversi mesi.
Applicando una gestione dei rischi che tenga una traccia permanente dei problemi che si sono
presentati e della loro risoluzione, diventa possibile fornire rapidamente a tutti coloro che prima o
poi lavoreranno sul progetto un quadro completo e preciso della situazione. Talvolta si rivela
9
importante, per intervenire efficacemente, conoscere i problemi riscontrati in passato, e sapere come
sono stati risolti.
Da questo punto di vista, le strategie di gestione dei rischi adottate, hanno bisogno di un sistema per
tenere conto di quanto succeda durante il progetto ed anche di quello che è successo in passato. Le
informazioni raccolte e la loro facilità di consultazione sono dunque di fondamentale importanza
per poter compiere decisioni accurate e tempestive nel correggere la rotta.
1.8.3 Strategie proposte
Uno strumento che si è rivelato efficace nel fornire un sistema di comunicazione dei problemi e nel
costruire uno storico ordinato comprensivo delle loro soluzioni, sono i sistemi detti appunto di
“issue tracking”. Essi sono software tramite i quali un'azienda può categorizzare e gestire in
maniera ordinata tanto le problematiche interne che quelle riscontrate dai loro clienti. Ogni
problema, “issue” in inglese, viene registrato nel sistema, con il dettaglio dei suoi sintomi, la data di
segnalazione e l'identità di chi l'ha segnalato. Da allora in poi viene tenuta traccia di chi interviene e
degli interventi effettuati. Ulteriori chiarimenti possono essere inseriti man mano per completare la
descrizione del problema. I sistemi di “issue tracking” sono detti anche “di ticketing”, in quanto in
passato per segnarsi i problemi si usavano dei bigliettini, “ticket” in inglese, che trovano oggi il loro
corrispettivo nella rappresentazione digitale nel softwareix.
I dati ricavabili dalla segnalazione e risoluzione dei problemi sono consultabili da chi debba
intervenire su situazioni simili, o riguardanti gli stessi aspetti del progetto. Diventa così più facile
reperire informazioni utili ad intervenire in maniera mirata e velocizzare i lavori, evitando di
ripetere errori già compiuti in precedenza.
L'utilizzo di sistemi di “issue tracking” può essere esteso per comprendere il tracciamento dei
requisiti, così da poter stimare il punto a cui sono giunti i lavori. Si riesce così a stimare quanto il
tempo necessario a porre rimedio a complicazioni sorte in itinere possa influire sulla data prevista
per il conseguimento degli obiettivi inizialix.
Dal punto di vista del manager, l'insieme dei dati e delle statistiche che il software è in grado di
generare è un utile quadro di indicatori sullo stato dei lavori, e su tutto quello che eventualmente li
sta rallentando. Questo insieme di informazioni è un utile aiuto al suo complesso compito di scovare
le criticità in agguato, oltre a costituire un punto di partenza per ragionamenti su come migliorare
l'efficienza dei processi .
10
2 Analisi dei requisiti
2.1 Piattaforma d'esecuzione
L'applicazione doveva essere compatibile con i seguenti prodotti:
- iPad
- iPad 2
- iPad 3 (The new iPad)
L'azienda ha chiesto di dare priorità allo sviluppo per la piattaforma iOS, che sapevano essere il
sistema preferito dai loro clienti, ed in particolare per l'iPad 2, che al momento dell'inizio del
progetto era la versione con maggiore penetrazione di mercato.
In secondo luogo ci ha chiesto di supportare anche le piattaforme tablet basate su sistema operativo
Android 4.
2.2 Vincoli generali
L'azienda ha imposto i seguenti vincoli sugli strumenti da impiegare per lo sviluppo:
- Instant Developer come ambiente di sviluppo primario
- Microsoft SQL Server 2008 r2 come motore per il database lato server
Inoltre era prevista la costruzione di un database locale che fosse una versione ridotta di quello
utilizzato dal lato server, e che quindi ne condividesse la struttura generale.
2.3 Assunzioni e dipendenze
Si assume che le applicazioni preesistenti possano interagire con i dati salvati sullo stesso database
lato server cui l'applicazione ha accesso. La nuova applicazione dipende da interventi esterni sul
database centrale per la creazione di nuovi account, e per la comunicazione degli impegni
giornalieri agli utenti.
Si assume che, nella maggior parte dei casi, essendo il database locale un sottoinsieme di quello
server, le modifiche di primaria importanza per l'applicazione tablet siano quelle che coinvolgono
campi presenti su entrambi i database.
Poiché il database locale dell'applicazione su tablet è una versione ridotta (nella struttura) e filtrata
(nel contenuto) del database lato server, si assume che le modifiche da riportare su entrambi i
database siano quelle che riguardano campi analoghi nella funzione e nel significato.
2.4 Casi d'uso
I principali casi d'uso sono mostrati nell'Illustrazione 5, e sono di seguito descritti.
11
Illustrazione 5: casi d'uso dell'agente commerciale,
rispetto al tecnico ha due casi d'uso aggiuntivi
“Consultazione catalogo” e “Gestione giri”
2.4.1 Autenticazione utente
L'autenticazione dell'utente si prepone all'uso di tutte le altre funzionalità del programma, e si
compone dell'inserimento e della verifica delle credenziali che identificano l'utente: username e
password.
Attori principali: tecnico o agente
Precondizioni:
- nessuno è autenticato nell'applicazione
- l'utente dispone di un account
- se è la prima volta che l'utente accede dal dispositivo in uso, questo dev'essere in grado di
comunicare con il database centrale
- l'utente sta visualizzando la schermata di login
Scenario principale: l'utente deve autenticarsi per poter accedere alle funzionalità principali
dell'applicazione. Inserisce quindi le proprie credenziali di accesso: username e password.
L'applicazione controlla le credenziali, e, se queste sono corrette, consente l'accesso all'utente.
Post-condizioni: l'utente ottiene l'accesso alle funzionalità principali dell'applicazione
Scenario alternativo: l'utente inserisce delle credenziali che non corrispondono ad alcun account
esistente sul dispositivo.
Se l'applicazione non è in grado di comunicare con il database centrale, avverte l'utente che per il
suo primo accesso dal dispositivo in uso è necessaria una connessione ad internet.
Nel caso in cui il dispositivo sia connesso, ma il server non risponda, viene chiesto di contattare
l'azienda per segnalare il problema.
12
2.4.2 Gestione documenti
Questo caso d'uso si compone di vari sotto casi, mostrati nell'Illustrazione 6 e di seguito descritti.
Illustrazione 6: espansione del caso d'uso "Gestione
documenti". Il tecnico ha un caso d'uso aggiuntivo rispetto
all'agente: "Compilazione piede documento"
Creazione documento
La creazione di un documento coincide con la creazione della sua testata, che ne definisce il tipo e
contiene i suoi dettagli più generali. Le righe del documento vengono aggiunte in seguito alla sua
creazione.
Attori principali: tecnico o agente
Precondizioni: l'utente è autenticato nell'applicazione, e sta visualizzando l'elenco dei suoi impegni
giornalieri, suddivisi per cliente
Scenario principale: l'utente inserisce, con l'aiuto dell'auto-completamento, i dati necessari alla
creazione della testata: codice destinazione diversa, codice documento, data documento, data
consegna, codice pagamento e note. L'applicazione controlla che i dati inseriti siano corretti,
completi e coerenti tra loro prima di creare il documento.
Post-condizioni: il sistema crea un nuovo documento, privo di righe e consistente nella sola testata
Scenario alternativo: l'utente non completa correttamente l'inserimento di alcuni dei dati necessari
alla creazione della testata, e l'applicazione segnala quali campi sono stati lasciati in uno stato
inconsistente
13
Aggiunta di una riga
Le righe di un documento sono come le righe di uno scontrino: rappresentano il costo,
eventualmente scontato, da pagare per l'acquisto o la vendita di una certa quantità di prodotti con lo
stesso codice.
Analoghi a questo caso d'uso sono i casi: “Modifica righe di un documento” e “Rimozione righe di
un documento”, entrambi mostrati nell'Illustrazione 6.
Attori principali: tecnico o agente
Precondizioni: l'utente è autenticato nell'applicazione, e sta consultando un documento già creato a
cui ha accesso
Scenario principale: l'utente inserisce, con l'aiuto dell'auto-completamento, i dati necessari alla
creazione della riga: codice articolo, quantità, sconti e note. L'applicazione controlla che i dati
inseriti siano corretti, completi e coerenti tra loro prima di aggiungere la riga al documento
Post-condizioni: il sistema aggiunge al documento la riga creata dall'utente
Scenario alternativo: l'utente non completa correttamente l'inserimento di alcuni dei dati necessari
alla creazione della riga, e l'applicazione segnala quali campi sono stati lasciati in uno stato
inconsistente
Compilazione piede documento
La chiusura di un documento, per il tecnico, richiede come azione aggiuntiva la compilazione di un
piede di documento.
Attori principali: tecnico
Precondizioni: l'utente è autenticato nell'applicazione, e sta consultando un documento già creato a
cui ha accesso
Scenario principale: l'utente inserisce, con l'aiuto dell'auto-completamento, i dati necessari alla
compilazione del piede: codice chiusura, ora di fine lavori, ora di partenza per il ritorno, ora di
arrivo del ritorno e note. L'applicazione controlla che i dati inseriti siano corretti, completi e
coerenti tra loro prima di aggiungere il piede al documento.
Post-condizioni: il sistema aggiunge al documento il piede creato dall'utente
Scenario alternativo: l'utente non completa correttamente l'inserimento di alcuni dei dati necessari al
salvataggio del piede, e l'applicazione segnala quali campi sono stati lasciati in uno stato
inconsistente
Raccolta firma
La raccolta della firma di un cliente avviene tramite un pennino.
Attori principali: l'attore principale, colui che firma, può essere:
- il tecnico o l'agente, se il documento è interno all'azienda
14
- un cliente che si trova di fronte ad un tecnico o ad un agente, se il documento riguarda terzi
Precondizioni: l'utente è autenticato nell'applicazione, e sta visualizzando un documento
completamente compilato
Scenario principale: l'utente firma sul tablet. Nel caso non sia soddisfatto della firma raccolta
dall'applicazione, può ricominciare da capo, e salvare il risultato finale nel momento in cui si senta
sicuro del risultato ottenuto.
Post-condizioni: l'applicazione salva la firma e la mostra in fondo alla testata del documento
Scenario alternativo: l'utente decide di annullare l'operazione
2.4.3 Consultazione dettagli clienti
Attori principali: tecnico o agente
Precondizioni: l'utente è autenticato nell'applicazione, e sta visualizzando l'elenco dei suoi clienti
Scenario principale: l'utente sceglie un cliente dall'elenco, ed accede quindi alle sue informazioni,
che servirono a rintracciarlo ed a contattarlo. Se sono presenti un indirizzo completo e la
connessione ad internet, viene data la possibilità di mostrare la posizione del cliente su una mappa.
Post-condizioni: l'utente visualizza i dettagli del cliente selezionato
2.4.4 Consultazione catalogo
Attori principali: agente
Precondizioni: l'utente è autenticato nell'applicazione, e sta visualizzando una schermata della
sezione catalogo
Scenario principale: l'utente desidera consultare il catalogo, ed inizia visualizzando l'elenco delle
macro-categorie. Ne seleziona una per accedere all'elenco delle sue sotto-categorie. Navigando tra
le categorie, raggiunge infine i singoli prodotti, dei quali può visualizzare i dettagli e le immagini a
loro associate.
Post-condizioni: l'utente riesce a trovare il prodotto cercato
Scenario alternativo: l'utente non trova il prodotto cercato, e telefona in azienda per sapere se esiste
2.4.5 Gestione giri
Questo caso d'uso si compone di vari sotto casi, mostrati nell'Illustrazione 7 e di seguito descritti.
15
Illustrazione 7: espansione del caso d'uso "Gestione giri"
Creazione giro
Analoghi a questo caso d'uso sono i casi: “Aggiunta destinazione”, “Rimozione destinazione” e
“Calcolo percorso” mostrati nell'Illustrazione 7.
Attori principali: agente
Precondizioni: l'utente è autenticato nell'applicazione
Scenario principale: l'utente desidera ordinare le visite che deve compiere in una singola giornata,
tracciando un percorso ottimizzato per il risparmio di tempo o carburante. Seleziona quindi i clienti
che vuole visitare quel giorno, e si avvale dell'applicazione per calcolare automaticamente un
percorso ottimizzato secondo le proprie priorità.
Post-condizioni: l'applicazione calcola il percorso che visiti tutti i clienti richiesti, e lo ottimizza
secondo le priorità dell'utente
Scenario alternativo: l'applicazione non riconosce l'indirizzo di un cliente, o non trova un modo per
raggiungerlo a partire dalla locazione corrente, ed avverte l'utente del problema
2.4.6 Logout
Attori principali: tecnico o agente
Precondizioni: l'utente è autenticato nell'applicazione, e sta visualizzando la schermata di uscita
Scenario principale: l'utente desidera uscire dall'applicazione prima di chiuderla. L'applicazione
chiede una conferma, l'utente la fornisce e l'applicazione procede quindi al logout.
Post-condizioni: l'utente non è più autenticato nell'applicazione
16
Scenario alternativo: l'utente annulla l'operazione fornendo una risposta negativa alla richiesta di
conferma presentata dall'applicazione
17
3 Design e progettazione
3.1 Vincoli per la distribuzione
L'obiettivo dell'azienda era quello di poter rendere disponibile ai propri clienti un'applicazione in
grado di funzionare su dispositivi tablet iOS ed Android.
Le applicazioni iOS, per essere rese disponibili ai clienti, devono essere distribuite attraverso il
canale ufficiale, l'App Store. Per accedere a questo canale, è necessario che i prodotti che si intende
distribuire siano conformi alle linee guida fissate da Apple.
Ciascun prodotto da immettere sul mercato, deve necessariamente superare una verifica da parte di
Apple, che controlla la conformità alle proprie linee guida, riservandosi la possibilità di non
ammetterlo al pubblico nel caso non le soddisfixi.
Pertanto è stato necessario studiare fin dall'inizio lo stile dell'applicazione che dovevamo
sviluppare, prestando particolare attenzione a non contravvenire le linee guida per l'eligibilità alla
distribuzione su App Store.
3.2 Concetti di base
Tenendo conto della necessità di conformarsi allo stile Apple, per mantenere una coerenza
dell'aspetto visivo del programma con le altre applicazioni dell'ecosistema, come pure all'interno del
programma stesso, è stato deciso di seguire un approccio alla progettazione orientato a mettere
prima di tutto a proprio agio l'utente. Del resto non potevamo rischiare che l'applicazione venisse
rifiutata per un mancato o scorretto uso delle convenzioni che governano la user experience di un
utente iOS.
Le principali questioni sulle quali abbiamo fin da subito posto importanza, sono state:
- aspetti gestionali, semplificare la navigazione per facilitare la ricerca dei dati
- uso su tablet, deve bastare una mano, non esiste un mouse
- schermo touch, per agevolare l'immissione dei dati servono pulsanti sufficientemente grandi e
distanziati da non richiedere una “mira” eccessiva
Ci siamo quindi da subito posti come obiettivo fondamentale lo sviluppo di un'interfaccia facile da
capire, ancor prima che da usare. Questo ha richiesto uno studio progettuale abbastanza simile a
quello di un sito web, con bozze delle schermate e percorsi di navigazione.
3.3 Navigazione
Per la navigazione, ci siamo ispirati all'app delle impostazioni dell'iPad:
- un menu laterale per accedere alle sezioni principali
- un riquadro a destra per muoversi tra le schermate della sezione
18
A fronte di tutto, abbiamo inserito una schermata di autenticazione, affiancata da un menu vuoto.
Questa organizzazione bipartita può ricordare quella di alcuni siti web, ma vi sono delle differenze
importanti, che è bene sottolineare:
- il menu di un sito, in genere, si espande durante la navigazione, mentre
il menu dell'iPad non si espande
- il menu di un sito, in genere, ci indica la sezione e la pagina in cui ci troviamo, mentre
il menu dell'iPad ci indica solo la sezione in cui ci troviamo
- in un sito si può tornare indietro tra una sezione e l'altra, mentre
nelle impostazioni dell'iPad si può tornare indietro solo all'interno di una sezione
Inoltre è stata compiuta una scelta distintiva sulla navigazione tra sezioni:
- nell'app delle impostazioni dell'iPad, i pulsanti del menu portano sempre al primo riquadro della
sezione scelta
- nella nostra app, i pulsanti del menu portano all'ultimo riquadro aperto nella sezione scelta
Questa scelta è volta a rendere più rapida la consultazione trasversale delle sezioni. Ad esempio, se,
mentre si sta compilando una fattura nella sezione documenti, si vuole cercare un prodotto nella
sezione catalogo, è poi possibile tornare a compilare la fattura dal punto in cui la si era lasciata.
3.4 Impostazione visiva generale
Le schermate dell'applicazione si presentano divise in due macro-regioni:
- a sinistra il menu
- a destra, la scheda aperta, che occupa la maggior parte dello spazio
In alto a sinistra:
- il nome dell'applicazione
- il menu, che permette di accedere alle sezioni
19
Quando il tablet è ruotato in posizione verticale, il menu viene nascosto per lasciar spazio al
riquadro principale, ed è possibile visualizzarlo premendo un bottone.
Il riquadro a destra può presentarsi in due modi:
- come lista di voci
- come form contenente i dettagli di una voce
Nel caso il riquadro si presenti come una lista, abbiamo:
- un pulsante per tornare al riquadro precedentemente della sezione
- una casella di ricerca che permette di specificare un criterio di filtro sulla prima colonna
- il nome del riquadro corrente
- i pulsanti per aggiornare la lista ed aggiungere una voce
Per cancellare una voce bisogna trascinarla col dito verso il bordo della lista, quindi compare sopra
di lei un pulsante per cancellarla.
Ciascuna voce di un riquadro di tipo lista può essere selezionata, e portare, a seconda di come è
stato studiato il riquadro:
- ad un riquadro di tipo form, che mostra i dettagli della voce selezionata
- ad un altro riquadro di tipo lista, contenente voci correlate
Questo secondo comportamento può essere sfruttato ad esempio per permettere all'utente di
navigare tra categorie e sotto-categorie, come scendendo in un albero.
Nel caso il riquadro si presenti come una form, abbiamo:
- un pulsante per tornare al riquadro lista in cui la voce compariva
- il nome del riquadro corrente
- il pulsante per modificare la voce, o, in alternativa, il pulsante per salvare le modifiche
Il nome del riquadro form che mostra i dettagli della voce ed il nome del riquadro lista che mostrava
la voce spesso coincidono, in quanto nella maggior parte dei casi si tratta dello stesso riquadro,
mostrato in due modi diversi.
Durante la modifica delle voci, a seconda del tipo dei campi, viene permessa una diversa modalità
di inserimento dati. Ad esempio, nel caso delle stringhe, è possibile inserire un valore da tastiera,
mentre per le date si impiega l'apposito widget.
I campi per cui ha senso inserire solo un valore preso da un insieme particolare, mostrano una drop
down list per la scelta dei propri valori.
20
3.5 Interfaccia del programma
L'interfaccia dell'agente, invece, aveva molto in comune con l'interfaccia del tecnico, per cui io ed il
mio collega abbiamo deciso di collaborare strettamente.
Abbiamo quindi portato avanti assieme uno studio approfondito e l'implementazione definitiva,
riservandoci dei periodi di lavoro individuale per lo studio e la proposta di bozze quando
ritenevamo necessario mettere a confronto le nostre idee per accertare quale strada fosse meglio
percorrere.
Così siamo riusciti a liberare del tempo per le parti più semplici, che potevano essere svolte
singolarmente, e siamo riusciti a lavorare assieme dove più contava procedere verso un unico
obiettivo comune.
Per le parti sviluppate fianco a fianco, crediamo che l'approccio critico e correttivo che abbiamo
adottato sia servito a garantire una maggior coerenza complessiva, oltre che una maggiore
attenzione al lavoro svolto.
Le differenze tra l'interfaccia dell'agente e quella del manutentore, queste verranno evidenziate nel
corso della descrizione delle parti comuni.
Per esplicare schematicamente la navigazione tra le schermate, adottiamo la seguente convenzione:
→ significa “proseguendo su un ramo del normale flusso logico”
← significa “premendo il pulsante per tornare indietro”
21
3.5.1 Sezioni di autenticazione
Schermata di login agente
Illustrazione 8: screenshot della schermata di login preso dal
programma
Serve a: autenticarsi nell'applicazione
Presenta: i campi login e password, ed un bottone per confermare i dati, un bottone per passare al
login di amministratore, come è possibile osservare nell'Illustrazione 8.
Ci si arriva da:
→ prima apertura applicazione
← schermata di logout, per trasferimento automatico dopo l'uscita
Da qui si passa a:
→ sezione documenti clienti, tramite autenticazione
→ schermata login amministratore, tramite il bottone
Nelle intenzioni iniziali il menu doveva essere rimosso per lasciar spazio ad un riquadro a tutto
schermo. C'era la possibilità di nasconderlo, ma, per via di un bug nell'ambiente di sviluppo, restava
possibile visualizzarlo quando il tablet era in posizione verticale. Per una scelta di coerenza estetica,
si quindi è deciso di lasciarlo visibile, seppur vuoto, anche in posizione orizzontale.
22
Schermata di logout
Illustrazione 9: screenshot della schermata di logout preso dal
programma
Serve a: consentire all'utente di uscire dall'applicazione prima di chiuderla
Presenta: un testo che chiede di confermare la volontà di uscire e due pulsanti per fornire la risposta.
(Illustrazione 9)
Ci si arriva da:
→ voce di menu “Logout”
Da qui si passa a:
→ schermata di autenticazione
23
3.5.2 Sezione documenti clienti
Schermata documenti clienti
Illustrazione 10: screenshot della schermata documenti clienti preso
dal programma
Serve a:
- consentire all'utente di accedere ai documenti che riguardano i suoi clienti, e facilitarne la
consultazione presentandone una visione organizzata
- rendere immediatamente distinguibili i clienti da visitare e visitati nel corso della giornata corrente
Presenta: l'elenco dei clienti dell'utente. La riga corrispondente ad ogni cliente ha un colore di
sfondo che può essere:
- verde, se il cliente è stato visitato oggi
- rosso, se il cliente deve ancora essere visitato oggi
- bianco, se non c'è bisogno di visitare il cliente oggi
Tutto ciò si può osservare nell'Illustrazione 10.
Ci si arriva da:
→ voce di menu “Documenti clienti”
→ schermata di login agente, per trasferimento automatico dopo l'autenticazione
← schermata di documenti cliente
Da qui si passa a:
→ schermata documenti cliente
24
Schermata documenti cliente
Illustrazione 11: screenshot della schermata documenti cliente preso
dal programma
Serve a:
- mostrare i documenti di uno specifico cliente creati nell'ultimo periodo
A seconda dei permessi concessi all'utente è possibile:
- avviare la creazione di un nuovo documento
- procedere alla modifica di un documento esistente
- rimuovere un documento creato
Presenta: l'elenco dei documenti relativi al cliente e creati nell'ultimo periodo, dei pulsanti funzione
nuovo ed aggiorna. (Illustrazione 11)
Ci si arriva da:
→ schermata documenti clienti
← schermata testata documento
Da qui si passa a:
→ schermata testata documento, premendo su una riga dell'elenco o sul pulsante “nuovo”
← schermata documenti clienti
25
Schermata testata documento
Illustrazione 12: screenshot della schermata testata documento preso
dal programma
Serve a:
- consentire la creazione di una nuova testata
- visualizzare e modificare il contenuto della testata di un documento
Presenta:
i campi necessari a descrivere: il luogo e la data in cui si è svolto l'intervento (l'utente è un tecnico),
o in cui consegnare la merce (se l'utente è un agente), il tipo di documento e la sua data di
creazione. Sono presenti anche un campo per le note ed uno in cui visualizzare la firma, quando
sarà stata raccolta. (Illustrazione 12)
Inoltre, se l'utente autenticato è un tecnico, vengono presentati dei campi aggiuntivi per descrivere il
motivo della chiamata, con alle tempistiche di partenza e di inizio lavori.
Nella modalità di creazione e modifica, presenta i pulsanti salva ed annulla.
Nella modalità di visualizzazione, presenta i pulsanti:
- torna indietro
- mostra righe
- elimina
- modifica
Ci si arriva da:
→ schermata documenti cliente
← schermata righe documento, tornando indietro o per trasferimento automatico dopo la firma
← schermata piede documento, per trasferimento automatico dopo la firma
26
Da qui si passa a:
→ schermata righe documento, tramite il pulsante “mostra righe”
← schermata documenti cliente
Schermata righe documento
Illustrazione 13: screenshot della schermata righe documento preso
dal programma
Mostra le righe del documento, che assomigliano alle righe di uno scontrino fiscale: ciascuna
descrive i dettagli sulla compravendita di uno specifico articolo.
Serve a: mostrare le righe del documento, ciascuna delle quali rappresenta, i costi da pagare per
l'acquisto o la vendita di un certo numero di prodotti uguali. (Illustrazione 13)
Presenta:
- un elenco dei prodotti coinvolti nella compravendita
- i pulsanti funzione nuovo ed aggiorna
- un pulsante “firma”, se l'utente autenticato è un agente
- un pulsante “chiudi documento”, se l'utente autenticato è un tecnico
Ci si arriva da:
→ schermata testata documento
← schermata dettagli riga
← schermata piede documento (se l'utente autenticato è un tecnico)
Da qui si passa a:
→ schermata dettagli riga
→ popup firma, tramite il pulsante “firma”
27
→ schermata piede documento, tramite il pulsante “chiudi documento”
← schermata testata documento
Piede documento
Illustrazione 14: screenshot della schermata piede documento preso
dal programma
Serve a: permettere al tecnico di compilare il piede del documento, e di consultarlo una volta finito
Presenta: i campi necessari a descrivere l'intervento effettuato, assieme alle tempistiche di fine
lavori e di ritorno.
Nella modalità di creazione e modifica, presenta i pulsanti salva ed annulla.
Nella modalità di visualizzazione, presenta i pulsanti:
- torna indietro
- elimina
- modifica
- firma
Tutto ciò si può osservare nell'Illustrazione 14.
Ci si arriva da:
→ schermata dettagli documento
Da qui si passa a:
→ popup firma
28
3.5.3 Sezioni elenco clienti e calcolo giri
Schermata elenco clienti
Illustrazione 15: screenshot della schermata elenco clienti preso dal
programma
Serve a:
- consentire all'utente di accedere alle informazioni che possono servirgli per contattare e
rintracciare i propri clienti
- facilitarne la consultazione presentandone una visione organizzata
Presenta: un elenco dei clienti dell'utente. (Illustrazione 15)
Ci si arriva da:
→ voce di menu “Elenco clienti”
← schermata dettagli cliente
Da qui si passa a:
→ schermata dettagli cliente, premendo sulla riga corrispondente ad un cliente
29
Schermata dettagli cliente
Illustrazione 16: screenshot della schermata dettagli cliente preso dal
programma
Serve a:
- mostrare le informazioni che possono servire all'utente per contattare e rintracciare un proprio
cliente
- permetterne la modifica
Presenta:
- l'indirizzo del cliente ed i suoi contatti, assieme ad altri dati come codice fiscale, partita IVA e
metodo di pagamento preferito
- un pulsante “vedi su mappa”
- gli opportuni pulsanti per la modifica ed il salvataggio dei dati
Tutto ciò si può osservare nell'Illustrazione 16.
Ci si arriva da:
→ schermata elenco clienti
Da qui si passa a:
→ schermata posizione cliente, premendo il pulsante “vedi su mappa”
← schermata elenco clienti
30
Schermata posizione cliente
Illustrazione 17: screenshot della schermata posizione cliente preso
dal programma
Serve a: mostrare sulla mappa la posizione di un cliente
Presenta:
- una mappa con segnata la posizione del cliente
- se l'utente autenticato è un agente, un pulsante “aggiungi al giro” o “rimuovi dal giro”a seconda
del fatto che il cliente faccia parte del giro corrente o meno. (Illustrazione 17)
Ci si arriva da:
→ schermata dettagli cliente
← schermata calcolo giri
Da qui si passa a:
→ schermata calcolo giri
← schermata dettagli cliente
Schermata calcolo giri
Serve a: consentire ad un agente di elencare i clienti che deve visitare in un giorno, ed ordinarle
calcolando un percorso ottimizzato per il risparmio di tempo e carburante.
Presenta:
- un pulsante “aggiungi cliente”
- un campo per selezionare i clienti da aggiungere
- una lista dei clienti che appartengono al giro
- un pulsante “calcola percorso”
- una mappa su cui viene mostrato il percorso calcolato
31
Ci si arriva da:
→ voce di menu “Calcolo giri”
→ schermata posizione cliente
Da qui si passa a:
← schermata posizione cliente, se l'utente era arrivato da lì
32
3.5.4 Sezione catalogo articoli
Schermata macro-categorie prodotti
Illustrazione 18: screenshot della schermata macro-categorie
prodotti preso dal programma
Serve a:
- mostrare una prima essenziale suddivisione dei prodotti trattati dall'azienda
- permettere di effettuare il primo passo della ricerca che si snoda dalle macro-categorie fino ai
singoli prodotti
Presenta: un elenco delle macro-categorie dei prodotti che l'azienda tratta. (Illustrazione 18)
Ci si arriva da:
→ voce di menu “Catalogo articoli”
← schermata categorie prodotti
Da qui si passa a:
→ schermata categorie prodotti
33
Schermata categorie prodotti
Illustrazione 19: screenshot della schermata categorie prodotti preso
dal programma
Serve a:
- mostrare le sotto-categorie di una macro-categoria di prodotti trattati dall'azienda
- permettere di effettuare il secondo passo della ricerca nel catalogo, per accedere alla lista dei
prodotti di una categoria
Presenta: l'elenco delle sotto-categorie di una macro-categoria precedentemente selezionata.
(Illustrazione 19)
Ci si arriva da:
→ schermata macro-categorie prodotti
← schermata categoria prodotti
Da qui si passa a:
→ schermata categoria prodotti
← schermata macro-categorie prodotti
34
Schermata descrizioni prodotti categoria
Illustrazione 20: screenshot della schermata descrizioni prodotti
preso dal programma
Serve a:
- permettere di effettuare il terzo passo della ricerca nel catalogo, ed accedere ai dettagli di un
singolo prodotto
- permettere all'utente di ricercare i propri prodotti di una categoria per codice per descrizione, e per
prezzo
Presenta:
- l'elenco dei prodotti della categoria, con i loro principali dettagli
- una tab bar con i pulsanti che consentono di scegliere il tipo di ricerca
Tutto ciò si può osservare nell'Illustrazione 20.
Ci si arriva da:
→ schermata categorie prodotti
→ schermata immagini prodotti categoria
← schermata dettagli prodotto
Da qui si passa a:
→ schermata dettagli prodotto
← schermata immagini prodotti categoria
← schermata categorie prodotti
35
Schermata immagini prodotti categoria
Serve a:
- permettere di effettuare il terzo passo della ricerca nel catalogo, ed accedere ai dettagli di un
singolo prodotto
- permette all'utente di cercare i prodotti di una categoria, sfogliando le loro immagini
Presenta:
- l'elenco delle immagini dei prodotti della categoria, affiancate dal codice del prodotto
- una tab bar con i pulsanti che consentono di scegliere il tipo di ricerca
Illustrazione non presente.
Ci si arriva da:
→ schermata descrizioni prodotti categoria
← schermata dettagli prodotto
Da qui si passa a:
→ schermata dettagli prodotto
← schermata descrizioni prodotti categoria
Schermata dettagli prodotto
Illustrazione 21: screenshot della schermata dettagli prodotto preso
dal programma
Serve a: mostrare le informazioni a disposizione su un prodotto a catalogo
Presenta:
- i dettagli del prodotto, come il codice, il prezzo e la categoria
- le immagini del prodotto eventualmente presenti, con dei bottoni per scorrerle
36
Tutto ciò si può osservare nell'Illustrazione 21.
Ci si arriva da:
→ schermata descrizioni prodotti categoria
→ schermata immagini prodotti categoria
Da qui si passa a:
← schermata descrizioni prodotti categoria, oppure a
← schermata immagini prodotti categoria, a seconda di come si era arrivati qui
37
4 Strumenti impiegati
4.1 Microsoft SQL Server 2008 r2
Microsoft SQL Server è un Relational Database Management System (RDBMS), più comunemente
detto database relazionale, rilasciato da Microsoft nell'aprile del 2010.
Per funzionare richiede un sistema operativo Microsoft Windows, con versione minima XP, o
Windows Server, con versione minima 2003, ed un'installazione della versione 3.5 del
framework .Net.
Il cuore del software è scritto in C++, mentre per l'interazione con l'esterno, e quindi come
linguaggio di querying, utilizza una propria variante di SQL-92 detta “Transact-SQL”, o, più
brevemente, T-SQL.
Come protocollo di rete a livello applicazione, per trasferire dati tra il server del database ed un
client, usa Tabular Data Streams (TDS). Questo permette di esporre il server attraverso web service,
incapsulando i pacchetti TDS all'interno di messaggi SOAP. Quando i dati devono essere acceduti
tramite web service, vengono quindi trattati sotto forma di XML.
Per l'accesso e la manipolazione dei dati, supporta inoltre le API Microsoft Object Linking and
Embedding Database (OLE-DB) e lo standard Open Database Connectivity (ODBC).
4.2 Instant Developer
Il programma che dovevamo realizzare era il primo ad essere studiato espressamente per tablet. Era
inoltre il primo destinato ad un sistema operativo non Microsoft. Forse per questi motivi, nella
speranza di velocizzare i lavori, la ditta aveva scelto Instant Developer (In.De), come ambiente di
sviluppo.
Questo software si compone di un modulo base, con delle limitazioni che possono essere rimosse
solo acquistando una licenza, e moduli aggiuntivi, disponibili solo a pagamentoxii.
Per funzionare richiede un sistema operativo Microsoft Windows, con versione minima XP, ed
un'installazione del framework .Net.
Può creare applicazioni client per Windows, Android ed iOS, ma l'applicativo server necessario per
fornire il servizio di sincronizzazione può essere creato solo per Windows, e necessita anch'esso
38
delle librerie .Net.
Per la costruzione dell'interfaccia grafica, In.De. permette di usare esclusivamente il proprio sistema
di drag&drop, senza generare alcun codice visibile all'interno dell'applicazione.
Per la programmazione della parte logica, utilizza invece un suo linguaggio, detto “visual code”,
che consente di scrivere le query e gestire gli eventi. Il codice scritto in questo linguaggio non può
essere creato su editor esterni, né può essere copiato ed incollato fuori dal programma.
Le applicazioni create da In.De. non sono multi-piattaforma per natura, ma vengono create tramite
una conversione che genera un codice scritto in un linguaggio specifico per ogni piattaforma.
Tuttavia, il codice del prodotto finale non è mai una semplice traduzione del codice scritto dal
programmatore: il compilatore aggiunge vaste porzioni di proprio codice, genera delle librerie, e ne
include delle altre.
Per questi motivi, le applicazioni create con questo strumento non sono in alcun modo portabili
verso altri ambienti di sviluppo. Non è possibile esportare neppure una riga di codice, e per
procedere ad un porting bisognerebbe operare una completa riscrittura.
Il software è completamente proprietario: il suo codice sorgente è chiuso. Anche volendo agire sul
codice generato dal compilatore, bisogna tenere conto che tale codice non è stato scritto dai
programmatori dell'azienda che usa il software, bensì dal compilatore dell'azienda fornitrice.
Le librerie incluse dal compilatore sono state scritte in parte dal compilatore, ed in parte
dall'azienda fornitrice, e quindi non sono in alcun modo proprietà dell'azienda che utilizza il
software, ma sono semplicemente concesse in licenza.
A seconda dei dettagli di questa licenza, l'azienda fornitrice potrebbe completamente precludere
l'uso non autorizzato di tali librerie. Oppure potrebbe richiedere un compenso per permettere che
esse siano usate in software creato con strumenti di sviluppo terzi.
Il codice generato dal compilatore, e le librerie incluse, sono stati creati solo per essere eseguiti
dalla macchina, ed il loro codice non è pertanto sempre formattato e presentato in forma
umanamente leggibile. Inoltre sono presenti delle sezioni di debug, che non sono strettamente
necessarie al funzionamento dell'applicazione, e che possono complicarne ulteriormente la
comprensione. Oltretutto, non esiste alcuna documentazione approfondita di tale codice.
39
4.3 Database aziendale
I database dei vari prodotti aziendali sono molto simili tra loro, e quello su cui abbiamo lavorato,
VISIONENERGY, non faceva eccezione. Era infatti una versione di test del database usato
dall'omonimo prodotto. Il motore RDMS era Microsoft SQL Server 2008 r2.
L'azienda ci ha messo a disposizione un database di prova su cui poter operare in quasi totale
libertà, senza il rischio di danneggiare dati importanti.
Durante lo sviluppo, ci siamo infatti trovati più volte in condizione di trarne vantaggio dalla
possibilità di sperimentazione concessaci.
Alcune versioni del programma che stavamo sviluppando, specie quelle iniziali e quelle che
introducevano nuove funzionalità, potevano causare, proprio per via della loro precocità, modifiche
erronee ai dati salvati. Nello scoprire la presenza di tali difetti, la possibilità di effettuare prove
estensive sul software ed il suo database è stata sovente di grande aiuto, ed in alcuni casi cruciale.
L'unico difetto che questa soluzione di prova aveva rispetto all'originale, era il suo scarso e poco
uniforme popolamento, avvenuto automaticamente tramite l'uso di un apposito programma, che
aveva generato dati talvolta poco credibili.
4.3.1 Situazione vigente all'inizio dei lavori
La struttura del database non era molto documentata, e le ragioni che avevano portato alla sua
costruzione erano un fattore di conoscenza personale dei singoli sviluppatori. Il funzionamento
delle parti sulle quali dovevamo operare direttamente ci è stato chiarito a voce, durante i colloqui
con il tutor aziendale. Comunque, molti aspetti di quello che avrebbe potuto riguardarci in maniera
indiretta durante il nostro lavoro, ci sfuggivano ancora. In particolare, la logica d'insieme non ci è
stata chiara fin dall'inizio, e, per ottenere chiarimenti a riguardo, abbiamo dovuto più volte agire di
nostra iniziativa e chiedere informazioni.
Solo più tardi siamo venuti a conoscenza di alcune delle ragioni che avevano determinato la
situazione che ci siamo trovati ad affrontare. L'azienda Vision è sempre stata disponibile ad
accogliere le richieste dei propri clienti in fatto di personalizzazione del proprio software. Così, nel
corso degli anni, per rispondere alle richieste di ciascun cliente, agli stessi programmi di base erano
state apportate modifiche distinte, creando molte versioni personalizzate, alcune delle quali erano
poi progredite divergendo sempre di più tra loro.
Per far fronte alla crescente frammentazione della base di codice, ed alla conseguente difficoltà nel
mantenere più versioni diverse del software contemporaneamente, si è poi proceduto ad integrare
molte di queste personalizzazioni nella struttura del database di partenza.
Nello specifico, il tipo più delicato di frammentazione che si era venuto a creare era stata l'aggiunta
di svariate colonne ad alcune tabelle del database, avvenuta a più riprese per venire incontro alle
richieste dei singoli clienti. Sulle varie versioni degli stessi database di partenza, tabelle con lo
stesso nome presentavano colonne diverse, e, poiché ciascuna di queste poteva serviva al cliente che
l'aveva richiesta, ma non ad un altro, l'unica possibile via per unificare i database era inserirle tutte.
Ci si è così venuti a trovare con tabelle composte da centinaia di colonne, nonostante molte di
40
queste colonne fossero utilizzate solo da una piccola percentuale dei clienti. Alcune di queste
colonne avevano pure funzioni molto simili, perché simili erano state create le esigenze di
personalizzazione che avevano spinto alla loro creazione, e non era stato poi possibile selezionare
l'una o l'altra perché servivano entrambe, seppure a clienti diversi.
A peggiorare le cose, il fatto che molti di questi campi opzionali, anziché contenere un valore nullo,
erano stati impostati con un valore di default discreto, una stringa vuota, che SQL Server gestisce in
maniera diversa.
Per via di questa scelta:
- le righe create erano più pesanti del necessario, causando un inutile appesantimento del database
- era difficile capire se un campo era stato impostato dall'utente o in automatico
Problematiche per l'utente
Proporzionalmente al numero di colonne di una tabella, cresce la lunghezza delle sue righe, il che,
quando parliamo di applicazioni per la contabilità, si traduce in una rappresentazione dei dati meno
leggibile. Per poter leggere delle righe così lunghe bisogna per forza scorrere più volte la schermata,
anche su schermi di grandi dimensioni. Questo è un difetto che è solo parzialmente correggibile
dando all'utente la possibilità di filtrare le colonne da mostrare. Difatti, al momento di creare una
nuova riga, bisogna visualizzare tutti i suoi campi, o almeno quelli non opzionali, per permetterne la
compilazione.
Problematiche prestazionali
L'elevato numero di colonne presenti nelle singole tabelle dei database aziendali, specie in quelle
maggiormente utilizzate, creava problemi di prestazioni per nulla trascurabili.
Soluzioni precedentemente adottate
Il database era cresciuto cresciuto gradualmente negli anni, tuttavia, non era mai stata applicata una
ristrutturazione d'insieme. Per tentare di mitigare i problemi prestazionali, erano state adottate
soluzioni di tampone, in particolare si era cercato di limitare la creazione di foreign key, preferendo
duplicare i dati più utilizzati nelle varie tabelle. Questo approccio riduce il numero di join
necessarie per ottenere i dati desiderati, ma scarica sul programmatore il peso della gestione della
consistenza delle informazioni salvate. Ciò ha portato da una parte al proliferare di trigger, e
dall'altra ad una maggiore complessità delle applicazioni, che dovevano occuparsi un numero
maggiore di controlli e di aggiornamenti.
4.3.2 Rielaborazione strutturale attuata
Tenendo conto conto delle problematiche storiche riscontrate nel database, abbiamo cercando di
crearne una versione strutturalmente alleggerita da impiegare nel nostro programma. La possibilità
di compiere questa semplificazione ci è stata data dal fatto che i vari tablet avrebbero dovuto salvare
su un proprio database locale parte dei dati presenti sul database centrale, per permettere
all'applicazione di funzionare anche in assenza di una connessione ad internet. A questo scopo
abbiamo studiato una versione ridotta del database originale che, visto la specificità dei requisiti
utente, aveva bisogno di un piccolo sottoinsieme delle colonne originali per rappresentare i propri
dati.
41
Tabella GrpArt
Questa tabella contiene le categorie in cui possono ricadere gli articoli.
CodGrpArt, codice della categoria, le prime 3 cifre indicano la categoria superiore, PK
DesGrpArt, descrizione della categoria di articoli
Livello, livello della categoria (se non è di primo livello, è una sottocategoria)
I codici di categoria possono essere di 3 o 5 cifre.
Se il codice è di sole 3 cifre, allora si tratta di una categoria di primo livello, altrimenti di una
sottocategoria. In tal caso, le prime 3 cifre indicano la categoria di livello superiore.
Tabella Art
Questa tabella contiene gli articoli che l'azienda tratta o ha trattato.
CodArt, codice dell'articolo, PK
CodForStd, codice del fornitore preferenziale
CodGrpArt, codice della categoria dell'articolo
DesArt, descrizione testuale dell'articolo
Listino1, prezzo di listino
CODMARCA, codice della marca
Sconto1, sconto applicabile
CodUM, codice dell'unità di misura usata per indicare la quantità di prodotto
QtaConf, numero di pezzi presenti in una confezione
CodClsArt, codice della classe dell'articolo
CodTopArt, codice della priorità con cui un articolo dev'essere venduto
CodStatArt, codice dello stato dell'articolo (ad esempio fuori catalogo)
Tabella Pagam
42
Questa tabella contiene i possibili tipi di pagamento, ed i relativi dettagli.
CodPagam, codice del metodo di pagamento, PK
DesPagam, descrizione del metodo di pagamento
Tabella CliFor
Questa tabella contiene i clienti, anche potenziali, dell'azienda ed i loro dettagli.I clienti possono
essere persone fisiche o giuridiche.
CodCliFor, codice del cliente, PK
CodPagam, codice del metodo di pagamento preferito, FK sulla tabella Pagam
DesCliFor, descrizione testuale del cliente
Cell, numero di telefono cellulare del cliente
CodAgente1, codice dell'agente (commerciale o tecnico) che segue il cliente
CodAgente2, codice di un eventuale secondo agente che segue il cliente
CodFiscale, codice fiscale del cliente
CodProv, codice della provincia del cliente, sono 2 lettere che corrispondono ad una provincia
italiana
CodZona, codice della zona del cliente
eMail, email del cliente
Fax, fax del cliente
Indirizzo, via e numero del cliente
Localita, comune del cliente
PartitaIva, partita iva del cliente
Sconto1, primo sconto applicabile per il cliente
Sconto2, secondo sconto applicabile per il cliente
Sconto3, terzo sconto applicabile per il cliente
Telefono, numero di telefono fisso del cliente
Contatto, persona di cui chiedere al telefono
DateLstDoc, data dell'ultimo documento creato, creato ex novo
DayAgList, codice degli agenti che hanno visitato il cliente oggi, creato ex novo
Tabella DestDiv
Questa tabella contiene le destinazioni diverse, che sono i vari recapiti di un cliente o gli indirizzi di
spedizione alternativi a quello principale.
CodDestDiv, codice della destinazione diversa, parte della PK
CodCliFor, codice del cliente, parte della PK ed FK su CliFor
DesDestDiv, descrizione testuale della destinazione diversa
Tabella Doc
Questa tabella contiene i tipi di documenti creabili per ciascun cliente. Un documento può essere
d'acquisto o di vendita, ma anche descrivere spostamenti di merce interni all'azienda.
43
CodDoc, codice del tipo di documento, PK
CodCliFor, codice del cliente, FK sulla tabella CliFor
DesDoc, descrizione testuale del tipo di documento
Tabella CallType
Questa tabella contiene i motivi di apertura e chiusura dei documenti.
CodCall, codice del motivo di apertura o chiusura del documento, PK
DesCall, descrizione testuale del motivo di apertura o chiusura
TipoCall, specifica se si tratta di un'apertura o di una chiusura
Tabella DocTes
Questa tabella contiene le testate dei documenti. Ciascuna testata contiene i dettagli generali di un
documento. Alcuni campi sono usati solo da un tipo di agente (commerciale o tecnico).
Id_DocTes, id della testata del documento, PK
CodCliFor, codice del cliente cui il documento fa riferimento, FK sulla tabella CliFor
CodDoc, codice del tipo documento creato, FK sulla tabella Doc
CodPagam, codice del metodo di pagamento adottato
DataCons, data della consegna della merce
CodClose, codice chiusura
OraIniAnd, ora in cui il tecnico parte per andare sul luogo dell'intervento
OraFineAnd, ora in cui il tecnico arriva sul luogo dell'intervento
OraIniLav, ora di inizio lavori del tecnico
OraFineLav, ora di fine lavori del tecnico
OraIniRit, ora in cui il tecnico parte per tornare in azienda
OraFineRit, ora in cui il tecnico fa ritorno in azienda
Note, note personali dell'agente sul documento
NumDoc, numero del documento
CodCont, numero del documento (bis, calcolato in altro modo)
CodEserciz, anno in cui il documento è stato creato
AnnoEserc, anno in cui il documento è stato creato (bis, serve ad altri scopi)
Firma, campo creato per contenere la firma del cliente
CodDestDiv, codice del luogo cui questo documento fa riferimento
CodCall, codice del motivo dell'intervento
NoteDesInt, note personali del tecnico sull'intervento
DataDoc, data in cui il documento è stato creato
Tabella DocRig
Questa tabella contiene le righe dei documenti. Ciascuna riga tratta di uno solo dei prodotti dei quali
il documento completo fa menzione. Se una riga fa parte di un documento d'acquisto, descrive i
dettagli dell'acquisto di un prodotto.
Id_DocRig, id della riga del documento, PK
44
Id_DocTes, id della testata del documento cui appartiene la riga, FK sulla tabella DocTes
CodCliFor, codice del cliente con cui si è trattato, FK sulla tabella CliFor
CodArt, codice dell'articolo in questione, FK sulla tabella Art
DesDocRig, descrizione testuale della transazione
Quantita, quantità di pezzi dell'articolo comprati, venduti o trasferiti
PrzUnit, prezzo unitario dell'articolo
Sconti, sconti applicabili al prezzo unitario
Note, note personali dell'agente sulla transazione
PrzTot, prezzo totale dei pezzi in questione, una volta applicato lo sconto
Tabelle create ex novo
Le tabelle seguenti sono state create ex novo ai fini del progetto.
Tabella iPadArtImg
Questa tabella contiene le immagini degli articoli.
CodImg, codice dell'immagine, PK
CodArt, codice dell'articolo rappresentato nell'immagine, FK sulla tabella Art
NomeImg, nome dell'immagine
ImgBlob, immagine salvata in formato binario, con un prefisso che serve ad identificarne il tipo
Tabella iPadSettAg
Questa tabella contiene le impostazioni dell'app per i singoli agenti che la possono usare.
CodAgente, codice dell'agente, PK
RuoloAg, ruolo dell'agente (tecnico o commerciale)
Pwd, password dell'agente, hashata
Tabella iPadPermRu
Questa tabella contiene i permessi che ciascun ruolo ha sui vari campi delle tabelle che può vedere.
Il permesso di un ruolo sul campo di una tabella può essere di 3 tipi: nessuno, solo vedere, vedere
ed editare.
IdPermRu, id del permesso del ruolo, PK
RuoloAg, ruolo cui applicare il permesso
Tabella, tabella cui applicare il permesso
Campo, campo cui applicare il permesso
PermessoRu, permesso garantito al ruolo sul campo della tabella in questione
Tabella iPadPermAg
Questa tabella contiene i permessi che ciascun agente ha sui vari campi delle tabelle che può
45
vedere. I permessi dell'agente possono coincidere con quelli del ruolo o sovrapporvisi, sono quindi
di 4 tipi: nessuno, solo vedere, vedere ed editare, default ruolo.
IdPermAg, id del permesso dell'agente, PK
CodAgente, codice dell'agente cui applicare il permesso
Tabella, tabella cui applicare il permesso
Campo, campo cui applicare il permesso
PermessoAg, permesso garantito all'agente sul campo della tabella in questione
46
5 Sviluppo
Una volta completata la progettazione, abbiamo proceduto ad operare l'implementazione del
programma. Ma, nel mettere mano a quest'opera, sono insorti vari elementi di difficoltà ed alcuni
ostacoli, molti dei quali dovuti a limitazioni dell'ambiente di sviluppo. Le difficoltà nel cercare di
superare questi problemi hanno portato ad un grande dispendio di tempo ed energie, e non sempre
hanno conseguito successi. In alcuni casi, dove non era possibile rimuovere o scavalcare gli ostacoli
incontrati, si è dovuto rimetter mano alla progettazione per tentare di aggirarli. Quando anche i
tentativi di aggiramento non portassero a trovare una strada percorribile, abbiamo dovuto ripensare
alcune funzionalità, o rinunciarvi del tutto.
5.1 La sincronizzazione
Uno degli aspetti centrali della user experience doveva essere la possibilità di ritrovare i propri dati
su ciascun dispositivo usato, e poter ricevere comunicazioni ed aggiornamenti dall'azienda in
maniera del tutto automatica. Al fine di raggiungere una integrazione quanto più trasparente tra i
dati presenti in azienda, inseriti tramite applicazioni preesistenti, e quelli presenti sui dispositivi
mobili, inseriti tramite la nuova applicazione, si rende necessario adottare delle adeguate strategie di
sincronizzazione.
L'aspetto della sincronizzazione dei dati tra i dispositivi mobili ed il server centrale, era una
questione di cui inizialmente non si pensava di doversi occupare. L'ambiente di sviluppo doveva
infatti garantire in maniera nativa la creazione di applicazioni per tablet in grado di funzionare
offline e di allineare i propri dati quando fosse presente una connessione.
La necessità di realizzare un applicativo dedicato sul server, non era espressamente dichiarata. Era
stato assicurato dal commerciale dell'azienda fornitrice dell'ambiente di sviluppo che, per creare
un'applicazione di questo tipo, era sufficiente attivare un'opzione aggiungendo una spunta. Così,
quando è stato sollevato l'argomento della sincronizzazione, questo è stato inizialmente
sottovalutato.
5.1.1 Utilizzo della soluzione integrata
Siamo riusciti a portare l'attenzione sul problema in occasione del primo giorno di formazione
presso l'azienda fornitrice dell'ambiente di sviluppo, la Pro Gamma, cercando di come abilitare la
modalità offline. Abbiamo quindi scoperto che, per realizzare un'applicazione che effettui la
sincronizzazione differenziale dei dati dell'utente, bisognava ricostruirla da capo, strutturandola in
modo totalmente diverso. Questo perché, la procedura automatica che volevamo sfruttare aveva
assoluto bisogno che le informazioni da allineare fossero rappresentate attraverso la “document
orientation”xiii.
Con il termine, più commerciale che tecnico, di “document orientation”, i fornitori intendevano una
modalità di rappresentazione delle tabelle duplice: un oggetto di tipo tabella e, collegato a questo,
un oggetto accessorio di tipo documento.
Per attivare la sincronizzazione automatica avremmo dovuto utilizzare le tabelle solo attraverso gli
oggetti di tipo documento, senza mai accedere direttamente agli oggetti di tipo tabella, che
restavano comunque visibili.
47
Pertanto sarebbe stato necessario riscrivere tutte le query, che usavano gli oggetti tabella, per usare
gli oggetti documento al loro posto.
Essendo il codice visualizzato dall'ambiente di sviluppo una semplice rappresentazione di blocchi
logici, era infatti detto “visual code”, la cancellazione di una variabile spesso equivaleva alla
cancellazione dell'intero blocco logico che la conteneva, e quindi la compromissione del codice.
In pratica, spesso conveniva riscrivere tutto.
Ad ogni tabella dovevano insomma corrispondere un oggetto di tipo tabella ed uno di tipo
documento. Dato che gli oggetti documento sono stati introdotti solo di recente nell'ambiente di
sviluppo, e visto che sono legati ai preesistenti oggetti tabella con una relazione perlopiù univoca.
Questo era probabilmente dovuto alle limitazioni sulle query che possono essere effettuate
attraverso documenti, come abbiamo in seguito scoperto.
In base a queste osservazioni, abbiamo dovuto procedere a una riscrittura del codice, che ha portato
a dilatare i tempi attesi per lo sviluppo. Inoltre, si rendeva necessario creare, tramite lo stesso
ambiente di sviluppo, un applicativo server per permettere all'applicazione client di accedere ai dati
da remoto, con i rischi connessi allo sviluppo di un'applicazione per il server centrale. In effetti, una
soluzione alternativa avrebbe richiesto un tempo di progettazione e sviluppo tali da portare a una
ridefinizione degli obiettivi dello stage.
5.1.2 Problemi di interoperabilità
Tuttavia abbiamo presto incontrato un problema ancor più serio: la sincronizzazione differenziale
automatica funziona solo se le modifiche al database sono effettuate dall'applicativo server scritto
con In.De. appositamente per i client scritti con lo stesso ambiente di sviluppoxiv. Per cui, gli
aggiornamenti apportati al database centrale dalle altre applicazioni aziendali avrebbero, nel caso
migliore, generato modifiche non rilevate dal nuovo applicativo server, e, nel caso peggiore, creato
interferenze in grado di far fallire la sincronizzazione con le sue applicazioni client, creando
inconsistenze nei dati.
Ancor prima di poter esaminare appieno la portata di tale problema, siamo stati affidati al
responsabile tecnico dell'azienda, che ci ha seguito alla ricerca di una soluzione.
Dopo aver acquisito le capacità necessarie a scrivere la nostra applicazione usando la “document
orientation”, abbiamo quindi realizzato una piccola applicazione di test, per verificare l'effettivo
funzionamento della sincronizzazione.
Il setup ha richiesto la costruzione di un'applicazione client e di una server di sincronizzazione
minimali, entrambe scritte con In.De., oltre alla configurazione di Microsoft SQL Server
Management Studio per l'accesso al database SQL Server.
Si è quindi potuto constatare che:
- se l'aggiunta di un record avveniva tramite il client scritto con In.De., essa veniva rilevata
dall'applicazione server scritta con In.De., e riportata sul database
- se l'aggiunta di un record avveniva tramite SQL Server Management Studio, essa veniva
completamente ignorata dall'applicazione server scritta con In.De.
Ci siamo quindi rivolti all'assistenza Pro Gamma per sapere se esistesse un modo per permettere
all'applicativo server scritto con In.De. di rilevare automaticamente le modifiche effettuate al
database. Per riuscire ad ottenere una risposta chiara ed univoca in proposito, abbiamo dovuto
insistere parecchio. All'inizio ci è stato detto di no, quindi il tutor aziendale ha telefonato al
commerciale per chiedere un rimborso, allora la risposta è stata diametralmente opposta.
48
Quindi siamo ricorsi all'assistenza telefonica perché evidentemente una soluzione doveva esserci. In
assistenza ci è stato precisato che non era possibile rilevare le modifiche in maniera automatica, ma
che era comunque possibile informare l'applicativo server, a patto di agire sulla tabella che esso
usava internamente per la sincronizzazione.
La struttura di questa tabella, chiamata “ZZ_SYNC”, e l'uso che il server ne faceva, erano
scarsamente descritti nella documentazione. Anche se questa tabella non doveva essere utilizzata, né
conosciuta dai programmatori, ne avevamo scoperta la presenza ancor prima, per via di un suo mal
funzionamento che ci aveva costretti a resettarla.
Le modifiche alla struttura del database che avvenivano in fase di sviluppo, come l'aggiunta di una
colonna al database, avevano l'effetto collaterale di confondere l'applicativo server, che di
conseguenza comprometteva la propria tabella di sincronizzazionexv.
Questa corruzione si manifestava con marcate difficoltà di sincronizzazione, o con il completo
fallimento della stessa. Tale fallimento non veniva tuttavia segnalato all'utente in modo esplicito,
ma solo registrato in un log. La natura del problema non ci era chiara, per cui eravamo stati costretti
a contattare l'assistenza, ed a cercarne le cause.
I problemi di sincronizzazione erano quindi già evidenti ancor prima di considerare l'integrazione
con le altre applicazioni esistenti.
5.1.3 Studio di soluzioni indipendenti
Per quanto potesse essere chiaro che l'ambiente di sviluppo si era rivelato inadeguato, le sue
inadeguatezze sono state considerate frutto di una sua immaturità cui le versioni successive
avrebbero potuto porre rimedio. La decisione del direttore è stata quindi quella di continuare lo
sviluppo con lo stesso programma, confidando nella sua evoluzione.
Alla luce dei problemi emersi, abbiamo proceduto a ridefinire i requisiti, in accordo con il tutor
aziendale: sarebbe bastato realizzare un'applicazione in grado di lavorare solo online, quindi con
una comunicazione diretta con il database e senza necessità di un server di sincronizzazione.
Era comunque chiaro che, per ottenere una sincronizzazione compatibile con gli altri software
aziendali, avremmo dovuto studiare un sistema di sincronizzazione indipendente da quello di
In.De.. Di lì a breve, infatti, abbiamo contattato per l'ultima volta l'assistenza, per chiedere se i
problemi di sincronizzazione fossero dovuti all'immaturità del prodotto, ed in tal caso quando
sarebbero stati risolti. Ci è stato risposto che la sincronizzazione era pronta così com'era, e che non
avrebbe subito cambiamenti importanti nelle successive versioni di In.De..
Dopo aver esposto la situazione al management, ed aver considerato il tempo speso nel tentare di
far funzionare in accordo con i prodotti esistenti la sincronizzazione fornita da In.De., l'azienda ha
deciso che sarebbe stato più conveniente sviluppare una soluzione ex novo.
Una soluzione indipendente dall'ambiente di sviluppo si sarebbe infatti potuta utilizzare anche per
altri prodotti, ed avrebbe consentito di acquisire conoscenze utili in futuro.
Inizialmente, il desiderio di ottenere un'integrazione completa con l'applicazione tablet scritta con
In.De. ha portato a discutere la possibilità di sostituire in maniera trasparente il server di In.De. con
49
uno scritto a parte. Tuttavia la documentazione non si è rivelata sufficientemente approfondita da
consentire la scrittura di server di rimpiazzo.
Riuscire nell'intento di sostituire il server avrebbe dunque richiesto un grande sforzo di reverse
engineering dei protocolli di comunicazione, e che qualsiasi cambiamento apportato in una
successiva versione di In.De. avrebbe sicuramente vanificato tale sforzo.
Una delle idee era che, se le applicazioni tablet scritte con In.De. erano tradotte in HTML5, e per
funzionare offline si appoggiavano al database SQLite integrato nel browserxvi, noi potevamo farle
funzionare offline comunque, sfruttando un file SQLite salvato sul file system.
Il normale browser non permette di interagire con i file locali, ma potevamo avvalerci
dell'applicazione che la ditta fornitrice aveva sviluppato per consentire di eseguire le applicazioni
create con Instant Developer con i mezzi necessari per caricare e salvare file all'interno di una
cartella locale.
Assumendo di poter accedere al database SQLite salvato sul dispositivo come file separato, si
sarebbe potuta effettuare una sincronizzazione da un programma esterno.
Nel caso la policy di sicurezza del sistema operativo non consentisse ad un'applicazione di accedere
ai file di un'altra, si sarebbe dovuta tentare un'altra strada.
Un'alternativa era quella di far dialogare l'applicazione con un web service remoto. In questo caso si
sarebbe potuta spostare gran parte della logica su server, dove poteva essere scritta in un linguaggio
meno limitante, ed ottenere così l'obiettivo desiderato di scrivere una parte indipendente
dall'ambiente di sviluppo usato per l'applicazione client.
In ogni caso, comunque, gli applicativi per la sincronizzazione di database SQL Server 2008 con
database SQLite erano molto meno comuni di quelli che potevano essere usati per sincronizzare, ad
esempio SQL Server 2008 con MySQL.
Tra questi, quelli che non richiedevano la modifica delle applicazioni esistenti, effettuavano un
confronto riga per riga tra i due database, e questo poteva rivelarsi troppo pesante per una
connessione dati su rete mobile e troppo lento per soddisfare i nostri casi d'uso.
L'alternativa che mi è sembrata più convincente, seppur potenzialmente onerosa in termini di lavoro
da compiere, era la seguente:
- creare sul database centrale uno storico delle modifiche apportate dalle applicazioni desktop
- creare sui database dei dispositivi mobili uno storico delle modifiche apportate dalle loro
applicazioni locali
- creare un applicativo lato server da interporre tra le applicazioni dei dispositivi mobili ed il
database centrale, per mantenere un terzo storico, relativo alle modifiche apportate al database
centrale a seguito delle sincronizzazioni dei singoli dispositivi mobili
Tutte le informazioni aggiuntive presenti negli storici così creati si sarebbero potute usare per
alleggerire i confronti da effettuare sulle varie tabelle, ed evitare di dover ricorrere al confronto di
tutte le righe, effettuando una sincronizzazione differenziale più veloce e meno dispendiosa in
termini di banda.
Le applicazioni desktop continuano a non aver bisogno di alcuna sincronizzazione, essendo sempre
in connessione diretta con il database centrale, e non è quindi necessario che siano al corrente della
50
presenza di un'applicazione server aggiuntiva.
Inoltre, c'è la possibilità che, attivando delle funzioni di log del database centrale, per generare lo
storico delle modifiche apportate dalle applicazioni desktop, non sia nemmeno necessario dover
riadattare queste applicazioni. Si otterrebbe così una soluzione totalmente trasparente alle
applicazioni esistenti.
In caso contrario, seppur con alcuni sforzi di riadattamento, si otterrebbe comunque una soluzione
capace di effettuare una sincronizzazione in maniera efficiente, cioè quanto desiderato. Tale
soluzione sarebbe inoltre riutilizzabile dall'azienda per lo sviluppo di altri prodotti destinati a
dispositivi mobili.
5.2 Implementazione dei giri
Contrariamente a quanto avviene per il tecnico, che ha una tabella di marcia prestabilita, il
commerciale deve decidere in autonomia come organizzare le proprie visite giornaliere.
L'azienda gli mette a disposizione delle informazioni sui suoi potenziali clienti, spesso suddivisi per
zone ed assegnati in modo da evitare che competa con gli altri commerciali per gli stessi clienti.
All'interno della sua zona, tuttavia, un agente può decidere di visitare anche altri clienti, oltre a
quelli suggeriti, qualora se ne presentasse l'occasione. Dev'essere quindi possibile aggiungerli
all'elenco delle visite, e gestirli al pari degli altri.
Maggiore è il numero dei clienti da visitare, e più attentamente bisogna studiare il percorso per
visitarli tutti, se si vuole ridurre la distanza totale percorsa, o il tempo totale di viaggio, a seconda
delle necessità. C'è chi preferisce risparmiare carburante, e chi invece ha bisogno di avere più tempo
utile a disposizione.
In entrambi i casi, si tratta di risolvere un problema di ottimizzazione noto in letteratura come
“problema del commesso viaggiatore”, o “TSP”, dal suo nome inglese “Travelling Salesman
Problem”, che si presenta per l'appunto nella sua formulazione originaria.
Questo è un problema NP-hardxvii, per cui non è noto, allo stato attuale, alcun algoritmo con
complessità polinomiale per risolverlo all'ottimo. Di certo si può affermare che la ricerca della
soluzione ottima può richiedere più tempo di quanto un commerciale sia disposto ad aspettare per
ottenere delle indicazioni stradali.
Nel caso più comune in cui ciascuna di queste destinazioni sia raggiungibile a partire da qualunque
altra, i casi da controllare per garantire che una soluzione trovata sia ottima sono tutte le possibili
permutazioni del loro insieme. Il numero di queste permutazioni cresce molto rapidamente col
crescere del numero di destinazioni, causando un'esplosione combinatoria che rende difficile, se non
impossibile, ottenere una risposta in tempo utile.
In effetti, la complessità dell'algoritmo risolutivo a forza bruta è O(n!), per cui già con 14
destinazioni vi sono oltre 87 miliardi di casi da controllare. Inoltre, essendo il problema NP-hardxviii,
anche gli algoritmi più avanzati finora conosciuti hanno complessità esponenziale.
Quindi, se vogliamo fornire una soluzione al TSP in un tempo accettabile, dobbiamo rinunciare a
dimostrare che questa soluzione è la migliore possibile, ed accontentarci di una soluzione
51
sufficientemente buona. A meno che il numero di destinazioni sia molto contenuto, siamo quindi
portati ad accettare un certo grado di approssimazione.
Nel nostro caso, l'utente è disposto ad aspettare pochi secondi per ricevere una soluzione, per cui la
rapidità di calcolo e la reattività del programma hanno la priorità sulla qualità dell'approssimazione.
5.2.1 Soluzioni esistenti
Per risolvere il problema in questione, esiste un gran numero di applicazioni e di librerie già
implementate, ma, purtroppo, nessuna di queste era compatibile con l'ambiente di sviluppo
impiegato. O forse sarebbe meglio dire il contrario, dato che è l'ambiente di sviluppo ad usare un
linguaggio completamente proprietario, ed a non permettere la chiamata di librerie senza modificare
il compilato finale.
Si è quindi adottata una soluzione sufficientemente semplice da poter essere implementata con i
mezzi ed il tempo che rimanevano a disposizione.
5.2.2 Scelta e descrizione dell'algoritmo
Tra gli algoritmi euristici per la soluzione del TSP presenti in letteratura, la classe che mi è sembrata
avere il miglior rapporto tra semplicità di implementazione ed errore medio è stata quella degli
algoritmi di inserzione. Questi algoritmi costruiscono il percorso completo inserendo una nodo alla
volta.
A seconda del criterio adottato per scegliere la nodo inserito ad ogni passo:
- nearest insertion, sceglie il nodo più vicino ad uno dei nodi del percorso
- farthest insertion, sceglie il nodo più lontano da uno dei nodi del percorso
- cheapest insertion, sceglie il nodo che costa meno inserire nel percorso
- random insertion, sceglie un nodo a caso
Tra questi algoritmi si è scelto quello che, nelle prove pratiche, risulta avere l'errore medio minore:
il farthest insertionxix.
L'idea alla base è quella di collegare subito le città più lontane nel tragitto, in modo da tracciare il
prima possibile un contorno dell'intero tragitto.
Vediamo nel dettaglio i passi di questo semplice algoritmo.
0) costruiamo una tabella distanze tra le coppie di nodi
1) scegliamo i due nodi più distanti tra loro, che chiameremo x ed y, e li usiamo per costruire il
primo circuito parziale x → y → x.
2) cerchiamo il nodo z per cui sia massima la distanza dal nodo del percorso a lui più lontano, cioè
z = arg max(max(dist(x,z), dist(y,z)))
Inseriamo questo nodo nel percorso. Grazie alla simmetria delle distanze, posizionarlo nel verso di
andata (x → y) o in quello di ritorno (y → x) è indifferente.
52
3) scegliamo, tra i nodi fuori dal percorso, il nodo z per cui sia massima la distanza dal nodo del
percorso a lui più lontano.
Decidiamo a che punto del percorso inserirlo, quindi quale coppia di nodi collegati tra loro
dobbiamo scollegare e riconnettere tramite z.
L'opzione migliore è quella per cui il nuovo percorso che si viene a creare risulta il meno allungato
possibile.
4) torniamo al punto 2) finché tutti i nodi non sono stati aggiunti al percorso
5.2.3 Problemi tecnici
L'algoritmo sopra descritto funziona conoscendo il costo del percorso tra ogni coppia di nodi.
Questo costo potrebbe rappresentare una distanza chilometrica o un tempo di percorrenza, non ha
importanza. Quel che conta è che sia indicato in modo uniforme. Resta da capire come calcolarlo.
Trattandosi di punti su una mappa, basterebbe conoscere latitudine e longitudine per calcolare una
distanza in linea d'aria. Poiché sul database aziendale queste informazioni non erano salvate,
bisognava ottenerle sfuttando un servizio di geo-localizzazione. A questo fine, l'azienda aveva già
previsto l'impiego di un plugin proprietario che permetteva all'ambiente di sviluppo di interfacciarsi
con i servizi di Google Maps.
Si era assunto di poter usare tale componente aggiuntivo per calcolare anche le distanze via terra tra
le differenti locazioni, e per sapere i tempi di percorrenza dei loro collegamenti stradali. Tuttavia,
per ottenere tali informazioni, il componente aggiuntivo forzava a lanciare un aggiornamento della
mappa per ogni calcolo di percorso. Non veniva fornito alcun modo pratico per mettersi in attesa
delle risposte asincrone di Google senza dover per forza aggiornare la mappa mostrata all'utente.
L'unico modo per calcolare gli (n^2)/2 percorsi ed i relativi costi sarebbe stato dunque utilizzare un
timer per aspettare il completarsi dell'aggiornamento della mappa su schermo, prima di rilanciare il
codice per chiedere un altro aggiornamento, cosa assolutamente improponibile.
Pertanto ci si è dovuti limitare alle interrogazioni effettuabili in modo sincrono, sufficienti solo a
recuperare le coordinate corrispondenti ai vari indirizzi. Di conseguenza, l'unica via percorribile
restava calcolare le distanze in linea d'aria, anche se erano meno precise.
5.2.4 Problemi con i dati salvati
Tuttavia, per risalire a delle coordinate, bisogna partire da un indirizzo valido, e, sfortunatamente,
molti degli indirizzi salvati nel database di prova erano inesistenti o contenevano errori. Quindi non
era da escludere la presenza di dati parziali o approssimativi.
Ad aggravare la situazione, Google Maps riconosce correttamente gli indirizzi solo se sono
formattati secondo regole precise. Ad esempio gli indirizzi che contengono la stringa “/bis”
vengono riconosciuti solo in parte, ed un indirizzo contenente punti o virgole può creare
comportamenti poco prevedibili. Vale la pena notare che questi dettagli sono scritti nella
documentazione delle API di Google, ma non erano in alcun modo menzionati nella
documentazione del plugin.
53
A questo punto si poteva procedere in due modi: tramite espressioni regolari, che avrebbero potuto
mitigare i problemi di formattazione, ma che non erano supportate dall'ambiente di sviluppo, o
tramite un intervento diretto sul database.
La necessità di intervenire direttamente sul database comportava diversi inconvenienti, anche
perché non era mai stato definito un modello unico per il loro salvataggio, e quindi ogni cliente
aveva avuto modo di adottare le proprie convenzioni. Inoltre, per mantenere la coerenza dei dati
anche dopo l'intervento, si sarebbero dovuti modificare tutti i programmi esistenti per integrare dei
controlli di conformità.
Per evitare i disagi ed i costi derivanti da tali modifiche, si è scelto di non obbligare l'inserimento di
indirizzi corretti, ma di segnalare semplicemente la presenza di errori al momento del loro utilizzo,
permettendo agli agenti di correggerli direttamente da tablet, nel caso lo ritenessero necessario.
5.3 Altre limitazioni riscontrate
5.3.1 Limitazioni all'uso di widget
In alcuni casi ci siamo trovati con campi di database che rappresentavano date o numeri, ma che
erano salvati come stringhe. In quanto l'ambiente di sviluppo non permetteva di forzare l'uso di
specifici widget sulle stringhe, abbiamo lasciato il metodo di inserimento generico da tastiera.
Abbiamo notato che un grosso svantaggio di questo ambiente di sviluppo era dovuto al forte legame
presente tra l'interfaccia creata e la struttura del database sottostante. Se ci si limita a mostrare il
contenuto di una singola tabella, vengono messi a disposizione i widget per l'inserimento e la
rimozione delle righe, e la modifica delle righe risulta immediata.
Tuttavia, già al momento di selezionare le colonne da visualizzare possono sorgere problemi: per
creare una nuova riga sulla tabella bisogna in qualche modo impostare tutti i campi obbligatori, se
questi non hanno un valore di default. Se uno di questi campi manca, l'ambiente di sviluppo se ne
accorge a tempo di compilazione, ma invece di segnalarlo al programmatore, aggiunge
automaticamente il campo necessario. Più volte ci siamo trovati a chiederci il motivo della
comparsa di campi che non avevamo inserito, e, tentando di toglierli, li abbiamo visti ricomparire.
Abbiamo capito il motivo di questo comportamento solo dopo aver contattato l'assistenza, la quale
ha sostenuto che tale comportamento le risultava essere il più ovvio possibile.
5.3.2 Limitazioni sui valori di default
Anche dopo aver capito la logica adottata, le difficoltà sono continuate. Per motivi di porting, nel
database che usavamo, molti dei campi opzionali, anziché essere inizializzati a null, di default
venivano riempiti con una stringa vuota. Questa era una scelta dei programmatori, perché SQL
Server è in grado di distinguere tra null e stringa vuota, ed era impostato per trattarli in maniera
diversa.
Ci siamo accorti di un bug per cui le stringhe vuote non venivano riconosciute come valori di
54
default validi, e venivano semplicemente scartate senza avviso, rendendo il campo obbligatorio.
Quindi, al momento della compilazione, alla tabella venivano aggiunte automaticamente varie
colonne che non ci servivano.
Dato il limitato spazio presente sullo schermo del tablet e la scarsa importanza dei campi aggiunti in
maniera forzata dall'ambiente di sviluppo, abbiamo provato a rimediare, seppur in parte,
impostando i campi come opzionali direttamente dentro l'ambiente di sviluppo.
Sfortunatamente, tali modifiche potrebbero non risultare per nulla evidenti a chi dovrà in futuro
mantenere il codice, trattandosi spesso di spunte nell'interfaccia che potrebbero andare perse
nell'eventualità di una nuova importazione della colonna. Questa possibilità non è poi così remota
se teniamo conto che, dopo aver aggiunto una colonna al database, per vederla all'interno
dell'ambiente di sviluppo bisogna reimportare l'intera tabella, comprese le colonne già presenti, le
cui impostazioni precedenti vengono perse, senza possibilità di scelta e senza alcuna segnalazione a
riguardo. In tal caso, i campi impostati come opzionali tornerebbero ad essere obbligatori, e le
colonne nascoste tornerebbero ad essere visibili.
Questa è tuttavia la soluzione che ci ha proposto l'assistenza quando abbiamo segnalato il bug sul
mancato riconoscimento della stringa vuota, ed era il modo più semplice di agire, senza ricorrere
alla modifica del database sottostante.
5.3.3 Limitazioni sulle tabelle aggregate
Le limitazioni più grandi le abbiamo riscontrate nell'uso delle tabelle costruite come risultato di
query che uniscono due o più tabelle. Nell'ambiente di sviluppo, queste tabelle aggregate potevano
essere trattate in maniera molto simile alle altre: non erano viste, e potevano essere mostrate
all'utente su un pannello identico a quello usato per le normali tabelle. Tuttavia, a run time venivano
trattate in diversamente: nel caso l'utente provasse a modificare anche solo un campo di una tabella
aggregata, si verificavano degli errori run time che venivano registrati su un log, ma non
visualizzati al di fuori del debug.
Dato che il salvataggio delle modifiche falliva senza evidenziare particolari motivi, abbiamo dovuto
contattare l'assistenza per capire che il problema stava nelle restrizioni che In.De. imponeva
implicitamente all'uso delle tabelle aggregate. Ci è stato riferito dall'assistenza che, a causa di
alcune limitazioni intrinseche ai driver usati per l'accesso al database, il loro programma non era in
grado di risalire alle tabelle di origine del dato modificato sulla tabella aggregata, e non era dunque
in grado di salvarlo correttamente.
Le nostre operazioni di aggregazione erano semplici natural join: non facevano altro che prendere
due tabelle ed unire le righe i cui valori dei campi omonimi corrispondevano. Le primary key erano
mantenute nella riga, quindi da un campo della tabella aggregata era sempre possibile risalire alle
sue tabelle di origine. Sarebbe stato dunque possibile riportare automaticamente sulle tabelle
originarie le modifiche alla tabella aggregata.
Ci è stato suggerito di implementare autonomamente il riconoscimento della tabelle cui
appartenevano originariamente i campi presenti nelle tabelle aggregate, e quant'altro fosse
necessario a salvare le loro modifiche.
Si trattava, inizialmente, di catturare l'evento del bottone di salvataggio delle modifiche ed eseguire
55
le azioni necessarie a riportare le modifiche sulle tabelle originarie. Siamo stati frenati nel nostro
intento dalla necessità di bloccare tutti i comportamenti di default attivati da eventi paralleli a quello
di salvataggio.
Gli eventi sollevati dall'applicazione, possono essere ascoltati dal programmatore, che può usarli
per intervenire al momento giusto, ma che non può sapere se qualche altro componente li ascolta
per eseguire qualche altra azione. Per sapere cosa succede alla pressione di un pulsante, bisogna
scoprire tutti gli eventi generati, e le funzioni vengono richiamate quando essi scattano. Purtroppo
non esiste un modo di individuare il codice che richiama queste funzioni, infatti, se si prova ad
accedere alla gestione di un evento, ci si trova di fronte ad una funzione completamente vuota. Si
può quindi avere l'impressione di aver catturato l'evento, e ridefinito il comportamento di default
con un metodo vuoto, quando invece si è solo ascoltato un evento senza aver fatto nulla.
Nella documentazione erano descritti i vari eventi e le loro conseguenze, ma non sempre veniva
fornito un modo per evitare che queste prendessero effetto. Dopo aver provato vari workaround,
alcuni dei quali suggeriti dall'assistenza, senza aver risolto i nostri problemi, ci siamo resi conto che
stavamo solo complicando le cose, ed abbiamo rinunciato, optando per soluzioni grafiche che non
richiedessero la modifica di tabelle aggregate.
56
6 Conclusioni
Analizzando in retrospettiva la situazione in cui sono sorti i problemi che abbiamo dovuto
affrontare, si può notare l'impatto di alcune decisioni prese agli inizi del progetto, avvenute prima
dell'inizio del mio stage, in particolare la scelta di Instant Developer come ambiente di sviluppo.
La gran parte dei problemi affrontati durante lo sviluppo, e soprattutto le difficoltà nel porvi
soluzione, sono imputabili ai seguenti aspetti del software utilizzato:
•
la completa chiusura del codice sorgente, per la correzione di un bug bisognava convincere
il fornitore dell'esistenza del problema, e sperare che lo risolvesse con il rilascio della
versione successiva. Nel frattempo, bisognava aspettare, quindi il lavoro poteva essere
condizionato anche in maniera importante dai tempi di risposta del fornitore.
•
la scarsa estensibilità del “linguaggio” detto “visual code”, specie nella costruzione di
applicazioni mobile, per utilizzare librerie bisognava linkarle nel codice generato, specifico
per ogni piattaforma
•
mancanza di supporto da parti di terzi, nessuna community indipendente, quindi ridotte
possibilità di chiedere aiuto al di fuori dell'assistenza tecnica del fornitore, vista anche la
modesta attività sul forum ufficialexx
Nonostante le difficoltà incontrate, e forse anche grazie a queste difficoltà, l'esperienza dello stage
trascorso alla Vision è stata per me di gran valore, sotto molti aspetti, non solo lavorativi. Dal punto
di vista professionale, posso dire di fatto esperienza di un ambiente a me nuovo, con esigenze anche
nuove rispetto a quelle che si possono incontrare in ambito universitario. Lo sviluppo di software
gestionale ha delle sfide tutte proprie, alcune delle quali non avrei creduto potessero essere così
complesse da affrontare.
Sono stato inserito in un meccanismo di produzione e dove mi sono stati messi a disposizione gli
strumenti per creare qualcosa di utile per l'azienda e le conoscenze per creare qualcosa di utile a me
stesso. In particolare, ho avuto modo di impiegare prodotti per me nuovi, alcuni dei quali, come
SQL Server, che non avevo mai preso in considerazione, ma si sono rivelati comunque validi. Ho
potuto toccare con mano la struttura di un database complesso e carico di storia, conoscere
l'evoluzione che ha avuto negli anni. L'opportunità di valutare le scelte progettuali compiute in
passato, alla luce di un trascorso temporale più ampio di quanto avessi mai osservato in precedenza,
è stata un'occasione importante per la mia formazione.
Nei due mesi trascorsi assieme, l'azienda ha sempre avuto cura di farmi notare quanto importante
sia la soddisfazione del cliente per il benessere di un'impresa. Questa visione del software, che
mette in primo piano l'utente, ha permeato il progetto fin dalla sua concezione. Non ero un esperto
di design, e fino al momento prima dello stage, avevo realizzato ben poche interfacce grafiche. Ciò
nonostante, credo che il lavoro, le discussioni, gli studi e le prove fatte assieme siano state in grado
di indirizzare sempre il mio operato nella direzione della fruibilità del prodotto per un pubblico che
mette l'usabilità al primo posto.
57
7 Riferimenti bibliografici
i
Vedasi la pagina “Chi Siamo” del sito aziendale
http://www.vsge.it
ii
Vedasi la panoramica della società su Microsoft Pinpoint
http://pinpoint.microsoft.com/it-IT/PartnerDetails.aspx?PartnerId=4297095752
iii Descrizioni prese dallo spazio riservato all'azienda nella vetrina di Confindustria Padova
http://vetrina.confindustria.pd.it/confindustria/padova/vetrina.nsf/
($schede)/A03301077BC9F93BC125791F002CE6E9?opendocument
iv Secondo l'articolo Font Size and Viewing Distance of Handheld Smart Phones, pubblicato su Optometry and Vision
Science (Issue 7 del numero 88, uscito nel luglio 2011)
http://journals.lww.com/optvissci/Fulltext/2011/07000/Font_Size_and_Viewing_Distance_of_Handheld_Smart.5.as
px
v
Ne tratta l'articolo Apple iPad sales topped 100 million two weeks ago, pubblicato su Engadget il 23/10/2012
http://www.engadget.com/2012/10/23/apple-ipad-sales-100-million/
vi Secondo le specifiche ufficiali di Apple
http://www.apple.com/ipad/specs/
vii Un altro esempio di processo di risk management è quello esposto dalla Borsa Italiana in questo articolo
http://www.borsaitaliana.it/notizie/sotto-la-lente/risk-management-107.htm
viii Un altro esempio di processo di risk management è esposto dalla Southern Cross University australiana, in un
articolo che cita lo standard AS/NZS 4360:2004
http://www.scu.edu.au/risk_management/index.php/8/
ix Ne tratta la voce di Wikipedia Issue tracking system
http://en.wikipedia.org/wiki/Issue_tracking_system
x
Un esempio di questo tipo di software è Nimble
http://sourceforge.net/projects/nimble/
xi Cito dal paragrafo “App review” della prima pagina delle guidelines di Apple “We review all apps to ensure they
are reliable, perform as expected, and are free of offensive material.”
https://developer.apple.com/appstore/guidelines.html
xii Vedasi pagina “Versioni di Instant Developer” del sito ufficiale per i dettagli sulle varie versioni. I moduli per la
sincronizzazione ed il controllo di versione non sono inclusi nella versione Standard e neppure nella versione
Professional. Cito la descrizione della versione TeamWorks “Questa versione aggiunge la gestione del lavoro di
gruppo alle caratteristiche della versione Professional. E' quindi possibile lavorare contemporaneamente sullo stesso
progetto anche in più persone.”
http://www.instantdeveloper.com/versions-in-detail.htm
xiii Cito da “Sviluppare Applicazioni Mobile con Instant Developer” seconda edizione – luglio 2012, scaricabile dal
sito ufficiale, a pagina 59 “Il sistema più semplice per sincronizzare i dati locali è tramite l’uso del servizio di
sincronizzazione a livello di documenti. [...] Le condizioni per usare questo tipo di allineamento sono le seguenti:
[...] 2) Avere utilizzato i documenti per la manipolazione dei dati sia nell’applicazione mobile che nel server di
sincronizzazione.”
http://www.instantdeveloper.com/support.htm
xiv Cito da “Sviluppare Applicazioni Mobile con Instant Developer” seconda edizione – luglio 2012, scaricabile dal
sito ufficiale, a pagina 59, continuato del punto 2 “[...] anche lato server ogni modifica ai dati che devono essere
distribuiti deve avvenire solamente tramite il server di sincronizzazione.”
xv Cito da “Guida all'uso di Instant Developer”, seconda edizione – ottobre 2011, scaricabile dal sito ufficiale, a
58
pagina 154 “Attenzione: se si effettuano modifiche al database direttamente tramite query, queste non verranno
memorizzate nella tabella ZZ_SYNC e quindi non potranno essere sincronizzate.”
http://www.instantdeveloper.com/support.htm
xvi Cito da “Sviluppare Applicazioni Mobile con Instant Developer” seconda edizione – luglio 2012, scaricabile dal
sito ufficiale, a pagina 8 “Quando si programma il contenuto dell’applicazione mobile e dei componenti condivisi
occorre tenere presente che il database da essi utilizzato è di tipo SQLite”, ed a pagina 56 “i dati sono contenuti nel
database SQLite del browser e l’applicazione può accedere ad essi localmente tramite l’interfaccia WebSQL”
xvii Vedasi M. Garey, D. Johnson, Computer and Intractability: a Guide to the Theory of NP-Completeness, Ed.
Freeman, 1979
xviiiNe tratta la voce di Wikipedia Travelling salesman problem
http://en.wikipedia.org/wiki/Travelling_salesman_problem
xix Secondo i dati osservati sulle dispense del professor Raffaele Pesenti, a pagina 5
http://venus.unive.it/pesenti/Didattica/ROI/RO16Tsp.pdf
xx Sul forum ufficiale, in data 29/11/2012 vi sono 8603 messaggi, ed i primi sono datati ottobre 2010, con una media,
approssimata per eccesso, di 11 messaggi al giorno.
http://forum.instantdeveloper.com/
59
Scarica