Hacks

En los últimos 10 años, ha habido una explosión de interés en la «computación científica» y la «ciencia de los datos»: es decir, la aplicación de la computación para responder a preguntas y analizar datos en las ciencias naturales y sociales. Para responder a estas necesidades, hemos asistido a un renacimiento de los lenguajes de programación, las herramientas y las técnicas que ayudan a los científicos e investigadores a explorar y comprender los datos y los conceptos científicos, y a comunicar sus hallazgos. Pero hasta la fecha, muy pocas herramientas se han centrado en ayudar a los científicos a acceder sin filtros a todo el potencial de comunicación de los navegadores web modernos. Así que hoy estamos encantados de presentar Yoduro, una herramienta experimental destinada a ayudar a los científicos a escribir hermosos documentos interactivos utilizando tecnologías web, todo ello dentro de un flujo de trabajo iterativo que se siente similar a otros entornos de computación científica.

Yoduro en acción.

Más allá de ser sólo un entorno de programación para la creación de documentos vivos en el navegador, Yoduro intenta eliminar la fricción de los flujos de trabajo comunicativos al incluir siempre la herramienta de edición con el documento limpio y legible. Esto difiere de los entornos de estilo IDE que producen documentos de presentación como archivos .pdf (que luego se separan del código original) y de los cuadernos basados en celdas que mezclan código y elementos de presentación. En Yoduro, usted puede obtener tanto un documento que se ve como usted quiere que se vea, y un fácil acceso al código subyacente y el entorno de edición.

Yoduro es todavía muy en un estado alfa, pero siguiendo el aforismo de Internet «Si usted no está avergonzado por la primera versión de su producto, usted ha lanzado demasiado tarde», hemos decidido hacer un lanzamiento suave muy temprano con la esperanza de obtener retroalimentación de una comunidad más grande. Tenemos una demo que puedes probar ahora mismo, pero espera muchas asperezas (¡y por favor no utilices esta versión alfa para trabajos críticos!). Esperamos que, a pesar de los bordes ásperos, si usted entrecierra los ojos en esto será capaz de ver el valor del concepto, y que la retroalimentación que nos da nos ayudará a averiguar dónde ir después.

Cómo llegamos a Iodide

Ciencia de datos en Mozilla

En Mozilla, la gran mayoría de nuestro trabajo de ciencia de datos se centra en la comunicación. Aunque a veces desplegamos modelos destinados a mejorar directamente la experiencia del usuario, como el motor de recomendación que ayuda a los usuarios a descubrir extensiones del navegador, la mayor parte del tiempo nuestros científicos de datos analizan nuestros datos con el fin de encontrar y compartir ideas que informarán las decisiones de los gerentes de producto, ingenieros y ejecutivos.

El trabajo de ciencia de datos implica escribir mucho código, pero a diferencia del desarrollo de software tradicional, nuestro objetivo es responder a preguntas, no producir software. El resultado suele ser algún tipo de informe: un documento, unos gráficos o quizás una visualización de datos interactiva. Al igual que muchas organizaciones de ciencia de datos, en Mozilla exploramos nuestros datos utilizando fantásticas herramientas como Jupyter y R-Studio. Sin embargo, cuando llega el momento de compartir nuestros resultados, normalmente no podemos entregar un cuaderno de Jupyter o un script de R a un responsable de la toma de decisiones, por lo que a menudo acabamos haciendo cosas como copiar las cifras clave y las estadísticas resumidas en un documento de Google.

Nos hemos dado cuenta de que hacer el viaje de ida y vuelta desde la exploración de datos en código hasta la creación de una explicación digerible y viceversa no siempre es fácil. La investigación muestra que muchas personas comparten esta experiencia. Cuando un científico de datos está leyendo el informe final de otro y quiere ver el código que hay detrás, puede haber mucha fricción; a veces, localizar el código es fácil, a veces no. Si quieren intentar experimentar con el código y ampliarlo, las cosas se complican aún más. Otro científico de datos puede tener tu código, pero puede no tener una configuración idéntica en su máquina, y configurar eso lleva tiempo.

El círculo virtuoso del trabajo de la ciencia de datos.

¿Por qué hay tan poca web en la ciencia?

En el contexto de estos flujos de trabajo de la ciencia de datos en Mozilla, a finales de 2017 emprendí un proyecto que pedía la visualización interactiva de datos. Hoy en día se pueden crear visualizaciones interactivas utilizando grandes bibliotecas para Python, R y Julia, pero para lo que yo quería lograr, necesitaba bajar a Javascript. Esto significaba alejarme de mis entornos de ciencia de datos favoritos. Las herramientas modernas de desarrollo web son increíblemente potentes, pero extremadamente complicadas. Realmente no quería averiguar cómo conseguir una cadena de herramientas de construcción de Javascript de pleno derecho con la recarga de módulos en caliente, pero a falta de eso no pude encontrar mucho dirigido a la creación de documentos web limpios y legibles dentro del flujo de trabajo vivo e iterativo que me es familiar.

Empecé a preguntarme por qué esta herramienta no existía – por qué no hay Jupyter para la construcción de documentos web interactivos – y pronto se amplió a pensar en por qué casi nadie utiliza Javascript para la computación científica. Tres grandes razones saltaron a la vista:

  1. Javascript en sí mismo tiene una reputación mixta entre los científicos por ser lento y torpe;
  2. no hay muchas bibliotecas de computación científica que se ejecuten en el navegador o que trabajen con Javascript; y,
  3. como había descubierto, hay muy pocas herramientas de codificación científica que permitan un rápido bucle de iteración y también concedan un acceso no filtrado a las capacidades de presentación en el navegador.

Estos son desafíos muy grandes. Pero mientras pensaba más en ello, empecé a pensar que trabajar en un navegador podría tener algunas ventajas reales para el tipo de ciencia de datos comunicativa que hacemos en Mozilla. La mayor ventaja, por supuesto, es que el navegador tiene posiblemente el conjunto más avanzado y bien soportado de tecnologías de presentación en el planeta, desde el DOM a WebGL a Canvas a WebVR.

Pensando en la fricción del flujo de trabajo mencionada anteriormente, se me ocurrió otra ventaja potencial: en el navegador, el documento final no necesita estar separado de la herramienta que lo creó. Quería una herramienta diseñada para ayudar a los científicos a iterar sobre documentos web (básicamente aplicaciones web de un solo propósito para explicar una idea)… y muchas herramientas que estábamos usando eran en sí mismas básicamente aplicaciones web. Para el caso de uso de la escritura de estos pequeños documentos de aplicación web, ¿por qué no agrupar el documento con la herramienta utilizada para escribirlo?

Al hacer esto, los lectores no técnicos podrían ver mi documento de aspecto agradable, pero otros científicos de datos podrían volver al instante al código original. Además, como el núcleo de cálculo sería el motor JS del navegador, podrían empezar a ampliar y experimentar con el código de análisis inmediatamente. Y podrían hacer todo esto sin conectarse a recursos informáticos remotos ni instalar ningún software.

Hacia el yoduro

Empecé a discutir los posibles pros y contras de la computación científica en el navegador con mis colegas, y en el transcurso de nuestras conversaciones, nos dimos cuenta de otras tendencias interesantes.

Dentro de Mozilla estábamos viendo un montón de demos interesantes que mostraban WebAssembly, una nueva forma de que los navegadores ejecuten código escrito en lenguajes distintos de Javascript. WebAssembly permite ejecutar programas a una velocidad increíble, en algunos casos cercana a los binarios nativos. Vimos ejemplos de procesos de alta carga computacional, como motores enteros de juegos en 3D, que se ejecutaban en el navegador sin dificultad. En el futuro, sería posible compilar las mejores bibliotecas de cálculo numérico en C y C++ a WebAssembly y envolverlas en APIs JS ergonómicas, tal y como hace el proyecto SciPy con Python. De hecho, hay proyectos que ya han empezado a hacerlo.

WebAssembly permite ejecutar código a una velocidad casi nativa en el navegador.

También hemos observado la disposición de la comunidad de Javascript a introducir una nueva sintaxis cuando hacerlo ayuda a la gente a resolver su problema de forma más eficaz. Tal vez sería posible emular algunos de los elementos sintácticos clave que hacen que la programación numérica sea más comprensible y fluida en MATLAB, Julia y Python: multiplicación de matrices, cortes multidimensionales, operaciones de transmisión de matrices, etc. Una vez más, encontramos a otras personas que pensaban de forma similar.

Con la convergencia de estos hilos, empezamos a preguntarnos si la plataforma web podría estar en la cúspide de convertirse en un hogar productivo para la computación científica. Al menos, parecía que podría evolucionar para servir a algunos de los flujos de trabajo comunicativos que encontramos en Mozilla (y que tantos otros encuentran en la industria y el mundo académico). Con el núcleo de Javascript mejorando todo el tiempo y la posibilidad de añadir extensiones de sintaxis para la programación numérica, quizás el propio JS podría hacerse más atractivo para los científicos. WebAssembly parecía ofrecer un camino hacia grandes bibliotecas científicas. La tercera pata del taburete sería un entorno para crear documentos de ciencia de datos para la web. Este último elemento es en el que decidimos centrar nuestra experimentación inicial, lo que nos llevó a Iodide.

La anatomía de Iodide

Iodide es una herramienta diseñada para dar a los científicos un flujo de trabajo familiar para crear documentos interactivos de gran aspecto utilizando toda la potencia de la plataforma web. Para lograrlo, te damos un «informe» -básicamente una página web que puedes rellenar con tu contenido- y algunas herramientas para explorar iterativamente los datos y modificar tu informe para crear algo que estés listo para compartir. Una vez que esté listo, puede enviar un enlace directamente a su informe finalizado. Si tus colegas y colaboradores quieren revisar tu código y aprender de él, pueden volver al modo de exploración con un solo clic. Si quieren experimentar con el código y utilizarlo como base de su propio trabajo, con un clic más pueden bifurcarlo y empezar a trabajar en su propia versión.

Sigue leyendo para conocer un poco más sobre algunas de las ideas con las que estamos experimentando en un intento de hacer que este flujo de trabajo se sienta fluido.

Las vistas de exploración e informe

El objetivo de Yoduro es apretar el bucle entre la exploración, la explicación y la colaboración. Para ello, es fundamental la capacidad de ir y venir entre un escrito de aspecto agradable y un entorno útil para la exploración computacional iterativa.

Cuando se crea por primera vez un nuevo cuaderno Iodide, se comienza en la «vista de exploración». Esto proporciona un conjunto de paneles que incluyen un editor para escribir código, una consola para ver la salida del código que evalúa, un visor de espacio de trabajo para examinar las variables que ha creado durante su sesión, y un panel de «vista previa del informe» en el que puede ver una vista previa de su informe.

Edición de un fragmento de código Markdown en la vista de exploración de Yoduro.

Al hacer clic en el botón «INFORME» en la esquina superior derecha, el contenido de la vista previa de su informe se expandirá para llenar toda la ventana, lo que le permite poner la historia que desea contar al frente y al centro. Los lectores que no saben cómo codificar o que no están interesados en los detalles técnicos pueden centrarse en lo que usted está tratando de transmitir sin tener que navegar a través del código. Cuando un lector visita el enlace a la vista del informe, su código se ejecuta automáticamente. si quieren revisar su código, simplemente haciendo clic en el botón «EXPLORAR» en la parte superior derecha les llevará de nuevo a la vista de exploración. Desde allí, pueden hacer una copia del cuaderno para sus propias exploraciones.

Pasar de la vista de exploración a la de informe.

Cuando compartes un enlace a un cuaderno de Yoduro, tu colaborador siempre puede acceder a ambas vistas. El documento limpio y legible nunca se separa del código ejecutable subyacente y del entorno de edición en vivo.

Documentos vivos e interactivos con la potencia de la Plataforma Web

Los documentos Iodide viven en el navegador, lo que significa que el motor de cálculo está siempre disponible. Cada vez que compartes tu trabajo, compartes un informe interactivo en vivo con código en ejecución. Además, como el cálculo se realiza en el navegador junto con la presentación, no es necesario llamar a un backend de lenguaje en otro proceso. Esto significa que los documentos interactivos se actualizan en tiempo real, lo que abre la posibilidad de realizar visualizaciones en 3D sin problemas, incluso con la baja latencia y la alta velocidad de fotogramas que requiere la RV.

El colaborador Devin Bayly explora los datos de la resonancia magnética de su cerebro

Compartir, colaborar y reproducibilidad

Construir Yoduro en la web simplifica varios de los elementos de fricción del flujo de trabajo que hemos encontrado en otras herramientas. Compartir se simplifica porque el escrito y el código están disponibles en la misma URL en lugar de, por ejemplo, pegar un enlace a un script en las notas al pie de un Google Doc. La colaboración se simplifica porque el núcleo de computación es el navegador y las bibliotecas pueden cargarse a través de una petición HTTP como cualquier página web carga script – no es necesario instalar lenguajes, bibliotecas o herramientas adicionales. Y como los navegadores proporcionan una capa de compatibilidad, no tienes que preocuparte de que el comportamiento de los cuadernos sea reproducible entre ordenadores y sistemas operativos.

Para soportar los flujos de trabajo colaborativos, hemos construido un servidor bastante simple para guardar y compartir cuadernos. Hay una instancia pública en iodide.io donde puedes experimentar con Iodide y compartir tu trabajo públicamente. También es posible configurar su propia instancia detrás de un firewall (y de hecho esto es lo que ya estamos haciendo en Mozilla para algunos trabajos internos). Pero lo más importante es que los cuadernos en sí no están profundamente ligados a una sola instancia del servidor Iodide. Si surge la necesidad, debería ser fácil migrar tu trabajo a otro servidor o exportar tu cuaderno como un paquete para compartirlo en otros servicios como Netlify o Github Pages (más sobre la exportación de paquetes más adelante en «¿Qué es lo siguiente?»). Mantener la computación en el cliente nos permite centrarnos en la construcción de un entorno realmente bueno para compartir y colaborar, sin necesidad de construir recursos computacionales en la nube.

Pyodide: La pila científica de Python en el navegador

Cuando empezamos a pensar en mejorar la web para los científicos, nos centramos en las formas en que podíamos mejorar el trabajo con Javascript, como compilar las bibliotecas científicas existentes en WebAssembly y envolverlas en APIs JS fáciles de usar. Cuando propusimos esto a los asistentes de WebAssembly de Mozilla, nos ofrecieron una idea más ambiciosa: si muchos científicos prefieren Python, hay que encontrarlos donde están compilando la pila científica de Python para que se ejecute en WebAssembly.

Pensamos que esto sonaba desalentador – que sería un proyecto enorme y que nunca ofrecería un rendimiento satisfactorio… pero dos semanas después Mike Droettboom tenía una implementación de Python funcionando dentro de un cuaderno Iodide. En los dos meses siguientes, añadimos Numpy, Pandas y Matplotlib, que son, con mucho, los módulos más utilizados en el ecosistema científico de Python. Con la ayuda de los colaboradores Kirill Smelkov y Roman Yurchak de Nexedi, conseguimos soporte para Scipy y scikit-learn. Desde entonces, hemos continuado añadiendo otras bibliotecas poco a poco.

Ejecutar el intérprete de Python dentro de una máquina virtual de Javascript añade una penalización de rendimiento, pero esa penalización resulta ser sorprendentemente pequeña – en nuestros benchmarks, alrededor de 1x-12x más lento que el nativo en Firefox y 1x-16x más lento en Chrome. La experiencia demuestra que esto es muy útil para la exploración interactiva.

La ejecución de Matplotlib en el navegador permite sus características interactivas, que no están disponibles en entornos estáticos

Incorporar Python al navegador crea algunos flujos de trabajo mágicos. Por ejemplo, puedes importar y limpiar tus datos en Python, y luego acceder a los objetos de Python resultantes desde Javascript (en la mayoría de los casos, la conversión se produce automáticamente) para que puedas mostrarlos usando bibliotecas JS como d3. Y lo que es más mágico, puedes acceder a las APIs del navegador desde el código de Python, permitiéndote hacer cosas como manipular el DOM sin tocar Javascript.

Por supuesto, hay mucho más que decir sobre Pyodide, y merece un artículo propio – entraremos en más detalle en un post de seguimiento el próximo mes.

JSMD (JavaScript MarkDown)

Al igual que en Jupyter y el modo R-Markdown de R, en Yodide puedes intercalar código y escritura como quieras, dividiendo tu código en «trozos de código» que puedes modificar y ejecutar como unidades separadas. Nuestra implementación de esta idea es paralela a R Markdown y al «modo de celdas» de MATLAB: en lugar de utilizar una interfaz explícitamente basada en celdas, el contenido de un cuaderno Iodide es simplemente un documento de texto que utiliza una sintaxis especial para delimitar tipos específicos de celdas. Llamamos a este formato de texto «JSMD».

Siguiendo a MATLAB, los chunks de código se definen por líneas que empiezan por %% seguidas de una cadena que indica el lenguaje del chunk que hay debajo. Actualmente soportamos chunks que contienen Javascript, CSS, Markdown (y HTML), Python, un chunk especial «fetch» que simplifica la carga de recursos, y un chunk de plugin que permite extender la funcionalidad de Iodide añadiendo nuevos tipos de celdas.

Hemos encontrado que este formato es bastante conveniente. Facilita el uso de herramientas orientadas al texto, como los visores de diferencias y tu propio editor de texto favorito, y puedes realizar operaciones de texto estándar como cortar/copiar/pegar sin tener que aprender atajos para la gestión de celdas. Para más detalles puedes leer sobre JSMD en nuestra documentación.

¿Qué es lo siguiente?

Vale la pena repetir que todavía estamos en alfa, así que seguiremos mejorando el pulido general y aplastando los errores. Pero además de eso, tenemos una serie de características en mente para nuestra próxima ronda de experimentación. Si alguna de estas ideas te parece especialmente útil, dínoslo. Mejor aún, ¡déjanos saber si te gustaría ayudarnos a construirlas!

Características de colaboración mejoradas

Como se mencionó anteriormente, hasta ahora hemos construido un backend muy simple que te permite guardar tu trabajo en línea, mirar el trabajo hecho por otras personas, y rápidamente bifurcar y extender cuadernos existentes hechos por otros usuarios, pero estos son sólo los pasos iniciales en un flujo de trabajo colaborativo útil.

Las próximas tres grandes características de colaboración que estamos considerando añadir son:

  1. Hilos de comentarios al estilo de Google Docs
  2. La capacidad de sugerir cambios en el cuaderno de otro usuario a través de un flujo de trabajo de bifurcación/fusión similar a las solicitudes de extracción de Github
  3. Edición simultánea de cuadernos como Google Docs.

En este punto, estamos priorizando en aproximadamente ese orden, pero si usted los aborda en un orden diferente o si tiene otras sugerencias, háganoslo saber!

Más lenguajes!

Hemos hablado con gente de las comunidades de R y Julia sobre la compilación de esos lenguajes a WebAssembly, lo que permitiría su uso en Iodide y otros proyectos basados en el navegador. Nuestra investigación inicial indica que esto debería ser posible, pero que la implementación de estos lenguajes podría ser un poco más difícil que Python. Al igual que con Python, se abren algunos flujos de trabajo interesantes si se puede, por ejemplo, ajustar modelos estadísticos en R o resolver ecuaciones diferenciales en Julia, y luego mostrar los resultados utilizando las API del navegador. Si traer estos lenguajes a la web le interesa, por favor, póngase en contacto con nosotros – en particular, nos encantaría la ayuda de los expertos en FORTRAN y LLVM.

Exportar el archivo del cuaderno

Las primeras versiones de Yoduro eran archivos HTML autocontenidos ejecutables, que incluían tanto el código JSMD utilizado en el análisis, como el código JS utilizado para ejecutar el propio Yoduro, pero nos hemos alejado de esta arquitectura. Los experimentos posteriores nos han convencido de que las ventajas de colaboración de tener un servidor Iodide superan las ventajas de gestionar los archivos en el sistema local. Sin embargo, estos experimentos nos mostraron que es posible tomar una instantánea ejecutable de un cuaderno Iodide al incluir el código Iodide junto con los datos y las bibliotecas utilizadas por un cuaderno en un gran archivo HTML. Esto podría terminar siendo un archivo más grande de lo que usted querría servir a los usuarios regulares, pero podría resultar útil como una instantánea perfectamente reproducible y archivable de un análisis.

Extensión de Iodide al navegador del editor de texto

Aunque muchos científicos están bastante acostumbrados a trabajar en entornos de programación basados en el navegador, sabemos que algunas personas nunca editarán el código en otra cosa que no sea su editor de texto favorito. Realmente queremos que Yoduro se reúna con la gente donde ya está, incluyendo a aquellos que prefieren escribir su código en otro editor pero quieren acceder a las características interactivas e iterativas que ofrece Yoduro. Para satisfacer esa necesidad, hemos empezado a pensar en crear una extensión ligera para el navegador y algunas APIs simples para permitir que Yoduro se comunique con los editores del lado del cliente.

¡Son bienvenidos los comentarios y la colaboración!

No estamos tratando de resolver todos los problemas de la ciencia de los datos y la computación científica, y sabemos que Yoduro no será del agrado de todos. Si necesitas procesar terabytes de datos en clusters de GPU, probablemente Iodide no tenga mucho que ofrecerte. Si estás publicando artículos en una revista y sólo necesitas escribir un documento en LaTeX, entonces hay mejores herramientas para tus necesidades. Si toda la tendencia de llevar las cosas al navegador te hace estremecerte un poco, no hay problema – hay una gran cantidad de herramientas realmente increíbles que puedes usar para hacer ciencia, ¡y estamos agradecidos por ello! No queremos cambiar la forma de trabajar de nadie, y para muchos científicos la comunicación centrada en la web no tiene importancia. ¡Rad! Vive tu mejor vida!

Pero para aquellos científicos que producen contenido para la web, y para aquellos que podrían hacerlo si tuvieran herramientas diseñadas para apoyar su forma de trabajo: ¡nos encantaría saber de ti!

Por favor, visita iodide.io, pruébalo, y danos tu opinión (pero de nuevo: ten en cuenta que este proyecto está en fase alfa – por favor, no lo uses para ningún trabajo crítico, y por favor, sé consciente de que mientras estamos en fase alfa todo está sujeto a cambios). Puedes participar en nuestra encuesta rápida, y los problemas e informes de errores en Github son muy bienvenidos. Las solicitudes de características y los pensamientos sobre la dirección general pueden ser compartidos a través de nuestro grupo de Google o Gitter.

Si desea participar en ayudarnos a construir Yoduro, estamos de código abierto en Github. Iodide toca una amplia variedad de disciplinas de software, desde el desarrollo de frontales modernos hasta la computación científica y la compilación y transpilación, ¡así que hay muchas cosas interesantes que hacer! Por favor, póngase en contacto si algo de esto le interesa!

Enorme agradecimiento a Hamilton Ulmer, William Lachance, y Mike Droettboom por su gran trabajo en Iodide y por revisar este artículo.

Acerca de Brendan Colloran

Más artículos de Brendan Colloran…

Deja una respuesta

Tu dirección de correo electrónico no será publicada.