กว่าสองทศวรรษนับจากวันที่ก้าวพ้นออกจากรั้วมหาวิทยาลัย สลัดชีวิต ‘นักศึกษา’ อย่างเป็นทางการ ทักษะหนึ่งที่ผู้เขียนนึกเสียดายตลอดมาว่าไม่ได้เรียนในมหาวิทยาลัย คือ การเขียนโค้ดคอมพิวเตอร์ (จริงๆ ก็เคยไปนั่งวิชาเขียนโค้ดพื้นฐานอยู่นานสามสัปดาห์ แต่ต้องตัดใจดรอปเพราะอาจารย์ให้การบ้านบานตะไท สุ่มเสี่ยงจะไม่มีเวลาทำการบ้านเศรษฐศาสตร์และปรัชญา สองวิชาเอกที่เลือกเรียน)
ครั้นพอเข้าสู่โลกแห่งการทำงาน แต่ยังพิสมัยการเขียนโค้ดและชอบเล่นเกม ผู้เขียนจึงลงเอยด้วยการเล่นเกมเกี่ยวกับการเขียนโค้ด ซึ่งตลอดระยะเวลาสองทศวรรษที่ผ่านมา ก็ไม่เห็นค่ายเกมค่ายไหนผลิตเกมแนวนี้ที่ชัดเจนและเจ๋งขึ้นเรื่อยๆ เท่ากับ Zachtronics ค่ายเกมอินดี้จากสหรัฐอเมริกา ซึ่งเรียกแนวเกมของตัวเองว่า ‘ปริศนาวิศวกรรม’ หรือ engineering puzzles
EXAPUNKS เกมใหม่ล่าสุด (ตุลาคม 2018) จากค่ายนี้เป็นเกมเขียนโค้ดที่สนุกและรื่นรมย์ที่สุดเท่าที่เคยเล่น (หมายเหตุเล็กน้อยว่า ‘สนุก’ ในที่นี้หมายถึง “ทึ้งผมเป็นครั้งคราวด้วยความเซ็งว่าอะไรมันจะยากขนาดนี้ แต่ก็หยุดเล่นไม่ได้” ไม่ใช่ “หัวเราะเฮฮาปาจิงโกะหยุดขำไม่ได้”)
ถ้าเทียบ EXAPUNKS กับเกมก่อนๆ จากค่ายเดียวกัน เกมนี้ระดับความยากสูงกว่า SpaceChem และ Opus Magnum (เกมที่เล่นง่ายที่สุดจากค่ายนี้) เล็กน้อย ยากกว่า Infinifactory (ซึ่งผู้เขียนคิดว่าง่ายเกินไปหน่อย) หลายเท่า แต่ง่ายกว่า TIS-100และ Shenzhen I/O มาก (สองเกมหลังนี้ ใครที่ไม่เคยเรียนวิชาเขียนโค้ดมาก่อนอย่างผู้เขียนจะพบว่ายากมากจนต้องกราบลาหลังจากมะงุมมะงาหราไปครึ่งชั่วโมง)
EXAPUNKS ให้เราเขียนโค้ดในภาษา assembly เฉพาะของเกม เรียกว่า EXA ซึ่งก็เป็นชื่อโปรแกรมหรือหุ่นยนต์จิ๋วในเกมด้วย นับเป็นครั้งแรกของเกมจากค่ายนี้ที่มี ‘เนื้อเรื่อง’ น่าติดตาม โดยจะค่อยๆ เผยเหตุการณ์ออกมาทีละนิด เราเป็นอดีตแฮกเกอร์ในโลกดิสโทเปียปี 1997 โลกที่คอมพิวเตอร์บริหารจัดการทุกอย่างแทนคน ประชากรจำนวนมากรวมทั้งเราด้วยป่วยเป็น ‘เฟจ’ (phage)โรคร้ายที่ค่อยๆ เปลี่ยนผิวหนังเป็นไมโครชิพไร้ประโยชน์ เหมือนไซบอร์กบุโรทั่ง โรคนี้มียารักษาแต่ราคาแพงมาก ($700 ต่อวัน!) ทางเดียวที่จะหาเงินมาซื้อยาได้คือยอมรับงานแฮกเครือข่ายต่างๆ จากโปรแกรมปริศนาที่ใช้หน้าผู้หญิง จู่ๆ เธอก็ติดต่อเรามา และรู้ว่าเราร้อนเงิน งานเหล่านี้มีความหลากหลายค่อนข้างมาก ตั้งแต่การทำให้ตู้กดเงินหรือเอทีเอ็มพ่นเงินสดออกมาฟรีๆ สร้างไฟล์บนคอมพิวเตอร์เป้าหมาย และอื่นๆ อีกมากมาย งานแต่ละชิ้นยากกว่าชิ้นก่อนหน้าเล็กน้อย เป็นวิธีสอนการเขียนโค้ดอย่างค่อยเป็นค่อยไป
โหมดสอนหรือ tutorial ในเกมนี้ซึ่งมาในรูปงานแฮกเลเวลแรกๆ ทำได้ค่อนข้างดี แต่ก็จงใจสอนเราไม่หมด มีฟังก์ชั่นบางตัวที่เราต้องค้นหาให้เจอเอง และฟังก์ชั่นเหล่านั้นก็สำคัญสำหรับการแก้ปริศนาโดยเฉพาะในเลเวลหลังๆ
การหวนคืนสู่สังเวียนแฮกของเราเริ่มต้นเมื่อ กาสท์ (Ghast) เพื่อนแฮกเกอร์ เคาะประตูมอบนิตยสารชื่อ Trash World News ให้ นิตยสารนี้ในเกมเป็นทั้งคู่มือการเล่น คำอธิบายมิติต่างๆ ของโลกดิสโทเปียในเกม และวิธีขับเคลื่อนเส้นเรื่องไปข้างหน้า ที่เจ๋งกว่านั้นคือนิตยสารมาในรูปไฟล์ PDF ซึ่งเราจะปริ้นท์มันออกมาจริงๆ ก็ได้ (เกมแนะนำให้ทำอย่างนั้น) เพื่อเพิ่มความสมจริงและเสริมบรรยากาศการแฮกในเกม
ผู้เขียนพบว่าการปรินต์ Trash World News ออกมาจริงๆ นั้นไม่เพียงแต่ทำให้การเล่นเกมนี้รื่นรมย์กว่าเดิมและทำให้เรา ‘อิน’ กับบทบาทแฮกเกอร์มากขึ้น แต่ยังช่วยให้เราพลิกหาคำอธิบายคำสั่งและฟังก์ชั่นต่างๆ ของภาษา EXA ในเกม (และควานหาโค้ดจำเป็นที่ถูกซ่อนไว้ในเล่ม) ได้อย่างง่ายดายกว่าอ่านในหน้าจอมาก อีกทั้งเนื้อหาในคอลัมน์ (ปลอม) ทั้งหมดก็ล้วนอ่านสนุก เติมรายละเอียดให้กับโลกในเกม และการเฝ้ารอ Trash World News เล่มใหม่ๆ ซึ่งจะปลดล็อกดาวน์โหลดได้เมื่อเราแก้ปริศนาไปถึงจุดหนึ่ง ก็ช่วยเพิ่มแรงจูงใจให้อยากโค้ดแก้ปริศนาไปเรื่อยๆ
แซค บาร์ธ (Zach Barth) ผู้ก่อตั้งค่ายเกม Zachtronicsและดีไซเนอร์ของเกมนี้ บอกว่าเขาโตมากับการอ่านนิตยสารแฮกกิ้งชื่อ 2600 และชอบซื้อคอมพิวเตอร์มือสองตามงานขายของเก่า เขาลงทุนบินไปร่วม DEFCON – งานประชุมประจำปีของเหล่าแฮกเกอร์ทั่วโลก เพื่อหาข้อมูลประกอบการออกแบบ EXAPUNKS
EXA ในเกมหมายถึงภาษาคอมพิวเตอร์ที่เราใช้เขียนโค้ด และโปรแกรมที่ทำตามชุดคำสั่งของเรา ซึ่งแสดงในเกมด้วยรูปฝูงหุ่นยนต์จิ๋ว วิ่งแบกโค้ดหลายบรรทัดไปวิ่งมาข้ามเครือข่ายคอมพิวเตอร์ เราจะสร้างและจัดการเหล่า EXA จิ๋วเหล่านี้ในพื้นที่สองมิติ โดยเขียนชุดคำสั่งให้มัน ยกตัวอย่างเช่น สมมติว่ามีคอมพิวเตอร์สองเครื่อง แสดงในเกมด้วยภาพแท่งลายสองแท่ง แต่ละแท่งติดชื่อ 400 เครื่องแรกมีไฟล์ชื่อ 100 ส่วนเครื่องที่สองไม่มี โจทย์ของเราคือต้องย้ายไฟล์จากเครื่องแรกไปยังเครื่องที่สอง ดังนั้นเราจะต้องเขียนโปรแกรมสั่งให้ EXA หยิบไฟล์ วิ่งไปยังคอมพิวเตอร์เครื่องที่สอง และหยุด เราสามารถเขียนโค้ดว่า
GRAB 100
LINK 400
DROP
HALT
เมื่อเรารันโปรแกรม หุ่นจิ๋ว EXA ก็จะหยิบไฟล์ เชื่อมเครื่องคอมพิวเตอร์สองเครื่อง (สลับไปหาเครื่องที่สอง) ปล่อยไฟล์ แล้วก็หยุดทำงาน จากคำสั่งง่ายๆ ทำนองนี้ ไม่นานเราจะได้จัดการกับ EXA คราวละมากกว่าหนึ่งตัว เขียนโค้ดที่มีเงื่อนไข อาทิ IF/THEN และจากนั้นเกมก็จะค่อยๆ ทวีความซับซ้อน และเมื่อใดที่ฝูง EXA ของเราทำงานเข้าขากันอย่างที่ต้องการ ด้วยโค้ดที่ดูสง่างามเรียบง่าย กินเนื้อที่ไม่กี่บรรทัด เมื่อนั้นเราก็จะรู้สึกเสมือนเป็นคนที่ฉลาดที่สุดในโลก
นี่เอง ความเบิกบานของการโค้ด
บาร์ธบอกว่าเขากับทีมนำแรงบันดาลใจหลายอย่างมาจากโลกแห่งความจริง ในการสร้างโลกในจินตนาการของ EXAPUNKS และออกแบบภาษา EXA ยกตัวอย่างเช่น เขาผสมผสานระหว่างแนวคิดของภาษา Java ซึ่งใช้ได้ข้ามแพลตฟอร์มทุกยี่ห้อ เข้ากับแนวคิดการเขียนโค้ดแบบ UNIX อย่างเช่นไฟล์ ท่อ (pipes) และแพร่งการทำงาน (processing forks) ตลอดจนแนวคิดของคอมพิวเตอร์ในยุค x86 อย่างเช่นคำสั่งทดสอบ (test instructions) ที่ให้ตั้ง ‘ธง’ (flags) และกระโดดตามเงื่อนไข
ส่วนฝูงโปรแกรม EXA ในรูปหุ่นยนต์จิ๋วที่วิ่งไปมาระหว่างเครือข่ายนั้น บาร์ธบอกว่ามาจากแพลตฟอร์มในโลกจริงชื่อ Magic Cap ซึ่งถูกพัฒนาโดยบริษัทชื่อ General Magic ก่อตั้งโดยโปรแกรมเมอร์กลุ่มหนึ่งที่เคยทำงานกับแอปเปิ้ล ใน Magic Cap โปรแกรมเมอร์สามารถเขียนโปรแกรมในภาษาเวอร์ชวลคล้าย Java แล้วโปรแกรมเหล่านั้นก็สามารถวิ่งระหว่างคอมพิวเตอร์ได้อย่างราบรื่น บาร์ธบอกว่า โลกการเขียนโค้ดในทศวรรษ 1990 เต็มไปด้วยความคิดเจ๋งๆ เหล่านี้ และสำหรับ EXAPUNKS เขาก็เพียงแต่จินตนาการว่าโลกเทคโนโลยีจะเป็นอย่างไร ถ้าหากความคิดเหล่านั้นได้รับความนิยมอย่างแพร่หลาย
สิ่งที่ผู้เขียนชอบมากใน EXAPUNKS นอกเหนือจากนิตยสารและความเจ๋งของโจทย์ต่างๆ ก็คือความยืดหยุ่นของภาษา EXA ในเกม
เพราะมันทำให้การหาวิธีที่ดีที่สุดในการเขียนโปรแกรม (optimize) เป็นเรื่องที่สนุกมาก เกมนี้กำหนดเป้าหมายแต่ให้อิสระเต็มที่ในการหาวิธีบรรลุเป้า เช่นเดียวกับเกมเขียนโค้ดทั่วไป ซึ่งโดยปกติก็มีสามวิธี – เราจะโค้ดทุกอย่างให้ EXA ตัวเดียว (โปรแกรมเดียว) ทำ หรือจะโค้ด EXA ขึ้นมาอีกตัวแล้วใช้มันเป็นตัวเก็บข้อมูลหรือส่งต่อคำสั่ง หรือจะให้ EXAตัวหนึ่งอ่านข้อมูล แล้วโคลน (clone) มันขึ้นมาหลายๆ ตัวก็ได้ ด้วยคำสั่ง REPL (ทำซ้ำหรือ replicate)
วิธีทั้งสามนี้มักบรรลุเป้าหมายของเลเวลได้เหมือนกัน ต่างกันที่ความเรียบง่ายสง่างามของโค้ด และวิธีหนึ่งก็เหมาะสมกับบางเลเวลมากกว่าวิธีอื่น ต้องให้เครดิตกับทีมออกแบบเกมที่ทำให้เราอยากกลับไปเล่นเลเวลเดิม เพราะตงิดว่ามันน่าจะมีวิธีเขียนโค้ดที่เรียบง่ายและใช้เวลาน้อยลง (ซึ่งก็แน่นอน ยิ่งโค้ดเรียบง่าย ใช้น้อยบรรทัด เราก็ยิ่งได้คะแนนมากขึ้น)
ความยืดหยุ่นของภาษา EXA ในเกมแปลว่าเราทำได้แม้แต่จะโค้ดเกมขึ้นมาในเกม ถ้าอยากทำ! และชุมชนของเกมนี้ใน Steam ก็เต็มไปด้วยแฟนเกม ทั้งที่เป็นโปรแกรมเมอร์ในชีวิตจริง และโปรแกรมเมอร์เฉพาะในเกมอย่างผู้เขียน ที่เกาะกลุ่มกันแลกเปลี่ยนความคิดเห็นและให้คำแนะนำซึ่งกันและกัน บางทีการอ่านข้อชี้แนะจากโปรแกรมเมอร์ในโลกจริง เกี่ยวกับการเขียนโค้ดในเกม ให้ความรู้สึกเหมือนกำลังเล่น ‘meta-game’ หรือเกมที่ล้นออกมาในโลกจริงอีกที!
EXAPUNKS ไม่เพียงแต่ทำให้โปรแกรมเมอร์ปลอมอย่างผู้เขียนเข้าใจตรรกะของโค้ด และเข้าถึงส่วนเสี้ยวของความสนุกในการสรรค์สร้างสิ่งใหม่ๆ แต่ยังทำให้โปรแกรมเมอร์มืออาชีพได้พบพานความเบิกบานของการเขียนโค้ดอีกครั้งดังความเห็นของ ไบรอัน น็อกซ์ (Brian Knox)โปรแกรมเมอร์อาชีพ ตอนหนึ่งว่า
“…หลังจากที่เล่นเกมนี้ไปชั่วโมงแล้วชั่วโมงเล่า ผมก็ตระหนักว่าสนุกกับการเขียนโค้ดมากกว่าที่เคยในหลายปีที่ผ่านมา ผมก็เลยลองถามตัวเองว่า ทำไม? ทำไมการเขียนโค้ดใน EXAPUNKS ถึงได้เป็นประสบการณ์ที่เบิกบานขนาดนี้ โดยเฉพาะในเมื่อภาษาโปรแกรมมิ่งที่ใช้ในเกมนี้ไม่สะดวกสำหรับผู้ใช้เอาเสียเลย เมื่อเปรียบเทียบกับภาษาขั้นสูงกว่าที่ผมเขียนสำหรับโครงการ “จริงๆ” ? <ผมคิดว่าคำตอบหลักๆ คือ>
- มีสภาพแวดล้อมอย่างเดียวในเกม ไม่มีความแตกต่างระหว่างขั้นตอนพัฒนา (development) เตรียมตัว (staging) หรือการผลิต (production) คุณแค่ต้องปรับปรุงโค้ดของคุณไปเรื่อยๆ จนกระทั่งบรรลุเป้าหมาย
- เกมถูกออกแบบมาแสดงผลลัพธ์ของโค้ดได้ทันที มองปราดเดียวผมก็รู้ว่าโค้ดแต่ละบรรทัดกำลังทำอะไร ค่าเมมโมรี (memory values) ปัจจุบันคือเท่าไร ตัวชี้วัดการทำงานต่างๆ เป็นอย่างไร และเห็นโค้ดของผมสะท้อนออกมาเป็นภาพ ภายในโครงสร้างของผม เงื่อนไขของผม และได้ผลตอบรับ (feedback) ทันทีที่โค้ดของผมทำตามเงื่อนไขเหล่านั้นได้ ผมไม่ต้องคิดว่าจะสร้างกลไกอธิบายโค้ดที่เหมาะสมอย่างไร ผมได้สิ่งเหล่านี้มาฟรีๆ ในเกม
- ผมไม่ต้องผลิตอะไรเลยยกเว้นโค้ด ในการแก้โจทย์ ไม่ต้องเขียนไฟล์คอนฟิก (config) หรือสร้างแพคเกจ (package) หรือต่อท่อ (pipelines) ใดๆ เลย แค่เขียนโค้ดเท่านั้น
- ผมมีศักยภาพทุกอย่างที่จำเป็นต่อการแก้โจทย์อยู่ตรงหน้า ไม่จำเป็นต้องคิดเรื่องอื่น ไม่ต้องคิดว่าต้องอาศัยอะไรอีกหรือจัดการอะไร
พูดสั้นๆ ก็คือ ผมเพียงแต่ต้องคิดเรื่องการแก้โจทย์ที่เกมบอกให้ผมแก้เพียงอย่างเดียวเท่านั้น เวลาที่ผมเขียนโค้ดใน EXAPUNKS นี่เป็นประสบการณ์สดใหม่มาก เบิกบานมากเทียบกับงานจริงๆ ที่การแก้ปัญหาอะไรก็ตามเกี่ยวกับซอฟต์แวร์อาจแปลว่าต้องไปแก้ปัญหาอื่นๆ อีกมากมายในหลายบริบท ทั้งปัญหาด้านเทคนิคและด้านสังคม