An interview with Meade Kincke in which he and Katrina Owen talk about the Rust compiler, a GUI that uses scientific colourspaces to determine the colour of beer, and his book '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 publicó en el subreddit de Rust de Reddit que el track de Rust de Exercism necesitaba mentores, así que lo miré. Me alegro mucho de haberlo hecho, porque es enormemente gratificante y todo el mundo ha sido muy amable y agradecido. He creado conexiones maravillosas con mis estudiantes de Exercism, y me encanta ayudarles.
¿Hay alguna historia en particular que destaque?
Sí, hay un ejercicio de Rust en particular que ha sido muy popular: la terna pitagórica.
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 que es al menos O(n²) y muy ineficiente. Mi objetivo es llevar a mis estudiantes a una solución lineal: O(n).
Mi enfoque es plantear preguntas. Empiezo preguntándoles si quieren aprender el método iterador de Rust, porque tiene un montón de beneficios, uno de los cuales 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á considerando usarlo para control embebido y luego para procesar su enorme volumen de datos de salida. Por lo tanto, el paralelismo es importante para él. Le gustó que usara un ejercicio aparentemente sencillo para enseñar aspectos más complejos e idiomáticos de Rust.
Ahora, gracias a Exercism, me ha contratado para enseñarle individualmente, y vamos a trabajar juntos en algunos proyectos experimentales. También enseñaré a todo su equipo cuando convierta por completo la empresa a Rust.
He disfrutado mucho trabajando con los estudiantes a los que he mentorizado, y quiero que esto siga creciendo.
Me gusta tanto que ahora me he ofrecido como voluntario para ser mantenedor del track de Rust y ayudar más entre bastidores.
¡Esa conexión humana es tan importante! Eres el autor de A Practical Guide to Rust. ¿De qué trata y qué te motivó a escribirlo?
Escribí este libro para ayudar a otros a comprender mejor ciertos aspectos de Rust. No hay mucha documentación sobre el lenguaje, y sentía que hacía falta literatura que tuviera humor y explicara los conceptos del lenguaje de forma tangible. Proporciona guías para algunas áreas básicas y avanzadas. Quiero que la gente adquiera 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 vi enseñando a un colega a programar en Rust de forma remota, la estructura encajó por sí sola. Nunca había tocado código antes, y yo necesitaba explicar términos y métodos que los que somos nerds damos por sentados de maneras nuevas y comprensibles. Usé analogías como tomar prestado un libro de la biblioteca frente a ser dueño del libro cuando hablaba del concepto de propiedad en Rust.
También incorporé ejemplos de mi proyecto BrewStillery. Es una gran forma de ver cómo funcionan cosas como las estructuras y las enumeraciones en un programa real. También muestra cómo usar el paralelismo de forma real.
Al escribir el libro, sabía que quería que se leyera como una historia en lugar de solo una guía de referencia. Se construye sobre sí mismo, pero los elementos son independientes. Es la diferencia entre cocinar con un manual de química y ver un episodio de «The French Chef», de Julia Child.
Oh, eso es intrigante. ¿Para quién escribiste el libro y qué sacaría el lector de él?
Está pensado para cualquiera que quiera aprender Rust. Lo que equilibra mi manera de desarrollar las ideas es que le da al lector una comprensión fundamental, mientras que gran parte de la otra literatura tiende a la memorización mecánica.
Veo que has recibido muchas reseñas positivas. ¿Tienes pensado publicar un Volumen II?
¡Sí! Por supuesto, seguiré escribiendo y tengo pensado publicar más volúmenes.
Además de enseñar mediante mentorías y de escribir, también has trabajado en el compilador de Rust. ¿Puedes contarme algo sobre eso?
¡Por supuesto!
Como breve introducción a mi trabajo, hay esencialmente dos lugares en los que 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, oí 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 conseguir que las cosas sean eficientes y precisas. Una cosa que me gusta mucho de const fn es que, cuando esté completo, podemos tener cosas maravillosas como constantes matemáticas determinadas de forma elegante. Actualmente, pi es un valor codificado de forma fija. 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 coma flotante.
Leí un poco más y me encontré con una entrada 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 publicaron nuevas versiones. Me puse en contacto con el equipo de Rust y empecé a trabajar en el compilador.
Lo mejor es que el propio compilador está escrito en Rust. Al principio se escribió en OCaml y luego se reescribió en Rust, lo que se conoce como bootstrapping. Básicamente, el compilador analiza toda la entrada en el AST, que luego 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 de gestionar LLVM. A medida que recorremos todos esos pasos, nos acercamos cada vez más al código máquina.
Hay que entender que el compilador no es más que un programa, pero uno muy elaborado. Rust tarda bastante en compilarse y, sobre todo, en ejecutar todas sus pruebas. Así que no basta con meter un poco de código y decir «ya está».
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 cada hilo hasta el final. Tuve que recorrer recursivamente todos los tipos anidados del compilador hasta agotar todas las opciones. La biblioteca nightly/compilador tiene un montón de tipos anidados. Mantener el hilo que sigues requiere mucha concentración.
Para complicar más las cosas, en el compilador trabaja un equipo distribuido, lo que significa que a menudo acabamos con conflictos de fusión.
Fue muy divertido. Todavía queda un montón de trabajo por hacer, al que me pondré en un futuro próximo.
Además de estas contribuciones de código abierto, sé que eres CTO de una empresa de blockchain. Asocio blockchain con perder un montón de dinero en Etherium. ¿Qué significa para ti?
La blockchain se ha convertido, por desgracia, en la palabra de moda más de moda que jamás haya existido.
Es mucho más que la City y Wall Street sacando partido de una nueva tendencia de moneda digital. En realidad no somos una «empresa de blockchain»; en Chainetix proporcionamos libros de contabilidad privados para proteger de forma segura 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 unos conocimientos básicos 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. A diferencia del Docker a secas, Habitat crea imágenes que pueden actualizarse automáticamente y hacer cosas increíbles como los enlaces de servicio. 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 sobre él?
¡Sí, desde luego que lo es!
BrewStillery es una herramienta de código abierto todo en uno para cerveza, vino y licores que escribí en Rust y GTK3. También añadí un tema CSS que es bellamente único. En una frase, es una calculadora avanzada para cualquiera que elabore licores.
He creado diferentes pestañas para separar las calculadoras específicas de cerveza y champán, y una pestaña general que se 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 puedes imaginar, aquí hay un montón de maravillas frikis. Lo que más me gusta es el cálculo del color de la cerveza:


Estas imágenes de antes y después muestran lo que ocurre tras introducir las cantidades. La forma en que lo he hecho 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 crudos sobre los espacios de color, búscame en una conferencia y lo hablamos tomando unas pintas.