Principios de diseño del lenguaje
Un lenguaje específico de dominio bien diseñado, o un lenguaje en general, permite a las personas expresar sus pensamientos de una manera rápida y concisa, así como comprender la respuesta de retroalimentación fácilmente. Es especialmente importante investigar porque afecta directamente a la rapidez con la que puede iterar, probar nuevas ideas y comprender los resultados intermedios. Las iteraciones rápidas permiten probar una gama más amplia de parámetros, incluidos aquellos que no deberían funcionar a primera vista, lo que le permite comprender mucho mejor el dominio que está investigando. Por lo tanto, el diseño del lenguaje afecta directamente no solo el tiempo total necesario para resolver un problema de una manera no lineal, sino que a menudo es la clave para encontrar la solución.
Surge una pregunta importante: ¿qué es un buen idioma? ¿Hay alguna guía que cada idioma específico de dominio deba seguir? Creemos que hay dos principios básicos:
- La gente necesita una conexión inmediata con lo que está haciendo
Este principio fue introducido por primera vez públicamente por Brett Victor, un visionario de la interacción humano-computadora, durante su charla Inventando por Principios. Cualquier violación de este principio aleja al usuario de los problemas reales que está tratando de resolver, lo que en consecuencia disminuye la comprensión y aumenta el número de errores. - La gente no puede estar limitada por la herramienta que está usando
La gente tiende a rechazar cualquier herramienta que obviamente limite su expresividad. Esta es la razón exacta por la que tantas soluciones WYSIWYG, como creadores de sitios web, creadores de juegos o lenguajes de programación visual, nunca se ponen al día. Cualquier DSL más complejo que un editor de texto WYSIWYG puede violar fácilmente este principio al proporcionar a sus usuarios un conjunto demasiado limitado de componentes predefinidos de alto nivel. Incluso si estos componentes se pueden ampliar escribiendo código, la necesidad de recurrir a algún lenguaje de programación subyacente estropea el diseño y lo hace inutilizable para un público menos técnico.
Violación de principios
La violación de cualquiera de estos principios siempre conduce a una solución subóptima. Consideremos de nuevo el diseño gráfico. ¿Usar Photoshop siempre es mejor que escribir código HTML, Sass y JavaScript? Posiblemente. Estas soluciones violan el primer y el segundo principio, respectivamente. Photoshop proporciona un lienzo digital WYSIWYG con un conjunto limitado de herramientas predefinidas y difícilmente extensibles. HTML, Sass y JavaScript, por otro lado, proporcionan una interfaz de texto, y por lo tanto, alejan al usuario de su creación real, pero no establecen una restricción estricta en la expresividad. Consideremos dos casos de uso:
- Un diseño de sitio web. Hay cinco elementos dispuestos de manera uniforme en la barra de menús. Si desea agregar un nuevo elemento y cambiar la paleta de colores del sitio web, todo lo que tiene que hacer es modificar una sola línea en HTML y una variable de color en Sass. No importa cuán complejo sea el sitio web, cada elemento se actualizará automáticamente. Hacer lo mismo en Photoshop requiere varios órdenes de magnitud más de tiempo: cree un nuevo elemento de menú, use una herramienta de alineación para organizar los elementos, cambie manualmente los colores y probablemente vuelva a aplicar algunas transformaciones y filtros en áreas de sitios web más complejas.
- Una pintura artística. Usar HTML, SVG y Sass dentro de un editor de texto para expresar una visión artística difícilmente sería posible. Cuanto más creativo y reconocible sea el proceso, más importantes serán el conjunto de herramientas WYSIWYG y el bucle de retroalimentación instantánea.
¿Sería posible fusionar ambos enfoques? No solo es posible, ya hay soluciones que van en la dirección correcta. Piense en Sketch, que se ha convertido en el kit de herramientas de diseño definitivo para Mac OS. ¿Por qué tanta gente lo prefiere a Photoshop? La respuesta es sorprendentemente simple: Sketch limita su expresividad al usuario menos que Photoshop. Le permite crear elementos de diseño reutilizables y luego actualizar en masa sus parámetros, al igual que Sass, pero en un entorno interactivo WYSIWYG. Hay muchas otras formas de mejorar aún más la experiencia del diseñador. Vea otra charla de Brett Victor, Drawing Dynamic Visualizations, para obtener más inspiración.
La maldición de los DSL
Si conocemos los principios básicos para un lenguaje específico de dominio perfecto, ¿por qué las herramientas específicas de dominio disponibles aún no están ahí? ¿Por qué no vivimos en un mundo WYSIWYG ilimitado?
Mientras que los lenguajes específicos de dominio ofrecen una forma incomparable de manipular y comprender los datos, también contrabandean silenciosamente patrones de diseño de software estropeados. La existencia de muchos DSL pequeños que no pueden hablar entre sí conduce en una perspectiva larga a un mundo de software disfuncional y fragmentado.
En el mundo real, hay una cooperación constante entre dominios. La manipulación de imágenes se utiliza a menudo para las necesidades de aprendizaje automático y bioinformática, que a su vez se convierten cada vez más en una herramienta importante para la arquitectura y el diseño de vehículos. El rápido desarrollo de IoT se traduce en dispositivos más pequeños y autónomos, lo que abre un nuevo mundo para la detección temprana de enfermedades, los sistemas de monitoreo de salud o las ciudades inteligentes.
Sin embargo, apenas hay cooperación en el mundo del software. Los desarrolladores de software están escribiendo el mismo código una y otra vez, lo que conduce a altos costos de desarrollo y estancamiento de la innovación. No puede simplemente tomar un editor de formas de su software de gráficos favorito, ajustarlo para sus necesidades, pegarlo con herramientas de aprendizaje automático y crear una herramienta de modelado 3D asistida por IA para las necesidades de la impresión 3D. En lugar de horas, actualmente necesita días o meses para realizar dicha tarea. Incluso si encuentra bibliotecas que implementan una funcionalidad similar, debe realizar una enorme cantidad de trabajo antes de que siga el principio de «sin límites» y proporcione un entorno verdaderamente flexible, para que sus usuarios puedan afinar cómo se construye el modelo. Como resultado, en lugar de mejorar los componentes existentes o inventar nuevas formas de manipular los datos, los desarrolladores vuelven a implementar soluciones conocidas desde cero en cada nueva aplicación.
Luna, el idioma
Las pautas para que los idiomas específicos de un dominio sigan el primer principio son claras. Para ofrecer la conexión inmediata entre las personas y su creación, los lenguajes específicos del dominio deben combinar una visualización de datos enriquecida y una manipulación de datos intuitiva en una experiencia única y fluida. Sin embargo, no hay una regla general sobre cómo hacerlo correctamente. Depende en gran medida del dominio en particular y de las preferencias del usuario, lo que hace que el segundo paradigma, la capacidad de personalizar los componentes, sea aún más importante.
Seguir el segundo principio, sin embargo, es más complicado. ¿Cómo podemos diseñar un lenguaje y asegurarnos de que no limite la expresividad de las personas? ¿Cómo podemos permitir a los usuarios crear componentes reutilizables personalizados y modificar profundamente los existentes, pero mantener la interfaz simple y no exigirles que sean programadores? La idea es permitir que el usuario cambie gradualmente la perspectiva. En lugar de recurrir a un lenguaje de programación subyacente, podemos permitir literalmente sumergirnos en cada componente y usar el mismo lenguaje (o muy similar) para describir cómo se comunican los subcomponentes. Profundizar en los componentes anidados permite a los usuarios proceder gradualmente de niveles altos a bajos de abstracción bajo demanda.
Esto es exactamente lo que hace Luna. Se basa en tres conceptos principales:
- Entorno de visualización y manipulación de datos
Desde la perspectiva más alta, Luna le permite visualizar y manipular datos utilizando componentes WYSIWYG interactivos y extensibles. Además, Luna proporciona una forma de definir fácilmente nuevos componentes, modificar los existentes y compartirlos con la comunidad. - Gráfico de flujo de datos
Literalmente puede alejarse para ver cómo los componentes de alto nivel están conectados entre sí formando un gráfico de flujo de datos. Puede volver a cablearlos o insertar nuevos componentes para redefinir el funcionamiento del gráfico. Luna ofrece componentes que se extienden a todos los niveles de abstracción, de alto a bajo. Desde pintar un lienzo sobre funciones estadísticas hasta operadores de bits - Gráficos de flujo de datos anidados y representación de código
Cada componente de Luna está construido a partir de otros componentes, sin excepción. Siempre puede sumergirse hasta el nivel deseado de abstracción y ajustarlo a sus necesidades. También puede contraer varios componentes conectados en uno nuevo y más potente y compartirlo con otros. Además, Luna proporciona a sus usuarios una capacidad única para cambiar entre representaciones, desde el gráfico de flujo de datos hasta el código y viceversa. Implica una verdad muy importante: el gráfico es tan poderoso como el código.
Luna se diseñó como un entorno unificado para crear y alojar lenguajes específicos de dominio visualmente ricos. Difumina los límites entre dominios, lo que permite que las herramientas de diferentes campos se comuniquen y coexistan sin problemas.