Principi di progettazione del linguaggio
Un linguaggio specifico del dominio ben progettato, o un linguaggio in generale, consente alle persone di esprimere i propri pensieri in modo rapido e conciso e di comprendere facilmente la risposta del feedback. E ‘ particolarmente importante per la ricerca, perché colpisce direttamente quanto velocemente si può iterare-testare nuove idee e capire i risultati intermedi. Iterazioni veloci consentono di testare una gamma più ampia di parametri, compresi quelli che non dovrebbero funzionare a prima vista, consentendo di comprendere molto meglio il dominio che si sta indagando. Pertanto, il design del linguaggio influisce direttamente non solo sul tempo totale necessario per risolvere un problema in modo non lineare, ma spesso è la chiave per trovare la soluzione.
Emerge una domanda importante: cos’è una buona lingua? Ci sono linee guida che ogni lingua specifica del dominio dovrebbe seguire? Crediamo che ci siano due principi di base:
- Le persone hanno bisogno di una connessione immediata a ciò che stanno facendo
Questo principio è stato introdotto pubblicamente da Brett Victor, un visionario dell’interazione uomo-computer, durante il suo discorso Inventando per principio. Qualsiasi violazione di questo principio allontana l’utente dai problemi reali che sta cercando di risolvere, il che di conseguenza diminuisce la comprensione e aumenta il numero di errori. - Le persone non possono essere limitate dallo strumento che stanno usando
Le persone tendono a rifiutare qualsiasi strumento che limiti ovviamente la loro espressività. Questo è il motivo esatto per cui così tante soluzioni WYSIWYG, come creatori di siti web, creatori di giochi o linguaggi di programmazione visivi, non raggiungono mai. Qualsiasi DSL più complesso di un editor di testo WYSIWYG può facilmente violare questo principio fornendo ai propri utenti un insieme troppo limitato di componenti predefiniti di alto livello. Anche se questi componenti possono essere estesi scrivendo codice, la necessità di ricorrere a qualche linguaggio di programmazione sottostante rovina il design e lo rende inutilizzabile per un pubblico meno tecnico.
Violazione del principio
La violazione di uno qualsiasi di questi principi porta sempre a una soluzione non ottimale. Consideriamo di nuovo il design grafico. Usare Photoshop è sempre meglio che scrivere codice HTML, Sass e JavaScript? Probabilmente. Queste soluzioni violano rispettivamente il primo e il secondo principio. Photoshop fornisce una tela digitale WYSIWYG con un set limitato di strumenti predefiniti, difficilmente estensibili. HTML, Sass e JavaScript, d’altra parte, forniscono un’interfaccia di testo e, quindi, alienano l’utente dalla sua creazione reale, ma non impostano una stretta restrizione sull’espressività. Consideriamo due casi d’uso:
- Un sito web design. Ci sono cinque elementi disposti in modo uniforme nella barra dei menu. Se si desidera aggiungere un nuovo elemento e modificare la tavolozza dei colori del sito web, tutto quello che dovete fare è modificare una singola riga in HTML e una variabile di colore in Sass. Non importa quanto sia complesso il sito web, ogni elemento si aggiornerà automaticamente. Fare lo stesso in Photoshop richiede diversi ordini di grandezza più tempo: creare una nuova voce di menu, utilizzare uno strumento di allineamento per disporre gli elementi, modificare manualmente i colori e probabilmente riapplicare alcune trasformazioni e filtri in aree del sito Web più complesse.
- Un dipinto artistico. Utilizzando HTML, SVG e Sass all’interno di un editor di testo per esprimere una visione artistica sarebbe difficilmente possibile. Più creativo e individuabile è il processo, più importante diventa il set di strumenti WYSIWYG e il ciclo di feedback immediato.
Sarebbe possibile fondere entrambi gli approcci? Non solo è possibile, ci sono già soluzioni che vanno nella giusta direzione. Pensa a Sketch, che è diventato l’ultimo toolkit di progettazione per Mac OS. Perché così tante persone preferiscono Photoshop? La risposta è sorprendentemente semplice: Sketch limita l’espressività dell’utente meno di Photoshop. Esso consente di creare elementi di design riutilizzabili e poi bulk-aggiornare i loro parametri, proprio come Sass, ma in un ambiente interattivo, WYSIWYG. Ci sono molti altri modi per migliorare ulteriormente l’esperienza del designer. Guarda un altro discorso di Brett Victor, Disegnando visualizzazioni dinamiche, per ulteriore ispirazione.
The curse of DSLs
Se conosciamo i principi di base per un linguaggio specifico di dominio perfetto, perché gli strumenti specifici di dominio disponibili non ci sono ancora? Perché non viviamo in un mondo WYSIWYG illimitato?
Mentre i linguaggi specifici del dominio offrono un modo impareggiabile per manipolare e comprendere i dati, contrabbandano anche modelli di progettazione software viziati. L’esistenza di molti, piccoli DSL che non possono parlare tra loro porta in una lunga prospettiva a un mondo software disfunzionale e frammentato.
Nel mondo reale, c’è una costante cooperazione tra i domini. La manipolazione delle immagini viene spesso utilizzata per le esigenze di machine learning e bioinformatica, che a loro volta diventano sempre più uno strumento importante per l’architettura e la progettazione di veicoli. Il rapido sviluppo IoT si traduce in dispositivi più piccoli e più autonomi, che apre un nuovo mondo per la diagnosi precoce delle malattie, sistemi di monitoraggio sanitario o città intelligenti.
Tuttavia, non c’è quasi alcuna cooperazione nel mondo del software. Gli sviluppatori di software stanno scrivendo lo stesso codice più e più volte, il che porta a costi di sviluppo elevati e stagnazione dell’innovazione. Non puoi semplicemente prendere un editor di forme dal tuo software di grafica preferito, ottimizzarlo per le tue esigenze, incollarlo con strumenti di apprendimento automatico e creare uno strumento di modellazione 3D assistito dall’IA per le esigenze della stampa 3D. Invece di ore, È attualmente necessario giorni o mesi per realizzare tale compito. Anche se trovi librerie che implementano funzionalità simili, è necessario eseguire un’enorme quantità di lavoro prima che segua il principio “no limits” e fornisca un ambiente veramente flessibile, in modo che gli utenti possano ottimizzare il modo in cui il modello è costruito. Di conseguenza, invece di migliorare i componenti esistenti o inventare nuovi modi di manipolare i dati, gli sviluppatori re-implementare soluzioni note da zero in ogni nuova applicazione.
Luna, la lingua
Le linee guida per le lingue specifiche del dominio per seguire il primo principio sono chiare. Al fine di fornire la connessione immediata tra le persone e la loro creazione, i linguaggi specifici del dominio devono combinare una ricca visualizzazione dei dati e una manipolazione intuitiva dei dati in un’unica esperienza fluida. Non c’è, tuttavia, nessuna regola empirica su come farlo correttamente. Dipende fortemente dal particolare dominio e dalle preferenze dell’utente, il che rende ancora più importante il secondo paradigma, la possibilità di personalizzare i componenti.
Seguire il secondo principio, tuttavia, è più complicato. Come possiamo progettare un linguaggio ed essere sicuri che non limiti l’espressività delle persone? Come possiamo consentire agli utenti di creare componenti riutilizzabili personalizzati e modificare profondamente quelli esistenti mantenendo l’interfaccia semplice e non richiedendo loro di essere programmatori? L’idea è quella di consentire all’utente di cambiare in modo incrementale la prospettiva. Invece di ricorrere a un linguaggio di programmazione sottostante, possiamo permettere di immergerci letteralmente in ogni componente e usare lo stesso (o molto simile) linguaggio per descrivere come comunicano i sottocomponenti. Immergersi ulteriormente nei componenti nidificati consente agli utenti di procedere gradualmente da livelli elevati a bassi di astrazione su richiesta.
Questo è esattamente ciò che fa Luna. È stato costruito su tre concetti principali:
- Data visualization and manipulation environment
Dal punto di vista più alto, Luna consente di visualizzare e manipolare i dati utilizzando componenti WYSIWYG interattivi ed estensibili. Inoltre, Luna fornisce un modo per definire facilmente nuovi componenti, modificare quelli esistenti e condividerli con la comunità. - Data flow graph
Puoi letteralmente ridurre lo zoom per vedere come i componenti di alto livello sono cablati insieme formando un grafico del flusso di dati. È possibile ricablarli o inserire nuovi componenti per ridefinire il funzionamento del grafico. Luna fornisce componenti che si estendono su tutti i livelli di astrazione, dall’alto al basso. Dalla pittura di una tela su funzioni statistiche agli operatori bit a bit - Grafici del flusso di dati nidificati e rappresentazione del codice
Ogni componente in Luna è costruito da altri componenti, senza eccezioni. Puoi sempre immergerti fino al livello di astrazione desiderato e adattarlo alle tue esigenze. È inoltre possibile comprimere diversi componenti collegati in uno nuovo, più potente e condividerlo con gli altri. Inoltre, Luna offre ai suoi utenti una capacità unica di passare da una rappresentazione all’altra, dal grafico del flusso di dati al codice e viceversa. Implica una verità molto importante: il grafico è potente quanto il codice.
Luna è stato progettato come un ambiente unificato per la creazione e l’hosting di linguaggi specifici di dominio visivamente ricchi. Sfuma i confini tra i domini, consentendo a strumenti di campi diversi di comunicare e coesistere senza problemi.