{"id":427,"date":"2014-01-04T12:07:03","date_gmt":"2014-01-04T11:07:03","guid":{"rendered":"https:\/\/alistapart.com\/it\/article\/progettare-web-app-offline-first\/"},"modified":"2014-01-04T12:07:03","modified_gmt":"2014-01-04T11:07:03","slug":"progettare-web-app-offline-first","status":"publish","type":"article","link":"https:\/\/alistapart.com\/it\/article\/progettare-web-app-offline-first\/","title":{"rendered":"Progettare Web App Offline-first"},"content":{"rendered":"<div class=\"paragrafo\">\n<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2014\/01\/n86lamp.jpg\" border=\"0\" align=\"left\" \/>Quando si tratta di creare delle app, spesso supponiamo che i nostri utenti siano molto simili a noi. Ce li immaginiamo con i device pi\u00f9 recenti, con software sempre aggiornato e con le connessioni pi\u00f9 rapide. Nonostante noi manteniamo un autentico zoo di vecchi dispositivi e vecchi browser per i test, passiamo la maggior parte del tempo a sviluppare dal comfort dei nostri device desktop moderni e sempre connessi.<\/p>\n<p>Per noi, una connessione che salta o un servizio lento \u00e8 un problema temporaneo che scaturisce in niente di pi\u00f9 di un semplice messaggio d&#8217;errore. Da questa prospettiva, c&#8217;\u00e8 la tentazione di pensare alla connettivit\u00e0, al mobile o ad altro come a qualcosa che si risolver\u00e0 da s\u00e9 nel tempo, man mano che aumentiamo la copertura di rete e acquistiamo servizi pi\u00f9 veloci. E questo funziona, fintanto che i nostri utenti rimangono sopra al livello del suolo in grandi citt\u00e0, ben sviluppate ma non troppo affollate.<\/p>\n<p>Ma cosa succede una volta che scendono nella metropolitana, quando si imbarcano su un aereo, si spostano sulla terraferma o vanno in campagna? Oppure quando sono nell&#8217;angolo sbagliato della stanza o semplicemente si trovano in mezzo a una grande folla? Le app experience che creiamo cos\u00ec attentamente diventano fonte di frustrazione, perch\u00e9 facciamo completo affidamento su quel collegamento effimero verso i server.<\/p>\n<p>Questa dipendenza ignora una verit\u00e0 fondamentale: essere offline succede. Se usate un dispositivo mobile, a un certo punto vi troverete offline. Comunque, va bene, ci sono dei modi per gestire questa situazione.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Facciamo il punto della situazione<\/h2>\n<p>Una volta le web app erano completamente dipendenti dal server: faceva tutto il lavoro e il client mostrava semplicemente il risultato. Ogni interruzione della connessione era un problema enorme: una volta offline, non si poteva usare l&#8217;app.<\/p>\n<p>Quel problema \u00e8 parzialmente risolto con dei client pi\u00f9 capaci, in cui la maggior parte della logica dell&#8217;applicazione gira nel browser, come ad esempio Google Docs. Ma, per un&#8217;appropriata esperienza offline-first, sarebbe il caso di memorizzare i dati nel front end e dovreste sincronizzarli con i dati memorizzati sul server. Fortunatamente, i database in-browser stanno maturando e c&#8217;\u00e8 un numero crescente di soluzioni per gestirli, come  <a href=\"http:\/\/derbyjs.com\/#introduction_to_racer\">derby.js<\/a>, <a href=\"http:\/\/brian.io\/lawnchair\/\">Lawnchair<\/a>, <a href=\"http:\/\/hood.ie\">Hoodie<\/a>, <a href=\"http:\/\/firebase.com\">Firebase<\/a>, <a href=\"http:\/\/remotestorage.io\/\">remotestorage.io<\/a>, <a href=\"http:\/\/www.sencha.com\/learn\/taking-sencha-touch-apps-offline\/\">Sencha touch<\/a> e altri, quindi risolvere gli aspetti tecnici sta diventando pi\u00f9 semplici.<\/p>\n<p>Ma abbiamo un problema pi\u00f9 grosso e pi\u00f9 strano da gestire: progettare app e relative interfacce per una connessione intermittente porta ad un&#8217;abbondanza di scenari e problemi.<\/p>\n<p>Ovviamente, ci sono alcuni precedenti di UX offline-first e uno di questi \u00e8 particolarmente diffuso: l&#8217;inbox e l&#8217;outbox dell&#8217;email. Le email finiscono nella outbox, anche quando si \u00e8 offline. Una volta che si ritorna online, vengono spedite. \u00c8 semplice, discreto e funziona.<\/p>\n<p>Per le email in arrivo, l&#8217;esperienza \u00e8 altrettanto delicata: una volta che vi ricollegate, le nuove email provenienti dal server appaiono in cima alla inbox. Nel frattempo, avete una copia locale pi\u00f9 o meno completa di tutte le email fino a quel punto, cos\u00ec da non essere bloccati in un&#8217;app vuota. Tutti e tre gli scenari (non funziona il &#8220;client push&#8221;, il &#8220;client pull\/server push&#8221; non funziona, non c&#8217;\u00e8 disponibilit\u00e0 dei dati locali quando offline) sono ben gestiti.<\/p>\n<p>Le email risultano essere semplici. Sono non editabili, facilmente elencabili, basate sul testo e &#8220;conflict-free&#8221;. La nozione di averne delle copie locali \u00e8 gi\u00e0 ben salda tra gli utilizzatori di email. Ma ci sono moltissime altre possibilit\u00e0. Come gestiamo questi scenari, ad esempio, in una app di disegno collaborativo? Cosa succede se abbiamo da gestire oggetti che non sono immutabili come le email, ma marker delle mappe con degli attributi che cambiano, tracce midi, problemi, task o azioni? Il browser \u00e8 il nuovo ambiente di runtime dell&#8217;applicazione e se prendiamo in considerazione la <a href=\"http:\/\/www.codinghorror.com\/blog\/2007\/07\/the-principle-of-least-power.html\">legge di Atwood<\/a> (&#8220;Ogni applicazione che pu\u00f2 essere scritta in JavaScript alla fine verr\u00e0 scritta in JavaScript&#8221;), quali altre cose mai sentite prima faremo nel browser in un paio d&#8217;anni? Vogliamo ancora trattare l&#8217;offline come un caso limite e ricorrere alle feature che non funzionano, ai template cos\u00ec fastidiosamente vuoti e ai messaggi di errore da panico?<\/p>\n<p>L&#8217;esperienza dell&#8217;utilizzo di un sito web o di un&#8217;app quando si \u00e8 offline dovrebbe essere migliore, meno frustrante e che dia pi\u00f9 possibilit\u00e0. Abbiamo bisogno dell&#8217;equivalente UX del responsive web design: un robusto catalogo di guide e pattern per il mondo disconnesso del multi-device.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Il ciclo di vita della connettivit\u00e0<\/h2>\n<p>La maggior parte delle web app ha due punti di fallimento correlati alla connettivit\u00e0: &#8220;client push&#8221; e &#8220;client pull\/server push&#8221;. A seconda di quello che fa l&#8217;app, dovrete:<\/p>\n<ul>\n<li>comunicare o nascondere esplicitamente lo stato della connessione e i suoi cambiamenti (ad esempio, un client per la chat informer\u00e0 gli utenti che qualsiasi nuovo messaggio inserito non verr\u00e0 mandato subito);<\/li>\n<li>abilitare feature di creazione ed editing lato client anche quando si \u00e8 offline e rassicurare gli utenti che i loro dati sono al sicuro e alla fine verranno inviati al server (pensate ad un&#8217;app di condivisione foto che vi permette di fare una foto e di pubblicarla in qualsiasi circostanza);<\/li>\n<li>disabilitare, modificare o eventualmente anche nascondere delle feature che non possono funzionare offline, invece di lasciare che gli utenti provino ad utilizzare senza riuscirci (immaginativi un pulsante &#8220;invia&#8221; che sa quando cambiare in un pulsante &#8220;invia pi\u00f9 tardi, quando sei online&#8221;).<\/li>\n<\/ul>\n<p>Altre questioni si sollevano quando cambia lo stato della connessione durante l&#8217;uso. Ad esempio, il server vuole fare push di un cambio all&#8217;oggetto o alla vista che l&#8217;utente sta attualmente guardando, o addirittura modificando, questo richiederebbe che voi:<\/p>\n<ul>\n<li>notificaste l&#8217;utente dei nuovi dati, potenzialmente in conflitto, che sono a disposizione, e<\/li>\n<li>diate all&#8217;utente uno strumento di risoluzione del conflitto piacevole, se necessario.<\/li>\n<\/ul>\n<p>Diamo un&#8217;occhiata a degli esempi presi dal mondo reale.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Scenari di connessione problematica<\/h2>\n<h3>Perdita di dati locali<\/h3>\n<p>Lavorare offline con Google Docs in un browser diverso da Chrome pu\u00f2 essere piuttosto frustrante: non si pu\u00f2 modificare il proprio documento e, sebbene leggerlo sia ancora possibile, copiarne alcune parti non lo \u00e8. Non si pu\u00f2 fare nulla con il proprio documento di testo o foglio di calcolo, nemmeno copiarlo in un altro programma per continuare a lavorarci da l\u00ec. E tuttavia, si tratta gi\u00e0 di un miglioramento rispetto alle versioni passate, in cui un grande overlay vi avrebbe avvisato dello stato offline e vi avrebbe impedito perfino di vedere il vostro lavoro.<\/p>\n<p>Questa \u00e8 una circostanza comune sia nelle app native che in quelle web: i dati a cui avete appena avuto accesso diventano d&#8217;un tratto non disponibili quando si perde la connessione. Se possibile, le app dovrebbero mantenere il loro stato e rendere disponibili i propri dati, anche se non possono essere modificati. Questo richiede mantenere dei dati locali a cui ricorrere se il server non pu\u00f2 essere raggiunto, cos\u00ec che gli utenti non vengano mai bloccati da una app vuota.<\/p>\n<h3>Trattare l&#8217;offline come un errore<\/h3>\n<p>Smettetela di trattare l&#8217;assenza di connettivit\u00e0 come un errore. La vostra app dovrebbe essere in grado di gestire le disconnessioni e di continuare con l&#8217;attivit\u00e0 quanto pi\u00f9 &#8220;elegantemente&#8221; possibile. Non mostrate schermate che non potete riempire con i dati e assicuratevi che i messaggi d&#8217;errore abbiano il giusto tono. Prendete Instagram: quando una persona non pu\u00f2 postare una foto, Instragram lo chiama fallimento: invece di rassicurare l&#8217;utente che l&#8217;immagine non \u00e8 persa, semplicemente la pubblicher\u00e0 pi\u00f9 tardi. Nessun problema. Potreste addirittura voler riformulare la vostra interfaccia a seconda dello stato di connessione dell&#8217;app, ad esempio potreste cambiare &#8220;salva&#8221; con &#8220;salva localmente&#8221;.<\/p>\n<p>A volte potreste aver bisogno di bloccare completamente delle intere feature, ma molto pi\u00f9 spesso non ne avrete bisogno. Per esempio:<\/p>\n<ul>\n<li>Se non potete aggiornare un feed, mostrate il vecchio feed e un messaggio corrispondente. Non buttate via i vecchi dati, per poi cercare di caricare i nuovi dati, fallire ed avere una schermata vuota e inutile.<\/li>\n<li>Se la vostra app permette agli utenti di creare dei dati localmente, lasciateglielo fare e informateli che saranno salvati e inviati in un secondo momento. Facoltativamente, avvisateli per avere una conferma prima di mandarli. Di nuovo, mi viene in mente Instagram: sa dove era stata fatta una foto, ma, quando \u00e8 offline, non pu\u00f2 chiedere a Foursquare come si chiama quel posto. Tuttavia, Instragram potrebbe chiedere agli utenti di ritornare ad una foto e di scegliere il posto su Foursquare una volta che ritornano online.<\/li>\n<\/ul>\n<h3>Gestire i conflitti<\/h3>\n<p>Se la vostra app offre l&#8217;editing collaborativo o delle altre forme di uso simultaneo su device multipli, probabilmente ad un certo punto dovrete creare delle versioni in conflitto degli oggetti. Non possiamo impedirlo, ma possiamo fornire delle UI per la risoluzione dei conflitti facilmente utilizzabili dalle persone che non sanno nemmeno cosa sia un conflitto di sincronizzazione.<\/p>\n<p>Prendete Evernote, il cui lavoro \u00e8 basato principalmente sulla sincronizzazione delle note: i conflitti sono risolti semplicemente concatenando entrambe le versioni della nota. Su qualunque cosa sia pi\u00f9 lunga di un paio di righe, questo richiede una quantit\u00e0 eccessiva di sforzo cognitivo e di editing successivo.<\/p>\n<p><a href=\"http:\/\/draftin.com\">Draft<\/a>, d&#8217;altro canto, \u00e8 riuscita a rendere semplice e bella la risoluzione dei conflitti tra collaboratori: mostra entrambe le versioni con le loro differenze in tre colonne separate e ciascuna differenza ha un pulsante &#8220;accetta&#8221; e uno &#8220;ignora&#8221;. Una risoluzione dei conflitti intuitiva e visualmente bella, almeno per il testo, \u00e8 sicuramente possibile.<\/p>\n<p>Non sempre \u00e8 necessaria una risoluzione cambiamento per cambiamento. In molti casi si ha solo bisogno di fornire una bella interfaccia per sottolineare le differenze e permettere all&#8217;utente di scegliere quale versione vince in uno specifico conflitto.<\/p>\n<p>Comunque, ci sono altri tipi di conflitti che ci attendono e molti di questi non saranno basati sul testo: marcatori delle posizioni sulle mappe fuori posto, colori dei grafici a barre, linee in un disegno e un&#8217;infinit\u00e0 di altre cose a cui non abbiamo ancora nemmeno pensato.<\/p>\n<p>Ma non tutti i problemi tecnici hanno bisogno di soluzioni tecniche. Prendiamo ad esempio due camerieri con dei dispositivi wireless per prendere gli ordini in un grande ristorante disposto su pi\u00f9 piani. Uno \u00e8 connesso al server del ristorante, l&#8217;altro \u00e8 all&#8217;ultimo piano, dove la connessione manca temporaneamente. Entrambe stanno servendo dei tavoli che hanno ordinato la stessa bottiglia di un raro e costoso vino. Il dispositivo del cameriere offline non pu\u00f2 sapere del conflitto. Quello che pu\u00f2 fare, per\u00f2, \u00e8 essere cosciente del rischio di conflitto (poco magazzino, il suo stato offline) e suggerire al cameriere di dare una risposta appropriata al tavolo (&#8220;Ottima scelta. Verifico che ce ne sia ancora.&#8221;).<\/p>\n<h3>Anticipare i bisogni degli utenti<\/h3>\n<p>In alcuni casi, le app possono fare delle azioni preventive a basso overhead per dare agli utenti una migliore esperienza in un secondo momento. Quando Google Maps capisce che sono su una rete wifi in un Paese diverso dal mio solito, potrebbe rapidamente mettere in cache quello che mi circonda, perch\u00e9 c&#8217;\u00e8 una forte probabilit\u00e0 che pi\u00f9 tardi sar\u00f2 offline o star\u00f2 usando il roaming.<\/p>\n<p>In molti casi, comunque, il contenuto \u00e8 troppo grande per essere messo in cache preventivamente: per esempio, un video da un sito di news. In questi casi, gli utenti devono prendere l&#8217;esplicita decisione di sincronizzare localmente, il che richiede il download del video sul loro device e la sua visione in un&#8217;applicazione diversa. Qualunque contesto avesse quel video online, come le informazioni collegate o un thread di commenti rilevanti, \u00e8 ora perso, cos\u00ec come lo \u00e8 l&#8217;opportunit\u00e0 per gli utenti stessi di commentare.<\/p>\n<h3>Refresh dei dati cronologici<\/h3>\n<p>Tutti questi sono esempi di &#8220;client push&#8221;, ma c&#8217;\u00e8 anche l&#8217;aspetto del &#8220;server push&#8221;: cosa possiamo fare quando il server aggiorna la vista attiva dell&#8217;utente e manda i dati che non possono essere opportunamente aggiunti in cima alla lista? I dati cronologici causano spesso questo problema.<\/p>\n<p>Per esempio, se usate iMessage su vari device, i messaggi a volte vengono mostrati senza un ordine cronologico durante la sincronizzazione. iMessage <em>potrebbe<\/em> rimetterli nell&#8217;ordine corretto (hanno un timestamp, dopo tutto), ma invece li mostra nell&#8217;ordine in cui sono arrivati sul device. Questo li rende molto evidenti ma anche estremamente disordinati.<\/p>\n<p>Immaginate il modo pi\u00f9 intuitivo per fare questa cosa: i messaggi vengono sempre mostrati in ordine cronologico, indipendentemente da quando arrivano. Sulle prime sembra ragionevole, ma significa che potreste dover scorrere indietro nel tempo per leggere un messaggio che \u00e8 appena arrivato perch\u00e9 era stato mandato in risposta ad uno molto pi\u00f9 vecchio. Peggio ancora, potreste non notarlo nemmeno perch\u00e9 si \u00e8 palesato in un posto in cui probabilmente non state guardando.<\/p>\n<p>Se mostrate i dati in ordine cronologico e la sequenza dei dati stessi ha senso, come in una chat (a differenza dell&#8217;email che pu\u00f2 essere a thread), le capacit\u00e0 offline pongono un problema: i dati trasmessi pi\u00f9 di recente non sono necessariamente i pi\u00f9 nuovi e potrebbero pertanto apparire in posti in cui gli utenti non se li aspettano. Potreste mantenere il contesto e la sequenza, ma la vostra interfaccia ha anche bisogno di far sapere agli utenti <em>la collocazione temporale<\/em> del nuovo contenuto.<\/p>\n<h3>Preparare diversi tipi di dati<\/h3>\n<p>Molti di questi esempi sono basati sul testo e anche se non lo sono (come i segnaposto su una mappa), alcuni di questi potrebbero plausibilmente avere un aiuto basato sul testo (come una lista di segnaposto della mappa vicini alla mappa), che possono semplificare gli aggiornamenti e le notifiche collegate alla sincronizzazione.<\/p>\n<p>Tuttavia, sappiamo che la quantit\u00e0, la variet\u00e0 e la complessit\u00e0 delle applicazioni web continuer\u00e0 ad aumentare cos\u00ec come i tipi di dati che saranno gestiti dai loro utenti. Alcune saranno collaborative, la maggior parte sar\u00e0 utilizzabile su pi\u00f9 device e molte introdurranno nuove ed emozionanti questioni legate alla sincronizzazione. Ha quindi senso studiare queste problematiche e sviluppare un vocabolario comune per gli scenari offline e le loro soluzioni.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Offliners Anonymous<\/h2>\n<p>Quando abbiamo cominciato a chiedere di questi problemi agli sviluppatori di tutto il mondo, siamo rimasti sorpresi dal quante persone si sono improvvisamente aperte, raccontando le loro storie di sofferenza offline, realizzando che avevano avuto problemi simili in passato ma non ne avevano mai parlato gli uni con gli altri. La maggior parte ha combattuto in solitaria, hanno rinunciato o hanno rimandato ma tutti avevano segretamente desiderato che ci fosse un qualche luogo in cui chiedere consigli per le app offline.<\/p>\n<p>Non dobbiamo rimanere anonimi, per\u00f2. Possiamo leggere <a href=\"article\/dao\">l&#8217;appello di John Allsopp<\/a> di 13 anni fa all&#8217;adozione del web come medium fluido pieno di incognite e di &#8220;accettare gli alti e i bassi delle cose&#8221;. Oggi, sappiamo che ci\u00f2 si estende oltre le dimensioni dei monitor e l&#8217;aspect ratio, il supporto delle feature e tutte le implementazioni dei rendering engines e rimane vero anche per le connessioni del nostro lavoro allo stesso web.<\/p>\n<p>In questa realt\u00e0 ancora pi\u00f9 fluida e in qualche modo scoraggiante, abbiamo bisogno di aiuto a vicenda. Dovremmo assicurarci che noi, e quelli che verranno dopo di noi, saremo ben equipaggiati con degli strumenti e dei pattern affidabili per le incertezze di un mondo mobile in espansione, sia per il bene dei nostri utenti sia per il nostro. Il web development \u00e8 gi\u00e0 abbastanza complicato senza perdere ulteriore tempo a reinventare la ruota.<\/p>\n<p>Per aiutarci gli uni con gli altri e per aiutare le future generazioni di designer, developer e user interface expert, vi invitiamo ad unirvi alla discussione su <a href=\"http:\/\/offlinefirst.org\">offlinefirst.org<\/a>. Il nostro obiettivo finale \u00e8 quello di creare un manuale offline che includa dei pattern UX e degli anti-patter, delle opzioni tecnologiche e la ricerca sui modelli mentali dell&#8217;utente, creando un repository di conoscenza a cui attingere e a cui contribuire, cos\u00ec che i nostri sforzi e le nostre esperienze collettive non vadano perse.<\/p>\n<p>Per ora, abbiamo bisogno di sentire la vostra voce: quali sono le vostre esperienze in questo campo, la vostra conoscenza dei tool, i vostri &#8220;tips and tricks&#8221; ma anche le vostre sfide. Risolverli non sar\u00e0 facile, ma migliorer\u00e0 l&#8217;esperienza dei nostri utenti, ovunque e in qualsiasi momento abbiano bisogno dei nostri servizi. Non \u00e8 questo il motivo per cui siamo qui?<\/p>\n<p>Illustrazioni: {carlok}<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Pensiamo sempre che i nostri utenti siano come noi: con gli ultimi device, con il software pi\u00f9 recente e con le connessioni pi\u00f9 veloci. E mentre noi manteniamo un autentico zoo di vecchi device e browser per i nostri test, passiamo la maggior parte del tempo a creare partendo dalla comodit\u00e0 dei nostri moderni e sempre connessi device desktop. Ma cosa succede quando i nostri utenti scendono nella metropolitana, si imbarcano su un aereo, vanno online in campagna o semplicemente si trovano nell&#8217;angolo sbagliato della stanza, quello in cui non arriva internet? La verit\u00e0 \u00e8 che l&#8217;essere offline \u00e8 un fatto della vita, ma ci sono dei modi per progettare per quando non si \u00e8 collegati. Alex Feyerke ci racconta tutto.<\/p>\n","protected":false},"author":818,"featured_media":7000719,"comment_status":"open","ping_status":"open","template":"","categories":[269,273,103,274],"tags":[],"coauthors":[408],"class_list":["post-427","article","type-article","status-publish","has-post-thumbnail","hentry","category-application-development","category-mobile-multidevice","category-numero-86-4-gennaio-2014","category-responsive-design"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/article\/427","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/article"}],"about":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/types\/article"}],"author":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/users\/818"}],"replies":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/comments?post=427"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media\/7000719"}],"wp:attachment":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media?parent=427"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/categories?post=427"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/tags?post=427"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/coauthors?post=427"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}