Crafting Interpreters: หนังสือความยาว 640 หน้าที่เสร็จสมบูรณ์ในเวลา 15 เดือน
(journal.stuffwithstuff.com)หนังสือ 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 และบรรณาธิการก็ปรับตัวได้ดี
งานจัดหน้า
- ขั้นตอนการจัดหน้ามีดังนี้
- สร้างไฟล์ InDesign ใหม่สำหรับบทถัดไป
- export เป็น XML
- import XML เข้า InDesign
- ใช้สคริปต์ JS ดึง aside และแท็กตำแหน่งออกมา
- กำหนด anchor ให้กับองค์ประกอบ sidebar
- ปรับพื้นที่ว่างบริเวณท้ายหน้า
- ขั้นตอน 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 ความคิดเห็น
ความคิดเห็นจาก Hacker News
Crafting Interpretersมีหน้าเว็บที่ให้ทั้งลิงก์สำหรับซื้อหนังสือและลิงก์เวอร์ชันออนไลน์ฟรีWriting an Interpreter in Goแล้ว วางแผนจะอ่านหนังสือเล่มนี้เป็นเล่มถัดไปเกี่ยวกับ interpreter และชอบที่ความยาวประมาณ 200 หน้ากำลังพอดี