ข้าม​ไป​ยัง​เนื้อหา

Read the Manual

บาง​ครั้ง​การ​อ่าน​คู่มือ​ก็​คุ้ม​กว่า​การ​ลอง​ผิด​ลอง​ถูก

โดย​ส่วน​ใหญ่ นัก​พัฒนา​มัก​คลำ​หา​ทาง​ได้​ด้วย​การ​ลอง​ไป​เรื่อย ๆ แล้ว​ดู​ว่า​อะไร​เข้า​ที่ อาจ​เป็นการ​ลอง​สลับ parameter จนกว่า compile error จะ​หาย​ไป cook ค่า config แบบ​สุ่ม​จน app ทำงาน หรือ​ค้นหา​ออนไลน์​จน​เจอ snippet ที่​ดู​น่า​จะ​ใช้ได้​แล้ว copy-paste มา​โดย​ไม่​เข้าใจ​ว่า​ทำไม​มัน​ถึง​ได้​ผล วิธี​นี้​เร็ว​ใน​ระยะ​สั้น​และ​บาง​ครั้ง​ก็​ใช้ได้​จริง แต่​มัน​แลก​ความ​เข้าใจ​กับ​ความเร็ว

Read the Manual (มัก​ย่อ​ว่า RTFM — “Read The F***ing Manual” ใน​ภาษา​แสลง​ของ​วงการ hacker) คือ​นิสัย​ง่าย ๆ แต่​ทรง​พลัง: ก่อน​จะ​ลอง​ผิด​ลอง​ถูก​ไป​เรื่อย ๆ หรือ​ก่อน​ไป​ถาม​คน​อื่น​ด้วย​คำถาม​พื้นฐาน ให้​ลอง​เปิด​เอกสาร​ทางการ​ของ​เครื่องมือ library framework หรือ API นั้น​ก่อน ไม่​ว่า​จะ​เป็น official docs, README, man page, API reference หรือ​แม้แต่ source code เอง (บาง​ครั้ง​เรียก​ว่า RTFS — “Read The F***ing Source”)

วลี RTFM มี​ราก​มา​จาก​วัฒนธรรม hacker ยุค​แรก ตัวอย่าง​ที่​ถูก​บันทึก​ไว้​เก่า​แก่​ที่สุด​ปรากฏ​ใน LINPACK Users’ Guide ปี 1979 (คู่มือ​ของ library พีชคณิต​เชิง​เส้น​สำหรับ Fortran) และ​คำ​นี้​ก็​ถูก​บรรจุ​อยู่​ใน Jargon File ซึ่ง​เป็น​พจนานุกรม​ศัพท์​แสลง​ของ​แวดวง​คอมพิวเตอร์​ที่​เริ่ม​รวบรวม​ตั้งแต่​ปี 1975 ที่ MIT AI Lab แม้​ตัว​คำ​จะ​ฟัง​ดู​หยาบ​และ​ถูก​ใช้​ใน​เชิง​ดูถูก​ได้​บ่อย​ครั้ง (โดย​เฉพาะ​เมื่อ​โยน​ใส่​มือใหม่​ที่​ถาม​คำ​ถาม​ใน​ฟอรัม) แต่​แก่น​ของ​มัน​คือ​คำ​แนะนำ​ที่​จริงใจ: เอกสาร​ที่​มี​อยู่​แล้ว​มัก​ตอบ​คำถาม​ได้​เร็ว​และ​แม่นยำ​กว่า​การ​เดา

RTFM ไม่​ได้​ขัดแย้ง​กับ​การ​ทดลอง (experimentation) — นัก​พัฒนา​หลาย​คน​ที่​เชื่อ​มั่น​ใน​การ​อ่าน​คู่มือ​ก็​ยัง​บอกว่า “การ​อ่าน​เอกสาร​อย่าง​เดียว​มัก​ไม่​พอ ต้อง​ทดลอง​ดู​ว่า​ระบบ​ทำงาน​จริง​อย่างไร” ทั้ง​สอง​แนวทาง​เสริม​กัน: เอกสาร​ให้​แผนที่​และ​คำ​ศัพท์​ที่​ถูกต้อง ส่วน​การ​ทดลอง​ให้​ความ​เข้าใจ​เชิง​ประจักษ์​ว่า​พฤติกรรม​จริง​ตรง​กับ​ที่​เอกสาร​เขียน​ไว้​หรือ​ไม่

ก่อน​จะ debug ด้วย​การ​ลอง​สุ่ม หรือ​ก่อน​ไป post คำ​ถาม​ใน​ฟอรัม/ถาม​เพื่อน​ร่วม​ทีม ให้​ผ่าน​ลำดับ​คร่าว ๆ นี้:

  1. ระบุ​แหล่ง​เอกสาร​ที่​ถูกต้อง — ตรวจ​ว่า​กำลัง​ดู official docs ของversion ที่​ใช้งาน​จริง อยู่​หรือ​เปล่า ผล​การ​ค้นหา​อันดับ​ต้น ๆ มัก​เป็น​เอกสาร version เก่า​ที่ index ไว้​นาน​แล้ว
  2. แยก​ประเภท​เอกสาร​ให้​ตรง​งาน — guide/tutorial เหมาะ​กับ​ตอน​เริ่มต้น​ทำความ​เข้าใจ​ภาพ​รวม ส่วน API reference เหมาะ​กับ​ตอน​ต้องการ signature parameter หรือ​พฤติกรรม edge case ที่​แม่นยำ
  3. ลงมือ​รัน code ตัวอย่าง​ก่อน แล้ว​ค่อย​อ่าน​คำ​อธิบาย — ประสบการณ์​ตรง​จาก​การ​รัน​จะ​ทำให้​คำ​อธิบาย​ที่​ตาม​มา​มี​ความหมาย​มากกว่า​อ่าน​ลอย ๆ
  4. ลอง​ทำให้​พัง — แก้ตัวอย่าง​ที่​ใช้งาน​ได้​ให้ error โดย​ตั้งใจ เพื่อ​เรียนรู้​ว่า error message แบบ​ไหน​สื่อ​ถึง​ปัญหา​อะไร วิธี​นี้​สร้าง​สัญชาตญาณ​สำหรับ​ตอน​เจอ​ปัญหา​จริง
  5. ถ้า​เอกสาร​ไม่มี​คำ​ตอบ ให้​อ่าน source code — โดย​เฉพาะ open-source library code จริง​คือ​ความ​จริง​สูงสุด (source of truth) เมื่อ​เอกสาร​ไม่​ครบ​หรือ​คลาดเคลื่อน
  6. จด​บันทึก​สิ่ง​ที่​ค้น​พบ — เก็บ link คำถาม​ที่​ยัง​ค้าง​คา และ insight ที่​ได้​ไว้​ใน note เพื่อ​ใช้​อ้างอิง​ใน​อนาคต​และ​ลด​การ​ค้น​ซ้ำ
  7. เมื่อ​ไป​ขอ​ความ​ช่วยเหลือ ให้​แสดง​ว่า​ได้​ลอง​อ่าน​มา​ก่อน​แล้ว — สรุป​ว่า​เอกสาร​ส่วน​ไหน​ที่​ดู​แล้ว​ยัง​ไม่​ชัด และ​ทำไม​มัน​ไม่​ตอบ​คำถาม​ที่​มี วิธี​นี้​ทั้ง​เคารพ​เวลา​คน​ที่​จะ​ช่วย และ​มักได้​คำ​ตอบ​ที่​ตรง​จุด​กว่า

ผัง​ด้าน​ล่าง​สรุป​ว่า​เมื่อไหร่​ควร​หยุด​ลอง​ผิด​ลอง​ถูก​แล้ว​หัน​ไป​อ่าน​คู่มือ​แทน

flowchart TD
    Stuck[เจอปัญหาหรือไม่แน่ใจวิธีใช้] --> Guess[ลองแก้แบบเดา 1 ถึง 2 รอบ]
    Guess --> Fixed{ปัญหาหายไหม}
    Fixed -->|หาย| Done[บันทึกสิ่งที่เรียนรู้แล้วไปต่อ]
    Fixed -->|ไม่หาย| Docs[เปิด official docs หรือ API reference]
    Docs --> Found{เจอคำตอบไหม}
    Found -->|เจอ| Apply[นำไปใช้และทดสอบยืนยัน]
    Found -->|ไม่เจอ| Source[อ่าน source code หรือ changelog]
    Source --> AskHelp[ถามทีมพร้อมสรุปว่าอ่านอะไรมาแล้วบ้าง]
    Apply --> Done

ตัวอย่าง​คลาสสิก​ใน​โลก .NET คือ​ปัญหา IDisposable ที่​ไม่​ได้​ถูก dispose อย่าง​ถูกต้อง นัก​พัฒนา​ที่​เจอ memory leak มัก​ลอง​สุ่ม​ใส่ GC.Collect() หรือ​แก้ try/catch ไป​เรื่อย ๆ โดย​ไม่​เข้าใจ​ต้นตอ ทั้ง​ที่ Microsoft Learn มี​เอกสาร​อธิบาย pattern Dispose ไว้​ชัดเจน​อยู่​แล้ว

// วิธีที่มักเจอจากการลองผิดลองถูก
// สร้าง connection แล้วลืมปิด เมื่อเจอปัญหาก็เพิ่ม catch ครอบไปเรื่อย ๆ
SqlConnection conn = new SqlConnection(connectionString);
conn.Open();
try
{
var command = new SqlCommand("SELECT * FROM Orders", conn);
command.ExecuteReader();
}
catch (Exception)
{
// กลืน exception ไว้เฉย ๆ เพราะไม่รู้ว่าเกิดอะไรขึ้นจริง ๆ
}
// ไม่มีการปิด connection เลย — leak แต่มองไม่เห็นทันที
// วิธีที่ได้จากการอ่านเอกสาร IDisposable และ using statement บน Microsoft Learn
using (var conn = new SqlConnection(connectionString))
{
conn.Open();
using var command = new SqlCommand("SELECT * FROM Orders", conn);
using var reader = command.ExecuteReader();
while (reader.Read())
{
// ประมวลผลแถวข้อมูล
}
} // Dispose ถูกเรียกอัตโนมัติแม้เกิด exception ระหว่างทาง

อีก​ตัวอย่าง​คือ​การ​ตั้ง​ค่า appsettings.json ผิดพลาด นัก​พัฒนา​มือใหม่​มัก​ลอง copy ตัวอย่าง config จาก block ต่าง ๆ มา​ต่อ​กัน​จนกว่า app จะ start ได้ แทนที่​จะ​เปิด​เอกสาร Configuration ของ ASP.NET Core ซึ่ง​อธิบาย​ลำดับ​ความ​สำคัญ​ของ​แหล่ง config (appsettings.jsonappsettings.{Environment}.json → environment variables → command-line args) ไว้​อย่าง​ชัดเจน การ​อ่าน​เอกสาร​ส่วน​นี้​ครั้ง​เดียว​ช่วย​ประหยัด​เวลา​แก้ config แบบ​เดา​มั่ว​ใน​ระยะ​ยาว​ได้​มาก

ประโยชน์

  • เร็ว​กว่า​ใน​ระยะ​ยาว — การ​ลอง​ผิด​ลอง​ถูก​อาจ​ได้​ผล​เร็ว​ใน​บาง​ครั้ง แต่​มัก​ไม่​สร้าง​ความ​เข้าใจ​ที่​ถ่ายทอด​ไป​ใช้​กับ​ปัญหา​อื่น​ได้ ขณะ​ที่​การ​อ่าน​เอกสาร​สร้าง mental model ที่​ใช้​ซ้ำ​ได้
  • เข้าใจ “ทำไม” ไม่ใช่​แค่ “ทำ​อย่างไร” — เอกสาร​มัก​อธิบาย design intent และ trade-off เบื้องหลัง ซึ่ง​ช่วย​ตัดสิน​ใจ​ได้​ดี​ขึ้น​ใน​สถานการณ์​ที่​ต่าง​ออก​ไป​เล็กน้อย
  • ลด​ความ​เสี่ยง​จาก snippet ที่​ล้าสมัย​หรือ​ไม่​ปลอดภัย — code ที่ copy จาก​ฟอรัม​เก่า​อาจ​ใช้ API version ที่ deprecated แล้ว หรือ​มี​ช่อง​โหว่​ด้าน security ที่​เอกสาร​ทางการ​เตือน​ไว้
  • เสริมสร้าง​นิสัย​การ​ค้นคว้า​ด้วย​ตนเอง (self-sufficiency) — ทีม​ที่​มี​นิสัย​นี้​พึ่งพา​การ​ถาม​คน​อื่น​น้อย​ลง และ​เมื่อ​ถาม​ก็​ถาม​คำถาม​ที่​มี​คุณภาพ​กว่า

ข้อ​ควร​ระวัง

  • เอกสาร​เอง​ก็​ไม่​สมบูรณ์​แบบ​เสมอ​ไป — บาง​เครื่องมือ​มี​เอกสาร​ที่​ล้าสมัย ไม่​ครบ หรือ​ผิดพลาด ใน​กรณี​นี้​การ​อ่าน source code หรือ​ทดลอง​รัน​จริง​ยัง​จำเป็นอยู่ อย่า​ยึด​ติด​กับ​เอกสาร​จน​ละเลย​พฤติกรรม​จริง
  • ห้าม​ใช้ RTFM เป็น​ข้อ​อ้าง​ใน​การ​ไม่​ช่วยเหลือ​คน​อื่น — คำ​นี้​มีชื่อเสียง​ใน​แง่​ลบ​เพราะ​ถูก​ใช้​แบบ​ดูถูก​ผู้​ถาม​ที่​เป็น​มือใหม่ วิธี​ที่​สร้างสรรค์​กว่า​คือ​ชี้​จุด​ใน​เอกสาร​ที่​ตอบ​คำถาม​นั้น​โดยตรง แทนที่​จะ​โยน​คำ​ว่า RTFM เฉย ๆ
  • บาง​ปัญหา​ก็​ไม่มี​เอกสาร​รองรับ — bug เฉพาะ environment หรือ interaction ระหว่าง library หลาย​ตัว​มัก​ไม่มี​ใคร​เขียน​คู่มือ​ไว้ กรณี​นี้​ต้อง debug และ​ทดลอง​ควบคู่​ไป​ด้วย
  • การ​อ่าน​เฉย ๆ โดย​ไม่​ลงมือ​ทำ​มัก​จำ​ไม่​ติด — เอกสาร​ที่​ดี​ควร​อ่าน​ควบคู่​กับ​การ​รัน code ตัวอย่าง​จริง ไม่ใช่​อ่าน​ผ่าน ๆ แล้ว​คาด​หวัง​ว่า​จะ​เข้าใจ​ลึกซึ้ง