Crafting Interpreters: un libro de 640 páginas terminado en 15 meses
(journal.stuffwithstuff.com)Un libro de 640 páginas terminado en 15 meses
- El 29 de julio de 2021 se terminó el libro "Crafting Interpreters" sobre lenguajes de programación. Se había dicho que estaba terminado hacía 15 meses, pero ahora sí está realmente completo. Ya están listas las versiones impresa, e-book y PDF, y se pueden comprar.
- Con 640 páginas y un tamaño de 8 pulgadas de ancho por 10 de alto, terminó siendo un libro mucho más grande de lo esperado.
Desarrollo de un nuevo sistema de build
- Después de descansar alrededor de un mes, se reanudó el trabajo. Se corrigieron erratas y errores reportados por los lectores.
- Sin una razón especial, se reescribió en Dart el sistema de build del libro. El anterior, hecho en Python, era demasiado lento y difícil de mantener.
- El nuevo sistema de build genera exactamente el HTML y el código con resaltado de sintaxis tal como se quería, y es 10 veces más rápido que la versión anterior en Python.
- También permitió tener un mejor control del procesamiento de Markdown, aunque en ese momento fue un trabajo hecho simplemente por diversión.
Diseño del libro
- Un gran proyecto de diseño gráfico avanza en dos etapas, igual que la programación web o de videojuegos. Primero se configura el "framework" o el "motor", y luego se coloca el contenido dentro de esa estructura.
- En Adobe InDesign se configuran estilos y masters. Los masters definen los márgenes y líneas de cuadrícula de la página, y los estilos asignan fuentes, estilos y colores a textos u objetos específicos, como en CSS.
- El diseño de un libro es, literalmente, un trabajo en un espacio bidimensional. Tanto la dirección horizontal como la vertical presentan dificultades.
Decidir el ancho y la altura
- La columna principal de texto necesita suficiente ancho para acomodar la línea de código más larga. Los aside también necesitan más espacio porque deben colocarse junto a ciertas oraciones.
- Al final se decidió usar métricas de página de 8 pulgadas de ancho. La altura de 10 pulgadas se eligió por las restricciones de tamaño admitidas por el proveedor de POD (Publish on Demand).
- En general es grande, pero se esperaba que no se sintiera demasiado grande. Si se escribe otro libro en el futuro, será uno más pequeño.
Procesamiento de XML
- InDesign soporta importación de XML. Se pueden aplicar estilos automáticamente a etiquetas específicas.
- Como se tenía control total del procesamiento de Markdown, fue posible generar directamente XML optimizado para InDesign.
JavaScript en InDesign
- La importación de XML por sí sola tiene límites. Los aside y las marcas de ubicación de código deben extraerse del cuerpo principal y colocarse al lado.
- InDesign permite scripting con JavaScript. Pero no hay depurador ni stack trace; solo existe
alert(). - De una manera u otra, se logró escribir un script que extraía los aside y las etiquetas de ubicación para convertirlos en cuadros de texto separados, pero no se pudo posicionarlos con precisión. La función de anclaje de InDesign resolvió esto hasta cierto punto.
Trabajo de edición
- Se volvió a leer todo el libro para editarlo. Ahí se descubrió que se repetían muchos de los mismos juegos de palabras. Esto tomó 5 meses.
- Se contrató a un corrector editorial profesional. A diferencia del mundo editorial, que usa Word, aquí se insistió en usar texto plano y Git. El editor se adaptó bien.
Trabajo de composición tipográfica
- El proceso de composición fue el siguiente:
- Crear un nuevo archivo de InDesign para el siguiente capítulo
- Exportar a XML
- Importar el XML en InDesign
- Extraer los aside y las etiquetas de ubicación con un script de JS
- Asignar anclas a los elementos del sidebar
- Ajustar los espacios en blanco al final de la página
- Los pasos 1 a 5 fueron fáciles, pero el paso 6 fue el más difícil.
- Las ilustraciones no debían cortarse ni los aside pasar a la página siguiente, y si era posible el código tampoco debía cortarse entre páginas. También había que evitar que una página terminara sin contenido debajo del encabezado, y era importante evitar widow/orphan.
- No fue fácil aplicar todas estas reglas en 630 páginas.
Ilustraciones
- Las ilustraciones fueron relativamente fáciles. Como estaban dibujadas a pluma en blanco y negro, eran adecuadas para impresión.
- Pero colocarlas en la página fue otro problema. El texto del libro estaba escrito para referirse directamente a las ilustraciones, así que estas debían estar cerca del lugar donde se mencionaban. Por eso hubo que ajustar manualmente, a lo largo de 630 páginas, la disposición de ilustraciones, código y texto principal.
Trabajo de las secciones iniciales y finales
- Se descubrió por primera vez que existe la profesión de indexador. Aun así, el índice se hizo personalmente durante dos semanas.
- En la parte inicial se incluyeron el título, copyright, dedicatoria y agradecimientos, y se dejó que InDesign generara automáticamente la tabla de contenido. Con eso, por fin quedó terminado el interior del libro.
Diseño de portada
- La portada del libro es importante. Como este libro se caracteriza por ilustraciones estilo dibujo a pluma, se decidió aprovechar eso.
- Se dibujó una imagen de montaña, usada como metáfora de escalada, más grande y con más detalle. También se rehízo a mano el título.
- Se usaron colores con una vibra similar a los manuales scouts de los años 50.
Revisión de la prueba de imprenta
- Al pedir una prueba de imprenta por POD, por primera vez se sintió realmente el tamaño del libro. También se percibió todo el volumen del trabajo acumulado durante tanto tiempo.
- Pero todavía no había terminado. Como gran parte de la composición se había hecho manualmente, podían existir errores, así que hubo que volver a leer y revisar todo una vez más.
- Los archivos de InDesign se subieron a Git, pero al ser binarios era difícil revisar los cambios.
- Para comparar la prueba de imprenta con los cambios, se usó un script en Dart que convertía cada página del PDF en una imagen, y una acción de Photoshop que dibujaba bordes rojos donde hubiera diferencias de píxeles.
- Dio tranquilidad poder verificar por programación que solo se hubieran aplicado exactamente los cambios intencionados.
Producción del e-book
- Aprovechando el sistema de build, se generaron todo el XHTML y los metadatos necesarios para EPUB. Luego se ajustó el CSS probándolo en varios lectores.
Opinión de GN⁺
-
Completar un libro de 640 páginas tras una travesía de 6 años es un logro impresionante. Resulta especialmente interesante que, durante el proceso de escritura, se desarrollara un sistema de build en Dart y se hicieran scripts para InDesign con el fin de componer el libro, aprovechando al máximo habilidades de programación.
-
En particular, la parte en la que se creó un script para comparar PDFs y verificar cambios en la etapa de prueba de imprenta es admirable. Parece que hace falta justamente ese tipo de ideas y capacidad de ejecución para que una persona pueda autopublicar un libro.
-
Aun así, es una lástima que el trabajo de composición no haya sido sencillo por el gran tamaño de página elegido, y que hubiera restricciones para escoger el tamaño por razones de la imprenta. En una próxima obra, convendría elegir un tamaño más amigable para la publicación.
-
Como menciona el autor, en el caso de un libro explicativo sobre lenguajes de programación, el diseño de portada quizá no influya mucho en las ventas, pero una portada con personalidad que refleje las características del contenido, como en el concepto de diseño de este libro, puede convertirse más bien en una ventaja llamativa.
-
El hecho de que se haya escrito a ratos durante nada menos que 6 años merece respeto por la pasión y la perseverancia del autor. Ahora solo queda ver cuánto buscarán este libro los lectores y qué tipo de feedback darán. Sin duda, parece claro que será de ayuda para muchas personas que quieran aprender sobre lenguajes de programación.
1 comentarios
Comentarios de Hacker News
Crafting Interpreterstiene una página web que ofrece tanto el enlace para comprar el libro como el enlace a la versión gratuita en líneaWriting an Interpreter in Go, planeo leer este como mi siguiente libro sobre intérpretes; me gusta que tenga una extensión razonable, de unas 200 páginas