Una entrevista con Meade Kincke en la que él y Katrina Owen hablan del compilador de Rust, de una GUI que usa espacios de color científicos para determinar el color de la cerveza, y de su libro «A Practical Guide To Rust».
Hola, Meade. Gracias por charlar. Queríamos hablar contigo porque eres el mentor más prolífico que tenemos en el track de Rust. Has ayudado a más de 400 estudiantes. ¿Cómo conociste Exercism?
Alguien en el subreddit de Rust de Reddit publicó que el track de Rust de Exercism necesitaba mentores, así que lo investigué. Me alegro mucho de haberlo hecho, porque es enormemente gratificante y todos han sido muy amables y agradecidos. He hecho conexiones maravillosas con mis estudiantes de Exercism y me encanta ayudarlos.
¿Hay alguna historia en particular que destaque?
Sí, hay un ejercicio de Rust en particular que ha sido muy popular: el Pythagorean Triplet.
El problema más común en este ejercicio suele ser el rendimiento. La mayoría de la gente lo resuelve al principio con bucles for anidados, lo cual es como mínimo O(n²) y es muy ineficiente. Mi objetivo es llevar a mis estudiantes a una solución lineal: O(n).
Mi enfoque es plantear preguntas. Empiezo preguntando si quieren aprender el método iterador de Rust, porque tiene muchísimos beneficios, y uno de ellos es que puedes usar la biblioteca Rayon para paralelizar tu trabajo.
Después de responder «Sí, por favor», uno de mis estudiantes mencionó que está aprendiendo Rust porque está pensando en usarlo para control embebido y luego procesar su enorme volumen de salida de datos. Por eso, el paralelismo es importante para él. Le gustó que yo tomara un ejercicio aparentemente simple para enseñar partes más complejas e idiomáticas de Rust.
Ahora, gracias a Exercism, me contrató para darle clases uno a uno, y vamos a trabajar juntos en algunos proyectos experimentales. También le voy a enseñar a todo su equipo cuando convierta la empresa por completo a Rust.
He disfrutado mucho trabajar con los estudiantes a los que he dado mentoría, y quiero que eso siga creciendo.
Me gusta tanto que ahora me ofrecí como voluntario para ser mantenedor del track de Rust y ayudar más detrás de escena.
¡Esa conexión humana es tan importante! Eres el autor de A Practical Guide to Rust. ¿De qué trata y cuáles fueron tus motivaciones para escribirlo?
Escribí este libro para ayudar a otros a entender mejor ciertos aspectos de Rust. No hay mucha documentación sobre el lenguaje, y sentí que hacía falta literatura que tuviera humor y explicara los conceptos del lenguaje de forma tangible. Ofrece guías de algunas áreas básicas y avanzadas. Quiero que la gente tenga una idea sólida del uso práctico y real del lenguaje. Da ejemplos reales, no hipotéticos.
Siempre supe que iba a escribir un libro. Cuando me encontré enseñándole a un colega a programar en Rust de forma remota, la estructura simplemente encajó. Él nunca había tocado código antes, y yo necesitaba explicar términos y métodos que los nerds damos por sentados de formas nuevas y comprensibles. Usé analogías como pedir prestado un libro de la biblioteca frente a ser dueño del libro cuando hablábamos del concepto de ownership en Rust.
También incorporé ejemplos de mi proyecto BrewStillery. Es una gran forma de ver cómo funcionan cosas como las structs y los enums en un programa real. También muestra cómo usar el paralelismo de verdad.
Al escribir el libro, sabía que quería que se leyera como una historia y no solo como una guía de referencia. Se construye sobre sí mismo, pero los elementos se sostienen por sí solos. Es la diferencia entre cocinar con un manual de química y ver un episodio de «The French Chef» de Julia Child.
Ah, eso es muy interesante. ¿Para quién escribiste el libro y qué obtendría el lector de él?
Está pensado para cualquiera que quiera aprender Rust. Lo que equilibra la balanza en cómo desarrollo las ideas es que le da al lector una comprensión fundamental, mientras que mucha otra literatura tiende a la memorización mecánica.
Veo que has recibido muchas reseñas positivas. ¿Piensas publicar un Volumen II?
¡Sí! Por supuesto, seguiré escribiendo y pienso publicar más volúmenes.
Además de enseñar mediante la mentoría y la escritura, también has trabajado en el compilador de Rust. ¿Puedes contarme sobre eso?
¡Por supuesto!
Como breve introducción a mi trabajo, hay esencialmente dos lugares donde un programa puede funcionar: el tiempo de compilación y el tiempo de ejecución. Cuando una función se ejecuta en tiempo de ejecución, todo lo que contiene tiene que regenerarse y recalcularse. Esto implica, de forma crítica, reasignar memoria, algo que siempre queremos evitar. Cuando una función es constante, se carga en memoria al iniciar el programa. Cuanto más podamos hacer en tiempo de compilación, mejor rendirán nuestros programas.
Hace un tiempo escuché que esta idea de la ejecución de funciones en tiempo de compilación (const fn) se estaba implementando en Rust, y me emocioné mucho. Me apasiona lograr que las cosas sean eficientes y precisas. Algo que me gusta mucho de const fn es que, cuando esté completo, podremos tener cosas maravillosas como constantes matemáticas determinadas de forma elegante. Actualmente, pi es un valor escrito directamente en el código. Mucha gente diría que es suficientemente preciso, pero yo creo que debería usar la totalidad del espacio numérico disponible. Con const fn, podemos usar la fórmula de Leibniz, que llenaría por completo el espacio de punto flotante.
Leí un poco más y me encontré con una publicación de blog que decía que MIRI haría mucho más fácil estabilizar const fn. Pasó el tiempo y no vi ningún progreso cuando se lanzaron nuevas versiones. Me puse en contacto con el equipo de Rust y empecé a trabajar en el compilador.
Lo genial es que el compilador en sí está escrito en Rust. Al principio se escribió en OCaml y luego se reescribió en Rust, lo que se llama bootstrapping. Básicamente, el compilador analiza toda la entrada en el AST, que luego se pasa a la representación intermedia de alto nivel (HIR), después a la de nivel medio (MIR) y luego a la de bajo nivel (LIR), que se encarga a LLVM. A medida que recorremos todos esos pasos, nos acercamos más y más al código máquina.
Algo que hay que entender es que el compilador es solo un programa, pero uno muy elaborado. Rust tarda bastante en compilar y, sobre todo, en ejecutar todas sus pruebas. Así que no basta con meter un poco de código y decir «ya terminé».
Mi primer trabajo en el compilador fue en el HIR. Implicó leer una cantidad enorme de la biblioteca estándar (tanto la estable como la nightly) y seguir un montón de vericuetos. Tuve que recorrer recursivamente todos los tipos anidados del compilador hasta agotar todas las opciones. La biblioteca nightly/del compilador tiene muchísimos tipos anidados. Mantener el hilo que estás siguiendo requiere mucha concentración.
Para complicar más las cosas, en el compilador trabaja un equipo distribuido, lo que significa que a menudo terminamos con conflictos de fusión.
Fue muy divertido. Todavía queda muchísimo trabajo por hacer, al que me dedicaré en un futuro cercano.
Además de estas contribuciones de código abierto, sé que eres CTO de una empresa de blockchain. Yo asocio blockchain con perder un montón de dinero en Etherium. ¿Qué significa para ti?
Lamentablemente, blockchain se ha convertido en la palabra de moda más sobada que jamás haya existido.
Es mucho más que la City y Wall Street sacando provecho de una nueva tendencia de moneda digital. En realidad no somos una «empresa de blockchain»: nosotros, en Chainetix, ofrecemos libros contables privados para mantener seguros los datos de una empresa. De hecho, ni siquiera trabajamos con criptomonedas. El objetivo en Chainetix es poner nuestra experiencia en manos de cualquiera que tenga un conocimiento básico de programación.
Mi trabajo ha consistido en trazar nuestros sistemas e infraestructura desde cero para crear algo sólido como una roca. Elegí un proyecto llamado Habitat by Chef. Me enteré de él porque está escrito en Rust, lo cual era intrigante viniendo de una empresa tan grande como Chef. En contraste con Docker a secas, Habitat crea imágenes que pueden actualizarse automáticamente y hacer cosas asombrosas como los enlaces de servicios. También he contribuido bastante al repositorio core-plans de Habitat.
Antes mencionaste tu proyecto, BrewStillery. Parece que es importante para ti. ¿Puedes contarnos un poco más al respecto?
¡Sí, sin duda lo es!
BrewStillery es una herramienta de código abierto todo en uno para cerveza, vino y destilados que escribí en Rust y GTK3. También le añadí un tema CSS que es bellamente único. En una frase, es una calculadora avanzada para cualquiera que elabore destilados.
Creé diferentes pestañas para separar las calculadoras específicas de la cerveza y el champán, además de una pestaña general que aplica por igual a cerveceros, vinicultores y destiladores. Si miras la mayoría de las botellas de cerveza y vino, verás el porcentaje de alcohol de esa botella: el Alcohol By Volume. Bueno, una de las cosas que hace BrewStillery es determinar ese ABV. Como probablemente puedas imaginar, aquí hay un montón de genialidades de nerd. Lo que más me complace es el cálculo del color de la cerveza:


Estas imágenes de antes y después muestran lo que pasa cuando ya ingresaste las cantidades. La forma en que lo hice es algo que nadie había hecho antes. Otra gran funcionalidad es que todo se calcula al vuelo mientras escribes. Si quieres los detalles más minuciosos sobre los espacios de color, búscame en una conferencia y lo hablamos tomando unas cervezas.