Viết tiểu thuyết ngắn bằng groff: Hành trình của một lập trình viên

Công nghệ01 tháng 11, 2026·6 phút đọc

Một lập trình viên chia sẻ trải nghiệm viết hai tiểu thuyết ngắn hoàn toàn bằng groff — hệ thống sắp chữ cổ điển của Linux. Anh tự tạo macro riêng, xử lý lỗi ngắt trang và dùng Vim để có trải nghiệm viết không xao nhãng.

Viết tiểu thuyết ngắn bằng groff: Hành trình của một lập trình viên

Một lập trình viên đã chia sẻ câu chuyện thú vị về việc tự tay viết hai tiểu thuyết ngắn (novella) và sắp chữ chúng hoàn toàn bằng groff — hệ thống sắp chữ quen thuộc với người dùng Linux qua các trang man. Bài viết không chỉ kể về quá trình sáng tác mà còn đi sâu vào kỹ thuật sắp chữ, từ việc tạo macro riêng đến xử lý các vấn đề ngắt trang.

Từ người không thích đọc đến tác giả

Điều bất ngờ nhất là tác giả từng rất "dị ứng" với việc viết lách. Thời đi học, mọi thứ liên quan đến "viết" đều là nỗi ám ảnh, trừ khi đó là toán, lý hay các môn kỹ thuật. Thế nhưng mọi thứ thay đổi vào khoảng tháng 7/2025, khi anh bắt đầu đọc những cuốn sách đã nằm trong nhà hàng chục năm và nhận ra việc đọc thú vị hơn mình tưởng.

Từ tháng 7/2025 đến nay, tôi đã đọc khoảng 30 cuốn tiểu thuyết. Có cuốn đọc vài ngày, có cuốn mất ba tháng.

Truyện thứ nhất dài khoảng 50 trang A5 (tương đương 15.000 từ), mất hơn bảy tháng để hoàn thành. Truyện thứ hai dài khoảng 120 trang (40.000 từ) nhưng chỉ mất mười ngày. Cả hai đều nằm ở ranh giới của định nghĩa "novella" — một hơi ngắn, một hơi dài.

Tại sao lại là groff?

Với tác giả, sức hấp dẫn của groff nằm ở sự nhỏ gọn và tốc độ. Tài liệu 50 trang chỉ mất khoảng 700ms để kết xuất trên chiếc PC 13,5 năm tuổi, còn tài liệu 120 trang mất 1,6 giây.

So với phần lớn phần mềm hiện đại ngày nay — vốn cho cảm giác như lội bùn — tốc độ này thật sự sảng khoái.

Vì muốn mọi thứ thú vị hơn, anh tự viết một gói macro nhỏ. Với một tiểu thuyết đơn giản, không cần mục lục, không tham chiếu chéo, không biểu đồ, không khối mã, không danh sách — chỉ cần dòng chữ chảy mượt và đôi khi một từ được nhấn mạnh.

Gói macro này đủ để tạo ra một tài liệu trông giống như một cuốn sách thực thụ. Mỗi chương được đặt trong một file riêng, sau đó kết xuất thành PDF với khổ giấy A5.

Vấn đề ngắt trang và đánh số

Một trong những thách thức kỹ thuật là đánh số trang. Mặc định groff không có số trang, và nếu chỉ cần PDF kỹ thuật số thì có thể bỏ qua. Tuy nhiên khi in ấn, chúng rất hữu ích.

Tác giả đã phải xử lý cẩn thận vị trí đặt footer và** trap** — cơ chế kích hoạt macro khi đầu ra chạm một vị trí nhất định trên trang. Có những chi tiết tưởng nhỏ nhưng lại gây lỗi khó hiểu, chẳng hạn việc phải thêm hậu tố u vào register thì mới hoạt động, dù tài liệu không giải thích rõ lý do.

Việc chuyển đổi giữa các environment trong groff được xem là chìa khóa để kiểm soát dòng chữ đang được thu thập và chèn nội dung vào đúng vị trí mong muốn.

Viết bằng groff rồi chuyển sang Markdown

Dù cả hai truyện ban đầu được viết bằng groff thuần túy, tác giả sau đó chuyển truyện thứ hai sang "Markdown" — một phiên bản Markdown tối giản chỉ với vài phần tử. Lý do là Markdown "đẹp về mặt thị giác" hơn, gần với văn bản con người đọc hơn, giúp tập trung vào quá trình sáng tạo.

Tuy nhiên, tác giả vẫn giữ groff cho khâu kết xuất cuối cùng vì lý do quan trọng: căn đều hai bên (justified text). Theo anh, văn bản căn đều trong HTML trông như "một thảm họa hoàn toàn", trong khi kết quả từ groff hay TeX đẹp hơn rất nhiều.

Trải nghiệm viết không xao nhãng với Vim

Tác giả dùng Vim với plugin hỗ trợ cú pháp và phóng to cửa sổ terminal để có trải nghiệm viết tập trung cao độ.

Không trình duyệt, không đồng hồ, không gì cả. Chỉ là một chiếc máy đánh chữ với chức năng hoàn tác dễ dàng.

Văn bản được ngắt dòng thủ công theo một độ rộng cố định, và anh dùng lệnh gq của Vim để định dạng lại đoạn văn khi chỉnh sửa. Toàn bộ dự án được quản lý bằng Git — chủ yếu để sao lưu và đồng bộ giữa laptop và máy để bàn, không mấy quan tâm đến commit message.

Bài học về kể chuyện

Tác giả thẳng thắn thừa nhận mình là "tay mơ" trong lĩnh vực này. Truyện đầu tiên có tiền đề thú vị nhưng anh không thật sự "vào vùng" — cũng vì thế mà mất nhiều thời gian. Truyện thứ hai khởi đầu từ ý tưởng tầm thường hơn nhưng dần cho thấy sự hấp dẫn với nhiều cú twist mà chính tác giả yêu thích.

Khó khăn lớn nhất là giữ cho các tình tiết nhất quán: nhân vật nào biết điều gì, khi nào, tại sao? Động cơ ra sao? Liệu mọi thứ có logic và hợp lý? Những câu thoại ở trang 100 trước có còn ý nghĩa sau cú twist cuối truyện không?

Tôi sẽ phải làm tốt hơn ở điểm này. Có lẽ lần sau sẽ dùng một "danh mục nhân vật" nhỏ — hồ sơ cho từng người.

Việc hiệu đính cũng cực kỳ vất vả: đọc lại 120 trang mất tới ba giờ đồng hồ.

Góc nhìn cho độc giả Việt Nam

Câu chuyện này là minh chứng thú vị cho việc các công cụ lập trình cổ điển vẫn có chỗ đứng trong sáng tạo văn chương. Với những ai quan tâm đến quy trình viết không phụ thuộc công cụ độc quyền, việc dùng groff, LaTeX hay Markdown kết hợp Vim là lựa chọn đáng tham khảo. Tại Việt Nam, cộng đồng người dùng Vim và các công cụ dòng lệnh tuy nhỏ nhưng vẫn tích cực, đặc biệt trong giới lập trình viên hệ thống và những người yêu thích triết lý phần mềm tối giản.

Tác giả hiện chưa có ý định công bố hai tác phẩm. Anh viết cho chính mình và không muốn tác phẩm bị "mổ xẻ" bởi những lời phê bình gay gắt.

Nếu bạn định gợi ý dùng LLM: Chúc mừng, bạn đã hoàn toàn hiểu sai vấn đề.

Thông điệp cuối cùng thật đáng suy ngẫm trong thời đại AI tràn lan: có những hành trình sáng tạo mà giá trị nằm ở chính quá trình, chứ không phải ở sản phẩm cuối cùng được tạo ra nhanh đến đâu.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗