~/docs/how-to-ask-questions-smartly.vi utf-8 · vi-VN · esr+moen
$ cat smart-questions.vi.md

Cách Hỏi Để Người Khác Muốn Giúp

Bản viết lại tiếng Việt hiện đại của bài “How To Ask Questions The Smart Way” của Eric S. Raymond & Rick Moen. Giữ nguyên tinh thần, cập nhật ví dụ cho thời Discord/GitHub/Stack Overflow/LLM.

Tác giả gốc: Eric Steven Raymond · Rick Moen
Nguồn: catb.org/~esr/faqs/smart-questions.html
Bản tiếng Việt: viết lại cô đọng, không phải bản dịch từng câu.
#hacker-culture #open-source #community #how-to-ask #netiquette

[00] Tuyên bố miễn trừ

$ Nhiều dự án mã nguồn mở link đến bài viết này ở mục “Hướng dẫn đặt câu hỏi cho cộng đồng”. Đó là chuyện tốt — nhưng nếu bạn được dẫn tới đây vì vừa mới hỏi một câu dở, đừng nghĩ rằng cả cộng đồng đang chĩa mũi dùi vào mặt mình.

Bài này không nhằm tát vào mặt bạn. Nó chỉ chỉ ra: muốn nhận được giúp đỡ chất lượng từ những người bận và không quen biết, bạn cần biết cách hỏi. Đọc xong, bạn sẽ giúp được chính mình và giúp được người trả lời.

// note Bài viết là tác phẩm chung của Eric S. Raymond (tác giả The Cathedral and the Bazaar) và Rick Moen. Bản tiếng Việt bạn đang đọc là viết lại cô đọng, không phải dịch nguyên văn.

[01] Mở đầu

Trong thế giới hacker — hiểu theo nghĩa người làm chủ kỹ thuật, viết phần mềm và yêu tự do thông tin, không phải “kẻ phá hoại máy tính người khác” — câu trả lời bạn nhận được phụ thuộc trực tiếp vào cách bạn đặt câu hỏi.

Hacker thường có những đặc điểm sau:

  • Coi trọng vấn đề thú vịgiải pháp hay.
  • Ghét lãng phí thời gian — đặc biệt là thời gian của mình bị lãng phí vì sự lười biếng của người khác.
  • Tôn vinh năng lực tự tìm hiểu. Bạn càng cho thấy mình đã cố, càng dễ được giúp.

Văn hóa này có thể trông khắc nghiệt với người mới. Nhưng nó được tạo ra không phải để loại trừ ai. Nó tồn tại để bảo vệ một thứ rất quý: nguồn lực thời gian của những người sẵn lòng giúp người lạ miễn phí.

“Câu hỏi khôn mời gọi câu trả lời sâu. Câu hỏi lười mời gọi sự im lặng — hoặc tệ hơn.” — Diễn giải lại tinh thần bài viết của ESR

[02] AI giúp gì, khi nào vẫn nên hỏi người khác

Ở thời điểm hiện tại, dev mới có lợi thế rất lớn: bạn có thể hỏi ChatGPT, Claude, Cursor, Gemini... để tự debug, đọc lỗi, giải thích khái niệm, viết test nhỏ, hoặc tạo một checklist kiểm tra trước khi làm phiền người khác.

Nhưng AI không thay thế hoàn toàn cộng đồng hay người có kinh nghiệm. Sẽ có lúc bạn vẫn nên hỏi người khác, đặc biệt khi:

  • Bug quá nhiều ngữ cảnh. Lỗi phụ thuộc vào repo, dữ liệu, hạ tầng, lịch sử thay đổi, hoặc quyết định kỹ thuật nội bộ.
  • Cần review hướng làm. Bạn không chỉ cần câu lệnh fix, mà cần biết cách tiếp cận có đúng, có maintainable, có ảnh hưởng lâu dài không.
  • Đụng production. Khi có rủi ro mất dữ liệu, downtime, bảo mật, tiền bạc, hoặc ảnh hưởng người dùng thật, cần thêm mắt người kiểm tra.
  • Framework/tool lạ hoặc edge case mới. AI có thể tự tin trả lời sai, nhất là với API mới, version mới, hoặc hành vi ít người gặp.
  • Business logic riêng. Chỉ team hoặc cộng đồng dự án mới hiểu tại sao hệ thống được thiết kế như vậy.
  • Cần góc nhìn thực tế. Có những câu trả lời đúng về mặt kỹ thuật nhưng không hợp với deadline, team size, vận hành, hoặc văn hóa dự án.
// tip Dùng AI như vòng debug đầu tiên. Khi hỏi người khác, hãy mang theo phần bạn đã hỏi AI, điều bạn đã kiểm chứng, và chỗ bạn vẫn còn nghi ngờ. Như vậy câu hỏi của bạn rõ hơn, và người trả lời đỡ phải bắt đầu từ số không.

[03] Trước khi hỏi

Trước khi bạn đặt một câu hỏi kỹ thuật trên Discord, Stack Overflow, GitHub Issues hay bất kỳ nơi nào, hãy lần lượt làm những việc sau:

  1. Đọc tài liệu / RTFM. Đọc README, docs/, FAQ, manual của tool.
  2. Tìm trong archive. Tìm trong issue cũ (đóng & mở), Stack Overflow, mailing list archive.
  3. Google nó. Copy nguyên thông báo lỗi vào ô search. 80% trường hợp đã có người gặp.
  4. Hỏi AI / LLM trước. Hiện tại ChatGPT, Claude, Cursor, Gemini... giải được khá nhiều bug phổ thông. Hỏi nó cho bạn dạng phỏng vấn 1-1, không tốn thời gian của người khác.
  5. Tự thử nghiệm. Đọc code nguồn nếu có. In log. Tạo MRE (Minimal Reproducible Example).
  6. Hỏi một người bạn thạo việc. Trước khi hỏi cả thế giới, hỏi một người cụ thể nếu có.

Khi đã làm hết những bước trên mà vẫn bí — lúc đó hãy mang câu hỏi đến cộng đồng. Hãy nói luôn rằng bạn đã thử những gì. Câu mở đầu kiểu “Tôi đã đọc X, thử Y và Z, kết quả là…” khiến bạn ngay lập tức được xếp vào nhóm người đáng giúp.

// warn Đừng hỏi điều mà man hoặc trang đầu Google trả lời trong 30 giây. Đó là cách nhanh nhất để bị bỏ qua hoặc bị bảo “RTFM”.

[04] Khi hỏi

Chọn forum cẩn thận

Đăng câu hỏi sai chỗ là cách nhanh nhất để không nhận được trả lời. Một số nguyên tắc:

  • Đừng đăng câu hỏi người dùng vào kênh developer của dự án.
  • Đừng đăng câu hỏi C++ vào forum Python chỉ vì bạn quen ở đó.
  • Đừng spam cùng câu hỏi ra 5 nơi (cross-posting trắng trợn). Nếu phải post nhiều nơi, nói rõ và link chéo.
  • Đừng nhắn DM riêng một maintainer chỉ để hỏi điều mà cộng đồng có thể giúp. Họ không phải nhân viên hỗ trợ riêng của bạn.

Stack Overflow / Stack Exchange

Với phần lớn câu hỏi lập trình thuần kỹ thuật, Stack Overflow là điểm đến đầu tiên. Hãy tìm trước. Khoảng 80% câu hỏi mới là trùng với câu cũ.

Khi đăng câu hỏi mới: dùng tag chính xác, viết tiêu đề như một câu hỏi cụ thể, kèm code MRE chạy được, kèm thông báo lỗi đầy đủ, và nêu rõ bạn kỳ vọng gì & nhận được gì.

Web forum / Discord / Slack / IRC

Các kênh chat real-time (Discord, Slack, IRC, Telegram…) phù hợp với thảo luận nhanh, không phù hợp với câu hỏi phức tạp cần lưu trữ. Lưu ý:

  • Đừng “xin phép để hỏi” rồi biến mất. Cứ hỏi thẳng. Nguyên tắc: “Don't ask to ask, just ask.”
  • Đừng paste 200 dòng log vào kênh chat. Dùng pastebin / gist / code block.
  • Câu hỏi cần đào sâu > 30 phút thì chuyển sang GitHub Issues hoặc forum có archive.
  • Đừng kỳ vọng câu trả lời ngay. Người trả lời ở khắp múi giờ.

Mailing list & GitHub Issues

Khi câu hỏi liên quan đến dự án cụ thể: vào trang dự án, đọc CONTRIBUTING.md, và dùng đúng kênh họ chỉ định. Hai lựa chọn phổ biến hiện nay:

  • GitHub Issues / Discussions: cho bug và câu hỏi về dự án.
  • Mailing list dev/user: vẫn tồn tại trong nhiều dự án lâu năm (Linux kernel, Postgres, Debian…).

Đừng nhầm user list với dev list. Hỏi “tại sao tool này crash khi tôi click” trên dev list = bạn đang lãng phí thời gian của những người viết ra tool đó.

Tiêu đề rõ ràng, cụ thể

Tệ
HELP!!!
loi gi vay
Khong chay duoc
Question
Bug
Tốt
X11 mouse cursor distorted on Nvidia 4090
with kernel 6.7

Postgres 16: pg_dump fails with SSL
SYSCALL EOF on tables > 2GB

Next.js 14 RSC: hydration mismatch only
on Safari iOS

Mẹo: viết tiêu đề như một dòng commit message — ngắn, cụ thể, đúng trọng tâm.

Làm sao cho dễ trả lời

Đừng kết câu hỏi bằng “Vui lòng email riêng cho tôi vì tôi không theo dõi forum này.” Đó là cách bảo: tôi quan trọng hơn cộng đồng của bạn. Người ta sẽ bỏ qua.

Viết rõ ràng, đúng chính tả & ngữ pháp

Người viết cẩu thả thường suy nghĩ cẩu thả. Nếu bạn không buồn kiểm tra chính tả, người trả lời sẽ đoán rằng bạn cũng không buồn debug.

Không cần văn vẻ hoa mỹ. Chỉ cần câu hoàn chỉnh, dấu câu đúng, viết hoa đầu câu. Nếu không thạo tiếng Anh, nói rõ ngay từ đầu — cộng đồng sẽ rộng lượng. Nhưng đừng tỏ ra lười.

Định dạng chuẩn, dễ đọc

  • Code & log dùng code block, không paste như văn bản thường.
  • Đừng gửi câu hỏi dưới dạng ảnh chụp màn hình của một đoạn text. Người ta không grep được ảnh.
  • Đừng gửi file .docx, .pdf chỉ để chứa 5 dòng code.
  • Wrap code/log dài bằng pastebin / gist / repro repo.

Chính xác và đủ thông tin về vấn đề

Trình bày tối thiểu các thông tin sau:

  • Triệu chứng: bạn thấy gì? (kèm log/screenshot nếu cần)
  • Môi trường: OS, version, phần cứng liên quan, version của tool.
  • Bạn đã làm gì để xảy ra điều đó? (các bước reproduce)
  • Bạn đã thử gì để fix?
  • Bạn kỳ vọng gì? Vs. bạn nhận được gì?

Lượng thông tin ≠ độ chính xác

Đừng dump cả 5000 dòng log vào tin nhắn. Hãy đọc qua, chọn đúng phần liên quan, kèm context tối thiểu. Một MRE (Minimal Reproducible Example) 20 dòng có giá trị hơn một repo 200 file.

Đừng vội kêu “đây là bug”

Trừ khi bạn rất chắc, đừng mở đầu bằng “Tool này có bug khi…”. Đa số trường hợp là người dùng dùng sai hoặc hiểu sai. Cách diễn đạt khôn ngoan hơn:

“Tôi gặp hành vi sau, không rõ là tôi đang dùng sai hay đây là bug. Tôi kỳ vọng X, nhưng nhận được Y. Phiên bản: …”

Cách nói này khiến bạn không phải xin lỗi nếu hóa ra mình sai.

Nịnh không thay được tự học

“Em là người mới, mong các pro chỉ giáo!” không phải tấm vé miễn phí. Người trả lời quan tâm bạn đã cố gắng gì, không phải bạn khiêm tốn tới đâu. Khiêm tốn rỗng = lười + sợ mất mặt.

Mô tả triệu chứng, không phải phỏng đoán

Đừng nói: “tôi nghĩ là do GC của Node bị rò rỉ.” Trừ khi bạn đã profile và có bằng chứng. Hãy nói: “RSS memory tăng đều 5MB/phút trong 2 giờ chạy, đính kèm heap snapshot.”

Chuyên gia có thể đọc triệu chứng và đoán đúng nguyên nhân. Họ không thể đọc phỏng đoán của bạn và đoán ra triệu chứng.

Mô tả theo trình tự thời gian

“Tôi cài A. Sau đó tôi cài B. Sau đó tôi update C. Sau đó X bắt đầu fail.” Có giá trị gấp 10 lần “X đang fail, tôi không biết tại sao.” Nguyên nhân thường nằm ở thay đổi gần nhất.

Mô tả mục tiêu, không phải các bước của bạn (XY Problem)

// XY problem Bạn muốn làm X. Bạn nghĩ giải pháp là Y. Bạn đang kẹt ở Y. Bạn đi hỏi về Y mà không nhắc đến X. Kết quả: bạn nhận được lời giải cho Y, nhưng vẫn không làm được X — vì Y vốn không phải là cách đúng.

Luôn nêu mục tiêu cuối cùng trước khi nêu các bước. Người trả lời có thể chỉ cho bạn cách làm X tốt hơn nhiều so với Y.

Đừng đòi trả lời qua email riêng

Hỏi công khai → trả lời công khai. Đó là cách kiến thức được lưu lại và giúp được người tiếp theo gặp vấn đề tương tự. Đòi reply riêng = bạn coi cộng đồng như tổng đài cá nhân.

Đặt câu hỏi rõ ràng & có giới hạn

“Có ai có thể giải thích cho tôi về microservices không?” là câu hỏi mở vô tận. Không ai có thời gian. Thu hẹp: “Tôi đang chuyển một monolith Django sang microservices. Cụ thể, làm cách nào để xử lý transaction qua 2 service mà không dùng 2PC?”

Khi hỏi về code

  • Cung cấp một MRE — đoạn code nhỏ nhất chạy được mà tái hiện lỗi.
  • Nói rõ bạn kỳ vọng output gì, thực tế output gì.
  • Đính kèm phiên bản ngôn ngữ, OS, build tool.
  • Đừng paste cả project. Cô đặc trước, đăng sau.
  • Nếu code đã chạy & build, hãy nói rõ.

Đừng post bài tập về nhà

Hacker phát hiện ra bài tập trên lớp rất nhanh. Việc làm bài hộ không giúp bạn học. Nếu bạn thực sự kẹt, hãy nói rõ bạn đang học, đã thử cách nào, bí ở bước nào — chứ không phải đăng nguyên đề bài rồi chờ ai đó submit hộ.

Cắt bỏ phần thừa

Đừng kết thúc bằng kiểu “Vui lòng hồi đáp giúp em, em rất mong nhận được sự giúp đỡ ạ. Em xin chân thành cảm ơn các tiền bối.” Lịch sự là cần, nhưng spam lời chào không giúp câu hỏi tốt hơn. Đi thẳng vào vấn đề.

Đừng gắn nhãn “KHẨN” / “URGENT”

Việc của bạn khẩn — không phải việc của người trả lời. Gắn “urgent” thường có tác dụng ngược: câu hỏi của bạn sẽ bị bỏ qua, vì bạn đang yêu cầu ưu tiên mà không có quyền.

Ngoại lệ: nếu thực sự có yếu tố thời gian khách quan (vd. server production của tổ chức nhân đạo sập trước deadline cứu trợ), giải thích bối cảnh đó — không chỉ gắn nhãn.

Lịch sự không thừa

“Please”, “Thank you in advance”, “Cảm ơn dù bạn không trả lời” đều miễn phí và làm tăng đáng kể tỷ lệ được giúp. Nhưng nhớ: lịch sự là cộng thêm, không phải thay thế cho nội dung tốt.

Báo lại lời giải

Khi bạn đã giải quyết được vấn đề, quay lại post một note ngắn mô tả lời giải. Việc này:

  • Cảm ơn cộng đồng đúng cách.
  • Giúp người tiếp theo google ra câu trả lời.
  • Tăng uy tín của bạn trong cộng đồng.

Một câu hỏi tốt + lời giải tốt là một tài sản của cộng đồng. Một câu hỏi bị bỏ rơi sau khi giải quyết là một viên gạch hỏng.

[05] Cách đọc câu trả lời

RTFM và STFW — Khi bạn nhận được hai chữ này

RTFM = “Read The F***ing Manual.” STFW = “Search The F***ing Web.” Nhận được hai cụm này nghĩa là người trả lời cho rằng:

  • Bạn nên tự tìm được câu trả lời trong vài phút.
  • Bạn đã không buồn tìm trước khi hỏi.

Phản ứng đúng không phải tự ái. Phản ứng đúng là: cảm ơn, đi đọc manual, đi search web. Sau đó nếu vẫn không hiểu, quay lại với câu hỏi tinh hơn nhiều.

Nếu bạn không hiểu câu trả lời

Đừng vội đáp “Tôi không hiểu, giải thích lại được không?” Hãy chứng tỏ bạn đã cố hiểu:

“Cảm ơn. Tôi đã thử X theo gợi ý, nhưng kết quả ra Y. Tôi đoán mình hiểu sai ở chỗ Z. Có phải ý của bạn là…?”

Đối phó với “thô lỗ”

Phần lớn cái trông như thô lỗ trong cộng đồng hacker không phải là sự xúc phạm cá nhân. Đó là văn hóa truyền đạt thẳng, không vòng vo. Khi một hacker bảo bạn “điều bạn vừa nói là sai”, đó không phải tấn công — đó là dữ liệu.

Tách câu chữ ra khỏi giọng điệu. Lấy phần kỹ thuật, bỏ qua phần thô. Đáp trả thô lỗ chỉ chứng minh bạn không thuộc về văn hóa này.

Tuy nhiên, có ranh giới: tấn công cá nhân, kỳ thị, hoặc chế giễu chủng tộc/giới tính KHÔNG phải “văn hóa hacker”. Đó là độc hại. Báo cáo cho moderator của diễn đàn đó.

Đừng phản ứng như “kẻ thua cuộc”

Sai một câu hỏi không phải tận thế. Đừng:

  • Xóa post của mình rồi giả vờ chưa từng xảy ra.
  • Chửi lại cả thread.
  • Spam câu hỏi mới y hệt sang chỗ khác.
  • Bỏ chạy khỏi cộng đồng vĩnh viễn.

Cách thắng: cảm ơn người chỉ cho mình điều mình làm sai, sửa, hỏi lại tốt hơn lần sau. Cộng đồng nhớ người học nhanh hơn là người không bao giờ sai.

[06] Những câu hỏi không nên hỏi

Dưới đây là một số dạng câu hỏi kinh điển khiến hacker quay lưng — kèm cái họ đang nghĩ nhưng có thể không nói ra:

Em mới học lập trình, em nên học ngôn ngữ nào?
Bạn chưa Google. Bạn cũng chưa nghĩ tới bạn muốn làm gì với nó. Câu này hỏi 1000 lần, có 1000 câu trả lời sẵn trên web.
Code của em không chạy. Giúp em với!
Code nào? Lỗi gì? Bạn mong nó làm gì? Bạn đã thử gì? Không có dữ liệu = không có câu trả lời.
Có ai trên Linux không?
Đừng xin phép hỏi. Hỏi luôn. Khi có ai biết, họ sẽ trả lời.
Làm sao crack/hack/jailbreak X?
Không.
Có thể làm hộ em bài tập này không, em deadline tối nay.
Không. Và việc đó không giúp bạn học. Bạn đang xin một con cá, không phải xin học cách câu.
Vì sao X chậm/dở/tệ?
So sánh với cái gì? Bạn đã đo bằng cách nào? Bạn có benchmark không? “Cảm giác chậm” không phải dữ liệu.

[07] Câu hỏi hay vs câu hỏi dở — ví dụ thực tế

Câu hỏi dở
Tiêu đề: HELP!!!

Code em không chạy, ai giúp với ạ.
Em đang làm app React, click vào button
nó không hiện gì hết. Em xin cảm ơn các
anh chị tiền bối nhiều ạ!!!
Câu hỏi tốt
Tiêu đề: React 18 + Vite: onClick không
fire trên <button> bên trong <form>
sau khi thêm preventDefault

Mô tả:
- React 18.2, Vite 5, Chrome 121, macOS 14
- Khi click button, kỳ vọng handler chạy
  → console.log ra. Thực tế: không log gì.
- Đã thử: kiểm tra event listener trong
  DevTools (có gắn), thử thay onClick bằng
  onPointerDown (vẫn không fire).
- MRE: https://stackblitz.com/edit/xxx
- Đoán: có thể form đang trigger submit
  trước? Nhưng e.preventDefault() đã được
  gọi trong onClick.

Câu hỏi: Tại sao handler không chạy,
và cách fix đúng là gì?

Câu hỏi dở
Database em bị chậm. Có ai biết tại sao
không ạ?
Câu hỏi tốt
Postgres 16: query JOIN 3 bảng chậm
2.5s → 18s sau khi data tăng gấp đôi
(~50M rows)

- EXPLAIN ANALYZE:
  https://explain.dalibo.com/plan/xyz
- Index hiện có: idx_users_email,
  idx_orders_user_id, idx_items_order_id
- pg_stat_statements: top 3 query đính kèm
- shared_buffers=4GB, work_mem=64MB,
  effective_cache_size=12GB (RAM 16GB)
- Bảng đã ANALYZE gần nhất 2h trước

Câu hỏi: Plan đang seq scan trên orders
dù có index. Có cách nào ép planner dùng
index, hoặc có index composite nào tốt
hơn cho query này không?

Sự khác biệt không nằm ở số lượng chữ. Nó nằm ở chất lượng dữ kiện bạn cung cấp. Câu hỏi tốt làm việc giùm người trả lời 80% — họ chỉ cần đưa ra mảnh ghép cuối.

[08] Nếu không có ai trả lời

Đừng coi đó là chuyện cá nhân. Có nhiều lý do hợp lý:

  • Câu hỏi của bạn quá đặc thù, không ai từng gặp.
  • Câu hỏi quá rộng, không ai đủ rảnh để trả lời tử tế.
  • Bạn đang hỏi sai nơi.
  • Không ai biết câu trả lời. (Có thật.)

Hành động tiếp:

  1. Đợi đủ thời gian (24-72h tùy kênh). Đừng bump sau 10 phút.
  2. Xem lại câu hỏi. Có thể viết lại cô đọng & rõ hơn?
  3. Thử kênh khác phù hợp hơn (đề cập chéo nhưng đừng spam).
  4. Nếu là dự án thương mại: có thể bạn cần support trả phí. Cộng đồng OSS không phải hỗ trợ kỹ thuật 24/7.
  5. Tiếp tục tự debug. Đôi khi quá trình viết câu hỏi đã giúp bạn nhận ra lời giải (rubber duck debugging).

[09] Mặt còn lại: cách trả lời câu hỏi cho tử tế

Nếu bạn là người trả lời, cộng đồng cũng cần bạn theo những nguyên tắc này:

  • Dịu dàng. Người hỏi đang căng thẳng. Khắc nghiệt với người mới = hỏng cả cộng đồng dài hạn.
  • Nếu trả lời, trả lời cho ra hồn. Đừng đáp nửa vời, để người hỏi đoán phần còn lại.
  • Hỏi lại để làm rõ trước khi mắng. Đôi khi câu hỏi dở chỉ vì người hỏi chưa biết phải cung cấp gì.
  • Chỉ chỗ tìm, đừng chỉ cho cá. Link tới doc, tới tag SO, tới tool. Dạy cách câu cá quan trọng hơn việc cho cá.
  • Đừng chế nhạo người mới. Bạn cũng từng là người mới. Câu trả lời của bạn sẽ được người khác đọc trong nhiều năm.
  • Nếu không trả lời, đừng phá thread. Im lặng tốt hơn nhiều so với một câu “lol” hoặc “noob”.
  • Đáp công khai khi có thể. Một câu trả lời tốt = tài liệu cho cả ngàn người tiếp theo.
// tip Bạn không bắt buộc phải trả lời. Nhưng nếu chọn trả lời, hãy làm cho cộng đồng tốt hơn lúc bạn đến.

[10] Tài nguyên liên quan

[11] Lời cảm ơn

Bản gốc của Eric S. Raymond và Rick Moen đã định hình văn hóa hỏi-đáp kỹ thuật trong suốt 20+ năm. Bản tiếng Việt này được viết lại với mong muốn giúp lập trình viên nói tiếng Việt tham gia cộng đồng quốc tế một cách tự tin và được giúp đỡ.

Nếu bài viết hữu ích, hãy chuyển nó cho người tiếp theo bạn thấy đang chuẩn bị đăng một câu hỏi mơ hồ trong một group lập trình.

// copyright Bài gốc © Eric S. Raymond & Rick Moen, theo chính sách copying tại catb.org. Bản viết lại này tôn trọng nguyên tác, không thay thế bản chính thức.