ไอเดีย #45: แพลตฟอร์มฝึกเขียนโค้ดพร้อมตรวจอัตโนมัติ
อาจารย์สอนเขียนโปรแกรมหลายคนคงเคยนั่งเปิดไฟล์การบ้านนักศึกษาทีละไฟล์ คอมไพล์เอง รันเอง ใส่ input เอง ห้องละหกสิบคน สัปดาห์ละหลายข้อ ตรวจไม่ไหวก็ต้องลดจำนวนโจทย์ลง ทั้งที่การฝึกเขียนโค้ดต้องอาศัยจำนวนข้อและ feedback ที่เร็ว ถ้ามีแพลตฟอร์มที่ส่งโค้ดแล้วรู้ผลทันทีว่าผ่านกี่ test case ทั้งคนสอนและคนเรียนจะได้เวลาคืนมาเยอะ
ใครจะใช้
- ผู้เรียน — เลือกโจทย์ เขียนโค้ดบนเว็บ ส่งตรวจ ดูผลและอันดับ
- ผู้สอน — สร้างโจทย์ test case ตั้งเวลาเปิดปิด ดูคะแนนรายห้อง
- ผู้ดูแลระบบ — ดูแลเครื่อง judge, ภาษาที่รองรับ และทรัพยากร
ฟีเจอร์ขั้นต่ำ (MVP)
- คลังโจทย์ มีคำอธิบาย ตัวอย่าง input/output ระดับความยาก และ tag หัวข้อ
- test case แบบซ่อน ผู้เรียนเห็นแค่ผ่านหรือไม่ผ่าน
- ส่งโค้ดหลายภาษา เช่น Python, C, PHP, JavaScript ผ่าน code editor บนเว็บ
- รันใน sandbox ที่จำกัดเวลา หน่วยความจำ ไม่มี network และไฟล์ระบบอ่านอย่างเดียว
- ผลตรวจมาตรฐาน: Accepted, Wrong Answer, Time Limit, Runtime Error, Compile Error
- คิวการตรวจแบบ async ให้หน้าเว็บไม่ค้าง แล้วอัปเดตผลผ่าน polling หรือ WebSocket
- ห้องเรียนและการบ้าน มีกำหนดส่ง และ export คะแนนเป็น CSV
ต่อยอดได้อีก
- โหมดแข่งขันพร้อม scoreboard แบบเรียลไทม์
- ตรวจความคล้ายของโค้ดเพื่อหาการลอก
- คะแนนบางส่วนตามจำนวน test case และ special judge สำหรับโจทย์ที่มีคำตอบได้หลายแบบ
- คำอธิบายเฉลยหลังหมดเวลา และกระทู้ถามตอบรายโจทย์
โครงข้อมูลตั้งต้น
problems— id, title, statement, time_limit_ms, memory_limit_mb, difficultytest_cases— id, problem_id, input_path, output_path, is_sample, scoresubmissions— id, problem_id, user_id, language, source_code, status, score, run_time_ms, created_atsubmission_results— id, submission_id, test_case_id, verdict, time_ms, memory_kbclassrooms/assignments— id, class_id, problem_id, open_at, due_at
ระดับความยาก และสิ่งที่จะได้เรียนรู้
ระดับ ท้าทาย ฝั่งเว็บใช้ Yii2 หรือ Laravel + PostgreSQL ส่วนตัว judge แยกเป็น worker ที่รันโค้ดใน container ผ่าน Docker หรือเครื่องมือ sandbox อื่น สิ่งที่จะได้เรียนรู้:
- สถาปัตยกรรม queue และ worker ด้วย Redis หรือ message broker
- การจำกัดทรัพยากรด้วย cgroups, timeout และการตั้งค่า container ให้ปลอดภัย
- เปรียบเทียบ output แบบไม่สนช่องว่างท้ายบรรทัด
- ทำ real-time update ผลตรวจบนหน้าเว็บ
ข้อควรระวัง
- ความเสี่ยงใหญ่ที่สุดคือรันโค้ดของคนอื่น อย่ารันบนเครื่องเดียวกับเว็บหรือฐานข้อมูลเด็ดขาด ปิด network ใช้ user ที่ไม่มีสิทธิ์ และทิ้ง container หลังรันทุกครั้ง
- ต้องกันโค้ดที่ fork process ไม่จบ หรือเขียนไฟล์จนดิสก์เต็ม ด้วยการจำกัด process และพื้นที่
- ช่วงใกล้กำหนดส่งคิวจะพุ่ง ควรเพิ่ม worker ได้ง่าย และจำกัดจำนวนการส่งต่อคนต่อนาที
ใครเคยทำ online judge ใช้เองในวิชาเรียนบ้างครับ เลือก sandbox แบบไหน แล้วเจอโค้ดนักศึกษาที่พยายามเจาะระบบไหม ถ้าเป็นคุณจะเพิ่มฟีเจอร์อะไรให้ผู้เรียนอยากฝึกต่อเอง มาแชร์ประสบการณ์หรือโชว์ระบบที่ทำไว้ในกระทู้นี้ได้เลย