ข้ามไปยังเนื้อหาหลัก
ProgrammerThailand

ไอเดีย (Idea) idea judge sandbox education

ไอเดีย #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, difficulty
  • test_cases — id, problem_id, input_path, output_path, is_sample, score
  • submissions — id, problem_id, user_id, language, source_code, status, score, run_time_ms, created_at
  • submission_results — id, submission_id, test_case_id, verdict, time_ms, memory_kb
  • classrooms / 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 แบบไหน แล้วเจอโค้ดนักศึกษาที่พยายามเจาะระบบไหม ถ้าเป็นคุณจะเพิ่มฟีเจอร์อะไรให้ผู้เรียนอยากฝึกต่อเอง มาแชร์ประสบการณ์หรือโชว์ระบบที่ทำไว้ในกระทู้นี้ได้เลย

0 คะแนน

0 คำตอบ

ยังไม่มีคำตอบ

รู้คำตอบ? ช่วยแบ่งปันได้เลย

ตอบคำถามนี้

เข้าสู่ระบบเพื่อตอบคำถามและโหวต

เข้าสู่ระบบ สมัครสมาชิก