{"id":860,"date":"2018-10-16T10:25:33","date_gmt":"2018-10-16T08:25:33","guid":{"rendered":"https:\/\/alistapart.com\/it\/article\/progettare-una-ricerca\/"},"modified":"2018-10-16T10:25:33","modified_gmt":"2018-10-16T08:25:33","slug":"progettare-una-ricerca","status":"publish","type":"article","link":"https:\/\/alistapart.com\/it\/article\/progettare-una-ricerca\/","title":{"rendered":"Progettare una ricerca"},"content":{"rendered":"<p>Se avete passato un tempo sufficientemente lungo a sviluppare per il web, da tempo immemore riceverete questo tipo di feedback nella vostra inbox:<\/p>\n<p><em>\u201cQuesta foto sembra sfuocata. Possiamo sostituirla con una versione migliore?\u201d<\/em><\/p>\n<p>Ogni volta che mi arriva questo feedback, sono incline a questionarlo: \u201cCosa nella foto ti sembra che non vada bene e puoi dirmi <em>perch\u00e9?<\/em>\u201d<\/p>\n<p>Non \u00e8 una domanda del tutto giusta con cui controbattere. La lamentela ha le sue radici in una percezione soggettiva della qualit\u00e0 dell&#8217;immagine, che a sua volta \u00e8 influenzata da molti fattori, alcuni tecnici, come la qualit\u00e0 dell&#8217;esportazione dell&#8217;immagine o del metodo di compressione (spesso lossy, come nel caso delle foto in formato JPEG), altri sono pi\u00f9 intuitivi o percettivi, come il contenuto dell&#8217;immagine e il modo in cui si mescolano gli artefatti di compressione al suo interno. Forse anche la performance gioca un ruolo di cui non siamo completamente consci.<\/p>\n<p>Rispondere per molti anni a questo tipo di feedback alla fine mi ha spinto a progettare e sviluppare <a href=\"https:\/\/imagesurvey.site\/\" rel=\"noopener\">un questionario sulla qualit\u00e0 dell&#8217;immagine<\/a>, che \u00e8 stato il mio primo tentativo nella creazione di un progetto di ricerca sul web. Ho cominciato con venticinque foto di un fotografo professionista. Con esse, ho generato una gran quantit\u00e0 di immagini a vari livelli di qualit\u00e0 e dimensioni. Le immagini di questo gruppo venivano inviate a caso agli utenti a cui veniva chiesto di valutare quello che pensavano della loro qualit\u00e0.<\/p>\n<p>I risultati dal primo round sono stati interessanti ma non completamente chiari: gli utenti sembrava avessero la tendenza di sovrastimare l&#8217;effettiva qualit\u00e0 delle immagini e una performance scarsa <em>apparentemente<\/em> aveva un impatto negativo sulla percezione della qualit\u00e0 dell&#8217;immagine, ma non si poteva affermare ci\u00f2 in maniera definitiva. Un numero di questioni di UX e tecniche ha reso necessaria l&#8217;implementazione di importanti miglioramenti e di condurre una seconda tornata di ricerca. Invece di scervellarmi sull&#8217;estrazione di conclusioni dal mio primo giro di risultati, ho deciso che sarebbe stato meglio migliorare il questionario quanto pi\u00f9 possibile e di condurre un altro giro di ricerca per avere dei dati migliori. Questo articolo fa la cronaca di come ho costruito in primo luogo il questionario e poi come ho in seguito ascoltato il feedback degli utenti per migliorarlo.<\/p>\n<div class=\"paragrafo\">\n<h2 id=\"section1\">Definire la ricerca<\/h2>\n<p>Tra i soggetti che rientrano nella performance web, l&#8217;ottimizzazione delle immagini \u00e8 particolarmente vasta. C&#8217;\u00e8 una gran variet\u00e0 di formati, codifiche e tool di ottimizzazione, ciascuno dei quali \u00e8 progettato per rendere le immagini sufficientemente piccole per l&#8217;uso sul web, mantenendo una qualit\u00e0 visuale ragionevole. Trovare l&#8217;equilibrio tra velocit\u00e0 e qualit\u00e0 \u00e8 davvero tutto quello che c&#8217;\u00e8 nell&#8217;ottimizzazione delle immagini.<\/p>\n<p>Questo equilibrio tra performance e qualit\u00e0 visiva mi ha indotto a considerare il modo in cui le persone <em>percepiscono<\/em>la qualit\u00e0 delle immagini. <a href=\"https:\/\/en.wikipedia.org\/wiki\/Lossy_compression\" rel=\"noopener\">La qualit\u00e0 dell&#8217;immagine lossy<\/a>,  in particolare. Alla fine, questo flusso di pensieri mi ha portato a una serie di domande che hanno incoraggiato la progettazione e lo sviluppo di un questionario sulla percezione della qualit\u00e0 delle immagini. L&#8217;idea del sondaggio \u00e8 che gli utenti forniscono delle valutazioni <em>soggettive<\/em> sulla qualit\u00e0. Questo viene fatto chiedendo ai partecipanti di dare un voto alle immagini senza un riferimento oggettivo a quella che \u00e8 la \u201cperfezione\u201d. Questo \u00e8, dopo tutto, il modo in cui le persone vedono le immagini <em>in situ<\/em>.<\/p>\n<h3 id=\"section2\">Una parola sui sondaggi<\/h3>\n<p>Quando si vuole quantificare il comportamento degli utenti, \u00e8 inevitabile almeno prendere in considerazione un sondaggio se non addirittura sceglierlo alla fine per raccogliere dei dati da un gruppo di persone. Dopo tutto, i sondaggi sono perfetti quando il vostro obiettivo \u00e8 ottenere qualcosa di misurabile. Tuttavia, il sondaggio \u00e8 uno strumento seducente ma pericoloso, <a href=\"https:\/\/medium.com\/research-things\/on-surveys-5a73dda5e9a0\" rel=\"noopener\">come ci avverte Erika Hall<\/a>. Sono semplici da fare e condurre e se ne abusa regolarmente nella loro divulgazione. Non sono degli ottimi tool per valutare il comportamento passato. Sono altrettanto scarsi (se non peggio) nel predire il comportamento futuro. Per esempio, la scala da 1 a 10 spesso usata per i questionari di soddisfazione dei clienti non dicono davvero molto riguardo a quanto siano effettivamente soddisfatti i clienti o quanto sia probabile che compreranno un prodotto in futuro.<\/p>\n<p>La sfortunata realt\u00e0, tuttavia, \u00e8 che al posto del mio controllo su centinaia di partecipanti di persona, il sondaggio \u00e8 l&#8217;unico strumento veramente pratico che ho per misurare come le persone percepiscono la qualit\u00e0 dell&#8217;immagine cos\u00ec come se (e potenzialmente come) le misurazioni della performance sono collegate a queste percezioni. Quando ho progettato il sondaggio, mi sono attenuto alle seguenti linee guida:<\/p>\n<ul>\n<li>non chiedere ai partecipanti nulla di diverso dalle loro percezioni sul momento. Quando un partecipante \u00e8 passato oltre, il suo ricordo di ci\u00f2 che ha appena fatto diminuisce rapidamente con il passare del tempo.<\/li>\n<li>Non dare per scontato che i partecipanti sappiano tutto quello che fate. Guidateli con del testo rilevante che descriva sinteticamente cosa vi aspettate da loro.<\/li>\n<li>Non chiedere ai partecipanti di fornire valutazioni con input grezzi. Utilizzate un tipo di input che consenta loro di valutare con precisione la qualit\u00e0 dell&#8217;immagine su una scala congruente con il range di codifica di qualit\u00e0 di immagine lossy.<\/li>\n<\/ul>\n<p>Procedendo, tutto quello che possiamo fare \u00e8 riconoscere che stiamo interpretando dei dati ottenuti sotto l&#8217;ipotesi che i partecipanti siano sinceri e comprendano il task che gli \u00e8 stato assegnato. Anche se la metrica della percezione viene scartata dai dati, ci sono ancora delle metriche di performance oggettive raccolte che potrebbero narrare una storia avvincente. Da qui, si tratta di definire le domande che guideranno la ricerca.<\/p>\n<h3 id=\"section3\">Fare le domande giuste<\/h3>\n<p>Nella ricerca, state cercando delle risposte a delle domande. Nel caso di questo particolare lavoro, volevo risposte alle seguenti domande:<\/p>\n<ul>\n<li>quanto sono accurate le percezioni delle persone sulla qualit\u00e0 delle immagini lossy in relazione all&#8217;<em>effettiva<\/em> qualit\u00e0?<\/li>\n<li>Le persone percepiscono la qualit\u00e0 delle immagini JPEG in maniera diversa dalle <a href=\"https:\/\/en.wikipedia.org\/wiki\/WebP\" rel=\"noopener\">immagini WebP<\/a>?<\/li>\n<li>La performance gioca un ruolo in tutto ci\u00f2?<\/li>\n<\/ul>\n<p>Sono domande importanti. Per me, tuttavia, rispondere all&#8217;ultima domanda era l&#8217;obiettivo primario. Ma la strada per le risposte era (e continua ad essere) un viaggio complesso di scelte di design e sviluppo. Cominciamo coprendo alcune delle tecniche usate per raccogliere informazioni dai partecipanti al sondaggio.<\/p>\n<h3 id=\"section4\">Scoprire le caratteristiche del device e del browser<\/h3>\n<p>Quando si misura la percezione della qualit\u00e0 delle immagini da parte delle persone, bisogna tenere in considerazione i device. Dopo tutto, lo schermo di un determinato device sar\u00e0 pi\u00f9 o meno capace di altri. Fortunatamente, feature HTML quali <code><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTML\/Element\/img#attr-srcset\" rel=\"noopener\">srcset<\/a><\/code> e <code><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTML\/Element\/picture\" rel=\"noopener\">picture<\/a><\/code> sono molto appropriate per inviare l&#8217;immagine migliore a ogni dato schermo. Ed \u00e8 di vitale importanza perch\u00e9 la percezione della qualit\u00e0 dell&#8217;immagine secondo una persona pu\u00f2 essere influenzata negativamente se un&#8217;immagine \u00e8 della dimensione sbagliata per lo schermo del device. Di contro, la performance pu\u00f2 subire un impatto negativo se un&#8217;immagine di qualit\u00e0 eccessivamente alta viene mandata a un device con uno schermo piccolo. Questi sono fattori che meritano di essere presi in considerazione quando si scoprono le relazioni potenziali tra la performance e la qualit\u00e0 percepita.<\/p>\n<p>Rispetto alle caratteristiche e condizioni del browser, JavaScript ci d\u00e0 moltissimi strumenti per identificare aspetti importanti del device di un utente. Per esempio, la propriet\u00e0 <code>currentSrc<\/code> rivela quale immagine si sta mostrando da un array di immagini responsive. In assenza di <code>currentSrc<\/code>, posso in qualche modo assumere con sicurezza che manchi il supporto per <code>srcset<\/code> o <code>picture<\/code> e utilizzare il fall-back al valore <code>src<\/code> del tag <code>img<\/code>:<\/p>\n<pre id=\"snippet1\" class=\" language-javascript\"><code class=\" language-javascript\">const surveyImage <span class=\"token operator\">=<\/span> document<span class=\"token punctuation\">.<\/span>querySelector<span class=\"token punctuation\">(<\/span><span class=\"token string\">\".survey-image\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token keyword\">let<\/span> loadedImage <span class=\"token operator\">=<\/span> surveyImage<span class=\"token punctuation\">.<\/span>currentSrc <span class=\"token operator\">||<\/span> surveyImage<span class=\"token punctuation\">.<\/span>src<span class=\"token punctuation\">;<\/span><\/code><\/pre>\n<p>In merito alle capacit\u00e0 di schermo, <code><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Window\/devicePixelRatio\" rel=\"noopener\">devicePixelRatio<\/a><\/code> ci dice la <a href=\"https:\/\/en.wikipedia.org\/wiki\/Pixel_density\" rel=\"noopener\">densit\u00e0 di pixel<\/a> dello schermo di un determinato device. In assenza di <code>devicePixelRatio<\/code>, potete tranquillamente assumere un valore di fallback di <code>1<\/code>:<\/p>\n<pre id=\"snippet2\" class=\" language-javascript\"><code class=\" language-javascript\"><span class=\"token keyword\">let<\/span> dpr <span class=\"token operator\">=<\/span> window<span class=\"token punctuation\">.<\/span>devicePixelRatio <span class=\"token operator\">||<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><\/code><\/pre>\n<p><a href=\"https:\/\/caniuse.com\/#feat=devicepixelratio\" rel=\"noopener\"><code>devicePixelRatio<\/code> \u00e8 supportato in maniera eccellente dai browser<\/a>. \u00c8 altamente improbabile che quei pochi browser che non lo supportano (i.e., IE 10 e precedenti) siano usati su display ad alta densit\u00e0.<\/p>\n<p>Il fedele <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Element\/getBoundingClientRect\" rel=\"noopener\">metodo <code>getBoundingClientRect<\/code><\/a> recupera la larghezza resa di un elemento <code>img<\/code>, mentre la propriet\u00e0 <code>complete<\/code> dell&#8217;interfaccia di <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/HTMLImageElement\" rel=\"noopener\"><code>HTMLImageElement<\/code><\/a> determina se un&#8217;immagine abbia finito di caricarsi. L&#8217;ultima di queste due \u00e8 importante, perch\u00e9 potrebbe essere preferibile scartare risultati individuali in situazioni in cui le immagini non si sono caricate.<\/p>\n<p>Nei casi in cui JavaScript non \u00e8 disponibile, non possiamo raccogliere <em>nessuno<\/em> di questi dati. Quando raccogliamo le valutazioni dagli utenti che hanno disabilitato JavaScript (o che in alternativa non possono far girare JavaScript), devo accettare che ci saranno dei gap nei dati. L&#8217;informazione base che siamo ancora in grado di raccogliere fornisce per\u00f2 alcuni valori.<\/p>\n<h3 id=\"section5\">Fare sniffing per il supporto di WebP<a class=\"subhead-anchor\" href=\"#section5\">#section5<\/a><\/h3>\n<p>Come ricorderete, una delle domande iniziali che ho posto era come gli utenti percepissero la qualit\u00e0 delle immagini WebP. Il request header <code>Accept<\/code> di HTTP rende pubblico il supporto di WebP in browser come Chrome. In questi casi, l&#8217;header <code>Accept<\/code> potrebbe essere cos\u00ec:<\/p>\n<pre id=\"snippet3\"><code class=\"language-http\">Accept: image\/webp,image\/apng,image\/*,*\/*;q=0.8<\/code><\/pre>\n<p>Come potete vedere, il content type WebP di <code>image\/webp<\/code> \u00e8 uno dei content type pubblicizzati nel contenuto dell&#8217;header. Nel codice server side, potete controllare <code>Accept<\/code> per la sotto-stringa <code>image\/webp<\/code>. Ecco come potrebbe apparire nel codice back-end in <a href=\"https:\/\/expressjs.com\/\" rel=\"noopener\">Express<\/a>:<\/p>\n<pre id=\"snippet4\" class=\" language-javascript\"><code class=\" language-javascript\">const WebP <span class=\"token operator\">=<\/span> req<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Accept\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>indexOf<span class=\"token punctuation\">(<\/span><span class=\"token string\">\"image\/webp\"<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!<\/span><span class=\"token operator\">==<\/span> <span class=\"token operator\">-<\/span><span class=\"token number\">1<\/span> <span class=\"token operator\">?<\/span> <span class=\"token boolean\">true<\/span> <span class=\"token punctuation\">:<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><\/code><\/pre>\n<p>In questo esempio, sto registrando il support status del browser per WebP in una <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/const\" rel=\"noopener\">costante JavaScript<\/a> che posso usare in seguito per modificare l&#8217;invio dell&#8217;immagine. <em>Avrei potuto<\/em> usare l&#8217;elemento <code>picture<\/code> con pi\u00f9 <code>source<\/code> e lasciare che fosse il browser a capire quale usare basandosi sul valore dell&#8217;attributo <code>type<\/code> dell&#8217;elemento <code>source<\/code>, ma questo approccio ha dei chiari vantaggi. Primo, c&#8217;\u00e8 meno markup. Secondo, il sondaggio non dovrebbe <em>sempre<\/em> scegliere una sorgente WebP semplicemente perch\u00e9 il browser \u00e8 in grado di usarla. Per ogni determinato campione del sondaggio, l&#8217;app dovrebbe decidere a caso tra un&#8217;immagine WebP e una JPEG. Non <code>tutti<\/code> i partecipanti che usano Chrome dovrebbero valutare <em>solo<\/em> immagini WebP, ma piuttosto un mix di entrambe i formati.<\/p>\n<h3 id=\"section6\">Registrare i dati della performance della API<\/h3>\n<p>Ricorderete che una delle prime domande a cui mi sono prefissato di rispondere era se la performance avesse un impatto sulla percezione della qualit\u00e0 dell&#8217;immagine. A questo punto dello sviluppo della web platform, ci sono varie API che aiutano a cercare una risposta:<\/p>\n<ul>\n<li><a href=\"https:\/\/w3c.github.io\/navigation-timing\/\" rel=\"noopener\">Navigation Timing API (Level 2)<\/a>: questa API traccia le metriche di performance per il page load. Pi\u00f9 di questo, d\u00e0 insight nelle specifiche fasi di page loading, come redirect, request e response time, DOM processing e altro.<\/li>\n<li><a href=\"https:\/\/w3c.github.io\/navigation-timing\/#obsolete\" rel=\"noopener\">Navigation Timing API (Level 1)<\/a>: Simile al Level 2 ma con delle differenze chiave. Ai tempi esposti dal Level 1 dell&#8217;API manca l&#8217;accuratezza di quelli nel Level 2. Inoltre, le metriche del Level 1 sono espresse in <a href=\"https:\/\/en.wikipedia.org\/wiki\/Unix_time\" rel=\"noopener\">Unix time<\/a>. Nel sondaggio, i dati sono raccolti solo dal Level 1 dell&#8217;API se il Level 2 non \u00e8 supportato. \u00c8 lontano dall&#8217;essere l&#8217;ideale (ed \u00e8 anche tecnicamente obsoleto), ma aiuta a riempire dei piccoli gap.<\/li>\n<li><a href=\"https:\/\/w3c.github.io\/resource-timing\/\" rel=\"noopener\">Resource Timing API<\/a>: Simile a Navigation Timing, ma Resource Timing raccoglie metriche su varie fasi di caricamento delle risorse della pagina piuttosto che della pagina stessa. Di tutte le API usate nel sondaggio, Resource Timing \u00e8 quella pi\u00f9 utilizzata, perch\u00e9 aiuta a raccogliere metriche sul caricamento dei campioni di immagini che l&#8217;utente valuta.<\/li>\n<li><a href=\"https:\/\/w3c.github.io\/server-timing\/\" rel=\"noopener\">Server Timing<\/a>: in browser selezionati, questa API viene portata nell&#8217;interfaccia della Navigation Timing Level 2 quando una page request risponde con un response header <code>Server-Timing<\/code>. Questo header \u00e8 open-ended e pu\u00f2 essere popolato con le tempistiche relative alle fasi di processing back-end. Questo \u00e8 stato aggiunto al secondo giro del sondaggio per quantificare il tempo di processing back-end in generale.<\/li>\n<li><a href=\"https:\/\/w3c.github.io\/paint-timing\/\" rel=\"noopener\">Paint Timing API<\/a>: attualmente solo in Chrome, questa API riporta due metriche di paint, <a href=\"https:\/\/developers.google.com\/web\/updates\/2017\/06\/user-centric-performance-metrics#first_paint_and_first_contentful_paint\" rel=\"noopener\"><em>first paint<\/em> e <em>first contentful paint<\/em><\/a>. Poich\u00e9 una parte significativa di utenti del web usa Chrome, <em>potremmo<\/em> essere in grado di osservare delle relazioni tra la qualit\u00e0 percepita dell&#8217;immagine e le metriche di paint.<\/li>\n<\/ul>\n<p>Usando queste API, possiamo registrare le metriche di performance per la maggior parte dei partecipanti. Ecco un esempio semplificato di come il sondaggio usi la Resource Timing API per raccogliere metriche di performance per il campione di immagine caricato:<\/p>\n<pre id=\"snippet5\" class=\" language-javascript\"><code class=\" language-javascript\"><span class=\"token comment\">\/\/ Get information about the loaded image\n<\/span>const surveyImageElement <span class=\"token operator\">=<\/span> document<span class=\"token punctuation\">.<\/span>querySelector<span class=\"token punctuation\">(<\/span><span class=\"token string\">\".survey-image\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\nconst fullImageUrl <span class=\"token operator\">=<\/span> surveyImageElement<span class=\"token punctuation\">.<\/span>currentSrc <span class=\"token operator\">||<\/span> surveyImageElement<span class=\"token punctuation\">.<\/span>src<span class=\"token punctuation\">;<\/span>\nconst imageUrlParts <span class=\"token operator\">=<\/span> fullImageUrl<span class=\"token punctuation\">.<\/span>split<span class=\"token punctuation\">(<\/span><span class=\"token string\">\"\/\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\nconst imageFilename <span class=\"token operator\">=<\/span> imageUrlParts<span class=\"token punctuation\">[<\/span>imageUrlParts<span class=\"token punctuation\">.<\/span>length <span class=\"token operator\">-<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token comment\">\n\/\/ Check for performance API methods\n<\/span><span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">\"performance\"<\/span> <span class=\"token keyword\">in<\/span> window <span class=\"token operator\">&amp;&amp;<\/span> <span class=\"token string\">\"getEntriesByType\"<\/span> <span class=\"token keyword\">in<\/span> performance<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\n <span class=\"token comment\"> \/\/ Get entries from the Resource Timing API\n<\/span>  <span class=\"token keyword\">let<\/span> resources <span class=\"token operator\">=<\/span> performance<span class=\"token punctuation\">.<\/span>getEntriesByType<span class=\"token punctuation\">(<\/span><span class=\"token string\">\"resource\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n\n <span class=\"token comment\"> \/\/ Ensure resources were returned\n<\/span>  <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">typeof<\/span> resources <span class=\"token operator\">==<\/span><span class=\"token operator\">=<\/span> <span class=\"token string\">\"object\"<\/span> <span class=\"token operator\">&amp;&amp;<\/span> resources<span class=\"token punctuation\">.<\/span>length <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\n    resources<span class=\"token punctuation\">.<\/span>forEach<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>resource<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\n     <span class=\"token comment\"> \/\/ Check if the resource is for the loaded image\n<\/span>      <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>resource<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">.<\/span>indexOf<span class=\"token punctuation\">(<\/span>imageFilename<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!<\/span><span class=\"token operator\">==<\/span> <span class=\"token operator\">-<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\n       <span class=\"token comment\"> \/\/ Access resource images for the image here\n<\/span>      <span class=\"token punctuation\">}<\/span>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n  <span class=\"token punctuation\">}<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>Se \u00e8 disponibile la Resource Timing API e il metodo <code>getEntriesByType<\/code> ritorna dei risultati, viene ritornato un oggetto con le tempistiche, che assomiglia a questo:<\/p>\n<pre id=\"snippet6\" class=\" language-javascript\"><code class=\" language-javascript\"><span class=\"token punctuation\">{<\/span>\n  connectEnd<span class=\"token punctuation\">:<\/span> <span class=\"token number\">1156.5999999947962<\/span><span class=\"token punctuation\">,<\/span>\n  connectStart<span class=\"token punctuation\">:<\/span> <span class=\"token number\">1156.5999999947962<\/span><span class=\"token punctuation\">,<\/span>\n  decodedBodySize<span class=\"token punctuation\">:<\/span> <span class=\"token number\">11110<\/span><span class=\"token punctuation\">,<\/span>\n  domainLookupEnd<span class=\"token punctuation\">:<\/span> <span class=\"token number\">1156.5999999947962<\/span><span class=\"token punctuation\">,<\/span>\n  domainLookupStart<span class=\"token punctuation\">:<\/span> <span class=\"token number\">1156.5999999947962<\/span><span class=\"token punctuation\">,<\/span>\n  duration<span class=\"token punctuation\">:<\/span> <span class=\"token number\">638.1000000037602<\/span><span class=\"token punctuation\">,<\/span>\n  encodedBodySize<span class=\"token punctuation\">:<\/span> <span class=\"token number\">11110<\/span><span class=\"token punctuation\">,<\/span>\n  entryType<span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"resource\"<\/span><span class=\"token punctuation\">,<\/span>\n  fetchStart<span class=\"token punctuation\">:<\/span> <span class=\"token number\">1156.5999999947962<\/span><span class=\"token punctuation\">,<\/span>\n  initiatorType<span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"img\"<\/span><span class=\"token punctuation\">,<\/span>\n  name<span class=\"token punctuation\">:<\/span> \"https<span class=\"token punctuation\">:<\/span><span class=\"token comment\">\/\/imagesurvey.site\/img-round-2\/1-1024w-c2700e1f2c4f5e48f2f57d665b1323ae20806f62f39c1448490a76b1a662ce4a.webp\",\n<\/span>  nextHopProtocol<span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"h2\"<\/span><span class=\"token punctuation\">,<\/span>\n  redirectEnd<span class=\"token punctuation\">:<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span>\n  redirectStart<span class=\"token punctuation\">:<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span>\n  requestStart<span class=\"token punctuation\">:<\/span> <span class=\"token number\">1171.6000000014901<\/span><span class=\"token punctuation\">,<\/span>\n  responseEnd<span class=\"token punctuation\">:<\/span> <span class=\"token number\">1794.6999999985565<\/span><span class=\"token punctuation\">,<\/span>\n  responseStart<span class=\"token punctuation\">:<\/span> <span class=\"token number\">1737.0999999984633<\/span><span class=\"token punctuation\">,<\/span>\n  secureConnectionStart<span class=\"token punctuation\">:<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span>\n  startTime<span class=\"token punctuation\">:<\/span> <span class=\"token number\">1156.5999999947962<\/span><span class=\"token punctuation\">,<\/span>\n  transferSize<span class=\"token punctuation\">:<\/span> <span class=\"token number\">11227<\/span><span class=\"token punctuation\">,<\/span>\n  workerStart<span class=\"token punctuation\">:<\/span> <span class=\"token number\">0<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>Prendo queste misurazioni ma mano che i partecipanti valutano le immagini e li memorizzo in un database. Lungo il percorso quando voglio scrivere delle query e analizzare i dati che ho, posso far riferimento al <a href=\"https:\/\/w3c.github.io\/navigation-timing\/#processing-model\" rel=\"noopener\">Processing Model for the Resource and Navigation Timing APIs<\/a>. Con SQL e i dati a mia disposizione, posso misurare le fasi distinte delineate dal modello e vedere se esistono delle correlazioni.<\/p>\n<p>Avendo discusso i dettagli tecnici di come si possono raccogliere i dati dai partecipanti a un sondaggio, spostiamo ora l&#8217;attenzione al design e agli user flow del sondaggio.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2 id=\"section7\">Progettare il sondaggio<\/h2>\n<p>Sebbene i sondaggi tendano ad avere dei design e user flow piuttosto semplici rispetto ad altri siti, dobbiamo rimanere coscienti del percorso dell&#8217;utente e degli ostacoli che un utente potrebbe affrontare.<\/p>\n<h3 id=\"section8\">L&#8217;entry point<\/h3>\n<p>Quando i partecipanti arrivano alla <a href=\"https:\/\/imagesurvey.site\/\" rel=\"noopener\">home page<\/a>, vogliamo essere diretti nella nostra comunicazione con loro. Il testo introduttivo della home page accoglie i partecipanti, d\u00e0 loro una spiegazione stringata di cosa aspettarsi e presenta due scelte di navigazione:<\/p>\n<div id=\"figure1\" class=\"image full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2018\/10\/fig-01-v2-1x.png\" border=\"0\" alt=\"Un pulsante con il testo \u201cI want to participate!\u201d e un altro pulsante con il testo \u201cWhat data do you gather?\u201d\" width=\"100%\" \/><\/div>\n<p>Da qui, i partecipanti o iniziano il sondaggio o leggono la privacy policy. Se l&#8217;utente decide di partecipare al sondaggio, raggiunger\u00e0 una pagina che gli chieder\u00e0 gentilmente quale sia la sua professione e gli richieder\u00e0 di dichiarare eventuali problemi alla vista. I campi per queste domande possono essere lasciati in bianco, dal momento che qualcuno potrebbe non sentirsi a proprio agio a rilasciare questo tipo di informazione. Oltre questo punto, il sondaggio inizia sul serio.<\/p>\n<h3 id=\"section9\">Il manuale introduttivo del sondaggio<\/h3>\n<p>Prima che l&#8217;utente inizi a valutare le immagini, verr\u00e0 re-diretto a una <a href=\"https:\/\/imagesurvey.site\/presurvey\" rel=\"noopener\">pagina di spiegazioni<\/a>. Questa pagina descrive cosa ci si aspetta dai partecipanti e spiega come valutare le immagini. Nonostante il sondaggio sia promosso nei luoghi di design e sviluppo dove i lettori lavorano regolarmente con le immagini sul web, un manuale \u00e8 ancora utile per essere sicuri che tutti siano allineati. Il primo paragrafo della pagina sottolinea che gli utenti stanno valutando la <em>qualit\u00e0<\/em> dell&#8217;immagine, non il <em>contenuto<\/em> dell&#8217;immagine. Questo \u00e8 importante. In assenza di qualsiasi contesto, i partecipanti possono effettivamente valutare le immagini per il loro contenuto, che non \u00e8 quello che chiediamo. Dopo questo chiarimento, viene dimostrato il concetto di qualit\u00e0 lossy dell&#8217;immagine con il seguente schema:<\/p>\n<div id=\"figure2\" class=\"image full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2018\/10\/fig-02-v2-1x.jpg\" border=\"0\" alt=\"Una foto divisa con met\u00e0 che dimostra la qualit\u00e0 lossy dell'immagine e l'altra che dimostra l'alta qualit\u00e0.\" width=\"100%\" \/><\/div>\n<p>Infine, si spiega la funzione dell&#8217;inserimento della valutazione. Probabilmente, i pi\u00f9 potrebbero dedurne il funzionamento, ma del testo esplicativo aiuta a rimuovere ogni ambiguit\u00e0 residua. Non \u00e8 necessariamente saggio supporre che l&#8217;utente sappia tutto quello che sapete voi. Quello che \u00e8 ovvio per uno non lo \u00e8 necessariamente per un altro.<\/p>\n<h3 id=\"section10\">La pagina con i campioni di immagine<\/h3>\n<p>Questa pagina \u00e8 l&#8217;evento principale ed \u00e8 dove i partecipanti valutano la qualit\u00e0 delle immagini che vengono loro mostrate. Contiene due aree principali su cui focalizzarsi: il campione dell&#8217;immagine e l&#8217;input usato per valutare la qualit\u00e0 dell&#8217;immagine.<\/p>\n<p>Esulando un attimo dall&#8217;ordine, discutiamo prima dell&#8217;input. Ho rimuginato un po&#8217; su alcune opzioni quando si \u00e8 trattato di decidere che input <code>type<\/code> usare. Ho preso in considerazione un input <code>select<\/code> con delle scelte grossolanamente predefinite, un <code>input<\/code> con un <code>type<\/code> <code>number<\/code> e altre scelte. Tuttavia, quello che mi sembrava avesse pi\u00f9 senso per me, \u00e8 stato un <code>input<\/code> slider con <code>type<\/code> <code>range<\/code>.<\/p>\n<div id=\"figure3\" class=\"image full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2018\/10\/fig-03-v2-1x.png\" border=\"0\" alt=\"Uno slide di valutazione con \u201cworst\u201d all'estrema sinistra e \u201cbest\u201d all'estrema destra. Lo slider track \u00e8 un gradiente da rosso a sinistra a verde sulla destra.\" width=\"100%\" \/><\/div>\n<p>Un <code>input<\/code> slider \u00e8 pi\u00f9 intuitivo di un <code>input<\/code> testuale o di un elemento <code>select<\/code> popolato con varie scelte. Dal momento che stiamo chiedendo una valutazione soggettiva riguardo a qualcosa con un cos\u00ec grande range di interpretazioni, uno slider permette ai partecipanti maggior granularit\u00e0 nelle loro valutazioni e d\u00e0 ulteriore accuratezza ai dati raccolti.<\/p>\n<p>Ora parliamo del campione dell&#8217;immagine e di come viene selezionato dal codice di back-end. Ho deciso da subito nello sviluppo del sondaggio che volevo immagini che non fossero note nelle collezioni di foto stock esistenti. Volevo anche fonti non compresse cos\u00ec non avrei presentato ai partecipanti degli esempi di immagine ri-compressa. Per fare ci\u00f2, mi sono procurato delle immagini da un <a href=\"http:\/\/www.wolftownmedia.com\/\" rel=\"noopener\">fotografo locale<\/a>. Le venticinque immagini che ho scelto erano <a href=\"https:\/\/en.wikipedia.org\/wiki\/Raw_image_format\" rel=\"noopener\">immagini raw<\/a> minimamente processate dalla macchina fotografica del fotografo. Il risultato era un insieme logico di immagini che sembravano visualmente legate le une alle altre.<\/p>\n<p>Per valutare correttamente la percezione attraverso l&#8217;intero spettro delle impostazioni di qualit\u00e0, avevo bisogno di generare ogni immagine dalle fonti di cui sopra a novantasei diverse impostazioni di qualit\u00e0 da 5 a 100. Per tenere conto delle diverse larghezze e densit\u00e0 di pixel degli schermi esistenti, ogni immagine doveva essere generata a quattro diverse larghezze per ogni impostazione di qualit\u00e0: per la precisione, 1536, 1280, 1024 e 768 pixel. Esattamente il lavoro per cui \u00e8 stato creato <code>srcset<\/code>!<\/p>\n<p>Per completare il tutto, le immagini dovevano <em>anche<\/em> essere codificate sia in formato JPEG sia in formato WebP. Come risultato, il sondaggio estrae a caso tra 768 immagini <em>per campione<\/em> in tutto il range di qualit\u00e0, il tutto inviando anche l&#8217;immagine migliore per lo schermo del partecipante. Questo significa che sui 25 campioni di immagine che i partecipanti valutano, il sondaggio le sceglie da un insieme di <em>19.200<\/em> immagini in totale.<\/p>\n<p>Ora che abbiamo esaminato la nascita e la progettazione del sondaggio, vediamo come il sondaggio \u00e8 stato migliorato implementando il feedback degli utenti nel secondo round.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2 id=\"section11\">Ascoltare i feedback<\/h2>\n<p>Quando ho lanciato il secondo round del sondaggio, ho ricevuto una valanga di feedback da designer, developer, accessibility advocate e addirittura ricercatori. Sebbene le mie intenzioni fossero buone, avevo inevitabilmente tralasciato alcuni aspetti importanti, che avevano reso necessario farne un secondo giro. Iterazione e miglioramento sono <em>cruciali<\/em> nel migliorare l&#8217;utilit\u00e0 di un design e questo sondaggio non faceva eccezione. Quando miglioriamo i design con il feedback dagli utenti, portiamo un progetto da \u201cnella media\u201d a \u201cmemorabile\u201d. Arrivare a questo punto significa gestire il feedback senza problemi e affrontare degli item distinti e perseguibili. Nel caso del sondaggio, incorporare il feedback non solo produceva una user experience migliore, ma migliorava anche l&#8217;integrit\u00e0 dei dati raccolti.<\/p>\n<h3 id=\"section12\">Creare un input slider migliore<\/h3>\n<p>Sebbene il primo round del sondaggio fosse stato utile, mi sono imbattuto in alcuni problemi con l&#8217;input slider. Nel primo round del sondaggio, l&#8217;input aveva questo aspetto:<\/p>\n<div id=\"figure4\" class=\"image full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2018\/10\/fig-04-v2-1x.png\" border=\"0\" alt=\"uno slider con delle etichette equidistanti da sinistra a destra, recanti rispettivamente la scritta: \u201cAwful\u201d, \u201cBad\u201d, \u201cOK\u201d, \u201cGood\u201d, \u201cGreat\u201d. Sotto ad esso c'\u00e8 un pulsante disabilitato con il testo \u201cPlease Rate the Image\u2026\u201d.\" width=\"100%\" \/><\/div>\n<p>Ci sono stati due reclami ricorrenti riguardo a questa specifica implementazione. Il primo era che i partecipanti sentivano di dover allineare la propria valutazione a una delle etichette sotto la traccia di scorrimento. Ci\u00f2 non era auspicabile per il semplice fatto che il cursore \u00e8 stato scelto <em>specificamente<\/em> per incoraggiare i partecipanti a fornire valutazioni sfumate.<\/p>\n<p>La seconda lamentela \u00e8 stata che il pulsante di invio rimaneva disabilitato fino a quando l&#8217;utente non interagiva con il cursore. Questa scelta progettuale aveva lo scopo di impedire ai partecipanti di fare semplicemente clic sul pulsante di invio su ogni pagina senza classificare le immagini. Sfortunatamente, questa implementazione era involontariamente ostile all&#8217;utente e necessitava di miglioramenti, perch\u00e9 impediva agli utenti di classificare le immagini senza una spiegazione chiara e ovvia del perch\u00e9.<\/p>\n<p>Risolvere il problema con le etichette significava ridisegnare il cursore come appariva in Figura 3. Ho rimosso completamente le etichette per eliminare la tentazione degli utenti di allineare le loro risposte ad essi. Inoltre, ho modificato la propriet\u00e0 <code>background<\/code> dello slider con un pattern gradiente, che suggeriva ulteriormente la granularit\u00e0 dell&#8217;input.<\/p>\n<p>Il problema del pulsante di invio riguardava la modalit\u00e0 di richiesta degli utenti. Nel primo round era visibile il pulsante di invio, tuttavia lo stato disabilitato non era abbastanza ovvio per alcuni. Dopo aver consultato un collega, ho trovato una soluzione per il secondo round: al posto del pulsante di invio inizialmente visibile, \u00e8 nascosto da del testo guida:<\/p>\n<div id=\"figure5\" class=\"image full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2018\/10\/fig-05-v2-1x.png\" border=\"0\" alt=\"Lo slider modificato seguito dal testo \u201cOnce you rate the image, you may submit.\u201d\" width=\"100%\" \/><\/div>\n<p>Una volta che l&#8217;utente interagisce con il cursore e valuta l&#8217;immagine, viene attivato un evento <code>change<\/code> associato all&#8217;input, che nasconde il testo guida e lo sostituisce con il pulsante di invio:<\/p>\n<div id=\"figure6\" class=\"image full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2018\/10\/fig-06-v2-1x.png\" border=\"0\" alt=\"Lo slider modificato seguito ora da un pulsante con la scritta \u201cSubmit rating\u201d.\" width=\"100%\" \/><\/div>\n<p>Questa soluzione \u00e8 meno ambigua e instrada i partecipanti lungo il percorso desiderato. Se una persona con JavaScript disabilitato visita il sondaggio, il testo guida non viene mai mostrato e il pulsante di invio \u00e8 immediatamente utilizzabile. Questo non \u00e8 l&#8217;ideale, ma non esclude i partecipanti senza JavaScript.<\/p>\n<h3 id=\"section13\">Affrontare i problemi di scorrimento<\/h3>\n<p>La pagina del sondaggio funziona particolarmente bene con l&#8217;orientamento verticale. I partecipanti possono vedere tutta l&#8217;immagine (o la maggior parte di essa) senza dover scorrere. Tuttavia, nelle finestre del browser o dei dispositivi mobili con orientamento orizzontale, l&#8217;immagine del sondaggio pu\u00f2 essere pi\u00f9 grande della viewport:<\/p>\n<div id=\"figure7\" class=\"image full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2018\/10\/fig-07-v2-1x.png\" border=\"0\" alt=\"Screenshot del sondaggio con un'immagine tagliata in basso dalla viewport e dallo slider di valutazione.\" width=\"100%\" \/><\/div>\n<p>Lavorare con uno spazio verticale cos\u00ec limitato \u00e8 difficile, specialmente nel caso in cui lo slider deve essere fissato nella parte inferiore dello schermo (che gestiva un precedente feedback dell&#8217;utente dal primo round di test). Dopo aver discusso il problema con i colleghi, ho deciso che gli indicatori animati negli angoli della pagina dovevano segnalare agli utenti che c&#8217;\u00e8 ancora una parte dell&#8217;immagine da vedere.<\/p>\n<div id=\"figure8\" class=\"image full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2018\/10\/fig-08-v2-1x.png\" border=\"0\" alt=\"Il sondaggio con l'immagine ritagliata, ma ora c'\u00e8 una freccia rivolta verso il basso con la parola \u201cScroll\u201d.\" width=\"100%\" \/><\/div>\n<p>Quando l&#8217;utente raggiunge la parte inferiore della pagina, gli indicatori di scroll spariscono. Poich\u00e9 le animazioni possono dare fastidio <a href=\"https:\/\/a11yproject.com\/posts\/understanding-vestibular-disorders\/\" rel=\"noopener\">ad alcuni utenti<\/a>, si \u00e8 usata <a href=\"https:\/\/css-tricks.com\/introduction-reduced-motion-media-query\/\" rel=\"noopener\">una media query <code>prefers-reduced-motion<\/code><\/a> per disabilitare questa (e tutte le altre) animazioni se l&#8217;utente ha dichiarato di preferire movimenti ridotti. Nel caso in cui JavaScript sia disabilitato, gli indicatori di scrolling sono sempre nascosti nell&#8217;orientamento portrait dove \u00e8 meno probabile che siano utili e sempre visibili nel landscape, dove \u00e8 pi\u00f9 probabile che siano pi\u00f9 necessari.<\/p>\n<h3 id=\"section14\">Evitare il sovradimensionamento dei campioni di immagine<\/h3>\n<p>Un problema che \u00e8 stato portato alla mia attenzione da un collega \u00e8 stato il modo in cui l&#8217;immagine del sondaggio sembrava espandersi senza limiti con la viewport. Sui dispositivi mobili questo non \u00e8 un problema, ma su schermi di grandi dimensioni e persino su display ad alta densit\u00e0 di dimensioni modeste, le immagini possono essere ridimensionate eccessivamente. Poich\u00e9 l&#8217;attributo <code>srcset<\/code> del tag responsive <code>img<\/code> specifica un&#8217;immagine con risoluzione massima di <code>1536w<\/code>, un&#8217;immagine pu\u00f2 iniziare a ridimensionarsi a &#8220;small&#8221; per dimensioni superiori a 768 pixel di larghezza su dispositivi con un device pixel ratio pari a 2.<\/p>\n<div id=\"figure9\" class=\"image full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2018\/10\/fig-09-v2-1x.jpg\" border=\"0\" alt=\"Il sondaggio con un'immagine che si espande a riempire la finestra.\" width=\"100%\" \/><\/div>\n<p>Un po&#8217; di sovradimensionamento \u00e8 inevitabile e accettabile. Tuttavia, quando \u00e8 eccessivo, gli artefatti di compressione in un&#8217;immagine possono diventare pi\u00f9 pronunciati. Per gestire la cosa, la <code>max-width<\/code> dell&#8217;immagine del sondaggio \u00e8 impostata a <code>1536px<\/code> per i display standard a partire dal secondo giro. Per i device con una device pixel ratio di 2 o superiore, la <code>max-width<\/code> dell&#8217;immagine del sondaggio \u00e8 impostata alla met\u00e0 di quello, ossia a <code>768px<\/code>:<\/p>\n<div id=\"figure10\" class=\"image full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2018\/10\/fig-10-v2-1x.jpg\" border=\"0\" alt=\"Il sondaggio con un'immagine che sta tranquillamente nella finestra.\" width=\"100%\" \/><\/div>\n<p>Questa piccola (ma importante) correzione assicura che le immagini non siano ridimensionate oltre un limite ragionevole. Con una risorsa immagine ragionevolmente dimensionata nella viewport, i partecipanti valuteranno le immagini in prossimit\u00e0 o in corrispondenza delle dimensioni naturali di una determinata immagine, in particolare su schermi grandi.<\/p>\n<p>Il feedback degli utenti \u00e8 prezioso. Questi ed altri punti di feedback di UX che ho incorporato hanno migliorato sia la funzione del sondaggio sia l&#8217;integrit\u00e0 dei dati raccolti. \u00c8 bastato sedersi con gli utenti e ascoltarli.<\/p>\n<div class=\"paragrafo\">\n<h2 id=\"section15\">Concludendo<\/h2>\n<p>All&#8217;inizio del secondo giro del sondaggio, spero che i dati raccolti rivelino qualcosa di eccitante sulla relazione tra la performance e il modo in cui le persone percepiscono la qualit\u00e0 delle immagini. Se volete partecipare, <a href=\"https:\/\/imagesurvey.site\/\" rel=\"noopener\">rispondete al questionario, per favore<\/a>. Quando si concluder\u00e0 il secondo giro, tenete d&#8217;occhio qui per i risultati!<\/p>\n<p><em>Grazie a tutti coloro i quali hanno prestato il loro tempo prezioso e il loro feedback per rendere questo articolo il meglio che potesse essere: <a href=\"https:\/\/www.aaron-gustafson.com\/\" rel=\"noopener\">Aaron Gustafson<\/a>, <a href=\"https:\/\/www.zeldman.com\/\" rel=\"noopener\">Jeffrey Zeldman<\/a>, <a href=\"http:\/\/brandongregorycreative.com\/\" rel=\"noopener\">Brandon Gregory<\/a>, <a href=\"https:\/\/rachelandrew.co.uk\/\" rel=\"noopener\">Rachel Andrew<\/a>, <a href=\"https:\/\/www.bruceontheloose.com\/\" rel=\"noopener\">Bruce Hyslop<\/a>, <a href=\"http:\/\/adrianroselli.com\/\" rel=\"noopener\">Adrian Roselli<\/a>, <a href=\"https:\/\/www.megkurdziolek.com\/\" rel=\"noopener\">Meg Dickey-Kurdziolek<\/a> e <a href=\"https:\/\/www.linkedin.com\/in\/tukkrr\/\" rel=\"noopener\">Nick Tucker<\/a>.<\/em><\/p>\n<p><em>Ringraziamenti aggiuntivi a coloro i quali mi hanno aiutato a migliorare il sondaggio sulla qualit\u00e0 delle immagini: <a href=\"https:\/\/twitter.com\/mandytensen\" rel=\"noopener\">Mandy Tensen<\/a>, <a href=\"https:\/\/twitter.com\/darleendenno\" rel=\"noopener\">Darleen Denno<\/a>, <a href=\"http:\/\/www.charlottedann.com\/\" rel=\"noopener\">Charlotte Dann<\/a>, <a href=\"https:\/\/www.timdunklee.com\/\" rel=\"noopener\">Tim Dunklee<\/a> e <a href=\"https:\/\/thadroe.com\/\" rel=\"noopener\">Thad Roe<\/a>.<\/em><\/p>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>La qualit\u00e0 delle immagini pu\u00f2 riguardare l&#8217;equilibrio tra la velocit\u00e0 e la qualit\u00e0, ma c&#8217;\u00e8 di pi\u00f9 per gli occhi. Cosa succederebbe se l&#8217;utente non fosse d&#8217;accordo, nonostante i metodi per sviluppare esperienze di immagine per il web sempre migliori? In una ricerca per trovare delle risposte a queste domande, Jeremy Wagner ci guida attraverso uno studio sulla qualit\u00e0 delle immagini che ha progettato, sviluppato e su cui ha iterato seguendo il feedback degli utenti. Nella ricerca, chiedersi \u201cperch\u00e9?\u201d non \u00e8 un&#8217;impresa facile.<\/p>\n","protected":false},"author":818,"featured_media":7000852,"comment_status":"open","ping_status":"open","template":"","categories":[269,230,9,267],"tags":[],"coauthors":[500],"class_list":["post-860","article","type-article","status-publish","has-post-thumbnail","hentry","category-application-development","category-numero-253-22-marzo-2018","category-usabilita","category-user-research"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/article\/860","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=860"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media\/7000852"}],"wp:attachment":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media?parent=860"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/categories?post=860"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/tags?post=860"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/coauthors?post=860"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}