Uploaded avatar of kytrinyx

Uma entrevista com Meade Kincke

@kytrinyx
há Mais de 7 anos

Uma entrevista com Meade Kincke na qual ele e Katrina Owen falam sobre o compilador de Rust, uma GUI que usa espaços de cor científicos para determinar a cor da cerveja, e o seu livro «A Practical Guide To Rust».

Olá, Meade. Obrigado pela conversa. Queríamos falar contigo porque és o mentor mais prolífico que temos no percurso de Rust. Já ajudaste mais de 400 alunos. Como é que descobriste o Exercism?

Alguém no subreddit de Rust do Reddit publicou um post a dizer que o percurso de Rust do Exercism precisava de mentores, por isso fui ver. Fico muito contente por o ter feito, porque é imensamente gratificante e todos têm sido tão simpáticos e agradecidos. Tenho criado ligações maravilhosas com os meus alunos do Exercism e adoro ajudá-los.

Há alguma história em particular que se destaque?

Sim, há um exercício de Rust em particular que tem sido muito popular: o Terno pitagórico.

O problema mais comum neste exercício costuma ser o desempenho. A maioria das pessoas resolve-o inicialmente com ciclos for aninhados, o que é pelo menos O(n²) e muito ineficiente. O meu objetivo é levar os meus alunos a uma solução linear: O(n).

A minha abordagem é fazer perguntas. Começo por perguntar se querem aprender o método iterador de Rust, porque tem imensos benefícios, um dos quais é poderes usar a biblioteca Rayon para paralelizar o teu trabalho.

Depois de responderem «Sim, por favor», um dos meus alunos referiu que está a aprender Rust porque pensa usá-lo para controlo embebido e depois para processar a enorme quantidade de dados que produz. Por isso, o paralelismo é importante para ele. Ficou contente por eu ter pegado num exercício aparentemente simples para ensinar aspetos mais complexos e idiomáticos de Rust.

Agora, graças ao Exercism, contratou-me para lhe dar aulas individuais, e vamos trabalhar juntos em alguns projetos experimentais. Também vou dar formação a toda a equipa dele quando ele converter a empresa toda para Rust.

Tenho gostado muito de trabalhar com os alunos a quem dei mentoria, e quero que isto continue a crescer.

Gosto tanto disto que agora ofereci-me como voluntário para ser maintainer no percurso de Rust e ajudar mais nos bastidores.

Essa ligação humana é tão importante! És o autor de A Practical Guide to Rust. Sobre o que é e quais foram as tuas motivações para o escrever?

Escrevi este livro para ajudar outras pessoas a compreender melhor certos aspetos do Rust. Não há muita documentação sobre a linguagem, e senti que era preciso literatura que tivesse humor e explicasse os conceitos da linguagem de forma tangível. Apresenta guias sobre algumas áreas básicas e avançadas. Quero que as pessoas tenham uma noção sólida do uso prático e real da linguagem. Dá exemplos reais, não hipotéticos.

Sempre soube que ia escrever um livro. Quando me vi a ensinar um colega a programar em Rust à distância, a estrutura encaixou-se naturalmente. Ele nunca tinha tocado em código, e eu precisava de explicar termos e métodos que nós, nerds, tomamos por garantidos de formas novas e percetíveis. Usei analogias como pedir um livro emprestado na biblioteca versus possuir o livro, ao falar do conceito de ownership em Rust.

Também incorporei exemplos do meu projeto BrewStillery. É uma ótima forma de ver como coisas como structs e enums funcionam num programa real. Mostra também como usar o paralelismo de forma real.

Ao escrever o livro, sabia que queria que se lesse como uma história, em vez de ser apenas um guia de referência. Constrói-se sobre si mesmo, mas os elementos funcionam de forma autónoma. É a diferença entre cozinhar com um manual de química e ver um episódio do «The French Chef», da Julia Child.

Ah, isso é intrigante. Para quem escreveste o teu livro e o que é que o leitor tira dele?

Destina-se a qualquer pessoa que queira aprender Rust. O que iguala a forma como elaboro as ideias é que dá ao leitor uma compreensão fundamental, enquanto muita outra literatura pende para a memorização mecânica.

Vejo que recebeste muitas críticas positivas. Estás a pensar publicar um Volume II?

Sim! Vou, claro, continuar a escrever e planeio publicar mais volumes.

Além de ensinar através de mentoria e de escrever, também trabalhhaste no compilador de Rust. Podes falar-me sobre isso?

Claro!

Como breve introdução ao meu trabalho, há essencialmente dois momentos em que um programa pode funcionar: o tempo de compilação e o tempo de execução. Quando uma função é executada em tempo de execução, tudo nela tem de ser regenerado e recalculado. Isto implica, crucialmente, realocar memória, algo que queremos sempre evitar. Quando uma função é constante, é carregada para a memória quando o programa arranca. Quanto mais conseguirmos fazer em tempo de compilação, melhor será o desempenho dos nossos programas.

Há algum tempo, ouvi dizer que esta ideia de execução de funções em tempo de compilação (const fn) estava a ser implementada em Rust, e fiquei muito entusiasmado. Sou muito apaixonado por tornar as coisas eficientes e precisas. Uma coisa de que gosto muito em const fn é que, quando está completa, podemos ter coisas maravilhosas como constantes matemáticas determinadas de forma elegante. Atualmente, o pi é um valor codificado diretamente. Muitas pessoas diriam que isto é suficientemente exato, mas eu sinto que deveria usar a totalidade do espaço numérico disponível. Com const fn, podemos usar a fórmula de Leibniz, que preencheria completamente o espaço de vírgula flutuante.

Li mais um pouco e deparei-me com um post de blog que dizia que o MIRI tornaria muito mais fácil estabilizar const fn. O tempo passou e não vi qualquer progresso quando saíram novas versões. Contactei a equipa de Rust e comecei a mexer no compilador.

O melhor é que o próprio compilador está escrito em Rust. Inicialmente foi escrito em OCaml e depois reescrito em Rust, o que se chama bootstrapping. Basicamente, o compilador analisa toda a entrada na AST, que é depois entregue à representação intermédia de alto nível (HIR), depois à de nível médio (MIR) e depois à de baixo nível (LIR), que é tratada pelo LLVM. À medida que percorremos todos estes passos, aproximamo-nos cada vez mais do código máquina.

Convém perceber que o compilador é apenas um programa, mas um programa muito elaborado. O Rust demora bastante tempo a compilar e, sobretudo, a correr todos os testes. Por isso, não basta atirar algum código para lá e dizer «Está feito.»

O meu primeiro trabalho no compilador foi no HIR. Envolveu uma quantidade enorme de leitura da biblioteca padrão (tanto a stable como a nightly) e de seguir pistas cada vez mais complexas. Tive de descer recursivamente por todos os tipos aninhados do compilador até esgotar todas as opções. A biblioteca nightly/do compilador tem imensos tipos aninhados. Manter o fio da meada exige muita concentração.

Para complicar ainda mais as coisas, o compilador é desenvolvido por uma equipa distribuída, o que significa que muitas vezes acabamos com conflitos de merge.

Foi muito divertido. Ainda há imenso trabalho por fazer, ao qual vou dedicar-me num futuro próximo.

Além destas contribuições de código aberto, sei que és CTO de uma empresa de blockchain. Eu associo blockchain a perder imenso dinheiro em Etherium. O que é que isso significa para ti?

Infelizmente, a blockchain tornou-se a palavra da moda mais badalada de sempre.

É muito mais do que a City e Wall Street a aproveitar uma nova tendência de moeda digital. Na verdade, não somos uma «empresa de blockchain»; nós, na Chainetix, fornecemos registos privados para proteger de forma segura os dados de uma empresa. Aliás, nem sequer lidamos com criptomoeda. O objetivo da Chainetix é pôr a nossa experiência ao alcance de todos os que tenham um conhecimento básico de programação.

O meu trabalho tem envolvido mapear os nossos sistemas e infraestrutura de raiz para criar algo sólido como uma rocha. Escolhi um projeto chamado Habitat by Chef. Descobri-o porque está escrito em Rust, o que era intrigante vindo de uma empresa tão grande como a Chef. Ao contrário do Docker simples, o Habitat cria imagens que se podem atualizar automaticamente e fazer coisas incríveis como service bindings. Também contribuí bastante para o repositório core-plans do Habitat.

Há pouco mencionaste o teu projeto, BrewStillery. Parece que é importante para ti. Podes contar-nos um pouco mais sobre isso?

Sim, sem dúvida!

O BrewStillery é uma ferramenta de código aberto tudo-em-um para cerveja, vinho e destilados, que escrevi em Rust e GTK3. Também adicionei um tema CSS de uma beleza única. Numa frase, é uma calculadora avançada para quem faz destilados.

Criei separadores diferentes para separar as calculadoras específicas de cerveja e champanhe, e tenho também um separador geral que se aplica tanto a cervejeiros como a produtores de vinho e de destilados. Se olhares para a maioria das garrafas de cerveja e vinho, vês a percentagem de álcool na garrafa, o Alcohol By Volume. Ora, uma das coisas que o BrewStillery faz é determinar esse ABV. Como deves calcular, há aqui uma data de maravilhas de nerd. O que mais me agrada é calcular a cor da cerveja:

Separador de cerveja do BrewStillery, copo vazio

Separador de cerveja do BrewStillery, copo cheio

Estas imagens de antes e depois mostram o que acontece depois de introduzires as quantidades. A forma como o fiz é algo que ninguém tinha feito antes. Outra grande funcionalidade é que tudo é calculado em tempo real à medida que escreves. Se quiseres os detalhes mais técnicos sobre espaços de cor, procura-me numa conferência e falamos sobre isso ao pé de umas canecas!

09 de fevereiro de 2019 · Foi útil?