Dev-note·Sep 6, 2026·4 min read

Cắt sáu lần mới biết mình cắt nhầm chỗ

Sửa CV cho vừa hai trang, mình cắt đi cắt lại sáu lượt mà vẫn ba trang. Đến lúc chịu ngồi đo thì mới thấy nội dung vẫn còn thừa chỗ, thủ phạm là một cái tiêu đề rơi cách đáy trang ba mươi mốt pixel.

Q
QuyenTMThợ code

Mở bài

Đợt vừa rồi mình ngồi sửa lại CV. Yêu cầu đơn giản thôi, gói gọn trong hai trang A4.

Bản đầu ra ba trang. Mình làm cái việc ai cũng làm: mở ra, tìm dòng nào nghe thừa nhất, xoá. Xuất lại. Vẫn ba trang. Xoá tiếp một mục. Vẫn ba trang. Gộp hai gạch đầu dòng làm một. Vẫn ba trang.

Đến lượt thứ sáu thì mình dừng, không phải vì hết chỗ cắt, mà vì thấy có gì đó sai sai. Mình đã cắt đi kha khá chữ rồi mà con số trang không hề nhúc nhích. Nếu nội dung dài quá thật thì cắt phải có tác dụng chứ.

Nên mình mở trình duyệt ra, chạy một đoạn script đo thử chiều cao thật của nội dung.

Kết quả: 1986px. Hai trang chứa được 2080px.

Tức là nội dung của mình thừa chỗ gần một trăm pixel. Nó không hề dài. Suốt sáu lượt vừa rồi mình cắt nhầm chỗ.

Thân bài

1. "Dài quá" và "ngắt trang xấu" là hai bệnh khác nhau

Đo kỹ hơn thì ra thủ phạm. Cái tiêu đề PROJECT HIGHLIGHTS nằm ở toạ độ y=1009, trong khi trang một kết thúc ở 1040. Nó còn đúng 31px trước khi hết trang.

Ba mươi mốt pixel thì không đủ cho tiêu đề cộng với đoạn văn dính ngay sau nó. Mà CSS in ấn có một luật rất hợp lý là break-after: avoid cho heading, để tránh cảnh tiêu đề nằm chỏng chơ cuối trang còn nội dung thì sang trang sau. Trình duyệt tuân thủ luật đó bằng cách đẩy cả cụm xuống trang mới.

Thế là cuối trang một bỏ trống 31px, mọi thứ phía dưới dịch xuống, và tràn sang trang ba.

Nhìn từ ngoài, hai tình huống này giống hệt nhau: "CV của tôi ba trang". Nhưng cách chữa thì ngược nhau hoàn toàn:

  • Nội dung dài thật thì phải cắt bớt.
  • Ngắt trang xấu thì cắt bao nhiêu cũng vô ích, phải đảo thứ tự mục, hoặc nới khoảng cách, hoặc thêm chữ vào chỗ khác cho cái tiêu đề đó trôi qua ranh giới trang.

Mình đã chữa bệnh thứ hai bằng thuốc của bệnh thứ nhất, sáu lần liền.

2. Cái sai không nằm ở kỹ thuật, nằm ở chỗ mình không chịu đo

Đoạn này mới là chỗ đáng nói, vì nó chẳng liên quan gì tới CV.

Mình làm nghề này mười mấy năm. Câu "đo trước khi tối ưu" mình nói với người khác không biết bao nhiêu lần. Đứng trước một service chậm, không đời nào mình ngồi đoán rồi sửa bừa; mình mở profiler, mở trace, tìm xem thời gian thật sự nằm ở đâu.

Vậy mà đứng trước một file Markdown, mình đoán liền tay.

Vì nó có vẻ hiển nhiên quá. Ba trang, muốn hai trang, thì cắt chứ còn gì nữa. Cái vẻ hiển nhiên đó là thứ đã ăn mất của mình sáu lượt sửa. Nó cũng chính là thứ khiến người ta thêm cache vào một endpoint chậm mà chưa hề nhìn query, hay tăng số worker cho một hàng đợi bị nghẽn ở chỗ hoàn toàn khác.

Cái bẫy không phải là thiếu kiến thức. Cái bẫy là bài toán trông nhỏ đến mức mình thấy không đáng để đo.

3. Rồi mình viết nó thành cái tool

Sau khi mất một buổi cho hai chuyện trên, mình gói lại thành một công cụ dòng lệnh, đặt tên là markcv.

Nó làm đúng hai việc mình đã phải làm bằng tay:

fit — đo chiều cao thật của bản in rồi trả lời câu "vì sao chưa vừa N trang". Nó phân biệt rõ hai bệnh, và chỉ đích danh khối nào bị đẩy sang trang mới cùng số pixel bị phí:

✗ 3 pages (target 2)
· content 1986px / 2080px available

Blocks pushed to a new page:
  PROJECT HIGHLIGHTS (H2, y=1009) → wastes 31px at the end of page 1

Suggestions:
  Content HAS ROOM (94px to spare) - length is not the problem, the page break is.

lint — soi nội dung chứ không soi định dạng. Bắt từ tự khen kiểu spearheaded, comprehensive; bắt kỹ năng khai ở mục SKILLS mà không có dòng kinh nghiệm nào đỡ; bắt việc đã nghỉ rồi mà bullet vẫn viết thì hiện tại.

Và bắt cả chiều ngược lại, tức là nói giảm: động từ yếu như advised on nằm ngay cạnh một con số lớn. Cái luật này mình chưa thấy công cụ CV nào có, mà nó lại là thứ đáng bắt: khoe quá thì bị phát hiện ở vòng phỏng vấn, còn nói giảm thì chẳng ai phát hiện ra cả, hồ sơ chỉ lặng lẽ yếu đi.

Cài bằng một dòng:

npm install -g @phuthuycoding/markcv
markcv fit cv.md --pages 2

Có kèm MCP server nữa, nên nếu bạn dùng Claude Code hay Cursor thì để agent nó tự sửa rồi tự đo lại cũng được.

Kết bài

Chuyện CV thì nhỏ. Nhưng cái vết mình dẫm phải hôm đó thì không nhỏ chút nào, và nó đúng cái vết mình vẫn hay chỉ cho người khác tránh.

Vấn đề trông càng hiển nhiên, mình càng dễ bỏ qua bước đo. Mà đúng những lúc đó, cái giá phải trả lại là sáu lượt sửa đi sửa lại một thứ vốn không hề hỏng.

Nên bài học thì cũ mèm, chỉ là lần này mình học lại nó ở chỗ chẳng ai ngờ tới: một file Markdown hai trang.

#Tooling#Debug#CV#Tập làm văn