4 điểm bởi GN⁺ 2024-04-29 | 1 bình luận | Chia sẻ qua WhatsApp

Hoàn thành cuốn sách 640 trang sau 15 tháng

  • Vào ngày 29 tháng 7 năm 2021, tác giả đã hoàn thành cuốn sách "Crafting Interpreters" về ngôn ngữ lập trình. Dù đã từng nói là hoàn thành từ 15 tháng trước, nhưng giờ mới thật sự hoàn tất. Bản in, e-book và PDF đều đã xong và có thể mua được.
  • Cuốn sách có 640 trang, khổ ngang 8 inch, dọc 10 inch, trở thành một cuốn sách lớn hơn nhiều so với dự kiến.

Phát triển hệ thống build mới

  • Sau khoảng một tháng nghỉ ngơi, tác giả bắt đầu làm việc trở lại. Sửa các lỗi chính tả và sai sót mà độc giả báo về.
  • Không vì lý do đặc biệt nào, tác giả đã viết lại hệ thống build của cuốn sách bằng Dart. Bản cũ viết bằng Python quá chậm và khó bảo trì.
  • Hệ thống build mới tạo ra HTML và mã có syntax highlighting đúng như mong muốn, đồng thời nhanh hơn gấp 10 lần so với phiên bản Python cũ.
  • Nhờ đó cũng có thể kiểm soát việc xử lý Markdown tốt hơn, dù vào thời điểm đó đây đơn giản chỉ là một việc làm cho vui.

Thiết kế sách

  • Một dự án thiết kế đồ họa lớn thường diễn ra theo hai giai đoạn, giống như lập trình web hay game. Trước tiên là thiết lập "framework" hoặc "engine", sau đó đưa nội dung vào cấu trúc đó.
  • Trong Adobe InDesign, người ta thiết lập style và master. Master định nghĩa lề trang và các đường lưới, còn style giống như CSS, dùng để chỉ định phông chữ, kiểu và màu sắc cho văn bản hay đối tượng cụ thể.
  • Thiết kế sách đúng nghĩa là công việc trong không gian hai chiều. Cả chiều ngang lẫn chiều dọc đều không hề dễ xử lý.

Quyết định chiều rộng và chiều cao

  • Cột văn bản chính cần đủ rộng để chứa được dòng code dài nhất. Aside cũng phải được đặt cạnh những câu nhất định, nên cần thêm không gian.
  • Cuối cùng tác giả quyết định dùng page metric với chiều rộng 8 inch. Việc chọn chiều cao 10 inch là do ràng buộc kích thước được hỗ trợ bởi nhà cung cấp POD (Publish on Demand).
  • Tổng thể thì khá lớn, nhưng tác giả hy vọng nó không tạo cảm giác quá khổ. Nếu viết sách lần nữa, tác giả sẽ làm một cuốn nhỏ hơn.

Xử lý XML

  • InDesign hỗ trợ import XML. Có thể tự động áp dụng style cho các tag cụ thể.
  • Vì có thể kiểm soát hoàn toàn việc xử lý Markdown, tác giả đã trực tiếp tạo ra XML được tối ưu cho InDesign.

JavaScript trong InDesign

  • Chỉ dùng XML import thì vẫn có giới hạn. Aside và các dấu vị trí code phải được tách ra khỏi phần thân bài và đặt sang bên cạnh.
  • InDesign có thể được script bằng JavaScript. Tuy nhiên không có debugger hay stack trace gì cả, chỉ có alert().
  • Tác giả đã xoay xở để viết script tách Aside và tag vị trí ra thành các hộp văn bản riêng, nhưng không thể định vị chính xác. Chức năng anchor của InDesign đã giải quyết được phần nào.

Biên tập

  • Tác giả đọc lại toàn bộ cuốn sách thêm một lần nữa để biên tập. Qua đó nhận ra mình đã lặp lại cùng một kiểu chơi chữ quá nhiều. Việc này mất 5 tháng.
  • Tác giả cũng thuê một biên tập viên hiệu đính chuyên nghiệp. Không giống thế giới biên tập vốn dùng Word, tác giả vẫn kiên trì với plain text và Git. Biên tập viên đã thích nghi rất tốt.

Dàn trang

  • Quy trình dàn trang diễn ra như sau:
    1. Tạo file InDesign mới cho chương tiếp theo
    2. Export sang XML
    3. Import XML vào InDesign
    4. Dùng script JS để trích xuất Aside và các tag vị trí
    5. Gắn anchor cho các phần tử sidebar
    6. Điều chỉnh khoảng trống ở cuối trang
  • Các bước 1–5 khá dễ, nhưng bước 6 là khó nhất.
  • Không được để hình minh họa bị cắt hoặc Aside tràn sang trang sau, và nếu có thể thì code cũng không nên bị cắt ngang trang. Cũng cần tránh việc trang kết thúc ngay sau một header mà không có nội dung bên dưới, đồng thời phải tránh widow/orphan.
  • Không hề dễ để áp dụng hết các quy tắc này lên tới 630 trang.

Hình minh họa

  • Phần minh họa tương đối dễ. Chúng được vẽ bằng bút, theo phong cách đen trắng nên phù hợp với in ấn.
  • Nhưng đặt chúng vào trang lại là một vấn đề khác. Tác giả viết sách theo cách văn bản tham chiếu trực tiếp đến hình minh họa, nên tranh phải nằm gần vị trí được nhắc tới. Vì vậy cần chỉnh tay để minh họa, code và nội dung chính được sắp xếp hợp lý trên 630 trang.

Phần đầu và cuối sách

  • Tác giả lần đầu biết rằng còn có cả nghề lập chỉ mục chuyên nghiệp. Nhưng cuối cùng đã tự làm mục lục tra cứu trong suốt 2 tuần.
  • Phần đầu sách gồm tiêu đề, bản quyền, lời đề tặng và lời cảm ơn, sau đó để InDesign tự động tạo mục lục. Làm đến đây thì phần nội dung bên trong của cuốn sách cuối cùng cũng hoàn thành.

Thiết kế bìa

  • Bìa sách rất quan trọng. Cuốn sách này có điểm nhấn là các hình minh họa theo phong cách vẽ bút, nên tác giả quyết định tận dụng điều đó.
  • Tác giả vẽ lại hình ngọn núi được dùng như một ẩn dụ cho việc leo trèo, làm nó lớn hơn và nhiều chi tiết hơn. Đồng thời cũng tự viết lại tiêu đề bằng chữ tay.
  • Màu sắc được chọn theo cảm hứng giống các sổ tay hướng đạo sinh thập niên 1950.

Xem xét bản in thử

  • Khi nhận bản in thử đặt qua POD, tác giả lần đầu thực sự cảm nhận được kích thước của cuốn sách. Có thể thấy rõ khối lượng công việc tích lũy suốt thời gian dài.
  • Nhưng vẫn chưa xong. Vì quá trình dàn trang có nhiều thao tác thủ công nên vẫn có thể có sai sót, do đó cần đọc lại và kiểm tra thêm một lần nữa.
  • Tác giả đã đưa các file InDesign lên Git, nhưng vì là file nhị phân nên rất khó xem khác biệt giữa các thay đổi.
  • Để so sánh giữa bản in thử và các thay đổi, tác giả dùng script Dart để chuyển từng trang PDF thành ảnh, rồi dùng Photoshop action để vẽ viền đỏ quanh những vùng có khác biệt về pixel.
  • Nhờ vậy có thể xác minh bằng lập trình rằng chỉ những thay đổi đúng như dự định mới xuất hiện, điều này mang lại sự yên tâm.

Làm e-book

  • Tận dụng hệ thống build, tác giả tạo toàn bộ XHTML và metadata cần cho EPUB. Sau đó điều chỉnh CSS trong khi thử nghiệm trên nhiều thiết bị đọc khác nhau.

Ý kiến của GN⁺

  • Việc hoàn thành một cuốn sách dày tới 640 trang sau hành trình kéo dài 6 năm là một thành tựu đáng nể. Điểm thú vị là trong quá trình viết, tác giả đã huy động tối đa kỹ năng lập trình như tự phát triển hệ thống build bằng Dart và tạo script cho InDesign để phục vụ dàn trang.

  • Đặc biệt, phần tạo script để so sánh PDF nhằm kiểm chứng các thay đổi ở giai đoạn bản in thử thật sự rất ấn tượng. Có lẽ phải có ý tưởng và năng lực thực thi như vậy thì một cá nhân mới có thể self-publishing sách.

  • Tuy vậy, việc kích thước trang mục tiêu khá lớn khiến khâu dàn trang không hề dễ dàng, và việc lựa chọn kích thước cũng bị giới hạn bởi điều kiện của nhà in là điều khá đáng tiếc. Ở tác phẩm tiếp theo, có lẽ nên chọn một kích thước thân thiện hơn với xuất bản.

  • Như chính tác giả đã nói, với một cuốn sách giải thích về ngôn ngữ lập trình thì thiết kế bìa có thể không ảnh hưởng quá lớn đến doanh số, nhưng một bìa có cá tính phản ánh rõ đặc trưng nội dung như cuốn sách này lại có thể trở thành một điểm mạnh nổi bật.

  • Việc tác giả kiên trì tranh thủ viết trong suốt 6 năm thật đáng khâm phục. Giờ chỉ còn chờ xem độc giả sẽ đón nhận cuốn sách này ra sao và đưa ra những phản hồi thế nào. Rõ ràng đây có vẻ sẽ là một cuốn sách hữu ích với rất nhiều người muốn học về ngôn ngữ lập trình.

1 bình luận

 
GN⁺ 2024-04-29
Ý kiến trên Hacker News
  • Crafting Interpreters có một trang web cung cấp cả liên kết mua sách lẫn liên kết tới bản trực tuyến miễn phí
  • Nhờ sự chăm chút tỉ mỉ mà Nystrom dành cho thiết kế bản in, các minh họa vẽ tay và lối viết xuất sắc, đây là cuốn sách hay hơn 99% sách kỹ thuật khác và hoàn toàn đáng để mua
  • Đã bắt đầu học với cuốn sách này từ năm 2017, và khi hoàn thành nửa đầu cuốn sách thì sự hiểu biết về tokenizer/lexer/parser/interpreter trở nên rõ ràng hơn nhiều. Điều này có được nhờ văn phong tuyệt vời của Nystrom và sự am hiểu sâu sắc của ông về chủ đề
  • Trước giờ không biết tác giả đã quyết định làm bản sách in, và dù đó không phải cách học phù hợp nhất với tôi, tôi vẫn muốn mua để sưu tầm và ủng hộ tác giả
  • Đây là một trong những sách kỹ thuật hay nhất từng đọc; vừa học được rất nhiều khi đọc, lại còn thực sự thấy thú vị. Ngoài nội dung kỹ thuật xuất sắc, câu chữ cũng được viết rất tốt, dí dỏm và minh họa cũng đẹp
  • Tầm nhìn là ở cuối mỗi chương đều có mã nguồn tiến hóa dần và một chương trình có thể chạy được thật sự rất ấn tượng, và đáng khen là tác giả đã làm được điều đó. Tôi bỏ qua phần tree-walking interpreter và học được nhiều hơn rất nhiều từ phần bytecode interpreter viết bằng C
  • Có một người bình luận nói một cách trớ trêu rằng họ mất 15 tháng để đọc xong cuốn sách, đồng thời gửi lời cảm ơn và chúc mừng tới tác giả vì công sức bỏ ra. Đây là cuốn sách không chỉ có chiều sâu kỹ thuật trong lĩnh vực ngôn ngữ mà còn có những chi tiết nhỏ về bố cục và đồ họa giúp người đọc đắm chìm, nên có lẽ sẽ còn là một cuốn sách ý nghĩa trong thời gian dài sắp tới
  • Tôi rất yêu thích cuốn sách này đến mức đã tự tạo trang https://hexmos.com/compiler dựa trên những gì mình đọc và học được từ nó
  • Đáng để nghe cuộc phỏng vấn với Bob, tác giả của sách (https://corecursive.com/032-bob-nystrom-on-building-an-interpreter/)
  • Việc tác giả là một kỹ sư compiler từng xuất thân từ graphic designer khiến tôi thấy rất ấn tượng
  • Sau khi đọc Writing an Interpreter in Go, tôi dự định sẽ đọc cuốn này như cuốn sách tiếp theo về interpreter, và tôi thích việc nó chỉ khoảng 200 trang nên độ dài vừa phải
  • (Bình luận năm 2021) Đây là một cuốn sách tuyệt vời và họ đã thực sự rất thích thú khi đọc nó