4 pontos por GN⁺ 2024-04-29 | 1 comentários | Compartilhar no WhatsApp

Livro de 640 páginas concluído em 15 meses

  • Em 29 de julho de 2021, foi concluído o livro "Crafting Interpreters" sobre linguagens de programação. Eu já tinha dito há 15 meses que estava concluído, mas agora ele está realmente pronto. As versões impressa, e-book e PDF foram todas finalizadas e agora estão disponíveis para compra.
  • Com 640 páginas e tamanho de 8 por 10 polegadas, o livro acabou ficando bem maior do que o esperado.

Desenvolvimento de um novo sistema de build

  • Depois de cerca de um mês de descanso, o trabalho recomeçou. Corrigi typos e erros relatados pelos leitores.
  • Sem um motivo especial, reescrevi o sistema de build do livro em Dart. A versão anterior, feita em Python, era lenta demais e difícil de manter.
  • O novo sistema de build gera exatamente o HTML e o código com syntax highlighting do jeito que eu queria, além de ser 10 vezes mais rápido que a versão antiga em Python.
  • Também passei a ter um controle muito melhor sobre o processamento de Markdown, embora na época isso tenha sido mais um projeto por diversão.

Design do livro

  • Grandes projetos de design gráfico costumam seguir duas etapas, assim como programação web ou de jogos. Primeiro você define o "framework" ou a "engine", depois coloca o conteúdo dentro dessa estrutura.
  • No Adobe InDesign, isso significa configurar estilos e masters. Os masters definem margens e linhas de grade das páginas, e os estilos, como no CSS, atribuem fonte, estilo e cor a textos ou objetos específicos.
  • O design de um livro é literalmente um trabalho em espaço bidimensional. Trabalhar bem tanto na horizontal quanto na vertical não é simples.

Definindo largura e altura

  • A coluna principal de texto precisava ser larga o suficiente para acomodar a linha de código mais longa. Os asides também precisavam de espaço extra para ficar ao lado de frases específicas.
  • No fim, foi adotada uma métrica de página com 8 polegadas de largura. A altura de 10 polegadas foi escolhida por causa das limitações de tamanho aceitas pela empresa de POD (Publish on Demand).
  • No geral ele é grande, mas a esperança é que não pareça grande demais. Se eu escrever outro livro no futuro, ele será menor.

Processamento de XML

  • O InDesign oferece suporte à importação de XML. É possível aplicar estilos automaticamente a tags específicas.
  • Como eu tinha controle total sobre o processamento de Markdown, pude gerar diretamente um XML otimizado para o InDesign.

JavaScript no InDesign

  • Só a importação de XML tinha limites. Os asides e os marcadores de posição do código precisavam ser retirados do corpo principal e colocados ao lado.
  • O InDesign permite automação com JavaScript. Mas não há debugger nem stack trace, só alert().
  • De um jeito ou de outro, consegui escrever um script que extrai asides e tags de posição para transformá-los em caixas de texto separadas, mas não consegui posicioná-los com precisão. O recurso de âncoras do InDesign ajudou a resolver isso em parte.

Trabalho de edição

  • Reli o livro inteiro mais uma vez enquanto fazia a edição. Percebi que repetia os mesmos trocadilhos com frequência. Isso levou 5 meses.
  • Também contratei um editor profissional. Ao contrário do mundo editorial, que usa Word, eu mantive a insistência em plain text e Git. O editor se adaptou bem.

Trabalho de diagramação

  • O processo de diagramação foi o seguinte:
    1. Criar um novo arquivo do InDesign para o próximo capítulo
    2. Exportar em XML
    3. Importar o XML no InDesign
    4. Extrair os asides e tags de posição com um script JS
    5. Definir âncoras para os elementos da sidebar
    6. Ajustar os espaços em branco no fim das páginas
  • As etapas de 1 a 5 foram fáceis, mas a etapa 6 foi a mais difícil.
  • As ilustrações não podiam ser cortadas, nem os asides podiam escorregar para a página seguinte; sempre que possível, o código também não deveria ser quebrado entre páginas. Também era preciso evitar páginas terminando logo abaixo de um cabeçalho sem conteúdo, além de evitar widow/orphan.
  • Não foi nada fácil aplicar todas essas regras em 630 páginas.

Ilustrações

  • As ilustrações foram relativamente fáceis. Como foram desenhadas à caneta em preto e branco, eram adequadas para impressão.
  • Mas posicioná-las nas páginas era outro problema. Como o texto do livro foi escrito para fazer referência direta às ilustrações, elas precisavam ficar perto do ponto em que eram mencionadas. Por isso, foi necessário ajustar manualmente a disposição das ilustrações, do código e do texto ao longo de 630 páginas.

Parte pré-textual e pós-textual

  • Foi a primeira vez que descobri que existe até profissional especializado em criar índices remissivos. Mesmo assim, eu mesmo fiz o índice ao longo de duas semanas.
  • Na parte inicial, incluí título, copyright, dedicatória e agradecimentos, e deixei o InDesign gerar automaticamente o sumário. Quando isso terminou, finalmente o miolo do livro estava pronto.

Design da capa

  • A capa do livro é importante. Como meu livro tem como marca um estilo de ilustração feito à caneta, decidi aproveitar isso.
  • Reforcei a imagem da montanha usada como metáfora de escalada, desenhando-a maior e com mais detalhes. Também refiz o título com caligrafia manual.
  • Usei cores que lembram manuais escoteiros dos anos 1950.

Revisão da prova impressa

  • Ao pedir uma prova impressa via POD, senti pela primeira vez o tamanho real do livro. Deu para perceber o volume de trabalho acumulado ao longo de tanto tempo.
  • Mas ainda não tinha acabado. Como muita coisa da diagramação foi feita manualmente, ainda podia haver erros, então foi preciso reler tudo e conferir novamente.
  • Coloquei os arquivos do InDesign no Git, mas como são binários, era difícil verificar as mudanças.
  • Para comparar a prova com as alterações, usei um script em Dart para transformar o PDF em imagens, uma página por vez, e uma action do Photoshop para desenhar bordas vermelhas nas áreas com diferença de pixels.
  • Foi reconfortante poder confirmar programaticamente que só as mudanças pretendidas haviam sido feitas.

Produção do e-book

  • Aproveitei o sistema de build para gerar todo o XHTML e os metadados necessários para o EPUB. Fui testando em vários leitores e ajustando o CSS.

Opinião do GN⁺

  • Concluir, ao fim de uma longa jornada de 6 anos, um livro de 640 páginas é uma conquista impressionante. Também chama a atenção o fato de o autor ter mobilizado ao máximo suas habilidades de programação no processo de escrita, desenvolvendo um sistema de build em Dart e criando scripts para o InDesign para fazer a diagramação.

  • Em especial, impressiona a parte em que ele criou um script de comparação de PDFs para validar as mudanças na etapa de prova. Parece mesmo que é preciso ter esse nível de ideias e capacidade de execução para alguém conseguir publicar um livro por conta própria.

  • Por outro lado, é uma pena que o tamanho de página desejado tenha tornado a diagramação mais difícil, e que a escolha do formato tenha sido limitada pelas condições da gráfica. Em uma próxima obra, seria melhor optar por um tamanho mais amigável para publicação.

  • Como o próprio autor comentou, no caso de um livro sobre linguagens de programação o design da capa talvez não afete tanto as vendas, mas uma capa com personalidade, que reflita as características do conteúdo como neste projeto, pode acabar sendo um diferencial visual importante.

  • O fato de o autor ter escrito o livro aos poucos ao longo de nada menos que 6 anos merece respeito por sua paixão e perseverança. Agora resta observar quanto interesse o livro vai despertar entre os leitores e que tipo de feedback ele vai receber. É claro que será uma obra útil para muita gente que quer aprender linguagens de programação.

1 comentários

 
GN⁺ 2024-04-29
Comentários do Hacker News
  • Crafting Interpreters tem uma página que oferece tanto link para compra do livro quanto link para a versão online gratuita
  • Graças ao cuidado minucioso que Nystrom dedicou ao design da edição física, às ilustrações desenhadas à mão e à excelente escrita, é um livro melhor do que 99% dos livros técnicos e vale muito a compra
  • Comecei a estudar com este livro em 2017 e, ao terminar a primeira metade, minha compreensão de tokenizer/lexer/parser/interpreter ficou muito mais clara. Isso se deve à ótima escrita de Nystrom e ao seu entendimento profundo do tema
  • Eu não sabia que o autor tinha decidido lançar uma versão física; embora não seja a forma de aprendizado mais adequada para mim, quero comprar para colecionar e para apoiar o autor
  • Está entre os melhores livros técnicos que já li; aprendi muito e realmente me diverti lendo. Além do excelente conteúdo técnico, o texto é bem escrito, espirituoso e as ilustrações são muito boas
  • A visão de ter, ao fim de cada capítulo, um código em evolução e um programa executável foi impressionante, e dou os parabéns ao autor por ter conseguido isso. Pulei o interpretador com tree-walking e aprendi muito mais com a parte do interpretador de bytecode em C
  • Há um comentarista que disse, ironicamente, que levou 15 meses para terminar de ler o livro, e agradece e parabeniza o autor pelo trabalho. Além da profundidade técnica na área de linguagens, é um livro em que pequenos detalhes de layout e gráficos ajudam a envolver o leitor, e parece que continuará sendo significativo por muito tempo
  • Gostei tanto do livro que cheguei a criar eu mesmo a página https://hexmos.com/compiler com base no que aprendi lendo-o
  • Vale a pena ouvir a entrevista com Bob, o autor (https://corecursive.com/032-bob-nystrom-on-building-an-interpreter/)
  • É impressionante saber que o autor é um engenheiro de compiladores com formação em design gráfico
  • Depois de ler Writing an Interpreter in Go, pretendo ler este como meu próximo livro sobre interpretadores, e gosto do fato de ele ter um tamanho razoável, de cerca de 200 páginas
  • (Comentário de 2021) Disseram que é um excelente livro e que foi realmente prazeroso lê-lo