4 คะแนน โดย GN⁺ 2024-04-29 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

หนังสือ 640 หน้าที่เสร็จสมบูรณ์ในเวลา 15 เดือน

  • เมื่อวันที่ 29 กรกฎาคม 2021 ผู้เขียนได้ทำหนังสือ "Crafting Interpreters" เกี่ยวกับภาษาโปรแกรมเสร็จสมบูรณ์ เดิมเคยบอกว่าเสร็จเมื่อ 15 เดือนก่อน แต่ตอนนี้ถือว่าเสร็จจริงแล้ว ทั้งฉบับพิมพ์, e-book และ PDF พร้อมจำหน่ายทั้งหมดแล้ว
  • หนังสือมีความยาว 640 หน้า ขนาดกว้าง 8 นิ้ว สูง 10 นิ้ว กลายเป็นหนังสือที่ใหญ่กว่าที่คาดไว้มาก

พัฒนาระบบบิลด์ใหม่

  • หลังพักประมาณหนึ่งเดือนก็กลับมาเริ่มงานอีกครั้ง แก้คำผิดและข้อผิดพลาดต่าง ๆ ที่ผู้อ่านแจ้งเข้ามา
  • โดยไม่มีเหตุผลพิเศษอะไร ผู้เขียนได้เขียนระบบบิลด์ของหนังสือใหม่ด้วย Dart ของเดิมที่ทำด้วย Python นั้นช้าเกินไปและดูแลรักษายาก
  • ระบบบิลด์ใหม่นี้สร้าง HTML และโค้ดที่ทำ syntax highlighting ได้ตรงตามต้องการ และเร็วกว่าเวอร์ชัน Python เดิมถึง 10 เท่า
  • ยังทำให้ควบคุมการประมวลผล Markdown ได้ดีขึ้นด้วย แม้ตอนนั้นจะเป็นงานที่ทำเพราะความสนุกมากกว่า

การออกแบบหนังสือ

  • โปรเจกต์ออกแบบกราฟิกขนาดใหญ่มีลักษณะทำงานสองขั้นเหมือนกับงานเว็บหรือการเขียนเกม คือเริ่มจากตั้งค่า "framework" หรือ "engine" ก่อน แล้วค่อยใส่เนื้อหาลงไปในโครงนั้น
  • ใน Adobe InDesign จะต้องกำหนดสไตล์และ master โดย master ใช้กำหนดระยะขอบและเส้นกริดของหน้า ส่วนสไตล์ก็เหมือน CSS ที่ใช้กำหนดฟอนต์ รูปแบบ และสีให้กับข้อความหรืออ็อบเจ็กต์บางประเภท
  • การออกแบบหนังสือเป็นงานในพื้นที่ 2 มิติอย่างแท้จริง ทำให้ทั้งแนวนอนและแนวตั้งต่างก็เป็นงานที่ไม่ง่าย

การตัดสินใจเรื่องความกว้างและความสูง

  • คอลัมน์ข้อความหลักต้องกว้างพอจะรองรับบรรทัดโค้ดที่ยาวที่สุดได้ ส่วน aside ต้องถูกวางไว้ข้างประโยคเฉพาะ จึงต้องการพื้นที่เพิ่ม
  • สุดท้ายจึงตัดสินใจใช้เมตริกหน้ากระดาษกว้าง 8 นิ้ว และเลือกความสูง 10 นิ้วเพราะข้อจำกัดของขนาดที่ผู้ให้บริการ POD (Publish on Demand) รองรับ
  • โดยรวมแล้วหนังสือมีขนาดใหญ่ แต่หวังว่าจะไม่ใหญ่จนเกินไป ถ้าเขียนหนังสืออีกครั้ง ผู้เขียนตั้งใจว่าจะทำให้เล็กกว่านี้

การจัดการ XML

  • InDesign รองรับการ import XML และสามารถใช้สไตล์กับแท็กบางชนิดได้โดยอัตโนมัติ
  • เพราะควบคุมการประมวลผล Markdown ได้อย่างสมบูรณ์ จึงสามารถสร้าง XML ที่ปรับให้เหมาะกับ InDesign ได้โดยตรง

JavaScript ใน InDesign

  • การ import XML อย่างเดียวมีข้อจำกัด เพราะ aside และตัวระบุตำแหน่งของโค้ดต้องถูกดึงออกจากเนื้อหาหลักแล้ววางไว้ด้านข้าง
  • InDesign รองรับการเขียนสคริปต์ด้วย JavaScript แต่ไม่มี debugger หรือ stack trace อะไรแบบนั้น มีเพียง alert() เท่านั้น
  • แม้จะเขียนสคริปต์ที่ดึง aside และแท็กตำแหน่งออกมาสร้างเป็นกล่องข้อความแยกได้สำเร็จ แต่ก็ยังระบุตำแหน่งให้แม่นยำไม่ได้ จึงแก้ปัญหาได้บางส่วนด้วยฟีเจอร์ anchor ของ InDesign

งานบรรณาธิการ

  • ผู้เขียนอ่านหนังสือทั้งหมดอีกครั้งเพื่อแก้ไข และพบว่าตัวเองเล่นมุกเดิมซ้ำอยู่หลายครั้ง ขั้นตอนนี้ใช้เวลา 5 เดือน
  • ยังจ้างบรรณาธิการตรวจแก้มืออาชีพด้วย แม้โลกงานบรรณาธิการจะนิยมใช้ Word แต่ผู้เขียนยังยึด plain text และ Git และบรรณาธิการก็ปรับตัวได้ดี

งานจัดหน้า

  • ขั้นตอนการจัดหน้ามีดังนี้
    1. สร้างไฟล์ InDesign ใหม่สำหรับบทถัดไป
    2. export เป็น XML
    3. import XML เข้า InDesign
    4. ใช้สคริปต์ JS ดึง aside และแท็กตำแหน่งออกมา
    5. กำหนด anchor ให้กับองค์ประกอบ sidebar
    6. ปรับพื้นที่ว่างบริเวณท้ายหน้า
  • ขั้นตอน 1~5 นั้นง่าย แต่ขั้นตอนที่ 6 ยากที่สุด
  • ต้องไม่ให้ภาพถูกตัดหรือให้ aside ไหลไปหน้าถัดไป และถ้าเป็นไปได้ก็ไม่ควรให้โค้ดถูกตัดกลางหน้า ต้องหลีกเลี่ยงการจบหน้าทันทีหลังหัวข้อโดยไม่มีเนื้อหา และการหลีกเลี่ยง widow/orphan ก็สำคัญเช่นกัน
  • การใช้กฎเหล่านี้กับหน้าทั้งหมดถึง 630 หน้าไม่ใช่เรื่องง่าย

ภาพประกอบ

  • ภาพประกอบค่อนข้างง่าย เพราะเป็นภาพขาวดำที่วาดด้วยปากกา จึงเหมาะกับการพิมพ์
  • แต่การวางลงบนหน้าเป็นอีกเรื่องหนึ่ง เพราะเนื้อหาในหนังสือเขียนให้มีการอ้างอิงภาพประกอบโดยตรง ภาพจึงต้องอยู่ใกล้กับตำแหน่งที่มีการกล่าวถึง ดังนั้นจึงต้องปรับด้วยมือเพื่อให้ภาพประกอบ โค้ด และเนื้อหาหลักวางตัวได้ดีตลอด 630 หน้า

งานส่วนต้นและส่วนท้าย

  • ผู้เขียนเพิ่งรู้เป็นครั้งแรกว่ามีอาชีพนักทำดัชนีโดยเฉพาะ ส่วนตัวจึงทำดัชนีเอง ใช้เวลานาน 2 สัปดาห์
  • ส่วนต้นของหนังสือใส่ชื่อเรื่อง ลิขสิทธิ์ คำอุทิศ และคำขอบคุณ แล้วให้ InDesign สร้างสารบัญให้อัตโนมัติ เมื่อถึงจุดนี้ภายในเล่มก็ถือว่าเสร็จสมบูรณ์ในที่สุด

การออกแบบปก

  • ปกหนังสือเป็นสิ่งสำคัญ หนังสือเล่มนี้มีเอกลักษณ์คือภาพประกอบลายเส้นปากกา จึงตัดสินใจนำจุดนั้นมาใช้
  • ผู้เขียนวาดภาพภูเขาที่ใช้เป็นอุปมาเรื่องการปีนให้ใหญ่ขึ้นและมีรายละเอียดมากขึ้น พร้อมทั้งเขียนชื่อหนังสือใหม่ด้วยลายมือของตัวเอง
  • ใช้โทนสีที่ให้ความรู้สึกเหมือนคู่มือลูกเสือในยุค 1950

ตรวจทานปรู๊ฟ

  • เมื่อสั่งปรู๊ฟจาก POD จึงรับรู้ขนาดของหนังสือได้อย่างชัดเจนเป็นครั้งแรก และสัมผัสได้ถึงปริมาณงานที่สั่งสมมานาน
  • แต่ก็ยังไม่ถือว่าจบ เพราะงานจัดหน้าหลายส่วนทำด้วยมือ จึงอาจมีข้อผิดพลาดและต้องอ่านตรวจอีกครั้ง
  • แม้อัปโหลดไฟล์ InDesign ขึ้น Git แล้ว แต่เพราะเป็นไฟล์ไบนารีจึงดูการเปลี่ยนแปลงได้ยาก
  • เพื่อเปรียบเทียบปรู๊ฟกับการเปลี่ยนแปลง ผู้เขียนใช้สคริปต์ Dart สร้าง PDF ออกมาเป็นภาพทีละหน้า แล้วใช้ Photoshop action วาดกรอบสีแดงรอบส่วนที่มีพิกเซลต่างกัน
  • การยืนยันด้วยการเขียนโปรแกรมได้ว่ามีเพียงการเปลี่ยนแปลงที่ตั้งใจไว้เท่านั้น ช่วยให้สบายใจขึ้นมาก

การทำ E-book

  • ผู้เขียนใช้ระบบบิลด์สร้างทั้ง XHTML และเมตาดาต้าที่ EPUB ต้องใช้ครบถ้วน แล้วทดสอบบนเครื่องอ่านหลายแบบพร้อมปรับ CSS ไปด้วย

ความเห็นของ GN⁺

  • การทำหนังสือความยาวถึง 640 หน้าให้เสร็จสมบูรณ์หลังการเดินทางอันยาวนาน 6 ปีถือเป็นความสำเร็จที่น่าทึ่ง ระหว่างกระบวนการเขียนยังลงมือพัฒนาระบบบิลด์ด้วย Dart เอง และสร้างสคริปต์สำหรับ InDesign เพื่อจัดหน้าอีกด้วย ซึ่งเป็นเรื่องที่น่าสนใจมาก

  • โดยเฉพาะช่วงตรวจปรู๊ฟที่ผู้เขียนสร้างสคริปต์เปรียบเทียบ PDF เพื่อตรวจสอบการเปลี่ยนแปลงนั้นน่าทึ่งมาก ดูเหมือนว่าการทำ self-publishing ด้วยตัวเองจำเป็นต้องมีทั้งไอเดียและพลังในการลงมือทำระดับนี้

  • อย่างไรก็ตาม ด้วยขนาดหน้ากระดาษที่ตั้งเป้าไว้ค่อนข้างใหญ่ งานจัดหน้าจึงไม่ง่าย และยังมีข้อจำกัดด้านการเลือกขนาดจากฝั่งโรงพิมพ์ด้วย ซึ่งน่าเสียดายอยู่บ้าง งานเล่มถัดไปน่าจะเหมาะกว่าหากเลือกขนาดที่เป็นมิตรกับการพิมพ์มากขึ้น

  • อย่างที่ผู้เขียนกล่าวไว้ หนังสืออธิบายภาษาโปรแกรมอาจไม่ได้ขายดีขึ้นเพราะการออกแบบปกเพียงอย่างเดียว แต่ปกที่มีเอกลักษณ์และสะท้อนลักษณะของเนื้อหาแบบคอนเซปต์ของหนังสือเล่มนี้ ก็อาจกลายเป็นจุดเด่นที่สะดุดตาได้เช่นกัน

  • การที่ผู้เขียนใช้เวลาถึง 6 ปีเขียนหนังสือเล่มนี้ในช่วงเวลาว่าง แสดงให้เห็นถึงความหลงใหลและความมุ่งมั่นที่น่ายกย่อง ตอนนี้ก็เหลือเพียงรอดูว่าผู้อ่านจะตอบรับหนังสือเล่มนี้มากแค่ไหน และจะมีฟีดแบ็กแบบใดกลับมา แต่ชัดเจนว่าเล่มนี้น่าจะเป็นประโยชน์ต่อคนจำนวนมากที่ต้องการเรียนรู้ภาษาโปรแกรม

1 ความคิดเห็น

 
GN⁺ 2024-04-29
ความคิดเห็นจาก Hacker News
  • Crafting Interpreters มีหน้าเว็บที่ให้ทั้งลิงก์สำหรับซื้อหนังสือและลิงก์เวอร์ชันออนไลน์ฟรี
  • ด้วยความใส่ใจอย่างพิถีพิถันของ Nystrom ที่มีต่อการออกแบบฉบับเล่มจริง ภาพประกอบวาดมือ และงานเขียนอันยอดเยี่ยม ทำให้หนังสือเล่มนี้ดีกว่าหนังสือเทคนิค 99% และคุ้มค่าที่จะซื้อ
  • เริ่มศึกษาจากหนังสือเล่มนี้ตั้งแต่ปี 2017 และเมื่ออ่านครึ่งแรกจบก็เข้าใจ tokenizer/lexer/parser/interpreter ได้อย่างชัดเจนขึ้น ซึ่งเป็นผลจากงานเขียนอันยอดเยี่ยมของ Nystrom และความเข้าใจอย่างลึกซึ้งในหัวข้อนี้
  • ไม่เคยรู้มาก่อนว่าผู้เขียนตัดสินใจทำเป็นหนังสือฉบับพิมพ์ แม้จะไม่ใช่วิธีเรียนรู้ที่เหมาะกับตัวเองที่สุด แต่ก็อยากซื้อไว้สะสมและเพื่อสนับสนุนผู้เขียน
  • เป็นหนึ่งในหนังสือเทคนิคที่ดีที่สุดเท่าที่เคยอ่านมา อ่านแล้วได้เรียนรู้อย่างมากและสนุกจริง ๆ นอกจากเนื้อหาทางเทคนิคที่ยอดเยี่ยมแล้ว งานเขียนยังดี มีไหวพริบ และภาพประกอบก็วาดได้อย่างดี
  • วิสัยทัศน์ที่จะให้แต่ละบทลงท้ายด้วยโค้ดที่ค่อย ๆ พัฒนาและโปรแกรมที่รันได้จริงนั้นน่าประทับใจมาก และขอชื่นชมที่ผู้เขียนทำได้สำเร็จ ข้ามส่วน tree-walking interpreter ไป และได้เรียนรู้อีกมากจากส่วน bytecode interpreter ที่เขียนด้วย C
  • มีคอมเมนต์หนึ่งพูดติดตลกว่าใช้เวลา 15 เดือนกว่าจะอ่านหนังสือจบ พร้อมทั้งขอบคุณและแสดงความยินดีกับความทุ่มเทของผู้เขียน หนังสือเล่มนี้ไม่เพียงลุ่มลึกในเชิงเทคนิคด้านภาษา แต่ยังใส่ใจรายละเอียดเล็ก ๆ ของเลย์เอาต์และกราฟิกจนทำให้ผู้อ่านดื่มด่ำ และน่าจะเป็นหนังสือที่มีความหมายไปอีกนาน
  • รู้สึกผูกพันกับหนังสือเล่มนี้มากถึงขั้นนำสิ่งที่เรียนรู้จากการอ่านมาสร้างหน้า https://hexmos.com/compiler ด้วยตัวเอง
  • น่าลองฟังบทสัมภาษณ์กับ Bob ผู้เขียน (https://corecursive.com/032-bob-nystrom-on-building-an-interpreter/)
  • ประทับใจที่ผู้เขียนเป็นวิศวกรคอมไพเลอร์ที่มีพื้นฐานมาจากกราฟิกดีไซเนอร์
  • หลังจากอ่าน Writing an Interpreter in Go แล้ว วางแผนจะอ่านหนังสือเล่มนี้เป็นเล่มถัดไปเกี่ยวกับ interpreter และชอบที่ความยาวประมาณ 200 หน้ากำลังพอดี
  • (คอมเมนต์ปี 2021) บอกว่าเป็นหนังสือที่ยอดเยี่ยมและอ่านแล้วสนุกมาก