Por que escrevi um livro sobre o BEAM (a VM do Erlang)
(happihacking.com)- A experiência prática de manter os sistemas centrais da Klarna mostrou que uma interrupção de 15 milissegundos no BEAM podia provocar falhas de pagamento em larga escala e respostas emergenciais
- O livro foi escrito ao longo de 10 anos com o objetivo de criar uma referência confiável sobre o BEAM
- Durante a escrita, houve frustrações e recomeços repetidos, incluindo troca de editora, problemas técnicos e várias reorganizações da estrutura
- Após virar open source, o feedback da comunidade, a participação, o aumento de estrelas e o incentivo contínuo passaram a servir como motivação constante
- O conteúdo central se concentra na estrutura e operação da VM BEAM, com uma composição pensada para ajudar engenheiros na prática
Motivação para escrever o livro sobre o BEAM
Post-mortems, café e 10 anos de obstinação
- Ao operar o sistema central de pagamentos da Klarna, ele viveu repetidamente situações em que apenas 15 milissegundos de parada do BEAM levavam a milhões de falhas de pagamento, reuniões de emergência na madrugada e até chamadas do CEO
- Sempre fez falta um material que permitisse resolver essas crises rapidamente, e The BEAM Book foi escrito com o desejo de que o próximo engenheiro consiga resolver o problema mais depressa
Processo inicial de escrita
Começo e frustração
- Em outubro de 2012, o projeto começou com um único arquivo DocBook e grandes ambições
- Os commits de duas semanas se concentraram principalmente em trabalho estrutural e atualização de metadados; o conteúdo real era muito pouco
- Em novembro, houve migração para AsciiDoc e scripts de build personalizados, com expectativa de concluir tudo em 6 meses, mas o progresso foi muito lento por causa de reescritas e mudanças de estrutura contínuas
Colaboração com editoras
- Em 2013, foi assinado um contrato com a O’Reilly e houve migração para o Atlassian Atlas, mas continuaram ocorrendo problemas com perda de arquivos e gerenciamento de capítulos
- O histórico do Git ficou marcado por uma sequência de insatisfações e correções estruturais
- Em março de 2015, foram tentadas soluções de último recurso, como forçar a separação por capítulos apenas para conseguir passar no build
- Dois meses depois, o contrato foi encerrado discretamente, trazendo ao mesmo tempo abatimento e alívio
- Uma segunda tentativa com a Pragmatic Bookshelf também acabou interrompida após um avanço lento
Reset e participação da comunidade
- Em janeiro de 2017, todo o conteúdo foi transferido para um novo repositório em um massive commit (6.622 arquivos, 1 milhão de linhas), mas a reescrita também ficou estagnada
- Em março de 2017, o trabalho recomeçou em um repositório privado no GitHub baseado em Asciidoctor, copiando apenas as partes necessárias
- Duas semanas depois, o projeto foi tornado público e colaboradores externos passaram a corrigir typos, adicionar diagramas e colaborar com a licença de forma ativa
Fatores de motivação contínua
- No fundo, a maior força motriz era a curiosidade pessoal e o desejo de entender como o BEAM realmente funciona
- O feedback e as sugestões da comunidade aumentaram a vontade de continuar escrevendo, e o crescimento no número de estrelas no GitHub serviu como motivação constante
- Issues de incentivo, como “Please continue being awesome”, também tiveram um papel importante de apoio psicológico
- O fato de o livro passar a ser citado com frequência em eventos acadêmicos e conferências ligados a Erlang e BEAM ajudou a comprovar sua necessidade
- Menções e compartilhamentos contínuos no Twitter e em outros espaços também estimularam a continuidade da escrita
Estrutura do livro e principais leitores
- O conteúdo foi escrito com foco nas partes que eram realmente indispensáveis ao projetar e operar grandes sistemas em Erlang
- Escalonadores e gerenciamento de processos: princípios de escalonamento de processos, prioridade e balanceamento sob carga real
- Memória de processos: heap, stack, mensagens, gerenciamento de binários e seu impacto na operação
- Coleta de lixo e modelo de memória: funcionamento do GC por processo/global, vazamentos de memória e estruturas de referência
- Sistema de representação de dados: estrutura interna de tagging de dados como inteiros, floats, tuplas e binários
- Compilador e estrutura interna da VM: fluxo real de execução de instruções na VM após a compilação
- Tracing e depuração:
dbg,erlang:trace, rastreamento de mensagens e eventos - Ajuste de desempenho: profiling de código real, análise de causas de latência e compreensão de reductions
- Arquitetura de sistemas: princípios de funcionamento integrado do ERTS, da VM BEAM e de seus subsistemas
- O livro tem impacto bastante prático para profissionais que operam Erlang/Elixir no dia a dia, e seu objetivo central é servir como um guia abrangente e confiável no lugar de materiais dispersos
Lições aprendidas durante a escrita
- Persistência vence o perfeccionismo. Mesmo após duas experiências de cancelamento editorial, a conclusão foi que isso ainda é melhor do que deixar a obra “inacabada”
- Foco e definição de limites são essenciais. Reservar tempo para escrever, bloquear notificações e manter uma gestão rígida do tempo foram as verdadeiras fontes de progresso
- Abertura e feedback são centrais para a melhoria qualitativa. Correções externas, incentivo e estímulo constante ajudaram muito
- Gerenciar o escopo é indispensável. Ao ajustar o escopo, temas difíceis como Dirty Scheduler e JIT foram deixados para apêndices futuros
- A estratégia de melhorar iterativamente após o lançamento é importante. O BEAM muda todos os anos, e um repositório Git vivo permite aperfeiçoamento contínuo
- Definir um prazo real foi um grande motivador. O prazo de imprimir o livro antes do evento Code Beam Stockholm ajudou a selecionar o conteúdo realmente essencial
Definição de conclusão
- Foi apenas no momento de segurar a cópia impressa nas mãos que finalmente surgiu a sensação de “conclusão”
- Como commits dispersos passaram a estar reunidos em um único volume concreto, decidiu-se declarar o trabalho encerrado no estado atual
Como participar
- The BEAM Book 1.0 atualmente pode ser comprado em versão impressa na Amazon
- Se você encontrar typos ou pontos de melhoria, ou tiver curiosidade sobre a estrutura interna, pode usar star, fork, abertura de issue e pull request no repositório do GitHub
- Contribuidores são mencionados nominalmente nos agradecimentos
- GitHub: theBeamBook
- Como avaliações reais pesam mais no algoritmo, resenhas também são fortemente incentivadas
- Também é possível realizar workshops de internals do BEAM focados em sistemas reais; para contato, envie um e-mail para happi@happihacking.com
1 comentários
Comentários do Hacker News
O repositório git pode ser visto aqui
Achei marcante a motivação do autor de continuar se aprofundando porque queria entender o BEAM de verdade. Acho que esse tipo de paixão produz resultados excelentes. Por isso decidi comprar na hora. Falando da minha experiência, já recebi várias propostas de editoras para escrever livros, mas nunca deu certo porque o que elas queriam e o que eu queria eram diferentes. Por exemplo, eu não queria escrever um livro introdutório de Java para jovens de 14 anos, e a editora não tinha interesse nos temas em que eu gosto de me aprofundar (por exemplo,
classloader). Fico curioso para saber como outras pessoas encontram a interseção entre paixão pessoal e a necessidade dos leitoresTrabalhar com BEAM e Erlang/OTP foi uma das melhores experiências de desenvolvimento que tive no último ano. Usei o livro “Programming Erlang: Software for a Concurrent World”, do Joe Armstrong, e quero recomendá-lo fortemente para iniciantes. “Designing for Scalability with Erlang/OTP” também é bem avaliado, mas ainda não comecei. Em profundidade, porém, este livro novo é muito superior. O BEAM realmente parece uma tecnologia alienígena deixada por uma civilização antiga. O livro saiu na hora certa e comprei imediatamente. Impressiona que o Dr. Erik Stenman tenha concluído o livro mesmo depois de a publicação ter sido cancelada duas vezes
Elixir e BEAM são minha escolha favorita para construir sistemas baseados em rede ou com muitos pipelines. Usei diariamente em produção por vários anos, e, embora a escolha não seja tão simples nos projetos recentes, continuo acompanhando de perto. Sou grato pelo lançamento deste livro. Era exatamente o tipo de livro que eu queria ter anos atrás, quando estava depurando Elixir em produção. O material que existia era complicado demais ou simples demais
Informações sobre o BEAM (Erlang virtual machine) podem ser vistas no link da Wikipédia
Acho que o BEAM é uma das tecnologias mais subestimadas do mundo open source. Um exemplo é o WhatsApp. É um mistério para mim por que Elixir e Erlang não são mais populares em projetos de alta concorrência
Gostei da explicação de que “Erlang Runtime System (ERS)” é um termo genérico para o runtime de Erlang, enquanto “Erlang RunTime System (ERTS)” se refere especificamente à implementação da Ericsson
Comprei o livro na hora. Dá para ler de graça online, mas quis apoiar o autor nem que fosse um pouco
Não trabalho com sistemas gigantes como o da Klarna, então é difícil ter referência, mas acho curioso que um atraso de 15 ms vire tema de postmortem
gen_serverpara proteger um estado compartilhado, isso funciona como um mutex gigante. Se ogen_serverleva 20 μs para processar uma requisição, um atraso de 15 ms significa 750 mensagens acumuladas na fila. Se além disso a fila de mensagens estiver sendo usada com um padrão ineficiente, o desempenho despenca. O BEAM só otimiza a fila de mensagens para certos padrões específicos; nos demais, o tempo de processamento cresce conforme o tamanho da fila. Se uma biblioteca usareceivede forma insegura internamente, isso pode causar degradação de desempenho inesperada. Recentemente o BEAM adicionou o recursoaliaspara amenizar problemas de fila de mensagens, mas muitas bibliotecas ainda não o utilizam. O objetivo doaliasé evitar perda de mensagens e impedir que mensagens de timeout poluam a fila. Em geral, processos de longa duração processam a fila em loopFico curioso para saber se existe alguma VM semelhante ao BEAM. Será que não existem concorrentes porque o BEAM é bom demais, ou porque é difícil demais construir algo assim?