ในโลกของการสัมภาษณ์โปรแกรมเมอร์ ผู้สมัครมักต้องเผชิญกับโจทย์อัลกอริทึมที่ท้าทาย แต่เรื่องราวสมมติล่าสุดหนึ่งได้ดึงดูดความสนใจจากชุมชนโปรแกรมเมอร์ ด้วยการนำแบบทดสอบ FizzBuzz แบบคลาสสิกไปสู่ขีดสุดทางตรรกะ นั่นคือการนำไปใช้งานทั้งหมดโดยใช้ แลมบ์ดา แคลคูลัส และ คอมบินาเตอร์ลอจิก
เรื่องราวติดตามการสัมภาษณ์โปรแกรมเมอร์กับผู้สัมภาษณ์ชื่อ Deno โดยสิ่งที่เริ่มต้นจากการเขียนโปรแกรม FizzBuzz แบบมาตรฐาน ได้กลายเป็นการดำดิ่งสู่แนวคิดพื้นฐานของวิทยาศาสตร์คอมพิวเตอร์อย่างรวดเร็ว แทนที่จะเขียน JavaScript แบบปกติทั่วไป ผู้สมัครได้สร้างพื้นฐานการเขียนโปรแกรมขึ้นจากหลักการแรกเริ่ม เริ่มจากฟังก์ชัน แลมบ์ดา พื้นฐาน แล้วค่อยๆ สร้าง ตัวเลขเชิร์ช (Church numerals), ตัวดำเนินการทางตรรกะ และแม้แต่ฟังก์ชันเรียกซ้ำโดยใช้ วาย คอมบินาเตอร์ (Y combinator)
แนวคิดหลักของ Combinatory Logic ที่กล่าวถึง:
- Church numerals: การแทนค่าจำนวนธรรมชาติโดยใช้ฟังก์ชันเพียงอย่างเดียว
- Y combinator: Fixed-point combinator ที่ช่วยให้สามารถทำ recursion ใน lambda calculus ได้
- S และ K combinators: Combinator พื้นฐานสองตัวที่เพียงพอสำหรับการคำนวณแบบ Turing-complete
- Currying: เทคนิคการแปลงฟังก์ชันที่รับหลายอาร์กิวเมนต์ให้กลายเป็นลำดับของฟังก์ชันที่รับอาร์กิวเมนต์เดียว
เมื่อการสัมภาษณ์โปรแกรมมิ่งเดินสายทฤษฎี
ปฏิกิริยาจากชุมชนมีความหลากหลาย โดยบางท่านประทับใจกับความลึกของเนื้อหาทางเทคนิค ในขณะที่บางท่านสับสนกับความเกี่ยวข้องในทางปฏิบัติ ผู้แสดงความคิดเห็นหนึ่งระบุว่ามันคล้ายคลึงกับซีรีส์ของ Aphyr เรื่อง Rewriting the Technical Interview ขณะที่อีกท่านกล่าวว่า ส่วนที่ชอบที่สุดของเรื่องทั้งหมดคือตอนที่การเน้นไวยากรณ์ (syntax highlighting) ล้มเหลวระหว่างที่ฉันเลื่อนหน้าลงมา
บทความนี้แสดงให้เห็นว่าแม้แต่ปัญหาการเขียนโปรแกรมง่ายๆ ก็สามารถแก้ไขได้โดยใช้เพียงองค์ประกอบพื้นฐานที่สุดของการคำนวณ ผู้สมัครสร้างทุกอย่างขึ้นมา ตั้งแต่ตรรกะบูลีนไปจนถึงการดำเนินการทางคณิตศาสตร์ โดยใช้เพียงการประยุกต์ใช้ฟังก์ชัน (function application) แสดงให้เห็นว่าระบบที่ซับซ้อนสามารถเกิดขึ้นได้จากกฎเกณฑ์ง่ายๆ
อันที่จริง คอมบินาเตอร์ลอจิก มักจะมีความยุ่งเหยิงมากกว่า แลมบ์ดา แคลคูลัส โดยทั่วไปแล้วต้องการบิตมากกว่าเพื่อแสดงโปรแกรมเดียวกัน
แนวทางนี้เน้นย้ำถึงรากฐานทางทฤษฎีของวิทยาศาสตร์คอมพิวเตอร์ ซึ่งระบบที่สมบูรณ์แบบทัวริง (Turing-complete) สามารถสร้างขึ้นจากส่วนประกอบที่เรียบง่ายอย่างน่าประหลาด การสัมภาษณ์กลายเป็นการเดินทางผ่านทฤษฎีการคำนวณ โดยมีปัญหา FizzBuzz ง่ายๆ เป็นตัวพาเราไปสำรวจแนวคิดอันลึกซึ้ง
ปฏิกิริยาที่แตกแยกของชุมชน
ผู้ที่ชื่นชอบการเขียนโปรแกรมได้แสดงทั้งความชื่นชมและความสงสัยเกี่ยวกับแนวทางนี้ บางคนมองว่ามันเป็นการฝึกฝนทางปัญญาที่น่าประทับใจ ซึ่งแสดงถึงความเข้าใจอย่างลึกซึ้งในพื้นฐานวิทยาศาสตร์คอมพิวเตอร์ ในขณะที่บางคนตั้งคำถามถึงคุณค่าในทางปฏิบัติสำหรับการสัมภาษณ์โปรแกรมเมอร์ในโลกจริง
ผู้แสดงความคิดเห็นหลายท่านชี้ให้เห็นถึงรายละเอียดปลีกย่อยทางเทคนิค เช่น ภาษาที่ใช้การประเมินค่าแบบกระตือรือร้น (eager evaluation) อย่าง JavaScript ยังสามารถนำ วาย คอมบินาเตอร์ ไปใช้ผ่านเทคนิคการห่อหุ้มด้วย แลมบ์ดา ได้ การอภิปรายเผยให้เห็นว่าแม้แต่โปรแกรมเมอร์ที่มีประสบการณ์ก็ยังสามารถเรียนรู้มุมมองใหม่ๆ จากการสำรวจทางทฤษฎีเหล่านี้ได้
สไตล์การเขียนที่ไม่ธรรมดาของบทความ ซึ่งผสมผสานเนื้อหาทางเทคนิคเข้ากับองค์ประกอบการเล่าเรื่อง ก็ดึงดูดความสนใจเช่นกัน บางผู้อ่านพบว่าแนวทางการเล่าแบบขำขันและสตรีมออฟคอนเชียสเนส (stream-of-consciousness) นั้นน่าสนใจ ในขณะที่บางคนรู้สึกว่ามันทำให้เนื้อหาทางเทคนิคเข้าใจได้ยากขึ้น
แหล่งเรียนรู้ที่แนะนำ:
- To Mock a Mockingbird โดย Raymond Smullyan
- Programming with Nothing โดย Tom Stuart
- JavaScript Binary Lambda Calculus interpreter (github.com/tromp/AIT)
ก้าวข้ามเวทมนตร์ทางเทคนิค
สิ่งที่ทำให้เรื่องเล่านี้มีความน่าสนใจเป็นพิเศษคือการที่มันสะท้อนถึงบทสนทนาที่กว้างขึ้นในชุมชนโปรแกรมเมอร์เกี่ยวกับแนวปฏิบัติการสัมภาษณ์ และความสมดุลระหว่างความรู้ทางทฤษฎีกับทักษะปฏิบัติ แม้งานโปรแกรมเมอร์ส่วนใหญ่ในโลกจริงจะไม่ต้องการให้เขียน FizzBuzz โดยใช้ ตัวเลขเชิร์ช แต่การเข้าใจแนวคิดพื้นฐานเหล่านี้สามารถให้ข้อมูลเชิงลึกที่มีค่าเกี่ยวกับการทำงานของภาษาโปรแกรมมิ่งในระดับแกนกลางได้
การอภิปรายในชุมชนยังกล่าวถึงคุณค่าทางการศึกษาของแบบฝึกหัดดังกล่าวด้วย ดังที่ผู้แสดงความคิดเห็นหนึ่งถามเกี่ยวกับการเรียนรู้ คอมบินาเตอร์ลอจิก ว่า: มันมีประโยชน์ในทางใดบ้างหรือไม่? หรือมันเป็นเพียงเรื่องน่าสนใจชั่วคราว? มันช่วยพัฒนาการคิดของคุณหรือไม่? คำถามเหล่านี้เข้าถึงหัวใจของเหตุผลที่โปรแกรมเมอร์อาจลงทุนเวลาเพื่อทำความเข้าใจแนวคิดเชิงนามธรรมเหล่านี้
บทความสรุปโดยอ้างอิงถึงแหล่งข้อมูลเช่นหนังสือ To Mock a Mockingbird โดย Raymond Smullyan และ Programming with Nothing โดย Tom Stuart ชี้ให้เห็นว่าสำหรับผู้ที่สนใจจะดำดิ่งลึกลงไป การเดินทาง才刚刚เริ่มต้น ไม่ว่าจะถูกมองว่าเป็นความอยากรู้อยากเห็นทางปัญญาล้วนๆ หรือเป็นการฝึกฝนจิตใจที่มีค่า แนวทางสุดขั้วต่อ FizzBuzz นี้ได้จุดประกายการสนทนาเกี่ยวกับความหมายของการเข้าใจพื้นฐานการเขียนโปรแกรมอย่างแท้จริงอย่างแน่นอน
อ้างอิง: Programming With Less Than Nothing
